Linux配置SSH密钥登录详解及客户端测试使用无密码登录

Linux SSH登录的两种方式

使用密码验证登录

通常VPS或服务器开通后都是直接提供IP和root密码,使用这种方式就是通过密码方式登录。如果密码不够强壮,而且没有安装DenyHosts之类的防止SSH密码破解的软件,那么系统安全将存在很大的隐患。

如果你安装DenyHosts并设置邮件提醒,你每天可能会受到数封DenyHosts Report将前来破解SSH密码的IP加入/etc/hosts.deny。

使用密钥验证登录

基于密钥的安全验证必须为用户自己创建一对密钥,并把公有的密钥放在需要访问的服务器上。当需要连接到SSH服务器上时,客户端软件就会向服务器发出请求,请求使用客户端的密钥进行安全验证。服务器收到请求之后,先在该用户的根目录下寻找公有密钥,然后把它和发送过来的公有密钥进行比较。如果两个密钥一致,服务器就用公有的密钥加密“咨询”,并把它发送给客户端软件(putty,xshell等)。客户端收到咨询之后,就可以用本地的私人密钥解密再把它发送给服务器,这种方式是相当安全的。

生成密钥

因为puttygen生成的密钥有问题可能会出现:“Server refused our key”,最好使用XShell生成密钥或者在远程Linux VPS/服务器生成密钥。

在Linux远程服务器生成密钥

本文以openSSH来说明,目前大部分的Linux/unix都在使用这个程序。 默认情况下,openSSH的ssh-keygen使用的SSH2协议,并且生成RSA密钥对。
登录远程Linux VPS/服务器,执行:

[root@localhost ~]# ssh-keygen -t rsa                                 // 先运行这个命令
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):              // 直接回车
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):                           // 输入密钥密码
Enter same passphrase again:                                          // 重复密钥密码
Your identification has been saved in /root/.ssh/id_rsa.              // 提示公钥和私钥已经存放在/root/.ssh/目录下
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
2b:89:43:22:a9:57:6f:6a:1d:ee:fe:93:46:37:bc:28 root@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
| .               |
|o . o   S.       |
|.. + o....+      |
|. . oo=o.+ o     |
| .  .+E.= .      |
|   ..oo+..       |
+-----------------+
[root@localhost ~]#

第3行是询问将生成的密钥对存放在哪里,直接回车存放在默认的位置就可以了。

第5行、第6行是让你输入口令短语,这个用于加密私钥的。如果你输入了,会使用它对私钥加密,这意味着你以后每次使用私钥,都要输入这个口令,用来解密私钥。无特殊要求下,这里留空。

其中公共密钥保存在 ~/.ssh/id_rsa.pub
私有密钥保存在 ~/.ssh/id_rsa
如果不需要为公钥和私钥设置密码,运行命令 ssh-keygen -t rsa 后连续三次回车,即在远程服务器生成了公钥和私钥
将/root/.ssh/下面的id_rsa和id_rsd.pub妥善保存。

使用XShell生成密钥

Xshell是一款Windows下面功能强大的SSH客户端,能够按分类保存N多会话、支持Tab、支持多密钥管理等等,管理比较多的VPS/服务器使用XShell算是比较方便的,推荐使用。

略①

使用SecureCRT生成密钥

详情请参考:
secureCRT创建公钥截图:http://blog.lihaixin.name/2011/02/securecrt-create-public-key.html

将密钥添加到远程Linux服务器

1、使用scp命令将id_rsa.pub文件上传到/root/.ssh/下面。如果没有则创建此目录,也可以使用命令:

ssh root@192.168.0.23 "mkdir .ssh;chmod 0700 .ssh" # 需要输入密码,并重命名为:authorized_keys
[root@localhost ~]# scp ~/.ssh/id_rsa.pub root@192.168.0.23:/root/.ssh/authorized_keys # 需要输入密码

