转: http://blog.knownsec.com/2012/05/ssh-%E5%85%AC%E9%92%A5%E8%AE%A4%E8%AF%81/

SSH 公钥认证

2012-05-15

简介

使用 SSH 登录并管理远程服务器是系统运维之中的常见操作。目前常用的认证方式是 用户名 + 密码。使用密码在某些特定的场合下的缺点是显而易见的,如:

  • 在需要多人共用一个帐号的场景下需要将密码告诉所有使用人员,使密码泄漏的风险增大,并且修改密码也需要通知所有人,带来一定的维护管理成本。
  • 某些情况下需要无密码访问(系统可以配置成允许空密码登录,但相应的安全风险也大增),如 MPI,大批量的服务器维护等。

采用公钥认证则能避免规避单纯使用密码认证带来的这些问题,多人可以通过持有各自的私钥登录到系统的同一个帐号。用户可以在安全保持私钥的前提下安全的执行无需输入密码的登录操作。

公钥认证的基本工作原理可以参考任何一本密码学相关的参考书籍,或者这里

接下来的内容就是最常见的 SSH 服务端(OpenSSH)和客户端(OpenSSH 和 PuTTY)的配置方法。其他的软件如何配置可以参考其附带的文档,差别应该仅体现在命令行的使用上。

配置

服务端配置

OpenSSH 的服务端配置文件一般为 /etc/ssh/sshd_config,和公钥认证有关的两个配置项是:

 
1
2
#RSAAuthentication yes
#PubkeyAuthentication yes

其缺省值一般为 yes。如果希望仅打开公钥认证,禁用其他的认证方式,则可以修改下列配置项:

 
1
2
3
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

上述配置项如果有任何需要修改的地方在修改之后重启ssh服务器让新的设置生效。

密钥生成

在使用公钥认证前需要实现生成相应的公私钥密码对。OpenSSH 下生成密钥对的命令为:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ ssh-keygen -C "liuzx@test" -t rsa -b 2048 -f test
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in test.
Your public key has been saved in test.pub.
The key fingerprint is:
2f:2e:86:fc:8f:55:82:d2:dd:18:fa:9a:6e:3a:b1:d9 liuzx@test
The key's randomart image is:
+[RSA 2048]-------+
|                 |
|                 |
|        .        |
|     . + +       |
|    . + S o      |
|    .. . +       |
|   . *  + .      |
|    * E* .       |
|    .B*oo        |
+-----------------+

更多的参数可以参考 ssh-keygen 的手册页。上面用到的参数分别介绍如下:
-C 是对密钥的一个说明,有助于区分不同的密钥用途。
-t 和 -b 分别指定要生成的密钥类型和密钥长度。
-f 指定生成的密钥对文件名。公钥文件名为test.pub,私钥为 test。

PuTTY 提供了一个PuTTYgen可以用来实现类似ssh-keygen的功能。相应的截图如下



PuTTYgen 生成的私钥文件一般 save 后的后缀为 .ppk,在这个程序的菜单栏 Conversions 里可以执行和 OpenSSH 的私钥格式之间的相互转换。

客户端配置

在完成密钥对的生成后,需要将对应的公钥文件拷贝到服务器上需要登录的用户的home目录下的
.ssh/authorized_keys文件中:

 
1
  $ cat test.pub >> ~test/.ssh/authorized_keys

对 PuTTYgen 生成的密钥将上图蓝色框内的文本拷贝粘贴到 authorized_keys 文件中即可。从上面的重定向用的 >> 就可看出我们可以附加任意多个公钥到这个文件之中(每个公钥占一行)。这样就实现多人以同一个用户的身份登录系统的功能。如果需要取消某个人的访问权限,只需要删除其对应的公钥即可。

事实上 authorized_keys 文件的准确名字是由 sshd_config 中的 AuthorizedKeysFile 配置指定给定的。同样,man sshd_config 获取详细的说明信息。注意: authorized_keys 文件及其所在的目录以及父目录(一直上溯到该用户的HOME目录为止)的权限必须设置为不能被组和其他人写(可以通过 chmod og-w 确认),否则其他人只需要修改这个文件即可以以该身份登录到系统上。

authorized_keys 的格式可以参考 man sshd,AUTHORIZED_KEYS FILE FORMAT 这一节。简单点说,通过配置 authorized_keys 的每一行,可以对不同的用户进行不同的细粒度的控制。如控制不同用户可以执行的命令,设置环境变量,设置允许登录的主机或 IP 地址等。典型的一个例子就是 git 的管理软件 gitolite。

