1、ssh服务
远程连接协议
软件名:openssh
最基本的通式:
ssh +IP地址
扩展通式:
1、ssh 选项 IP地址 -p 22
ssh zhangsan@192.168.91.101 -p 22
2、ssh ip地址 命令
ssh 192.168.91.101 hostname
| ssh选项 | 含义 |
|---|---|
| -p | port 端口号,指定登录的端口号 |
| -l(小L) | 指定登录名称,-l=@ |
| -t | 跳板连接 |
[root@localhost .ssh]#iptables -A INPUT -s 192.168.91.102 -j REJECT
#模拟防火墙
[root@localhost ~]# ssh -t 192.168.91.101 ssh -t 192.168.91.102 ssh 192.168.91.103
#方便跳板连接,类似曲线救国
1.1 ssh协议的优点
- 数据传输是加密的,可以防止信息泄漏
- 数据传输是压缩的,可以提高传输速度
ssh与telnet的相同点和不同点:
-
相同点
- 都是通过协议,去连接远程的服务器。
-
不同点
- ssh:密文传输,压缩,ssh应用范围广
- telnet:明文 ,不安全,但是效率比ssh高。
1.2 openssh的客户端和服务端
| 类型 | 客户端 | 服务端 |
|---|---|---|
| 服务名 | openssh-clients | openssh-server |
| 主程序 | /usr/bin/ssh | /usr/sbin/sshd |
| 配置文件位置 | /etc/ssh/ssh_config | /etc/ssh/sshd_config |
// sshd 可以通过网络在主机中 开启shell的服务,d就daemon,就是后台进程的含义。
修改客户端配置文件,无需验证,有安全隐患:
vim /etc/ssh/ssh_config
1.3 known_hosts
公钥存放的位置:~/.ssh/known_hosts
自己的密钥位置:/etc/ssh/
公钥是一串乱码,公钥加密,私钥解密。
[root@localhost ~]# cd /etc/ssh
[root@localhost ssh]# cat known_hosts
2、ssh原理
ssh是字符界面
2.1 公钥传输原理:
- 客户端发起链接请求
- 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
- 客户端生成密钥对
- 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
- 客户端发送加密值到服务端,服务端用私钥解密,得到Res
- 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
- 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
// 密码有可能会被破解,所以要用密钥
2.2 加密类型
- 对称加密
- 非对称加密
// 注意:私钥不会发给对方,发给对方的是一般是本机的公钥。
2.3 常用算法
(不是绝对的安全,只是相对比较安全)
- RSA(RSA algorithm):目前使用最广泛的算法
- DSA(Digital Signature Algorithm):数字签名算法,和 RSA 不同的是 DSA仅能用于数字签名,不能进行数据加密解密,其安全性和RSA相当,但其性能要比RSA快
- ECC(Elliptic curve cryptography,椭圆曲线加密算法)
- ECDSA:Elliptic Curve Digital Signature Algorithm,椭圆曲线签名算法,是ECC和 DSA的结合,相比于RSA算法,ECC 可以使用更小的秘钥,更高的效率,提供更高的安全保障
3、服务端配置
配置文件位置:/etc/ssh/sshd_config
SElinux软件 作用是控制安全,它规定了ssh只能用端口号22,如果想要修改ssh的端口号,需要向SElinux软件 申请放行。
3.1 常用配置项:
| 配置 | 含义 |
|---|---|
| ListenAddress ip | 监听地址设置SSHD服务器绑定的IP 地址 |
| LoginGraceTime 2m | 用来设定如果用户登录失败,在切断连接前服务器需要等待的时间,单位为秒 |
| PermitRootLogin yes | centos默认允许, ubuntu不允许root远程ssh登录 |
| StrictModes yes | 检查.ssh/文件的所有者,权限等 |
| MaxAuthTries | 用来设置最大失败尝试登陆次数为6 |
| MaxSessions 10 | 同一个连接最大会话 |
| PubkeyAuthentication yes | 基于key验证 |
| PermitEmptyPasswords no | 密码验证当然是需要的!所以这里写 yes,也可以设置为 no |
| UseDNS yes | 提高速度可改为no 内网改为no 禁用反向解析 |
| AllowUsers user1 user2 user3@ip | 白名单用户 |
| AllowGroups g1 g2 | 白名单组 |
| DenyUsers user1 user2 user3 | 黑名单用户 |
| DenyGroups g1 g2 | 黑名单组 |
3.2 ssh服务的最佳实践
- 建议使用非默认端口 22
- 禁止使用protocol version 1
- 限制可登录用户 白名单
- 设定空闲会话超时时长
- 利用防火墙设置ssh访问策略
- 仅监听特定的IP地址 公网 内网
- 基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs
- 使用基于密钥的认证
- 禁止使用空密码
- 禁止root用户直接登录
- 限制ssh的访问频度和并发在线数
- 经常分析日志 分离
3.3 服务端实验
3.3.1 实验一:修改默认端口
- 修改服务机的端口
[root@localhost ~]# vim /etc/ssh/sshd_config #进入服务端配置文件
# port 22 #原来的端口号22
port 9527 #将22改成9527
[root@localhost ~]# systemctl restart sshd
Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details. #正常情况下会报错,因为Selinux安全软件
[root@localhost ~]# getenforce #检查一下
Enforcing #Selinux安全软件对其进行了限制,所以导致报错
[root@localhost ~]# setenforce 0 #使用该命令,就可以修改了
[root@localhost ~]# systemctl restart sshd
- 然后用客户机去远程连接服务机,验证端口号是否修改成功
[root@localhost ~]# ssh 192.168.125.130 -p 9527
Last login: Mon Apr 29 22:09:07 2024 from 192.168.125.100 #连接成功,证明端口号已被成功修改。
3.3.2 实验二:禁止root用户登录
ssh zhangsan@192.168.91.130 -p 9527
#zhangsan不是超级管理员,不受限制,可以登录。
3.3.3 实验三:白名单黑名单列表
- 白名单:默认拒绝所有,只有在白名单内的才放行
- 黑名单:默认允许所有,只有在黑名单内的才拒绝
[root@localhost ssh]#vim /etc/ssh/sshd_config
#手动添加
AllowUsers zhangsan@192.168.91.100 lisi
#允许所有有的主机访问我的lisi用户
#只允许192.168.91.100 访问服务器的zhangsan用户
DenyUsers liwu@192.168.91.100 #只拒绝192.168.91.100登录服务器的liwu用户
systemctl restart sshd
小拓展:查看用户信息、给用户添加密码
id zhangsan #查看zhangsan的信息
useradd lisi #添加lisi用户
echo "123" |passwd --stdin lisi #给lisi用户添加免交互密码123
3.3.4 实验四:客户端免密登录服务端
ssh-keygen 生成密钥的命令
ssh-keygen -t 生成密钥的算法方式,默认是id_rsa算法
// 客户端想免密登录服务端,要把自己(客户端)的公钥 推给服务端
第一步:生成密钥
[root@localhost ~]# ssh-keygen #生成密钥的命令
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:QnTHZ8gA4xhzEEjoDryrWaR93gtXsTYFeAZGFPzyhHg root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| o..=*@=++.. |
|. . Ooooo+ o |
|o ..o=. .o |
|.o ..E o+ |
|o o ..+S |
| * +.. |
|. + o . |
| + o + |
|+ . o. |
+----[SHA256]-----+
第二步:把密钥传给对方
[root@localhost ~]# cd .ssh/
[root@localhost .ssh]# ssh-copy-id -i id_rsa.pub 192.168.125.130 #id_rsa.pub是公钥,如果在家目录下,要用绝对路径
密钥文件的位置:~/.ssh/id_rsa
第三步:免密登录服务端
[root@localhost .ssh]# ssh 192.168.125.130
Last login: Mon Apr 29 22:25:48 2024 from 192.168.125.130
3.4 代理 agent
ssh-agent bash #启用代理,用bash进行后台运行
ssh-add + 密码 #相当于把密码交给 agent管理
#如果重启或者退出,需要进行重新代理
3.5 使同网段的设备之间 免密登录
#免密登录脚本
vim ssh_log.sh
#!/bin/bash
PASS=123123 #密码
#设置网段最后的地址,4-255之间,越小扫描越快
END=254
IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.
rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
done
wait
ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP
AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done
3.6 pssh
轻量级自动化运维工具 (EPEL源)
pssh命令 比较实用,可以批量操作。
用pssh之前,要先免密登录 ssh-keygen
加强版的ssh
-H:主机字符串,内容格式”[user@]host[:port]”
-h file:主机列表文件,内容格式”[user@]host[:port]”
-A:手动输入密码模式
-i:每个服务器内部处理信息输出
-l:登录使用的用户名
-p:并发的线程数【可选】
-o:输出的文件目录【可选】
-e:错误输出文件【可选】
-t:TIMEOUT 超时时间设置,0无限制【可选】
-O:SSH的选项
-P:打印出服务器返回信息
-v:详细模式
--version:查看版本