基于 Ssh Key 的分发安全
0x01 利用最原始的 SSH key ,实现批量ssh管理 只适合较小规模集群场景,通常在100台机器以内
,要实现的最终效果,如下:1
2可以批量分发文件,进行常规配置管理
可以批量执行shell命令,进行日常维护操作
演示环境:1
2
3SshKeyMaster ip: 192.168.5.11 CentOS6.8 x86_64 分发机
SshKeySlave5 ip: 192.168.5.13 CentOS5.5 i386 分发客户机
SshKeySlave7 ip: 192.168.5.12 CentOS7 x86_64 分发客户机
0x02 基于SSH key 的批量ssh管理,具体实现过程:
以下是在这方面已经相对比较成熟的一些工具框架,后续会再专门针对每一种进行单独说明:1
saltstack,ansible,puppet...
1 | # rpm -qa openssh openssl 务必确保所有机器均已事先安装好ssh且ssh服务已正常开启 |
0x03 先在所有机器上 [ 注意,是所有机器,密码完全一致 ]
创建一个普通用户,因为等会儿我们要用此用户身份来进行各种分发操作
切记,严禁直接用root分发,权限过高,太危险,分发机一旦被攻陷,其它的分发客户机也就随之沦陷了,建议,如果实在有需求可以用sudo或suid [其实也不推荐]来暂时性授权
1 | # useradd sysadm |
0x04 再在分发机上创建好密钥对,准备发到各个客户机上1
2
3
4
5# su - sysadm 切到刚刚创建的用户下
$ ssh-keygen -t dsa 一路回车即可
$ ls -l .ssh/
-rw------- 1 sysadm sysadm 668 Nov 27 14:11 id_dsa 私钥[钥匙]
-rw-r--r-- 1 sysadm sysadm 609 Nov 27 14:11 id_dsa.pub 公钥[锁],把公钥分发给所有要ssh的机器
0x05 最后,批量往所有分发客户机上发送刚刚创建好的公钥把锁丢给别人,钥匙自己拿着
, 在初次部署,机器比较多的情况下,也可利用expect的方式进行发送1
2$ ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 22 sysadm@192.168.5.12"
$ ssh -p 22 sysadm@192.168.5.12 现在即可无密码ssh登陆
1 | $ ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 22 sysadm@192.168.5.13" |
1 | $ ls .ssh/authorized_keys 这是实际到目标机器上的文件名,只不过过去的时候被改名了,其实跟id_dsa.pub文件中的内容是一模一样的,权限600 |
0x06 尝试在远程机器上执行shell命令:1
2$ ssh -p22 sysadm@192.168.5.12 hostname
$ ssh -p22 sysadm@192.168.5.13 hostname
0x07 尝试批量往远程机器上分发文件:1
2$ scp -P22 -p -r /etc/hosts sysadm@192.168.5.12:~ 直接往对方sysadm用户的家目录下发
$ scp -P22 -p -r /etc/hosts sysadm@192.168.5.13:~
0x08 通过脚本进行批量文件分发及shell命令执行:
1 | $ /bin/sh send_file.sh /etc/hosts |
1 | ########################## 批量分发文件 ############################### |
1 | $ /bin/sh send_cmd.sh "rm -fr /home/sysadm/send_dir" |
1 | ########################## 批量执行shell命令 ############################### |
0x09 除了分发文件,执行命令,我们也可以尝试利用ssh key 实现免密码rsync数据同步,不过实际基本不会这么做,太危险,因为ssh key同样也可以执行命令:1
# rsync -avzP -e 'ssh -p 22' /tmp/ sysadm@192.168.5.4:/tmp/
0x10 分发过程中需要注意的一些的问题:1
2
3
4严禁用root的ssh key进行各种分发操作,非常危险,分发机一旦被攻陷,其它的机器也就跟着沦陷了
让普通用户使用sudo来执行特权操作,还是有些危险
也可以用suid来控制,对要执行的命令进行suid,实际中也最好不要用,比较危险
推荐使用各种第三方工具,如,puppet,saltstack
0x11 利用sudo的方式批量执行shell命令,到所有分发机客户机上对sysadm用户添加特权命令,具体操作如下,实际中把上面的稍微改下即可:1
2
3# echo "sysadm ALL=(ALL) NOPASSWD:/usr/bin/rsync" >> /etc/sudoers
# visudo -c
# grep sysadm /etc/sudoers
脚本意思就是先把修改好的系统配置文件推到远程机器上的sysadm家目录下,再用sudo来执行特权操作,说实话,既然都可以操作系统配置文件了,创建个用户又有多难呢,所以,自己觉得这样也并不是特别安全1
$ /bin/sh send_sudo_file.sh hosts /etc/
1 | ########################## 利用sudo 来分发文件,执行命令 ############################### |
0x12 至于如何利用suid 进行分发,就更简单了,只需要把你经常要用的一些命令加上suid权限属性就好了,如,我们前面用过的rsync,其实,个人觉得这样等于说就是帮别人留了个后门,上来以后,只需要find下当前系统中所有的suid,一下就能看到rsync,接着再把自己在本地修改好的系统配置文件直接传上来覆盖,后果你懂的,完全通过配置文件就可以创建一个root用户,根本不需要任何命令工具,这就是linux一切皆文件的好处,如果真想用,稍微改下脚本就好了,还是那句话,如果是自己手里的服务器最好还是不要这样搞1
2# chmod 4755 /usr/bin/rsync 让rsync具有suid属性
# ls -l /usr/bin/rsync
0x13 最后,利用定时任务执行各种分发任务即可,比较简单,此处就不细说了:1
# crontab -e
0x14 分发机自身的安全问题:1
2
3严禁直接把分发机暴露在公网中
只允许特定的跳板机才能访问到分发机
...
小结:
关于分发安全,大致就先说到这里,个人还是更推荐直接用saltstack这类的工具来管理,没完,待续……