第一章SSH基础
1.1.SSH服务器
1.2加密原理
1.3修改默认端口
1.4禁止root用户登录
1.5白名单黑名单列表
1.6ssh服务的最佳实践
1.7使用秘钥对及免交互验证登录
1.8免密登录脚本
第一章SSH基础
1.1.SSH服务器
SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输速度。
优点: 数据传输是加密的,可以防止信息泄漏
数据传输是压缩的,可以提高传输速度
1.2加密原理
客户端发起链接请求
服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
客户端生成密钥对
客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
客户端发送加密值到服务端,服务端用私钥解密,得到Res
服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
![](https://i-blog.csdnimg.cn/blog_migrate/861e6389c4f18eddec74994d0273a42a.png)
1.3修改默认端口
![](https://i-blog.csdnimg.cn/blog_migrate/c92a98a4e7652d55f1e539a7dd8c4a18.png)
1.4禁止root用户登录
![](https://i-blog.csdnimg.cn/blog_migrate/7ea6052d3ff9d67a2c1b3a65eaa6bdc8.png)
1.5白名单黑名单列表
![](https://i-blog.csdnimg.cn/blog_migrate/85c2bcba3292fa66186fe8f122f50910.png)
1.6ssh服务的最佳实践
建议使用非默认端口 22
禁止使用protocol version 1
限制可登录用户 白名单
设定空闲会话超时时长
利用防火墙设置ssh访问策略
仅监听特定的IP地址 公网 内网
基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs
使用基于密钥的认证
禁止使用空密码
禁止root用户直接登录
限制ssh的访问频度和并发在线数
经常分析日志 分离
1.7使用秘钥对及免交互验证登录
原理:
用户/密码
基于秘钥
用户/密码:
1.生成公钥和私钥
2.将公钥导给对面
![](https://i-blog.csdnimg.cn/blog_migrate/6f69fcbcabcd2fa9af16147cb46ed689.png)
客户端发起ssh请求,服务器会把自己的公钥发送给用户
用户会根据服务器发来的公钥对密码进行加密
加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
基于密钥的登录方式
![](https://i-blog.csdnimg.cn/blog_migrate/4b39b06de2e597bbe76fff0e56ab2854.png)
首先在客户端生成一对密钥(ssh-keygen)
并将客户端的公钥ssh-copy-id 拷贝到服务端
当客户端再次发送一个连接请求,包括ip、用户名
服务端得到客户端的请求后,会到authorized_keys()中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:kgc
服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
![](https://i-blog.csdnimg.cn/blog_migrate/7c7ff96b86844af2eed532700726384c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/224bfc17eb8c42841304114491f2ad36.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb25f685ba00beacd5470eb6cb0cab7e.png)
另外一台主机登录
1.8免密登录脚本
#免密登录脚本
#!/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