1-部署环境。
[root@m01 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@m01 ~]# uname -r
2.6.32-696.el6.x86_64
2-实现架构拓扑。
3-具体步骤。
1-批量添加用户oldboy
[root@m01 ~]# useradd oldboy
[root@m01 ~]# echo 123456|passwd --stdin oldboy
2-调整优化 ssh 配置文件
[root@m01 ~]# sed -i '13 iPort 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUserDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config
3-hosts 解析
[root@m01 ~]# cat >>/etc/hosts<<EOF
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web02
172.16.1.8 web01
172.16.1.51 db01
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
EOF
4-用普通用户生成密钥。
[root@m01 ~]su - oldboy
[oldboy@m01 ~]$ ssh-keygen -t dsa (一路回车)
#--->ssh-keygen 是生产秘钥的工具, -t 指定建立秘钥的类型,这里是建立 dsa 类型秘钥
#--->也可以执行 ssh-keygen -t rsa 来建立 rsa 类型秘钥
#--->RSA 与 DSA 加密算法的区别
#--->RSA 是一种加密算法(PS:RSA 也可以进行数字签名),它的简写的来由是 Ron vest,Adi shamir和 Leonard adaemon,这三个首字母连接起来就是 RSA
#--->DSA 就是数字签名算法的英文全称的简写,即 Digital Signature Algorithm,简写就是 DSA,RSA 既可以进行加密也可以进行数字签名实现认证,而 DSA 只能用于数字签名实现认证。
非交互式创建密钥:
1、一键生成密钥对 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
2、echo -e "\n"|ssh-keygen -t dsa -N ""
[oldboy@m01 ~]$ ls .ssh/ -al
total 20
drwx------ 2 oldboy oldboy 4096 Apr 17 21:33 .
drwx------ 3 oldboy oldboy 4096 Apr 17 22:01 ..
-rw------- 1 oldboy oldboy 668 Apr 17 21:23 id_dsa
-rw-r--r-- 1 oldboy oldboy 600 Apr 17 21:23 id_dsa.pub
-rw-r--r-- 1 oldboy oldboy 786 Apr 17 21:34 known_host
5-分发公钥。
未更改默认端口的话,执行:
[oldboy@m01 ~]$ ssh-copy-id -i .ssh/id_dsa.pub oldboy@172.16.1.41
已更改端口的话,执行:
ssh-copy-id -i .ssh/id_dsa.pub "-p 52113 oldboy@172.16.1.41"
#该命令只能发公钥,不能发私钥
在backup上查看,发现被改名为权限是 600 的 autorized_keys.
[oldboy@backup ~]$ ls -l ./.ssh/
total 12
-rw-------. 1 oldboy oldboy 600 Apr 17 21:33 authorized_keys
-rw-------. 1 oldboy oldboy 668 Apr 17 21:31 id_dsa
-rw-r--r--. 1 oldboy oldboy 603 Apr 17 21:31 id_dsa.pub
也可以通过 scp、 rsync 等手动拷贝(需要注意 600 的权限以及更名 authorized_keys)
6-批量操作测试。
批量查看1:
[oldboy@m01 ~]$ cat neihe.sh
#!/bin/sh
for n in 31 41
do
ssh -p22 172.16.1.$n cat /etc/redhat-release
done
[oldboy@m01 ~]$ bash neihe.sh
CentOS release 6.9 (Final)
CentOS release 6.9 (Final)
批量查看2:
[oldboy@m01 ~]$ cat neihe.sh
#!/bin/sh
for n in 31 41
do
echo "===172.16.1.$n==="
ssh -p22 172.16.1.$n $1
done
[oldboy@m01 ~]$ sh neihe.sh "cat /etc/redhat-release"
===172.16.1.31===
CentOS release 6.9 (Final)
===172.16.1.41===
CentOS release 6.9 (Final)
[oldboy@m01 ~]$ sh neihe.sh "/sbin/ifconfig eth0"
批量分发1:
[oldboy@m01 ~]$ cat neihe.sh
#!/bin/sh
for n in 31 41
do
echo "===172.16.1.$n==="
scp -P22 $1 172.16.1.$n:~
done
[oldboy@m01 ~]$ scp -P22 444 172.16.1.31:
/etc/ #只能推送到对方服务器oldboy的家目录
scp: /etc//444: Permission denied
[oldboy@m01 ~]$ scp -P22 444 172.16.1.31:~
444 100% 0 0.0KB/s 00:00
[oldboy@nfs01 ~]$ ls
111 222 333 444
批量分发2:
[oldboy@m01 ~]$ vim neihe.sh
#!/bin/sh
if [ $# -ne 1 ];then
echo "USAGE:/bin/sh $0 FILENAME"
exit 1
fi
for n in 31 41
do
echo "===172.16.1.$n==="
scp -P22 $1 172.16.1.$n:~
done
[oldboy@m01 ~]$ bash neihe.sh
USAGE:/bin/sh neihe.sh FILENAME
[oldboy@m01 ~]$ bash neihe.sh 555
===172.16.1.31===
555 100% 0 0.0KB/s 00:00
===172.16.1.41===
555 100% 0 0.0KB/s 00:00
[oldboy@backup ~]$ ls
111 222 333 555
批量分发3:
[oldboy@m01 ~]$ vim neihe.sh
#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 1 ];then
echo "USAGE:/bin/sh $0 FILENAME"
exit 1
fi
for n in 31 41
do
echo "===172.16.1.$n==="
scp -P22 $1 172.16.1.$n:~ &>/dev/null
if [ $? -eq 0 ];then
action "dis $1 to 172.16.1.$n" /bin/true
else
action "dis $1 to 172.16.1.$n" /bin/false
fi
done
[oldboy@m01 ~]$ bash neihe.sh 666
===172.16.1.31===
dis 666 to 172.16.1.31 [ OK ]
===172.16.1.41===
dis 666 to 172.16.1.41 [ OK ]
4-SSH 免密码登陆小结:
1) 免密码登陆验证是单向的,方向从私钥(钥匙) ===》公钥(锁)
2) ssh免密码登陆是基于相同用户,最好不要跨不同的用户
3) ssh连接慢的问题解决方案(优化/etc/ssh/sshd_config)
5-SSH 批量管理步骤:
1) 所有机器创建用户及密码
useradd oldboy
echo 123456|passwd --stdin oldboy
id oldboy
su - oldboy
2) 创建秘钥对
ssh-keygen -t dsa(全部回车至无需确认为止)
3) m01 分发公钥
ssh 默认 22 端口时:
ssh-copy-id -i .ssh/id_dsa.pub oldboy@172.16.1.41
ssh 端口非默认时:
ssh-copy-id -i .ssh/id_dsa.pub “-p 52113 oldboy@172.16.1.31”
4) 测试
ssh -p52113 oldboy@172.16.1.31 /sbin/ifconfig eth0
非第一次不需输入密码即为正确
注意: ssh -p52113 oldboy@172.16.1.31 “cat /etc/redhat-release”
有间隔的整条命令最好用“”括起来
7-SSH批量分发提权
方法1:配置sudoers
1-配置sudoers(在服务器backup配置)
[root@backup ~]# echo "oldboy ALL= NOPASSWD: /usr/bin/rsync" >>/etc/sudoers
2-先scp复制到家目录
[oldboy@m01 ~]$ scp -P22 hosts oldboy@172.16.1.41:~
3-再ssh复制到/etc/hosts
[oldboy@m01 ~]$ ssh -p22 -t oldboy@172.16.1.41 sudo rsync -avz ~/hosts /etc/hosts
方法2:设置 suid 权限
[root@nfs01 ~]# ls -l `which rsync`
-rwxr-xr-x. 1 root root 414968 Apr 30 2014 /usr/bin/rsync
[root@nfs01 ~]# chmod u+s `which rsync` (chmod 4755 `which rsync`)
[root@nfs01 ~]# ls -l `which rsync`
-rwsr-xr-x. 1 root root 414968 Apr 30 2014 /usr/bin/rsync
[oldboy@m01 ~]$ scp -P22 hosts oldboy@172.16.1.31:~
#端口22的话可以省略,即-P22可以去掉
[oldboy@m01 ~]$ ssh -p22 oldboy@172.16.1.31 rsync -avz ~/hosts /etc/hosts
方法3:直接使用 root
需要取消 ssh 配置文件里/etc/ssh/sshd_config禁止 root 登录的限制。
企业级生产场景批量管理自动化管理方案:
1) 最简单最常用 ssh key,功能最强大,一般中小企业会用,50-100 台以下
2) sina cfengine/puppet 较早的批量管理工具,现在基本没企业用
3) 门户级别较流行的, puppet 批量管理工具,复杂、笨重
4) saltstack 批量管理工具,特点:简单、功能强大(配置复杂),赶集网、小米以及一些 CDN 公司常用
5) http+cron
批量管理路线: ssh key--->puppet--->saltstack/ansible
8-如何实现自动创建秘钥对,同时分发公钥(编写脚本实现)
需要安装一个软件sshpass用来提供用户密码:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install sshpass
[root@m01 ~]# vim fenfa.sh
#!/bin/bash
###make key
\rm -f /root/.ssh/id_dsa
ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" -q
###fengfagongyao
for ip in 31 41
do
echo ====fenfa key to host 172.16.1.$ip====
sshpass -p111111 ssh-copy-id -i /root/.ssh/id_dsa.pub "-
o StrictHostKeyChecking=no root@172.16.1.$ip"
echo ===============fenfa end==============
echo ""
done
脚本说明:
ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" -q
创建密钥,-f指定存放位置,-P 密钥加密的密码 -q 减少信息输出
sshpass -p111111 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no root@172.16.1.$ip"
ssh-copy-id 命令来分发密钥 -i 指定密钥本地存放的路径
-o StrictHostKeyChecking=no 在登陆其他服务器时不选择yes/no