在authorized_keys文件设置好之后,即可以使用公钥认证的方式来登录远程服务器了。

对 OpenSSH 客户端,可以通过 ssh -i test test@remote.host 快速测试是否工作。更一般的方法是将私钥文件 test 拷贝为 .ssh/id_xxx (xxx 由密钥类型决定,如rsa,dsa,ecdsa)。如果不能正常工作,可以 ssh 加上 -v 参数以及查看服务端的日志来排查可能的原因。注意私钥的权限要求必须只能自己具有读写权限(通过 chmod og-rwx 确认),否则ssh客户端会拒绝使用该私钥。在有多个密钥对的情况下,可以通过设置 .ssh/config 对不同的主机和用户使用不同的私钥文件。如下例:

 
1
2
Host *
    IdentityFile ~/.ssh/%r@%h

同样的,更多的细节参考 man ssh_config。

对 PuTTY 客户端,见下图,在执行 session 时选择相应的私钥文件即可。

关于密钥的更多说明

一般来说生成密钥对时选择 RSA 2048 的强度足够安全了。此外还有dsa 和 ecdsa。根据 PuTTY 的用户手册,推荐使用 RSA,不建议用 DSA, PuTTY 不支持 ECDSA。

由于在配置了公钥认证的情况下,为方便起见,一般都不设置私钥密码,即只要持有私钥就可登录系统。因此私钥文件泄漏带来的风险就非常大了。因此,对私钥文件应仅在可信的环境下才能以无密码的方式存储,其他情况下应该以强密码保护。如果最初生成密钥是没有设置密码,可以通过 ssh-keygen -p -f test 重新设置密码。对 PuTTY 只需在 Load 私钥后输入密码然后重新保存即可。

幸好,SSH 对这种情况已经有所考虑,并提供了相应的辅助程序做认证代理。OpenSSH 的程序名为 ssh-agent,PuTTY 的程序名为 pageant。其基本思想是预先加载私钥在内存之中,在记载的过程之中如果私钥有密码,会请求用户输入密码。这样以后的 SSH 连接就不需要频繁的输入私钥的密码。

OpenSSH 下的响应操作如下:

 
1
2
3
4
5
$ eval $(ssh-agent –t 1800)
$ ssh-add .ssh/id_rsa
Enter passphrase for ./ssh/id_rsa:
$ ssh-add -l
2048 f3:65:34:01:24:61:56:94:5d:54:63:44:1e:1a:18:6a .ssh/id_rsa (RSA)

PuTTY 下的操作如图:

在执行pageant后,在托盘栏会有相应的图标,右键单击即出现上图,点击 Add Key 按提示操作即可。

结语

严格说来,在不可信的环境里不管是采用密码还是公钥任何认证方式都是有风险的。我们所能作的就是在风险控制和易用性方便权衡选择。

最后,采用公钥认证由于需要私钥文件才能登录,在特殊的情况下,如果没有私钥会导致无法登陆系统。简单的回到密码认证又规避不了风险。这种情况下,采用 One-time passcodes (OTP ,HOTP或者 TOTP) 也许是一种选择。Google Authenticator 提供了一个很好的实现方案,包括移动客户端。我会在另一篇 blog 里来简单介绍如何实现。

P.S. 由于系统配置以及软件版本等的不同,本文中提到的配置并不能覆盖所有的环境。准确的配置需要参考官方文档并结合实际的系统进行调整。

作者:clan | Categories:技术分享 | Tags: 运维
  • 33

    写得好@!

  • http://blog.81n.org/ 81难

    大力支持,不用每次都输密码,多省事儿啊

  • haipeng zhu

    真及时!

  • Hysia

    科普的好文章!赞

