SSH远程管理服务
SSH服务介绍说明
SSH是Secure Shell Protocol的简写,由IETF网络工作小组(Network Working Group)制定;在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。确保了传递的数据安全。
SSH是专为远程登录会话和其他网络服务提供的安全性协议。利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,在当前的生产环境运维工作中,绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件,如telnet(23端口,非加密的)等。在默认状态下,SSH服务主要提供两个服务功能:
-
一是提供类似telnet远程联机服务器的服务,即上面提到的SSH服务;
-
另一个是类似FTP服务的sftp-server, 借助SSH协议来传输数据的,提供更安全的SFTP服务(vsftp,proftp)。
SSH连接工作原理
私钥:钥匙
公钥:锁头
第一个步骤:客户端 执行远程连接命令
第二个步骤:客户端 服务端 建立三次握手
第三个步骤:服务端 让客户端进行确认是否接收服务端公钥信息
第四个步骤:客户端 进行公钥确认,接收到公钥信息
第五个步骤:服务端 让客户确认登录用户密码信息
第六个步骤:客户端 进行密码信息确认
第七个步骤:客户端 服务端 远程连接建立成功
![](https://img2020.cnblogs.com/blog/1983655/202003/1983655-20200331170356908-706782488.png)
SSH远程连接方式
a 基于口令的方式进行远程连接 连接比较麻烦 连接不太安全
b 基于密钥的方式进行远程连接 连接方便 连接比较安全
基于密钥方式连接过程(原理)
1. 客户端(管理端) 执行命令创建密钥对
2. 客户端(管理端) 建立远程连接(口令),发送公钥信息
3. 客户端(管理端) 再次建立远程连接
4. 服务端(被管理端) 发送公钥质询信息(你钥匙能打开我的锁着吗)
5. 客户端(管理端) 处理公钥质询信息(钥匙将锁头打开),将质询结果返回给服务端
6. 服务端(被管理端) 接收到质询结果,建立好远程连接
![](https://img2020.cnblogs.com/blog/1983655/202003/1983655-20200331170422585-148738147.png)
SSH基于密钥方式连接部署
第一个步骤:管理端创建密钥对信息
[root@m01 ~]# ssh-keygen -t dsa
Generating public/private dsa key pair. --- 创建一个公钥/私钥密钥对
Enter file in which to save the key (/root/.ssh/id_dsa): --- 是否将密钥保存到该路径
Enter passphrase (empty for no passphrase): --- 是否对密钥对进行加密
Enter same passphrase again: --- 再次输入相同的密码
Your identification has been saved in /root/.ssh/id_dsa. --- 你的身份认证已经保存到/root/.ssh/id_dsa
Your public key has been saved in /root/.ssh/id_dsa.pub. --- 你的公钥已经保存在/root/.ssh/id_dsa.pub
The key fingerprint is: 关键指纹是:
SHA256:Z1AgXSeXBDP+ecDCT9csPFRSoU0Qlh4Pjj3L/95gTC4 root@m01
The key's randomart image is:
+---[DSA 1024]----+
| ...oBo+=*=+|
| ..+ Bo*++ |
| . + O.O.o|
| . * O + |
| S o = = |
| o B |
| E * |
| o o.|
| .=|
+----[SHA256]-----+
第二个步骤:管理端对公钥进行分发
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_dsa.pub"
The authenticity of host '172.16.1.41 (172.16.1.41)' can't be established.
ECDSA key fingerprint is SHA256:PfFz3a/VH7YgL/iKkse/2iSps5jJuV6Q1tdNI+B0WCU.
ECDSA key fingerprint is MD5:3b:54:44:bf:fb:ec:c8:09:dd:02:fa:a8:84:cc:fe:18.
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@172.16.1.41's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@172.16.1.41'"
and check to make sure that only the key(s) you wanted were added.
![](https://img2020.cnblogs.com/blog/1983655/202003/1983655-20200331170604505-433513226.png)
第三个步骤:进行远程连接进行测试
[root@m01 ~]# ssh 10.0.0.41
Last login: Tue Mar 31 00:06:11 2020 from 10.0.0.61 不需要输入密码即可登录,公钥分发成功
编写脚本对公钥进行批量分发
批量分发要遇到的问题:有交互过程
1)需要有确认yes或no
2)需要输入密码信息
3)服务端端口号变化了,如何进行分发
如何不用输入yes或no
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41 "-o StrictHostKeyChecking=no"
如何进行免密进行公钥分发
第一个步骤:下载安装sshpass软件
[root@m01 ~]# yum -y install sshpass
[root@m01 ~]# rpm -qa | grep sshpass
sshpass-1.06-2.el7.x86_64
第二个步骤:执行免交互方式分发公钥
[root@m01 ~]# sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41
如何解决服务端端口号发生过变化进行批量分发公钥
[root@m01 ~]# sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41 -p 52113 "-o StrictHostKeyChecking=no"
编写批量分发脚本
[root@m01 ~]# vim /server/scripts/ip.txt
172.16.1.7
172.16.1.31
172.16.1.41
[root@m01 ~]# vim /server/scripts/fenfa_pub_key.sh
#!/bin/bash
#################################
# 公钥批量分发脚本 #
#################################
for ip in `cat /server/scripts/ip.txt` #for ip in {7,31,41}
do
echo "================= =host $ip pub-key start fenfa=================="
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@$ip "-o StrictHostKeyChecking=no" &>/dev/null
echo "host $ip fenfa success."
echo "================= =host $ip pub-key fenfa end=================="
echo ""
done
批量分发检查脚本(批量管理脚本)
[root@m01 ~]# vim /server/scripts/check_pub_key.sh
#!/bin/bash
###################################
# 分发检测脚本(批量管理脚本) #
###################################
CMD=$1 #传参,在执行脚本时,只要在执行脚本时跟上相应的参数,就会执行相应的命令
for ip in `cat /server/scripts/ip.txt`
do
echo "================== host $ip check =================="
ssh $ip $CMD
echo ""
done
验证批量分发
[root@m01 ~]# /server/scripts/check_pub_key.sh hostname
================== host 172.16.1.7 check==================
web01
================== host 172.16.1.31 check==================
nfs01
================== host 172.16.1.41 check==================
backup
SSH服务配置文件(/etc/ssh/sshd_config)
[root@m01 ~]# vim /etc/ssh/sshd_config
Port 22 #修改服务端口号
ListenAddress 0.0.0.0 #监听地址,指定一块网卡能够接受远程访问请求,指定监听地址只能是本地网卡上的地址
PermitEmptyPasswords no #是否允许远程用户使用空密码登录,默认不允许
PermitRootLogin yes #是否禁止root用户远程连接主机,建议改为no
GSSAPIAuthentication yes #是否开户GSSAPI认证功能,不用的时候关闭
UseDNS yes #是否开启反向DNS解析功能,建议进行关闭,设置为no
SSH远程服务防范入侵
1. 用密钥登录,不用密码登陆
2. 牤牛阵法:解决SSH安全问题
a. 防火墙封闭SSH,指定源IP限制(局域网、信任公网)
b. 开户SSH只监听本地内网IP(ListenAddress 172.16.1.61)
3. 尽量不给服务器外网IP
4. 最小化(软件安装-授权)
5. 给系统的重要文件或命令做一个指纹
/etc/passwd md5sum 监控
inotify /bin 监控
6. 给他锁上 chattr +i 查看lsattr -a