基于key验证的ssh连接

来源:互联网 发布:编程语言哪个好 编辑:程序博客网 时间:2024/06/08 08:00

简介
在实际生产环境中,我们每日工作可能面对着许多的服务器需要管理,记住每台机器的账户密码显然不现实,所以我们通常需要采取ssh的key验证登录(公钥登陆),来协助我们实现多主机的远程管理操作
所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

准备

ssh连接自身来自于openssh包,分为openssh,openssh-clients,openssh-server三个包,会生成不同的配置文件。
我们需要保证连接双方的主机均安装了软件包,并且保证之间的网络处于连通状态。

实现

基于密钥的安全验证必须为用户自己创建一对密钥,并把共有的密钥放在需要访问的服务器上。当需要连接到SSH服务器上时,客户端软件就会向服务器发出请求,请求使用客户端的密钥进行安全验证。服务器收到请求之后,先在该用户的根目录下寻找共有密钥,然后把它和发送过来的公有密钥进行比较。如果两个密钥一致,服务器就用公有的密钥加密“质询”,并把它发送给客户端软件(putty,xshell等)。客户端收到质询之后,就可以用本地的私人密钥解密再把它发送给服务器,这种方式是相当安全的。
步骤:
1、在客户端生成一对密钥
2、将公钥传输至服务器端某用户的家目录下的 .ssh/authorized_keys 文件中(多个公钥需要进行追加)
3、测试登录
首先,我们需要生成一对密钥

[root@localhost ~]$ ssh-keygen -t rsa -P '' -f "/root/.ssh/id_rsa"Generating public/private rsa key pair.Your identification has been saved in /root/.ssh/id_rsa.Your public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:f3:80:b8:7e:39:66:e5:6b:6f:f7:b6:5a:c5:50:6d:78 root@localhost.localdomainThe key's randomart image is:+--[ RSA 2048]----+|               .o||              ..E||              .o ||     . .       o ||    . . S       o||     .  .+     . ||    .  +  .   .  ||   .  * o . ...  ||    .+ o.+...+o. |+-----------------+

-t 指定算用算法
-p 指定私钥口令
-f 指定生成密钥目录

[root@localhost ~]$ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.18.46.106/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keysroot@172.18.46.106's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh 'root@172.18.46.106'"and check to make sure that only the key(s) you wanted were added.

之后我们使用命令将本机生成公钥文件拷贝到服务器
-i 指定目标公钥文件(注:如果所填为私钥文件,也会默认发送对应公钥,避免错误操作)

[root@localhost ~]$ssh 172.18.46.106Last login: Sun Sep 10 19:23:02 2017 from 172.18.251.187[root@CentOS6 ~]$ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 00:50:56:30:33:7d brd ff:ff:ff:ff:ff:ff    inet 172.18.46.106/16 brd 172.18.255.255 scope global eth1    inet6 fe80::250:56ff:fe30:337d/64 scope link        valid_lft forever preferred_lft forever

我们通过ssh连接命令尝试连接到ip106主机,发现连接成功,这一有一点需要注意,我们连接时本机所登录的账号为root账号,如果我们在连接ip前未标识username@ip格式,ssh连接就会默认以当前的用户进行登录,如果目标主机上并没有该用户,会提示连接出错,又或者我们拷贝的公钥pub文件未放在目标主机同名账户家目录中,会导致不能实现key验证,仍然提示输入密码。

补充一

我们可以注意到,我在生成密钥时并没有对私钥进行加密,如果考虑安全问题,我们可以对私钥进行加密操作,创建时没有设置,我们可以之后运用命令进行重新设置

[root@localhost ~]$ssh-keygen –p

但是需要注意的是,添加完私钥口令后,我们仍需在登录时输入密码,就与我们的初衷不符,那么我们可以使用代理进行解决
ssh-agent是一个密钥管理器,运行ssh-agent以后,使用ssh-add将私钥交给ssh-agent保管,其他程序需要身份验证的时候可以将验证申请交给ssh-agent来完成整个认证过程。
ssh包含的内建支持允许它同ssh-agent通信,允许ssh不必每次新连接时都提示要密码才能获取解密的专用密钥。对于ssh-agent,你只要使用ssh-add把专用密钥添加到ssh-agent的高速缓存中。这是个一次性过程;用过ssh-add之后,ssh将从ssh-agent获取你的专用密钥,而不会提示要密码短语。

ssh-agent bashssh-add

开启代理
并将密码添加给代理,那么我们既保证了私钥的安全,又解决了输入主机密码的麻烦。

补充二

我们实现了多主机的key验证登录,为了方便管理小的集群环境,我在这里补充一个pssh软件供参考。
pssh是一个python编写可以在多台服务器上执行命令的工具,也可实现文件复制
选项如下:
–version:查看版本
-h:主机文件列表,内容格式” [user@]host[:port]”
-H:主机字符串,内容格式” [user@]host[:port]”
-l:登录使用的用户名
-p:并发的线程数【可选】
-o:输出的文件目录【可选】
-e:错误输入文件【可选】
-t: TIMEOUT 超时时间设置, 0无限制【可选】
-O: SSH的选项
-v:详细模式
-A:手动输入密码模式
-x:额外的命令行参数使用空白符号,引号,反斜线处理
-X:额外的命令行参数,单个参数模式,同-x
-i:每个服务器内部处理信息输出
-P:打印出服务器返回信息

下面给出几个实例

[root@CentOS6 ~]$pssh -H 192.168.0.1 -i hostname==>在指定IP主机执行命令[root@CentOS6 ~]$pssh -H "192.168.0.1  192.168.0.2" -i hostname==>在指定多个IP主机执行命令[root@CentOS6 ~]$pssh -h ip.txt -i setenforce 0==>在指定文件中保存的IP主机执行命令[root@CentOS6 ~]pssh -h ip.txt -i -o /app/ hostname==>在指定文件中保存的IP主机执行命令,并把返回结果存入本机/app下,结果存入以主机ip为文件名的文件[root@CentOS6 ~]pscp.pssh -h ip.txt /app/f1.sh /app将/app/f1.sh推送到目标ip主机[root@CentOS6 ~]pslurp -h ip.txt -L /app /etc/passwd从目标ip主机拷贝文件,并保存到以IP为目录名的目录下

总结:基于key验证的ssh是自动化运维的第一步,需要牢固掌握,熟练运用。

原创粉丝点击