首页 > 代码库 > 7)SSH批量管理分发项目
7)SSH批量管理分发项目
ssh服务认证类型介绍
从SSH客户端来看,SSH服务主要提供两种级别的安全验证,具体级别如下:
基于口令的安全验证:
基于口令的安全验证的方式就是大家一直在用的,只要知道服务器的SSH连接账号和口令,应用服务器的IP及开放的端口,默认为22,就可以通过SSH客户端登录到这台远程主机。此时,联机过程中所有传输的数据都是加密的。
基于口令的我们可以通过expect,pssh,sshpass实现批量管理。期中集群:一键搭建及优化50台服务器集群
基于密钥的安全验证:
基于密钥的安全验证方式是指,需要依靠密钥,也就是必须事先建立一堆密钥对,然后把公用密钥(Public key)放到ssh的客户端或对应的客户端服务器上。
此时,如果要想连接到这个带有公用密钥的SSH服务器,客户端SSH软件或者客户端服务器就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求后,会先在该SSH服务器上连接的用户的家目录下寻找放上去的对应用户的公用密钥,然后把它和连接的SSH客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公用密钥加密“质询”(challenge)并把它发送给SSH客户端。
SSH客户端收到“质询”之后,就可以用自己的私钥解密,再把它发送给SSH服务器。使用这种方式,需要知道联机用户的密钥文件,与第一种基于口令验证的方式相比,第二种
SSH批量管理分发项目
1)为所有用户创建用户及密码
useradd oldgirlecho "123456"|passwd --stdin oldgirlid oldgirlsu - oldgirl
2)管理服务器上生成密钥
法一:
ssh-keygen -t dsa (不断回车)Generating public/private dsa key pair.Enter file in which to save the key (/home/oldgirl/.ssh/id_dsa): Created directory ‘/home/oldgirl/.ssh‘.Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/oldgirl/.ssh/id_dsa. (私钥)Your public key has been saved in /home/oldgirl/.ssh/id_dsa.pub. (公钥)The key fingerprint is:e0:eb:3c:a3:5d:95:b6:9d:b3:87:28:39:7f:23:96:56 oldgirl@m01The key‘s randomart image is:+--[ DSA 1024]----+| || || . || . . . || . S + || . o oE. || . ...++. || +o.+ * +o. || ..+o *.o.o |+-----------------+
法二:
ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa >/dev/null 2>&1ll .ssh/总用量 12-rw------- 1 oldgirl oldgirl 601 1月 26 18:55 authorized_keys-rw------- 1 oldgirl oldgirl 668 1月 26 19:11 id_dsa-rw-r--r-- 1 oldgirl oldgirl 603 1月 26 19:11 id_dsa.pub
查看创建好的公钥和私钥
[oldgirl@m01 ~]$ ll .ssh/总用量 8-rw------- 1 oldgirl oldgirl 668 1月 26 18:03 id_dsa (钥匙 私钥)-rw-r--r-- 1 oldgirl oldgirl 601 1月 26 18:03 id_dsa.pub (锁 公钥)
3)m01分发公钥
ssh默认22端口
[oldgirl@m01 ~]$ ssh-copy-id -i .ssh/id_dsa.pub oldgirl@172.16.1.41oldgirl@172.16.1.41‘s password: Now try logging into the machine, with "ssh ‘oldgirl@172.16.1.41‘", and check in: .ssh/authorized_keys (到41上就改名了,因为配置文件里[root@backup ~]# grep authorized_keys /etc/ssh/sshd_config #AuthorizedKeysFile .ssh/authorized_keys ssh配置文件里默认就是这个名字)to make sure we haven‘t added extra keys that you weren‘t expecting.
更改过的ssh端口
ssh-copy-id -i .ssh/id_dsa.pub "-p 52113 oldgirl@172.16.1.31"
4)校验结果:查看各服务器上的IP
ssh -p52113 oldgirl@172.16.1.31 /sbin/ifconfig eth0ssh -p52113 oldgirl@172.16.1.8 /sbin/ifconfig eth0ssh -p52113 oldgirl@172.16.1.41 /sbin/ifconfig eth0
成功标志!连接所有的机器,不提示密码了。
5)最简单的批量管理之查看IP
vim view_ip.sh
ssh -p52113 oldgirl@172.16.1.31 /sbin/ifconfig eth0ssh -p52113 oldgirl@172.16.1.8 /sbin/ifconfig eth0ssh -p52113 oldgirl@172.16.1.41 /sbin/ifconfig eth0
企业里实现ssh方案:3种
http://study.oldboyedu.com/classModule/video/179199/182281/630896/0/0
1)直接root ssh key. 条件:允许root ssh登录
2)sudo提权实现没有权限用户拷贝。 每台机器上配置sudoers echo "oldgirl ALL= NOPASSWD: /usr/bin/rsync" >>/etc/sudoers visudo -c
scp -P52113 hosts oldgirl@172.16.1.41:~
远程sudo:-t参数
ssh -p52113 -t oldgirl@172.16.1.41 sudo rsync ~/hosts /etc/hosts
3)利用suid实现没有权限用户拷贝。(做思维扩展了解) 172.16.1.31:上做一个suid的授权 chmod u+s which rsync
m01服务器上 scp -P52113 hosts oldgirl@172.16.1.31:~ ssh -p52113 oldgirl@172.16.1.31 rsync ~/hosts /etc/hosts (进行覆盖)
4)批量分发覆盖/etc/hosts文件。 vim fenfa_file.sh
scp -P52113 hosts oldgirl@172.16.1.31:~ssh -p52113 -t oldgirl@172.16.1.31 sudo rsync ~/hosts /etc/hostsscp -P52113 hosts oldgirl@172.16.1.41:~ssh -p52113 -t oldgirl@172.16.1.41 sudo rsync ~/hosts /etc/hostsscp -P52113 hosts oldgirl@172.16.1.8:~ssh -p52113 -t oldgirl@172.16.1.8 sudo rsync ~/hosts /etc/hosts然后查看客户端是否已经修改。已修改表示成功。
5)ssh隧道模式
rsync -avz hosts -e ‘ssh -p 52113‘ oldgirl@172.16.1.41:~
6)自动化脚本
vim scripts/fenfa_file1.sh
#!/bin/sh. /etc/init.d/functionsfor n in 8 31 41do scp -P52113 ~/hosts oldgirl@172.16.1.${n}:~ >/dev/null 2>&1 && ssh -p52113 -t oldgirl@172.16.1.${n} sudo rsync ~/hosts /etc/hosts >/dev/null 2>&1 if [ $? -eq 0 ];then action "fenfa hosts 172.16.1.$n" /bin/true else aciton "fenfa hosts 172.16.1.$n" /bin/false fi done结果:[oldgirl@m01 ~]$ sh scripts/fenfa_file1.sh fenfa hosts 172.16.1.8 [确定]fenfa hosts 172.16.1.31 [确定]fenfa hosts 172.16.1.41 [确定]
优化(在命令行即可填写源文件目录 及到目的地目录)
[oldgirl@m01 ~]$ cat scripts/fenfa_file2.sh
#!/bin/shif [ $# -ne 2 ];then echo "USACE:/bin/sh $0 ARG1 ARG2" exit 1fi. /etc/init.d/functionsfor n in 8 31 41do scp -P52113 ~/$1 oldgirl@172.16.1.${n}:~ >/dev/null 2>&1 && ssh -p52113 -t oldgirl@172.16.1.${n} sudo rsync ~/$1 $2 >/dev/null 2>&1 if [ $? -eq 0 ];then action "fenfa hosts 172.16.1.$n" /bin/true else action "fenfa hosts 172.16.1.$n" /bin/false fi done
[oldgirl@m01 ~]$ sh scripts/fenfa_file2.sh mo1.txt /opt
fenfa hosts 172.16.1.8 [确定]fenfa hosts 172.16.1.31 [确定]fenfa hosts 172.16.1.41 [确定]
做一个可以加参数既可以管理所有服务器
[oldgirl@m01 ~]$ cat scripts/view_ip.sh
#!/bin/shif [ $# -ne 1 ];then echo "USAGE:/bin/sh $0 ARG1" exit 1fifor n in 8 31 41do echo ===========172.16.1.$n=========== ssh -p52113 oldgirl@172.16.1.$n "$1"done
[oldgirl@m01 ~]$ sh scripts/view_ip.sh
USAGE:/bin/sh scripts/view_ip.sh ARG1
[oldgirl@m01 ~]$ sh scripts/view_ip.sh "/sbin/ifconfig eth0"
===========172.16.1.8===========eth0 Link encap:Ethernet HWaddr 00:0C:29:0A:9A:09 inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe0a:9a09/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:5454 errors:0 dropped:0 overruns:0 frame:0 TX packets:2994 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:5269705 (5.0 MiB) TX bytes:259828 (253.7 KiB)===========172.16.1.31===========eth0 Link encap:Ethernet HWaddr 00:0C:29:9A:3B:9B inet addr:10.0.0.31 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe9a:3b9b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1550 errors:0 dropped:0 overruns:0 frame:0 TX packets:998 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:147840 (144.3 KiB) TX bytes:150446 (146.9 KiB)===========172.16.1.41===========eth0 Link encap:Ethernet HWaddr 00:0C:29:C3:10:CC inet addr:10.0.0.41 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fec3:10cc/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1146 errors:0 dropped:0 overruns:0 frame:0 TX packets:736 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:120748 (117.9 KiB) TX bytes:84306 (82.3 KiB)
[oldgirl@m01 ~]$ sh scripts/view_ip.sh "cat /etc/redhat-release"
===========172.16.1.8===========CentOS release 6.8 (Final)===========172.16.1.31===========CentOS release 6.8 (Final)===========172.16.1.41===========CentOS release 6.8 (Final)
SSH批量分发与管理方案小结:
1)利用root做ssh key验证。
优点:简单,易用缺点:安全性差,同时无法禁止root远程连接这个功能。企业应用:80%的中小企业。
2)利用普通用户如oldgirl来做
思路是先把分发的文件拷贝到服务器用户家目录,然后sudo提权拷贝分发的文件到远程服务器的对应权限目录。优点:安全,无需停止root远程连接这个功能。缺点:配置比较复杂。
3)拓展:同方案2,知识不用sudo,而是设置suid对固定命令提权。
优点:相对安全。缺点:复杂,安全性差,任何人都可以处理带有suid权限的命令。
建议:
1)追求简单,选1.2)追求安全,选2. 有能力可以玩:puppet,saltstack. suid:普通用户运行程序,没权限时也可以suid,然后运行,必须是编译好的程序命令。
重要安全思想:
不管用什么方法,我们一定要管理好中心分发服务器,因为他的权限很大,很重要,1)一定要取消中心分发服务器的外网IP。2)开启防火墙禁止SSH对外用户登录,并仅给某一台后端无外网机器访问,然后这台后端的服务器依然没有外网IP,并且仅能通过VPN连接,这样中心分发服务器就相对安全了。
企业自动化管理方案:
1)最简单最常用ssh key,功能最强大的,一般中小型企业会用,50-100台以下。2)sina cfengine/puppet 较早的批量管理工具,复杂,笨重。3)门户级别比较流行的,puppet批量管理工具,复杂,笨重。4)saltstack批量管理工具,特点:简单,功能强大(配置复杂),赶集网,小米,一些CDN 公司。5)http+cron批量管理路线:sshkey--->cfengine--->puppet--->saltstack/ansible
非交互式生成密钥及实现批量管理(非交互式工具:expect,SSHpass,pssh)
管理机安装expect
yum install expect -y rpm -qa expect
expect 也有可以生成随机数字的命令
mkpasswd -l(指定长度)
[root@m01 ~]# mkpasswd -l 15iwib/yyCMlg5hm2
1)为所有用户创建用户及密码
useradd oldgirl888echo "123456"|passwd --stdin oldgirl888id oldgirl888su - oldgirl888
2)管理服务器上生成密钥
ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa >/dev/null 2>&1
3)分发公钥
ssh-copy-id -i .ssh/id_dsa.pub "-p 52113 oldgirl@172.16.1.31"
[oldgirl888@m01 ~]$ expect fenfa_sshke.exp
usage: expect fenfa_sshkey.exp file host
创建exxpect脚本
vi fenfa_sshke.exp
#!/usr/bin/expectif { $argc != 2 } { send_user "usage: expect fenfa_sshkey.exp file host\n" exit}#define varset file [lindex $argv 0]set host [lindex $argv 1]set password "123456"#spawn scp /etc/hosts root@10.0.0.142:/etc/hosts#spawn scp -P52113 $file oldboy@$host:$dirspawn ssh-copy-id -i $file "-p 52113 oldgirl888@$host"expect { "yes/no" {send "yes\r";exp_continue} "*password" {send "$password\r"}}expect eofexit -onexit { send_user "Oldboy say good bye to you!\n"}#script usage#expect oldboy-6.exp file host dir#example#expect fenfa_sshkey.exp file host dir#expect oldboy-6.exp /etc/hosts 10.0.0.41:~
测试expect脚本免输入创建密钥对
[oldgirl888@m01 ~]$ expect fenfa_sshke.exp .ssh/id_dsa.pub 172.16.1.31
spawn ssh-copy-id -i .ssh/id_dsa.pub -p 52113 oldgirl888@172.16.1.31The authenticity of host ‘[172.16.1.31]:52113 ([172.16.1.31]:52113)‘ can‘t be established.RSA key fingerprint is 87:9c:42:c6:7a:78:72:d4:57:55:21:38:74:e0:8e:b6.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added ‘[172.16.1.31]:52113‘ (RSA) to the list of known hosts.oldgirl888@172.16.1.31‘s password: Now try logging into the machine, with "ssh ‘-p 52113 oldgirl888@172.16.1.31‘", and check in: .ssh/authorized_keysto make sure we haven‘t added extra keys that you weren‘t expecting.Oldboy say good bye to you!
客户端已收到)[oldgirl888@nfs01 ~]$ ls .ssh
authorized_keys
测试查询一下ip)[oldgirl888@m01 ~]$ ssh -p52113 oldgirl888@172.16.1.31 /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:9A:3B:9B inet addr:10.0.0.31 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe9a:3b9b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1824 errors:0 dropped:0 overruns:0 frame:0 TX packets:1213 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:176048 (171.9 KiB) TX bytes:169774 (165.7 KiB)
批量自动分发公钥到服务器上脚本
[oldgirl888@m01 scripts]$ vim fenfa_sshke.sh
#!/bin/sh. /etc/init.d/functionsfor ip in 8 31 41do expect fenfa_sshke.exp ~/.ssh/id_dsa.pub 172.16.1.$ip >/dev/null 2>&1if [ $? -eq 0 ];then action "$ip" /bin/trueelse action "$ip" /bin/falsefidone
执行自动分发公钥的脚本测试
[oldgirl888@m01 scripts]$ sh fenfa_sshke.sh
8 [确定]31 [失败] 因为前面测试已传送41 [确定]
一键给多台服务器安装http服务:
useradd gongli888echo "123456"|passwd --stdin gongli888id gongli888#配置suduers#每台机器上配置sudoersecho "gongli888 ALL= NOPASSWD: ALL" >>/etc/sudoersvisudo -csu - gongli888
创建自动连接到其他服务器上的时候填写yes和密码的exxpect脚本
创建了两个模块,可以快速指定源文件和目标ip.可以通过 expect ~/scripts/fenfa_sshke.exp ~/.ssh/id_dsa.pub 172.16.1.$ 来将创建好的密钥发给172.16.1.$
vim fenfa_sshke.exp
#!/usr/bin/expectif { $argc != 2 } { send_user "usage: expect fenfa_sshkey.exp file host\n" exit}#define varset file [lindex $argv 0]set host [lindex $argv 1]set password "123456"#spawn scp /etc/hosts root@10.0.0.142:/etc/hosts#spawn scp -P52113 $file oldboy@$host:$dirspawn ssh-copy-id -i $file "-p 52113 gongli888@$host"expect { "yes/no" {send "yes\r";exp_continue} "*password" {send "$password\r"}}expect eofexit -onexit { send_user "Oldboy say good bye to you!\n"}#script usage#expect oldboy-6.exp file host dir#example#expect fenfa_sshkey.exp file host dir#expect oldboy-6.exp /etc/hosts 10.0.0.41:~
创建密钥对,并实现可以远程安装等操作
vim auto_deploy.sh
#!/bin/sh. /etc/init.d/functions#1)product key paissh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa >/dev/null 2>&1 if [ $? -eq 0 ];then action "create dsa $ip" /bin/true else action "create dsa $ip" /bin/false exit 1fi#2)dis pub keyfor ip in 8 31 41do expect ~/scripts/fenfa_sshke.exp ~/.ssh/id_dsa.pub 172.16.1.$ip >/dev/null 2>&1if [ $? -eq 0 ];then action "$ip" /bin/trueelse action "$ip" /bin/falsefidone#3)dis fenfa scriptsfor n in 8 31 41do scp -P 52113 -rp ~/scripts gongli888@172.16.1.$n:~done#4)install servicefor m in 8 31 41do ssh -t -p 52113 gongli888@172.16.1.$m sudo /bin/bash ~/scripts/install.shdone
7)SSH批量管理分发项目