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
~