Linux System Environment
[root@ansible ~]# cat /etc/redhat-release #==》系统版本
CentOS Linux release 7.5.1804 (Core)
[root@ansible ~]# uname –r #==》系统内核
3.10.0-862.el7.x86_64
[root@ansible ~]# uname -m #==》系统位数
x86_64
[root@ansible ~]# echo $LANG #==》系统字符集
en_US.UTF-8
[root@ansible ~]# ssh –V #==》SSH版本
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
SSH Function
1、远程登陆linux
2、使用密码或密钥对验证登陆远程Linux
3、实现批量管理linux服务器(功能较差,建议使用ansible)
SSH Note
1、ssh默认端口22,使用ssh协议
2、服务端配置文件/etc/ssh/sshd_config
3、客户端配置文件/etc/ssh/ssh_config(基本不用)
4、SSH协议有两个版本,SSH 1.x和SSH 2.x,建议使用 SSH 2.x版本
5、SSH采用密钥对验证,公钥(锁)和私钥(钥匙)
6、SSH采用加密算法有RSA和DSA算法,RSA可以加密也可以数字签名实现认证,DSA只能数字签名实现认证,不指定参数默认创建是RSA
SSH命令参数
1、-p #==》指定远程连接端口
2、-i #==》指定公钥文件
3、-t #==》指定生成密钥算法(RSA和DSA )
SSH配置优化
标注:修改SSH配置文件 /etc/ssh/sshd_config(根据需求选择)
Port 52113 #==》建议使用大于10000以上的端口
PermitRootLogin no #==》禁止root远程登录
PermitEmptyPasswords no #==》禁止使用空密码远程登录
UseDNS no #==》不使用dns解析
GssAPIAuthentication no #==》解决连接ssh缓慢问题
PasswordAuthentication no #==》禁用ssh用密码登陆,只能使用密钥对验证登陆
ListenAddress 0.0.0.0 #==》指定远程监控的IP地址,此地是指定本机网卡IP地址,也可以指定多个监听端口
一、SSH服务免密配置
主机规划
外网IP地址 内网IP地址 计算名 备注
10.0.0.30 172.16.1.30 ansible SSH服务端(私钥)
10.0.0.31 172.16.1.31 test01 SSH客户端(公钥)
10.0.0.32 172.16.1.32 test02 SSH客户端(公钥)
1、配置阿里云Yum源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache
2、Yum安装SSH软件(默认已经安装)
yum -y install openssh openssl
rpm -qa openssh openssl
3、启动SSH服务并设置开机自启动
systemctl start sshd
systemctl enable sshd
systemctl status sshd
4、创建密钥对
[root@ansible ~]# ssh-keygen #==》默认生成rsa算法的密钥
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #==》密钥保存路径,按回车确认即可
Enter passphrase (empty for no passphrase): #==》设置密钥文件密码,按回车确认即可
Enter same passphrase again: #==》确认密钥文件密码,按回车确认即可
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Nk/4iqnAvJxQs+0PbmSlKWZnCddlCiP9C+b5TwGjtG4 root@ansible
The key's randomart image is:
+---[RSA 2048]----+
| . |
| . + o |
| ..=o+ |
| ..+o=o . |
| o=oB .S . |
| ++=@ .. * |
|.o=*E. . o |
| o B...+ . |
| +.+o+.o |
+----[SHA256]-----+
[root@ansible ~]# ls -l /root/.ssh/
total 8
-rw------- 1 root root 1679 Aug 5 14:34 id_rsa #==》私钥
-rw-r--r-- 1 root root 394 Aug 5 14:34 id_rsa.pub #==》公钥
5、私钥保存在SSH服务端,公钥发送给客户端
#==》首次登陆会提示确认信息与输入客户端root密码验证
[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
[root@ansible ~]# ls /root/.ssh/
id_rsa id_rsa.pub known_hosts
[root@ansible ~]# cat /root/.ssh/known_hosts #==》记录SSH服务端首次登陆客户端信息
10.0.0.31 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDj4xnopm/g0G8uaIsClu2iOZz/ERogK6z+J8fjlqaue60vbasDgEgBTkjp7HSLXUffGvD4xT/elTj71V6WKmH8=
10.0.0.32 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDj4xnopm/g0G8uaIsClu2iOZz/ERogK6z+J8fjlqaue60vbasDgEgBTkjp7HSLXUffGvD4xT/elTj71V6WKmH8=
6、SSH服务端登陆SSH客户端测试
[root@ansible ~]# ssh 10.0.0.31 #==》登陆SSH客户端10.0.0.31
Last login: Mon Aug 5 14:50:00 2019 from 10.0.0.30
[root@test01 ~]# hostname
test01
[root@test01 ~]# hostname -I
10.0.0.31 172.16.1.31
[root@ansible ~]# ssh 10.0.0.32 #==》登陆SSH客户端10.0.0.32
Last login: Mon Aug 5 14:39:06 2019 from 10.0.0.1
[root@test02 ~]# hostname
test02
[root@test02 ~]# hostname -I
10.0.0.32 172.16.1.32
7、SSH客户端10.0.0.31生成的公钥文件
[root@test01 ~]# ls -l /root/.ssh/
total 4
-rw------- 1 root root 394 Aug 5 14:40 authorized_keys
二、Shell脚本实现批量免密操作
主机规划
标注:优化SSH配置文件两项
UseDNS yes 修改成 no
GSSAPIAuthentication yes 修改 no
外网IP地址 内网IP地址 计算名 备注
10.0.0.30 172.16.1.30 ansible SSH服务端(私钥)
10.0.0.31 172.16.1.31 test01 SSH客户端(公钥)
10.0.0.32 172.16.1.32 test02 SSH客户端(公钥)
1、SSH服务端操作
标注:sshpass工具解决SSH命令行指定密码登陆
[root@ansible ~]# yum -y install sshpass #==》安装sshpass工具免密码输入
[root@test02 ~]# mkdir -p /server/scripts/
[root@ansible ~]# vim /server/scripts/ssh_sent.sh
#!/bin/bash
if [ -f /root/.ssh/id_rsa ];then
echo "----------密钥对已经存在---------------"
else
echo "----------正在生成密钥对---------------"
ssh-keygen -f /root/.ssh/id_rsa -N '' > /dev/null 2>&1
fi
for i in {31,32}
do
echo "正在操作:172.16.1.${i}"
echo "----------正在分发--------"
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.${i} -o StrictHostKeyChecking=no > /tmp/ssh.log 2>&1
echo "----------正在备份SSH配置-----"
ssh 172.16.1.${i} "\cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak"
echo "----------正在优化SSH配置----"
ssh 172.16.1.${i} "sed -i 's@#UseDNS yes@UseDNS no@g' /etc/ssh/sshd_config"
ssh 172.16.1.${i} "sed -i 's@#GSSAPIAuthentication yes@GSSAPIAuthentication no@g' /etc/ssh/sshd_config"
sleep 2
echo "----------测试优化后的连接"
ssh 172.16.1.${i} hostname
done
[root@ansible ~]# sh /server/scripts/ssh_sent.sh
[root@ansible ~]# sh /server/scripts/ssh_sent.sh
----------正在生成密钥对---------------
正在操作:172.16.1.31
----------正在分发--------
----------正在备份SSH配置-----
----------正在优化SSH配置----
----------测试优化后的连接
test01
正在操作:172.16.1.32
----------正在分发--------
----------正在备份SSH配置-----
----------正在优化SSH配置----
----------测试优化后的连接
test02
[root@ansible ~]# ls -l /root/.ssh/
total 12
-rw------- 1 root root 1675 Aug 5 15:53 id_rsa
-rw-r--r-- 1 root root 394 Aug 5 15:53 id_rsa.pub
-rw-r--r-- 1 root root 346 Aug 5 15:53 known_hosts
[root@ansible ~]# ssh 172.16.1.31
Last login: Mon Aug 5 15:35:31 2019 from 172.16.1.30
[root@test01 ~]# hostname
test01
[root@ansible ~]# ssh 172.16.1.32
Last login: Mon Aug 5 15:35:36 2019 from 172.16.1.30
[root@test02 ~]# hostname
test02
2、SSH客户端检查
[root@test01 ~]# ls -l /root/.ssh/
total 4
-rw------- 1 root root 394 Aug 5 15:53 authorized_keys
[root@test01 ~]# cat /etc/ssh/sshd_config | egrep -i "^UseDNS|^GSSAPIAuthentication"
GSSAPIAuthentication no
UseDNS no