ssh-key 免密码验证分发、管理、备份指南02
1.备份需求分析
要求所有服务器在同一用户xiaoping系统用户下,实现B.A机器从本地备份数据到C机器上,在备份过程
中不需要C的提示系统密码验证。
即实现从A.B服务器备份数据到Z备份存储服务器的免密码登陆验证的解决方案
备份数据流方式如下:
A--->C
B-->C
想想比喻,即多把钥匙(A\B)开一把锁(C)
2.生成密钥对
[xiaoping@clientC ~]$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/xiaoping/.ssh/id_dsa): Created directory '/home/xiaoping/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/xiaoping/.ssh/id_dsa. Your public key has been saved in /home/xiaoping/.ssh/id_dsa.pub. The key fingerprint is: db:c7:c4:95:66:00:06:b9:12:ca:72:e3:56:f6:08:e5 xiaoping@clientC The key's randomart p_w_picpath is: +--[ DSA 1024]----+ | .oo.. | | o .. . . | | . + . . = | | . * E . . + | | + = +S o | | o . .o o | | . . . o | | . | | | +-----------------+ [xiaoping@clientC ~]$ ls /home/xiaoping/.ssh/ id_dsa id_dsa.pub
3.分发私钥(钥匙)
特别强调:这里是和分发数据方案不通的地方,分发数据方案中是把公钥(锁)从A拷贝到B、C端用户加目录各一份。而
在备份数据方案中,我们需要把私钥发到X,Y server上,把公钥(锁)留在Z备份服务器本地。因为,备份服务器本身就是“锁”
[root@clientC .ssh]# grep \key /etc/ssh/sshd_config #HostKey /etc/ssh/ssh_host_key #HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_dsa_key # Lifetime and size of ephemeral version 1 server key #PubkeyAuthentication yes #AuthorizedKeysFile .ssh/authorized_keys # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts # Change to no to disable s/key passwords [root@clientC .ssh]# grep \key /etc/ssh/sshd_config #HostKey /etc/ssh/ssh_host_key #HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_dsa_key # Lifetime and size of ephemeral version 1 server key #PubkeyAuthentication yes #AuthorizedKeysFile .ssh/authorized_keys # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts # Change to no to disable s/key passwords [root@clientC .ssh]# ^C [root@clientC .ssh]# su xiaoping [xiaoping@clientC .ssh]$ ls -a . .. id_dsa id_dsa.pub known_hosts [xiaoping@clientC .ssh]$ mv id_dsa.pub authorized_keys [xiaoping@clientC .ssh]$ ls -a . .. authorized_keys id_dsa known_hosts [xiaoping@clientC .ssh]$ scp -p id_dsa xiaoping@192.168.20.5:~/.ssh/ xiaoping@192.168.20.5's password: id_dsa 100% 668 0.7KB/s 00:00 在A端测试: [xiaoping@clientA .ssh]$ ssh xiaoping@192.168.20.25 free -m The authenticity of host '192.168.20.25 (192.168.20.25)' 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.20.25' (RSA) to the list of known hosts. total used free shared buffers cached Mem: 143 130 12 0 33 17 -/+ buffers/cache: 79 64 Swap: 1983 13 1970 [xiaoping@clientA .ssh]$ scp -p -r /xiaoping/ xiaoping@192.168.20.25:/tmp/ 22.sh 100% 0 0.0KB/s 00:00 111.sh 100% 0 0.0KB/s 00:00
【如何把远端root的权限文件备份到C端】
先调整一下xiaoping用户sudo权限
[xiaoping@clientA ~]$visudo xiaoping ALL=(ALL) NOPASSWD: /usr/bin/rsync,/usr/bin/scp,/bin/cp [root@clientA xiaoping]# su xiaoping [xiaoping@clientA ~]$ scp -p -r ./xiaoping xiaoping@192.168.20.25:~ ./xiaoping: No such file or directory [xiaoping@clientA ~]$ scp -p -r /home/xiaoping xiaoping@192.168.20.25:~ #先把文件考到家目录下 manager.sh 100% 435 0.4KB/s 00:00 iplist 100% 28 0.0KB/s 00:00 .bash_history 100% 44 0.0KB/s 00:00 hoststatus.txt 100% 0 0.0KB/s 00:00 .bash_profile 100% 176 0.2KB/s 00:00 id_dsa 100% 668 0.7KB/s 00:00 known_hosts 100% 789 0.8KB/s 00:00 net.sh 100% 521 0.5KB/s 00:00 .bash_logout 100% 18 0.0KB/s 00:00 network.sh 100% 238 0.2KB/s 00:00 .bashrc 100% 124 0.1KB/s 00:00 [xiaoping@clientA ~]$ ssh -t -p 22 xiaoping@192.168.20.25 sudo rsync -avz -p /home/xiaoping/xiaoping /root/ #再远程到对端服务器在用sudo将文件考到root目录下。 sending incremental file list xiaoping/ xiaoping/.bash_history xiaoping/.bash_logout xiaoping/.bash_profile xiaoping/.bashrc xiaoping/hoststatus.txt xiaoping/net.sh xiaoping/network.sh xiaoping/xiaogui xiaoping/xiaolai xiaoping/xiaoqi xiaoping/xiaozhou xiaoping/.ssh/ xiaoping/.ssh/id_dsa xiaoping/.ssh/known_hosts xiaoping/manager/ xiaoping/manager/iplist xiaoping/manager/manager.sh sent 3108 bytes received 309 bytes 6834.00 bytes/sec total size is 3041 speedup is 0.89 Connection to 192.168.20.25 closed. [xiaoping@clientA ~]$ #scp -p -r /home/xiaoping xiaoping@192.168.20.25:~ #ssh -t -p 22 xiaoping@192.168.20.25 sudo rsync -avz -p /home/xiaoping/xiaoping /root/
scp -P22 -p -r /xiaping root@192.168.20.5:~
方法一:使用rsync服务,在备份服务器部署rsync守护进程,把所有备份节点作为rsync客户端,
出方案在生产环境常用的备份方案,对于特别碎的文件,要进行打包再传输。
方法二:ftp的方式,在备份服务器部署ftp守护进程,把所有备份节点做为ftp客户端,在本地备份完毕,把数据通过
ftp的方式推送到备份服务器上。也可以采用。
方法三NFS方式,在备份服务器部署NFS服务,部署NFS服务,把所有备份节点做为NFS客户端,在本地备用完毕(也可以直接备份到远端的nfs server)
把数据通过挂载的方式把数据推送到NFS备用服务器上,此法也是个方案,机器少15台左右可以采用,推荐不用。
方法四。scp加ssh key或者expect交互式的方法备份,作为一个备份思路列在这里,不推荐。
总结:无论使用哪个方案备份都不能完全保证数据备份正常,在我的工作中还对备份服务器上备份的内容通过脚本程序做检查
定时发送邮件,甚至做定期的人工或自动化的还原数据测试操作(如:每周一次把数据自动还原测试机的WEB SERVER ,DB SERVER)
,然后备份及还原结果定时一般每日安排人工或自动的发送运维组相关人员的信箱。以确保备份的数据是真正有效的。
方案一,通过root用户直接建立密钥认证
方案二。普通用户建立密钥(通过sudo提权)
[root@clientC ~]# useradd 001 [root@clientC ~]# tail -l /etc/passwd rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin SambaServer:x:501:501::/home/SambaServer:/bin/false lily:x:502:502::/home/lily:/bin/bash lisan:x:503:502::/home/lisan:/bin/bash proadmin:x:504:504::/home/proadmin:/sbin/nologin prouser:x:505:504::/home/prouser:/sbin/nologin xiaoping:x:506:506::/home/xiaoping:/bin/bash 001:x:507:507::/home/001:/bin/bash [root@clientC ~]# echo "123456" | passwd --stdin 001 Changing password for user 001. passwd: all authentication tokens updated successfully. [root@clientC ~]# su -001 su: invalid option -- '0' Try `su --help' for more information. [root@clientC ~]# su 001 [001@clientC root]$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/001/.ssh/id_dsa): Created directory '/home/001/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/001/.ssh/id_dsa. Your public key has been saved in /home/001/.ssh/id_dsa.pub. The key fingerprint is: d4:44:da:62:a9:f1:af:c9:66:47:c2:09:ba:06:0e:b8 001@clientC The key's randomart p_w_picpath is: +--[ DSA 1024]----+ | .o | | * | | . * o | | .* . | |. ..oS. | |o . . +.. | | + . . o. | |E . o .oo. | | . o+. | +-----------------+ [001@clientC .ssh]$ ssh-copy-id -i id_dsa.pub "-p 22 001@192.168.20.5" The authenticity of host '192.168.20.5 (192.168.20.5)' can't be established. RSA key fingerprint is c1:28:b4:c3:f6:3d:85:bf:b2:df:59:17:d5:9f:65:2e. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.20.5' (RSA) to the list of known hosts. 001@192.168.20.5's password: Now try logging into the machine, with "ssh '-p 22 001@192.168.20.5'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. [001@clientC .ssh]$ ssh 001@192.168.20.5 free -m total used free shared buffers cached Mem: 199 182 17 0 52 19 -/+ buffers/cache: 109 89 Swap: 1055 0 1055 [001@clientC .ssh]$ ssh 001@192.168.20.5 /sbin/ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0C:29:D8:5D:8C inet addr:192.168.20.5 Bcast:192.168.20.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fed8:5d8c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:32979 errors:0 dropped:0 overruns:0 frame:0 TX packets:24899 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2999695 (2.8 MiB) TX bytes:6948512 (6.6 MiB) [001@clientC .ssh]$ mkdir /001/ mkdir: cannot create directory `/001/': Permission denied [001@clientC .ssh]$ mkdir 001 [001@clientC .ssh]$ cd 001 [001@clientC 001]$ touch 001 [001@clientC 001]$ touch 002 [001@clientC 001]$ echo 111 > 001 [001@clientC .ssh]$ scp -p -r 001 001@192.168.20.5:~ 001 100% 4 0.0KB/s 00:00 002 100% 0 0.0KB/s 00:00 [001@clientC .ssh]$ scp -p -r 001 001@192.168.20.5:/etc #A端没有root权限需要提权。 scp: /etc/001: Permission denied [root@clientA xiaoping]# grep \001 /etc/sudoers #在A端添加sudo权限,为下面拷贝做准备 001 ALL=(ALL) NOPASSWD: /usr/bin/rsync,/usr/bin/scp,/bin/cp [001@clientC .ssh]$ ssh -t 001@192.168.20.5 sudo rsync -avz -p 001 /etc/ sending incremental file list 001/ 001/001 001/002 sent 155 bytes received 54 bytes 418.00 bytes/sec total size is 4 speedup is 0.02 Connection to 192.168.20.5 closed. [root@clientC scirts]# mkdir /xp001/ -p [root@clientC scirts]# chown 001 /xp001/ -R [root@clientC scirts]# cp /etc/hosts /xp001/ [root@clientC scirts]# cd /xp001/ [root@clientC xp001]# ll total 4 -rw-r--r-- 1 root root 225 Feb 23 23:49 hosts [root@clientC xp001]# su 001 [001@clientC xp001]$ scp -p -r /xp001/hosts 001@192.168.20.5:~ hosts 100% 225 0.2KB/s 00:00 [001@clientC xp001]$ ssh -t 001@192.168.20.5 sudo rsync -avz -P hosts /etc sending incremental file list hosts 225 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) sent 199 bytes received 31 bytes 460.00 bytes/sec total size is 225 speedup is 0.98 Connection to 192.168.20.5 closed. [001@clientC xp001]$ vi 001-fenfa.sh ##让脚本自动分发 [001@clientC xp001]$ sh 001-fenfa.sh hosts hosts 100% 225 0.2KB/s 00:00 sending incremental file list sent 41 bytes received 12 bytes 106.00 bytes/sec total size is 225 speedup is 4.25 Connection to 192.168.20.5 closed. [001@clientC xp001]$ cat 001-fenfa.sh for ip in 192.168.20.5 do scp -p -r /xp001/hosts 001@$ip:~ ssh -t 001@$ip sudo rsync -avz -P $1 /etc done [001@clientC xp001]$ ##如果C端任何目录考到C端任何目录该任何呢! 1.c端也需要sudo提权,需要密码,就相当本地root 和远端001做认证。 ##??? 2.文件目录用户有读取权限就可以拷贝了。 [root@clientC ~]# cp -ap /home/001/.ssh/ /root/ [root@clientC ~]# mkdir /lily [root@clientC ~]# chmod 700 /lily/ [root@clientC ~]# touch /lily/001 [root@clientC ~]# su 001 [001@clientC root]$ sudo -l Matching Defaults entries for 001 on this host: requiretty, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User 001 may run the following commands on this host: (ALL) NOPASSWD: /usr/bin/rsync, (ALL) /usr/bin/scp, (ALL) /bin/cp [001@clientC root]$ sudo scp -p -r /lily/001 001@192.168.20.5:~ scp: /home/001/001: Is a directory [001@clientC root]$ sudo scp -P22 -p -r /lily/ 001@192.168.20.5:~ 001 100% 0 0.0KB/s 00:00 [root@clientC ~]# ll .ssh total 16 drwxrwxr-x 2 001 001 4096 Feb 23 23:36 001 -rw------- 1 001 001 668 Feb 23 23:30 id_dsa -rw-r--r-- 1 001 001 601 Feb 23 23:30 id_dsa.pub -rw-r--r-- 1 001 001 394 Feb 23 23:34 known_hosts [root@clientC .ssh]# diff id_dsa /home/001/.ssh/id_dsa #检查密钥是一致的 [root@clientC .ssh]# [root@clientC .ssh]# ssh -t 001@192.168.20.5 sudo rsync -avz -p /lily/ /etc/ sending incremental file list rsync: change_dir "/lily" failed: No such file or directory (2) sent 18 bytes received 12 bytes 60.00 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6] Connection to 192.168.20.5 closed.
方案三:普通用户建立密钥(setuid对命令提权操作)
[root@clientC .ssh]# which rsync /usr/bin/rsync [root@clientC .ssh]# chmod 4755 /usr/bin/rsync #设置setuid使用该命令用于root权限 [root@clientC .ssh]# ls /usr/bin/rsync -l -rwsr-xr-x. 1 root root 415544 Nov 11 2010 /usr/bin/rsync [root@clientC .ssh]# rsync -avz -P /xp001/001-fenfa.sh -e 'ssh' 001@192.168.20.5:/etc sending incremental file list 001-fenfa.sh 107 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) rsync: mkstemp "/etc/.001-fenfa.sh.ld7zDj" failed: Permission denied (13) sent 183 bytes received 31 bytes 142.67 bytes/sec total size is 107 speedup is 0.50 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6] [root@clientC .ssh]# [001@clientC .ssh]$ rsync -avz -p /etc/hosts -e 'ssh ' 001@192.168.20.5:/etc sending incremental file list hosts rsync: mkstemp "/etc/.hosts.V7AS9m" failed: Permission denied (13) sent 188 bytes received 31 bytes 146.00 bytes/sec total size is 225 speedup is 1.03 rsync error: some files/attrs were not transferred (see previous errors) (code 2 [001@clientC .ssh]$ ^C [001@clientC .ssh]$ rsync -avz -p /etc/hosts -e 'ssh -p 22 ' 001@192.168.20.5:/tmp/ sending incremental file list hosts sent 188 bytes received 31 bytes 146.00 bytes/sec total size is 225 speedup is 1.03
总结批量分发、部署、管理的解决方案:
【1】. secureCRT
借用SecureCRT的交互式交谈窗口(其他远程连接软件也有类似的功能)
a.通过交互式交谈窗口可以批量查看客户端cpu、内存、负载、IP等。
b.批量部署客户端如nagios、puppet等;交互式交谈窗口。
c.分发文件
【2】.把要分发的文件放在一台http server上,然后交互式交谈窗口,统一wget url地址。
适合服务器200台以内的环境,服务器太多,批量部署也会越麻烦。
【3】ssh密钥的方案
简单,易用,功能强大,分发,如果对于1000台以下的机器,我们可以配置rsync daemon模式。
在客户机上通过定时任务rsync命令去分发机上取(puppet ,cfengine都是这个思路)。
ssh key 密钥认证实现批量分发、部署、管理的几种方案:
a.通过root用户直接建立密钥认证。
优点:简单,方便。缺点:及不安全。
b.普通用户建立密钥(需要通过sudo提权操作)
优点:简单,方便,安全,缺点:需技术
c.普通用户建立密钥(setuid对命令提权操作)
[root@clientA tmp]# chmod 4755 /usr/bin/rsync #当普通用户使用rsync命令具备root的权限 [root@clientA etc]# ll /usr/bin/rsync -rwsr-xr-x. 1 root root 410536 Apr 30 2014 /usr/bin/rsync
【4】expect
这里可以直接用expect做批量分发管理,省了密钥认证,交互式命令(结合rsync+scp+sudo),可实现普通用户,root
用户之间文件分发,批量部署及配置管理,查看信息。
优点:简单、强大、缺点:难度略大,相对复杂,需开开发写脚本。
【5】puppet
分发工具,分发和抓取。
缺点:复杂,特别在控制,批量部署方面实现复杂,大部分朋友仅仅实现了数据分发。
【6】cfengine
分发工具,分发和抓取。
缺点:复杂,特别在控制,批量部署方面实现复杂,大部分朋友仅仅实现了数据分发
【7】rsync
分发服务器上部署rsync daemon,然后客户机上通过定时任务抓取的方式实现文件分发。
【8】lsyncd (sersync)
触发式实时的抓取或推送。
【9】http 方式
http server+客户机cron.实现文件分发。
【10】NFS网络文件系统
把要分发的文件放在nfs上,然后在客户端通过定时任务,复制到需要的目录。