第0章 主要内容
1个目录
~/.ssh/
2条命令
ssh-keygen #服务器上创建密钥和公钥
ssh-copy-id #分发命令,后面接客户端的ip
4个文件
#客户端3个:
~/.ssh/id_rsa #私钥,自己保留,注意,权限是600,相当于钥匙,一定要保存好,不要泄露了
~/.ssh/id_rsa.pub #公钥,发给需要被连接的服务器,相当于锁
~/.ssh/known_hosts #保存已经连接过的主机的指纹信息
#服务端1个:
~/.ssh/authorized_keys #用来保存接收到的公钥,注意,权限是600
1.服务端发生的事情
- 本质都是客户端远程在服务端操作
- 在服务器当前家目录下生成.ssh目录
- 创建一个文件名字叫authorized_keys
- 文件内容是客户端发送过来的公钥内容
- 权限是600
2.实现免密认证的前提
1.m-61必须把自己的公钥发送到web
2.m-61的私钥不能没有
3.web必须保存m-61的公钥
4.web服务器的authorized_keys文件其他用户不能有修改的权限
第1章 为什么需要SSH
1.远程连接Linux的姿势
1.SSH连接
2.Telnet连接
3.本地显示器键盘支直连
2.为什么使用SSH连接
#SSH:
linux默认 安全性好 传输加密 默认端口号22
#TELNET:
网络设备上默认的是telnet 安全性较差 传输明文 默认不允许用root登录 默认端口号23
3.抓包演示
安装telnet服务
yum provides telnet*
yum install -y telnet-server
systemctl start telnet.socket
systemctl status telnet.socket
netstat -lntup|grep 23
使用telnet连接虚拟机:
telnet 10.0.0.61
telnet抓包:
SSH抓包:
第2章 SSH远程连接流程
1.SSH加密原理
#对称加密:
就是指双方共用一套公钥和私钥,加密解密使用的都是同一套公钥私钥,如果被泄露,双方的数据都有风险。
#非对称加密:
非对称加密则包含了两套秘钥,公钥 以及 私钥
其中公钥用来加密,私钥用来解密。双方都是用对方的公钥加密数据,使用自己的私钥来解密数据,而公钥可以随便传递,即使泄露也无风险。
2.SSH交换公钥流程
1.A服务器发起连接B服务器的请求
2.B服务端返回自己的公钥以及一个会话ID,此时A服务器得到了B服务器的公钥
3.A服务器生成密钥对
4.A服务器用自己的公钥异或会话ID,计算出一个值,并用B服务器的公钥加密
5.A服务器发送加密后的值到B服务器,B服务器用私钥解密
6.B服务端用解密后的值异或会话ID,计算出客户端的公钥,此时B服务器得到了A服务器的公钥
7.最后双方服务器都持有了3个密钥,分别为自己的一对公钥私钥,以及对方的公钥
3.SSH身份认证方式
SSH的身份认证分为两个流程:
1.基于密码方式认证
2.基于密钥方式认证
基于密码方式认证:
A为客户端,B为服务端
1.服务端收到登录请求后,首先互换公钥
2.客户端用服务端的公钥加密用户密码并发送给服务端
3.服务端用自己的秘钥解密后得到账号密码,然后进行验证
4.服务端用客户端的公钥加密验证结果并返回
5.服务端用自己的秘钥解密后得到验证结果
基于密钥方式认证:
A为客户端,B为服务端
1.客户端在本地生成一对密钥
2.客户端将自己的公钥使用ssh-copy-id命令发送到服务端
3.此时会提示客户端输入账号密码。客户端再次发送连接请求,包括ip、用户名
4.服务端得到客户端的请求后,会在家目录下.ssh目录里的authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串
5.服务端将生成的字符串使用客户端发送过来的公钥进行加密,然后再发送给客户端
6.客户端收到加密后的内容后,会使用自己的私钥进行解密,然后将解密后的随机字符串发送给服务端
7.服务端接受到客户端发来的随机字符串后,跟之前的随机字符串进行比对,如果一致,就允许免密码登录
4.流程总结
1. 客户端 - 服务端 请求建立ssh远程连接
2. 服务端 - 客户端 请求确认公钥信息
3. 客户端 - 服务端 确认接收公钥信息,保存到~/.ssh/authorized_keys文件中
4. 服务端 - 客户端 询问用户密码信息
5. 客户端 - 服务端 用户密码信息
6. 服务端 - 客户端 确认密码信息正确 远程连接建立
1之后:不用反复确认公钥信息
6之后:所有传输的数据信息会进行加密处理
第3章 SSH密钥对方式连接
1.SSH密钥对创建流程
1.执行密钥对创建命令生成公钥和私钥
2.执行命令分发公钥到远程服务器
3.根据提示输入远程服务器的密码
4.公钥分发成功后即可使用私钥免密码登陆
2.创建密钥对
[root@m-61 ~]# ssh-keygen #创建密钥对执行命令
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #私钥存储位置,直接按回车
Created directory '/root/.ssh'. #默认创建在/root/.ssh下
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:xjH5BBqb5S4W4/remLU/zYIeU3m6U9GoRk0SJaJm254 root@m-61
The key's randomart image is:
+---[RSA 2048]----+
| . + oo. |
| O +... |
| X = .+ o |
| + B =..+ . |
| = S.+... |
| o + ooo. |
| . Eo.+ |
| . =.++.o |
| .=.+.o+ |
+----[SHA256]-----+
[root@m-61 ~]#
3.查看生成的密钥对
[root@m-61 ~]# ll ~/.ssh/
total 8
-rw------- 1 root root 1675 Jun 3 21:42 id_rsa
-rw-r--r-- 1 root root 391 Jun 3 21:42 id_rsa.pub
4.分发公钥到远程机器
[root@m-61 ~]# ssh-copy-id 10.0.0.31 #分发命令
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '10.0.0.31 (10.0.0.31)' can't be established.
ECDSA key fingerprint is SHA256:DxCC5qxDnT2+kmVS1AlIaQvf6FkEnvhExJlrAJBuA14.
ECDSA key fingerprint is MD5:22:02:5e:fd:a0:b9:3c:f3:86:bf:2d:14:e2:ca:75:67.
Are you sure you want to continue connecting (yes/no)? yes #确认指纹信息
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.0.0.31's password: #输入10.0.0.31主机密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '10.0.0.31'"
and check to make sure that only the key(s) you wanted were added.
5.验证是否可以免密码登陆
[root@m-61 ~]# ssh 10.0.0.31
Last login: Fri Jun 3 21:46:36 2022 from 10.0.0.1
[root@nfs-31 ~]#
6.客户端检查服务端公钥信息
[root@nfs-31 ~]# cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDOvLp4ruXBA2tKeG4ijD60THSqC975uwXmALVNbxlJhiAT5wHNqzqczqwqImhWkl7gwkyBZN3OiaoCb9koqPbRZzftTvJfnZukoZ1Qv3rA626GqoyPI3KCcEdc2RnpiDYNyR21LhbAwFdCdoVI7SW1q2bCurB1OTvcZgesNkcdusAL3NEmaZAqMI++sNOA+MKBvRGPKfo7wist7hb768Hv0ZME/9wIwGbPPEUJ3lso5ysORsRZ/Q288T0aCPDQCb063x4uVfR0OGznrsBSdOvC4d7Pd4Sk5KrukfaUM1dLfxXX2sxHGCDqxoD1MY+fELo66PqAlY/HRhoa2Sz+D02H root@m-61
7.SSH密钥对关键文件解释
SSH服务端:
[root@m-61 ~/.ssh]# ll
total 12
-rw------- 1 root root 1675 Jun 3 21:42 id_rsa #私钥,自己保留,注意,权限是600
-rw-r--r-- 1 root root 391 Jun 3 21:42 id_rsa.pub #公钥,发给需要被连接的服务器
-rw-r--r-- 1 root root 171 Jun 3 21:47 known_hosts #保存已经连接过的主机的指纹信息
SSH客户端:
[root@nfs-31 ~/.ssh]# ll
total 4
-rw------- 1 root root 391 Jun 3 21:47 authorized_keys #用来保存接收到的公钥,注意,权限是600
第4章 SSH远程执行命令
1.SSH远程执行命令说明
SSH不仅仅可以用来连接服务器,也可以远程执行命令。
SSH远程执行命令并不需要登陆到远程服务器,只需要配置好密钥对即可,执行完成后进程就结束了。
2.SSH远程执行命令实战
#1.远程连接命令后直接加上需要执行的命令即可
[root@m-61 ~/.ssh]# ssh 10.0.0.31 hostname
nfs-31
#2.远程执行命令不支持别名
[root@m-61 ~/.ssh]# ssh 10.0.0.31 ll /tmp
bash: ll: command not found
[root@m-61 ~/.ssh]# ssh 10.0.0.31 ls -l /tmp
total 0
-rw-r--r-- 1 root root 0 Jun 3 22:00 nfs-31.txt
第5章 SSH安全防范
1.目前SSH存在的安全隐患
#问题1: 虽然使用了秘钥连接,但是原来的密码连接还是可以使用的
#问题2: 默认22端口号所有人都知道,需要修改
#问题3: 如果被别人偷走了私钥,在不受信任的机器可以不需要root账号密码登录
2.SSH安全优化步骤
配置172.16.1.7这台机器只能被172.16.1.61这台机器连接
#ssh配置文件:
/etc/ssh/sshd_config
注意:优化前先确认172.16.1.7服务器是否有客户端的公钥,如果没有先分发公钥,不然优化完成之后无法连接
优化1: 修改默认端口号
[root@web-7 ~]# grep -n "Port" /etc/ssh/sshd_config
17:Port 22
#默认端口22,改为9999
[root@web-7 ~]# grep -n "Port" /etc/ssh/sshd_config
17:Port 9999
优化2:SSH修改监听地址
[root@web-7 ~]# grep -n "Listen" /etc/ssh/sshd_config
19:#ListenAddress 0.0.0.0
#默认是外网内网都可以连接,改为内网172.16.1.x字段
[root@web-7 ~]# grep -n "Listen" /etc/ssh/sshd_config
19:ListenAddress 172.16.1.7
优化3:关闭密码认证方式,只能通过秘钥登录
[root@web-7 ~/.ssh]# grep -n '^PasswordAuthentication' /etc/ssh/sshd_config
65:PasswordAuthentication yes
#默认是账号密码登录跟密钥登录都可以
[root@web-7 ~/.ssh]# grep -n '^PasswordAuthentication' /etc/ssh/sshd_config
65:PasswordAuthentication no
#修改完ssh配置文件,记得重启sshd服务
[root@m-61 ~/.ssh]# systemctl restart sshd
优化4:防火墙限制内网服务器只能通过m-61这个内网的IP地址连接
iptables -A INPUT ! -s 172.16.1.61 -p tcp --dport 9999 -j DROP
3.测试方法
目前被管理的机器只能通过管理机的内网网段并且只能使用秘钥方式连接
[root@m-61 ~/.ssh]# ssh 172.16.1.7 -p 9999
Last login: Sat Jun 4 12:36:29 2022 from 172.16.1.61
[root@web-7 ~]#
第6章 SSH免交互分发密钥
1.目前存在的问题
正常操作的步骤:
1.生成秘钥对
2.服务端分发秘钥需要手动确认
- yes
- 密码
3.修改客户端SSH配置文件,端口号,监听IP,秘钥方式,拒绝密码
4.重启服务
5.测试是否可以免密登录
存在的问题:
1.操作步骤繁琐,如果服务器数量很多,工作量非常大,效率非常低
2.手动操作容易出现失误,出现失误不好检查,总之,人不可靠
2.我们想要的效果
新服务器安装好系统后,管理机只需要运行一次脚本,上述所有操作全部自动完成,不需要人工介入,不需要交互输入确认
3.收集正常创建密钥对的交互步骤
第一次交互:解决yes
[root@m-61 ~]# ssh-copy-id 10.0.0.7
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '10.0.0.7 (10.0.0.7)' can't be established.
ECDSA key fingerprint is SHA256:DxCC5qxDnT2+kmVS1AlIaQvf6FkEnvhExJlrAJBuA14.
ECDSA key fingerprint is MD5:22:02:5e:fd:a0:b9:3c:f3:86:bf:2d:14:e2:ca:75:67.
Are you sure you want to continue connecting (yes/no)? yes #需要手动输入yes
第二次交互:输入密码
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.0.0.7's password: #这里需要手动输入10.0.0.7的登录密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '10.0.0.7'"
and check to make sure that only the key(s) you wanted were added.
4.解决交互问题
1.指定key输出位置
ssh-keygen -f /root/.ssh/id_rsa.pub
2.跳过输入密码
ssh-keygen -f /root/.ssh/id_rsa.pub -N ''
3.跳过连接确认
ssh-copy-id 172.16.1.7 -o StrictHostKeyChecking=no
4.自动输入密码
yum install sshpass -y
sshpass -p '123' ssh-copy-id 172.16.1.7 -o StrictHostKeyChecking=no
5.编写面交互分发密钥脚本
#脚本
[root@m-61 ~]# cat fenfa.sh
#!/bin/bash
if [ -f /root/.ssh/id_rsa ];then
echo "创建成功"
else
ssh-keygen -f /root/.ssh/id_rsa -N '' > /dev/null 2>&1
echo "创建成功"
fi
for ip in $(cat hostname.txt)
do
sshpass -p '123123' ssh-copy-id ${ip} -o StrictHostKeyChecking=no > /dev/null 2>&1
ssh ${ip} 'hostname'
done
#需要分发服务器的内网IP
[root@m-61 ~]# cat hostname.txt
172.16.1.5
172.16.1.6
172.16.1.7
172.16.1.8
172.16.1.9
172.16.1.31
172.16.1.41
172.16.1.51
1. 作业内容
一个脚本完成以下所有任务:
1.管理机自动创建密钥对
ssh-keygen
2.管理机自动将公钥发送到被管理机
bash fenfa.sh
3.修改被管理机的SSH连接端口为9999
ssh ${ip} "sed -i '/#Port 22/c Port 9999' /etc/ssh/sshd_config"
4.修改被管理机的SSH监听地址为172.16.1.X
ssh ${ip} "sed -i '/#ListenAddress 0.0.0.0/c ListenAddress ${ip}' /etc/ssh/sshd_config"
5.修改被管理机不允许使用账号密码方式登陆,只允许使用密钥方式连接
ssh ${ip} "sed -i '/^PasswordAuthentication yes/c PasswordAuthentication no' /etc/ssh/sshd_config"
ssh 172.16.1.7 'systemctl restart sshd'
6.修改完之后验证是否生效,验证方法为使用9999端口连接被管理机并打印出主机信息
ssh ${ip} -p 9999 'hostname'
最终脚本
#!/bin/bash
yum install sshpass -y
if [ -f /root/.ssh/id_rsa ];then
echo "创建成功"
else
ssh-keygen -f /root/.ssh/id_rsa -N '' > /dev/null 2>&1
echo "创建成功"
fi
for ip in $(cat hostname.txt)
do
sshpass -p '123123' ssh-copy-id ${ip} -o StrictHostKeyChecking=no > /dev/null 2>&1
ssh ${ip} 'hostname'
ssh ${ip} "sed -i '/#Port 22/c Port 9999' /etc/ssh/sshd_config"
echo "修改被管理机的SSH连接端口为9999"
ssh ${ip} "sed -i '/#ListenAddress 0.0.0.0/c ListenAddress ${ip}' /etc/ssh/sshd_config"
echo "修改被管理机的SSH监听地址为:" ${ip}
ssh ${ip} "sed -i '/^PasswordAuthentication yes/c PasswordAuthentication no' /etc/ssh/sshd_config"
echo "修改被管理机不允许使用账号密码方式登陆,只允许使用密钥方式连接"
ssh ${ip} 'systemctl restart sshd'
echo "重启sshd服务"
done
for ip in $(cat hostname.txt)
do
echo "打印出主机信息"
ssh ${ip} -p 9999 'hostname'
done
#hostname.txt 文件是需要操作的主机内网IP地址
172.16.1.7
172.16.1.8
172.16.1.9
172.16.1.31
172.16.1.41