APT404-不作恶

在路上,一直在路上!

基于 Ssh Key 的分发安全



0x01 利用最原始的 SSH key ,实现批量ssh管理 只适合较小规模集群场景,通常在100台机器以内,要实现的最终效果,如下:

1
2
可以批量分发文件,进行常规配置管理
可以批量执行shell命令,进行日常维护操作

演示环境:

1
2
3
SshKeyMaster 	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
2
# useradd sysadm
# echo "admin" | passwd --stdin 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
2
$ ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 22 sysadm@192.168.5.13"
$ ssh -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
2
$ /bin/sh send_file.sh /etc/hosts
$ /bin/sh send_file.sh ./send_dir/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
########################## 批量分发文件 ###############################
#!/bin/bash
# use: ssh key commond / file
if [ $# -ne 1 ];then
echo "use: sh ssh_key.sh file | dir"
exit 1
fi

for n in 12 13
do
scp -P22 -p -r $1 sysadm@192.168.5.$n:~ &>/dev/null
if [ $? -eq 0 ];then
echo -e "$n send ok \n"
else
echo -e "$n ,Oh No,send failed \n"
fi
done
1
$ /bin/sh send_cmd.sh "rm -fr /home/sysadm/send_dir"
1
2
3
4
5
6
7
8
9
10
11
12
13
########################## 批量执行shell命令 ###############################
#!/bin/bash
# use: ssh key commond / file
if [ $# -ne 1 ];then
echo "use: sh ssh_cmd.sh cmd"
exit 1
fi

for n in 12 13
do
echo -e "\n-----------------------------------------------------------------------"
ssh -p22 sysadm@192.168.5.$n $1
done

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
########################## 利用sudo 来分发文件,执行命令  ###############################
#!/bin/bash
# use: ssh key commond / file
if [ $# -ne 2 ];then
echo "use: sh ssh_sudo_file.sh localfile remotedir"
exit 1
fi

for n in 12 13
do
scp -P22 -r -p $1 sysadm@192.168.5.$n:~ &>/dev/null && \
ssh -t sysadm@192.168.5.$n sudo rsync $1 $2 &>/dev/null
if [ $? -eq 0 ];then
echo -e "$n exec ok !\n"
else
echo -e "$n , Oh No ,exec failed! "
fi
done

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这类的工具来管理,没完,待续……


env