SSHH 免密码验证生产环境分发、管理、备份实战应用指南
ssh是secure shell protocol的简写,它通过对联机数据包加密的技术进行数据传递。专门为远程登录会话
和其他网络服务提供安全的协议。
ssh本身提供两个服务功能:一个是类似telnet的远程联机使用shell服务,即俗称的ssh;
另外一个是类似FTP服务的sftp-server,可以提供更安全的TFP.
从客户端来看,ssh提供两种级别的安全验证。
第一种级别(基于口令的安全验证)
只要你知道自己的账号和口令,就可以登录到远程主机,所有传输的数据都会被加密
第二种(基于密钥的安全验证)
需要依靠密钥,也就是你必须为自己创建一对密钥,并把公用密钥放在需要访问的服务器上,如果你需要
连接到shh服务器上,客户端ssh软件就会向服务器发出请求,请求用你的密钥进行安全验证
服务器收到请求之后,先在该服务器上你的用户主目录下寻找你的公用密钥,然后把它和你
发送过来的公用密钥进行比较。如果两个密钥一致。服务器就用公用密钥加密“质询”(challenge)并把它发送
给客户端软件。
网络数据包的加密技术通常是所谓的一对公钥和私钥(public key and private key)组合成的密钥对进行加密与解密
的操作,主机端所要传client端的数据,会先通过公钥加密后再网络上传输,而到达client端后,再经由私钥将加密的
数据解开来。由于在internet上传输的数据是加密过的,所以数据内容当然就比较安全。
一、颁发数据(一把钥匙开多把锁 )
具体需求
要求所有服务器在同一用户xiaoping系统用户下,实现A机器从本地的分发数据到BC机器上,在分发过程中不需要B.C
的提示系统密码验证,当然,还包括批量查看客户机上的cpu,load,mem等使用信息。
即使实现从A服务器发布数据到B.C客户端服务器的免密码登陆验证解决方案。
A--->B
A--->C
(1)行前准备
在部署密钥之前,首先要分别在A.B.C服务器上添加好xiaoping用户并设置密码,然后,通过xiaoping
用户来实现多个服务器之前免密码登陆,以A服务器为例,具体步骤如下;
[root@clientA ~]# useradd xiaping [root@clientA ~]# echo "123123123"|passwd --stdin xiaoping
(2)开始部署
因为A服务器为中心分发服务器,所以我们选择在A端建立public key(锁)与private key(钥匙)
(A是中心颁发服务器) A----------|------>C(B接收客户服务器)
|------>B(C接收客户服务器)
提示:在整个方案实现中,钥匙(private key)和锁(pubic key)仅需要建立一次即可,可以
在A.B.C任意机器上来执行,本文选择A上面生成密钥对。
[root@clientA ~]# su xiaoping [xiaoping@clientA root]$ ssh-keygen -t dsa
#ssh-keygen是生成密钥的工具,-t参数指建立密钥的类型,这里是建立dsa类型密钥。
#也可以执行ssh-keygen -t rsa 来建立rsa类型密钥
#rsa与dsa加密算法的区别
#RSA,是一种加密算法(ps:RSA也可以进行数字签名,也可以加密),而 DSA只能用于数字签名算法从而实现认证
Generating public/private dsa key pair. Enter file in which to save the key (/home/xiaoping/.ssh/id_dsa): #默认敲回车键到底 Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/xiaoping/.ssh/id_dsa. #private key (钥匙)路径 Your public key has been saved in /home/xiaoping/.ssh/id_dsa.pub. #public key (锁)路径 The key fingerprint is: ae:7f:ec:ef:c9:1f:88:0e:e0:50:85:b7:d7:a2:40:bb xiaoping@clientA The key's randomart p_w_picpath is: +--[ DSA 1024]----+ | .. | | o.. | | ..o . . | | .o . o . | | . .oSo . | | oEo. . . | | . o.. . . | | . oo. . . | | ...ooo=.. | +-----------------+ [xiaoping@clientA ~]$ ls -l .ssh total 12 -rw-------. 1 xiaoping xiaoping 668 Feb 12 08:32 id_dsa -rw-r--r--. 1 xiaoping xiaoping 606 Feb 12 08:32 id_dsa.pub [root@clientA ~]# ls -ld /home/xiaoping/.ssh/ drwx------. 2 xiaoping xiaoping 4096 Feb 12 08:32 /home/xiaoping/.ssh/
(3)颁发公钥(锁)
把公钥(锁)从A拷贝到B.C端用户家目录一份;
即在A端执行如下命令:(可以利用scp拷贝然后改名和配置文件一样名字也可以的)
[root@clientA .ssh]# /usr/bin/ssh-copy-id -i id_dsa.pub xiaoping@202.192.77.20 The authenticity of host '202.192.77.20 (202.192.77.20)' can't be established. RSA key fingerprint is e2:d9:87:29:0a:d8:1b:6f:00:02:59:e4:79:34:ab:dd. Are you sure you want to continue connecting (yes/no)? yes #输入yes在本地添加ssh公钥,该信息 默认会被添加到本地/.ssh/known_hosts文件中。 xiaoping@202.192.77.20's password: Now try logging into the machine, with "ssh 'xiaoping@202.192.77.20'", and check in: .ssh/authorized_keys xiaoping@202.192.77.20's password: Now try logging into the machine, with "ssh 'xiaoping@202.192.77.20'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. [root@clientB ~]# cd /home/xiaoping/.ssh/ [root@clientB .ssh]# ls -a . .. authorized_keys
我们可以bc端的xiaoping家目录而且多一个authorized_keys,其实这个文件就是A端的id_dsa_pub文件
默认情况下ssh的配置文件中默认调用的公钥路径为.ssh,文件名为autorized_keys.
[root@clientB .ssh]# cat /etc/ssh/sshd_config |grep authorized_keys #AuthorizedKeysFile .ssh/authorized_keys
注意:.ssh目录权限(700)及authorized_keys公钥的文件权限(600)和A端一样的。
#因为A端当做锁,所以只需要id_dsa.pub 放到b.c端上xiaoping家目录的.ssh目录即可(自动修改名)
#ssh-copy-id 为系统自带的shell脚本,可用来分发公钥。
(4)测试
[xiaoping@clientA .ssh]$ ssh xiaoping@202.192.77.16 free -m total used free shared buffers cached Mem: 143 129 13 0 20 25 -/+ buffers/cache: 83 59 Swap: 1983 0 1983 [xiaoping@clientA .ssh]$ ssh xiaoping@202.192.77.20 free -m total used free shared buffers cached Mem: 249 170 79 0 19 36 -/+ buffers/cache: 114 135 Swap: 799 0 799 [xiaoping@clientA .ssh]$ ssh xiaoping@202.192.77.20 /sbin/ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0C:29:DE:9A:AA inet addr:202.192.77.20 Bcast:202.192.77.63 Mask:255.255.255.192 inet6 addr: fe80::20c:29ff:fede:9aaa/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:4166 errors:0 dropped:0 overruns:0 frame:0 TX packets:740 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:445151 (434.7 KiB) TX bytes:97452 (95.1 KiB)
#直接连接不需要输入密码这样通过脚本查看大量机器信息省事!
(5)建立测试数据
[xiaoping@clientA jiaoben]$ mkdir -p /tmp/xiaoping [xiaoping@clientA jiaoben]$ cd /tmp/xiaoping/ [xiaoping@clientA xiaoping]$ touch xiaozhou xiaolai xiaoqi xiaogui [xiaoping@clientA xiaoping]$ ls -l total 0 -rw-rw-r--. 1 xiaoping xiaoping 0 Feb 12 12:48 xiaogui -rw-rw-r--. 1 xiaoping xiaoping 0 Feb 12 12:48 xiaolai -rw-rw-r--. 1 xiaoping xiaoping 0 Feb 12 12:48 xiaoqi -rw-rw-r--. 1 xiaoping xiaoping 0 Feb 12 12:48 xiaozhou [xiaoping@clientA xiaoping]$ /usr/bin/scp -P 22 -r /tmp/xiaoping/ xiaoping@202.192.77.16:~ xiaozhou 100% 0 0.0KB/s 00:00 xiaogui 100% 0 0.0KB/s 00:00 xiaoqi 100% 0 0.0KB/s 00:00 xiaolai 100% 0 0.0KB/s 00:00 [xiaoping@clientA xiaoping]$ /usr/bin/scp -P 22 -r /tmp/xiaoping/ xiaoping@202.192.77.20:~ bash: scp: command not found #20这台机器没有scp命令所以不成功 lost connection [xiaoping@clientA xiaoping]$ rsync -avz -p -e 'ssh -p 22' /tmp/xiaoping xiaoping@202.192.77.20:~ bash: rsync: command not found #对端没有rsync命令 rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6] [xiaoping@clientA xiaoping]$ rsync -avz -p -e 'ssh -p 22' /tmp/xiaoping xiaoping@202.192.77.20:~ sending incremental file list xiaoping/ xiaoping/xiaogui xiaoping/xiaolai xiaoping/xiaoqi xiaoping/xiaozhou sent 254 bytes received 92 bytes 138.40 bytes/sec total size is 0 speedup is 0.00 [xiaoping@clientA xiaoping]$
scp 和rsync 的区别
都是用ssh协议来拷贝 ,rsync可以用自身协议拷贝,scp是整体拷贝,rsync拷贝是增量的文件(同步删除)。
用法:
A.ssh -p22 xiaoping@202.192.77.20
#-p 小写接端口 默认22可以省略
B.scp -P22 -r -p /tmp/xiaoping xiaoping@202.192.77.20:~
#scp 为远程拷贝文件或目录的命令
#-p (大写。注意和ssh的区别)接端口。默认22可以省略
#-r 表示拷贝目录
#-p 表示在拷贝前后保持文件目录属性
#可以把远端目录抓到本地:scp -P22 -r xiaoping@202.192.77.20:/tmp /tmp/xiaoping(本地目录)
#格式--> scp [选项] [源文件 /user@ip:目录] or [user@ip:/目标目录 /目录]
C.rsync通过ssh通道传输数据的用法
rsync -avz -progress -- delete -e 'ssh -p 22'/tmp/xiaoping xiaoping@202.192.77.20:/tmp/xiaoping rsync -avz -progress -e 'ssh -p 22'/tmp/xiaoping xiaoping@202.192.77.20:/tmp/xiaoping 拷贝/etc/hosts文件 [root@clientA ~]# /usr/bin/rsync -avz -p -e 'ssh -p 22' /etc/hosts xiaoping@192.168.1.101:/etc/ The authenticity of host '192.168.1.101 (192.168.1.101)' can't be established. RSA key fingerprint is 6c:3a:ef:2b:3f:18:b7:db:83:b4:72:22:5b:07:23:50. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.101' (RSA) to the list of known hosts. xiaoping@192.168.1.101's password: sending incremental file list hosts rsync: mkstemp "/etc/.hosts.I1kMPT" failed: Permission denied (13) sent 130 bytes received 37 bytes 10.12 bytes/sec total size is 133 speedup is 0.80 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]
以上的处理办法:
可以把xiaoping用户配置sudo权限用户,然后就可以实现通过sudo功能来实现普通
用户推送只有root才能处理的问题了。执行visdudo 开启Defaults requiretty参数:
案例:
C-server (中心服务器跳板)
E-server(接收服务器)
A-server(中心颁发服务器)
D-server (中心服务器跳板)
D-server(接收服务器)
a.这个构架的目的就是管理好中心颁发服务器A。取消A服务器的外网IP,开启防火墙禁止ssh对外所有IP连接,
并仅给某一台内部无外网机器访问C-server访问。
b.然后内部服务器C-server依然没有外网IP,并且仅能通过×××连接,这样要想连接到中心颁发服务器A-server就必须登陆
上D-server,然后通过C-server 登录到最终的A-server.
【文件分发及批量管理方案】
a.sudo+sshkey+rsync
b.cfengine
c.puppet
5.expect
6.secureCRT的批量管理功能+http服务。
7.sersync主从模式或lrsync
由A-sever向bc服务器颁发服务器搭建
[xiaoping@clientA sysconfig]$useradd xiaoping12 [xiaoping@clientA sysconfig]$echo "123123123" | passwd --stdin xiaoping12 [xiaoping@clientA sysconfig]$ ssh-keygen -t dsa [xiaoping@clientA ~]$ ls -l .ssh/ total 16 -rw-------. 1 xiaoping xiaoping 668 Feb 12 08:32 id_dsa -rw-r--r--. 1 xiaoping xiaoping 606 Feb 12 08:32 id_dsa.pub -rw-r--r--. 1 xiaoping xiaoping 1975 Feb 16 12:12 known_hosts -rw-r--r--. 1 xiaoping xiaoping 606 Feb 12 10:23 xiaoping@202.192.77.16 [xiaoping@clientA ~]$ ssh-copy-id -i .ssh/id_dsa.pub xiaoping@192.168.20.25 [xiaoping@clientA ~]$ ssh-copy-id -i .ssh/id_dsa.pub xiaoping@192.168.20.25 [xiaoping@clientA ~]$ ssh -t 192.168.20.25 free -m
第二项目实现A文件颁发BC服务器家目录
[xiaoping@clientA .ssh]$ scp id_dsa 192.168.20.25:/home/xiaoping/.ssh/ id_dsa 100% 668 0.7KB/s 00:00 [xiaoping@clientA .ssh]$ vi benfen.sh #!bin/bash if [ $# -ne 1 ];then echo "sh $0 arg0" exit 1 fi for ip in 192.168.20.25 192.168.20.50 do scp -r -p $1 xiaoping@$ip:~ done ~