转: SSH 公钥认证的更多相关文章

  1. SSH公钥认证+优化

    一 ssh公钥认证流程: sshclinet机器:产生公私钥(公钥相当于一把锁) sshclient:将公钥发给sshserver(抛出锁子) sshclinet去连sshserver不需要密钥   ...

  2. Linux配置SSH公钥认证与Jenkins远程登录进行自动发布

    公钥认证,是使用一对加密字符串,一个称为公钥(public key), 任何人都可以看到其内容,用于加密:另一个称为密钥(private key),只有拥有者才能看到,用于解密. 在使用jenkins ...

  3. ssh公钥认证原理及设置root外的其他用户登录ssh

    1)创建其他用户 useradd [-d 登录目录] [-G ssh][用户名]  一定要将用户添加到ssh组不然无法没有权限登录ssh 2)设置ssh不允许root登录 vi /etc/ssh/ss ...

  4. [svc][op]SSH公钥认证+优化

    一 ssh公钥认证流程: sshclinet机器:产生公私钥(公钥相当于一把锁) sshclient:将公钥发给sshserver(抛出锁子) sshclinet去连sshserver不需要密钥 二 ...

  5. SSH公钥认证(码云)

    开发者向码云版本库写入最常用到的协议是 SSH 协议,因为 SSH 协议使用公钥认证,可以实现无口令访问,而若使用 HTTPS 协议每次身份认证时都需要提供口令.使用 SSH 公钥认证,就涉及到公钥的 ...

  6. SSH公钥认证登录

    概述: SSH登录的认证方式分为两种,一种是使用用户名密码的方式,另一种就是通过公钥认证的方式进行访问, 用户名密码登录的方式没什么好说的,本文主要介绍通过公钥认证的方式进行登录. 思路: 在客户端生 ...

  7. 使用SecureCRT设置linux系统登录的ssh公钥认证

    1.修改ssh配置文件/etc/ssh/sshd_configRSAAuthentication yes                             //使用RSA加密算法PubkeyAu ...

  8. linux配置ssh公钥认证,打通root用户的免密码输入的scp通道

    1.ssh-keygen ssh-keygen是unix-like系统的一个用来生成.管理ssh公钥和私钥的工具. 2.用法 常用的重要的选项有: -b num   指定生成多少比特长度的key,单位 ...

  9. 一次由SELinux引起的ssh公钥认证失败问题

    一直使用CentOS作为服务器系统,平时装完系统以后都是建立publickey认证机制,然后关闭密码认证.原本是一件轻车熟路毫无压力的事情,不想前日新装一台机器按照正常配置以后居然使用publicke ...

随机推荐

  1. Python类总结-描述符__get__(),__set__(),__delete__()

    1 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),set(),delete()中的一个,这也被称为描述符协议 get():调用一个属性时,触发 set():为一 ...

  2. FastReport.Net使用:[28]数据合并

    基础数据 1.拖动数据源中的数据列到报表设计器中,获得一张简单的报表. 2.下面使用两种方法将期中考试和期末考试的成绩合并到一行显示 合并数据(分组方法) 1.按学生名字和科目来进行分组,成绩文本框咱 ...

  3. WebLogic Server

    前几天,看了几集J2ee , 给我的感觉就是,看不懂!! 一点也不懂! 那怎么办呢? 听老师的,不管懂不懂,先看看再说.接下来,就开始了J2ee "艰苦"的历程.在J2ee中,经常 ...

  4. 51nod1218 最长递增子序列 V2

    看见标签推荐顺便就做了吧 记$f[i], g[i]$为$i$的含$i$的前缀最长递增子序列和后缀递增子序列 只要满足$f[i] + g[i] == LIS + 1$,那么$i$就是可能的 对于$i$而 ...

  5. 【最小表示法】BZOJ2882-工艺

    [题目大意] 求一个循环数列的最小表示法. [思路] 最小表示法模板题.之前用SAM做的,MLE了hhhhh戳☆ #include<iostream> #include<cstdio ...

  6. java 环境变量设定

    ​     1   新建系统环境  新建  弹出“新建系统变量”对话框,分别输入变量名“JAVA_HOME”和变量值(java安装路径)“C:\Java\jdk1.7.0_03”,其中变量值是笔者的J ...

  7. lightoj 1306 - Solutions to an Equation 扩展的欧几里得

    思路:看题就知道用扩展的欧几里得算法做!!! 首先我们可以求出ax+by=gcd(a,b)=g的一个组解(x0,y0).而要使ax+by=c有解,必须有c%g==0. 继而可以得到ax+by=c的一个 ...

  8. Java并发(十四):并发工具类——CountDownLatch

    先做总结: 1.CountDownLatch 是什么? CountDownLatch 允许一个或多个线程等待其他线程(不一定是线程,某个操作)完成之后再执行. CountDownLatch的构造函数接 ...

  9. 腾讯通消息webSDK踩坑

    1.腾讯通提供一个通过http协议的接口,可用于发送消息,公告等功能,要使用其功能首先要开启RTX_HTTPServer服务. 2.阅读文档http://rtx.tencent.com/sdk/,为了 ...

  10. ACM -- 算法小结(七)Phone list解题报告

          HDOJ -- Phone list解题报告 问题描述:给出一些电话号码,如果有共同前缀则输出NO,如果没有则输出YES. 解题关键:将电话号码进行字符串排序,相邻的电话号码进行比较 Sa ...