# 如果是在Linux服务器上生成的密钥直接执行:
mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
# 或者
cat /root/.ssh/id_rsa.pub  >> /root/.ssh/authorized_keys # 将id_rsa.pub的内容追加到 authorized_keys 中,再执行:
chmod 600 /root/.ssh/authorized_keys # 修改权限。

对于OpenSSH来说,我们需要将公钥加入到~/.ssh/authorized_keys中。每个公钥一行,千万注意不要换行,否则可能不能正常工作。

2、修改/etc/ssh/sshd_config 文件,将RSAAuthentication 和 PubkeyAuthentication 后面的值都改成yes ,保存。(此步可以省略)

3、重启远程服务器的sshd服务
Debian/Ubuntu执行

/etc/init.d/ssh restart

CentOS执行

/etc/init.d/sshd restart

客户端测试使用密钥登录

使用putty登录

略②

XShell登录

略③

Linux客户端登录测试

在Linux客户端执行:

chmod 600 /root/id_rsa 
# 再执行
ssh root@192.168.0.23 -i /root/id_rsa 

/root/id_rsa为私钥文件,第一次链接可能会提示确认,输入yes即可,再按提示输入密钥密码,没有问题就会出现用户提示符。
以后你在这台机器上用scp ssh sftp 命令访问目标机器的时候就不用输入密码了。

配置多个私钥

我们在使用密钥的时候,肯定不会只使用一个密钥,我们有许多个不同的服务器,帐号不同,用户名不同,我们有多个私钥,因此我们需要管理这些密钥。

通过~/.ssh/config这个文件可以配置特定的主机,使用特定的私钥、用户名。

如果没有这个文件,那么创建它,并添加下面的内容,注意设置一下权限。

[root@localhost ~]# chmod 600 ~/.ssh/config
[root@localhost ~]# cat ~/.ssh/config
Host github.com *.github.com
  ProxyCommand connect -H web-proxy.oa.com:8080 %h %p
  IdentityFile ~/.ssh/privatekey/id_rsa.github
  User git

我们配置文件,

第一行Host指定了目标主机。
第二行ProxyCommand说明要使用代理去访问这个主机。
第三行IdentityFile指定私钥的路径,通过这个关键字这样就可以保存多个私钥了。
第四行User指明了用户。
另外,如果你不想写这个配置文件,那么可以在ssh命令中使用-i参数指定私钥的路径。

-i identity_file Selects a file from which the identity (private key) for RSA or DSA authentication is read. The default is ~/.ssh/identity for protocol version 1, and ~/.ssh/id_rsa and ~/.ssh/id_dsa for protocol version 2. Identity files may also be specified on a per-host basis in the configuration file. It is possible to have multiple -i options (and multiple identities specified in configuration files).
1
ssh -i ~/.ssh/privatekey/id_rsa.github -T git@github.com

修改远程Linux服务器sshd服务配置

1、修改/etc/ssh/sshd_config 文件

将PasswordAuthentication yes 修改成 PasswordAuthentication no

2、重启sshd服务

Debian/Ubuntu执行

/etc/init.d/ssh restart

CentOS执行

/etc/init.d/sshd restart

再提醒一下一定要保存好Putty私钥文件id_rsa.ppk或Linux服务器下载下来的id_rsa私钥文件。

可能遇到的问题:
1、如果确认目录权限和密钥都没问题后,不管怎样都不能实现密钥登录时,那可能是SELinux引起的ssh公钥认证失败。具体分析过程可以参考:
SELinux引起的ssh公钥认证失败:http://www.cnblogs.com/qcly/p/3219535.html

附录:
1、略①②③请参考:
SSH密钥登录让Linux VPS/服务器更安全:http://www.vpser.net/security/linux-ssh-authorized-keys-login.html

扩展阅读:
ssh证书登录(实例详解):http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646346.html
ssh非交互式密码授权(三):使用密钥进行认证:http://www.chenyudong.com/archives/ssh-using-private-public-key-no-password.html
ssh无密码访问:http://blog.csdn.net/codepeak/article/details/14447627 (主要参考authorized_keys文件实现多个密钥认证)

发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据