远程管理服务(SSH).
一,远程服务概念说明
ssh可以基于密码进行认证,也可以基于密钥去认证用户,基于密钥认证时可以实现免密码登录的效果 利用SSH telnet服务实现远程连接 SSH :加密传输数据方式(安全性更高,复杂性更高) 经过互联网连接 访问端口:22 默认支持root用户远程连接 telnet :明文传输数据方式(安全性更低,复杂性更低) 经过局域网连接 访问端口:23 默认禁止root用户远程连接
二,远程服务连接原理
2.1 ssh连接示意图
2.2 ssh连接流程
客户端:发送建立连接通讯请求
服务端:回复密钥信息确认
客户端:进行密钥信息确认
服务端:将公钥信息进行发送传递
客户端:接收公钥进行保存, 并发送确认信息 (~/.ssh/known_hosts)
服务端: 发送密码验证信息 (加密处理)
服务端:输入密码信息 (加密处理)
数据连接建立完毕
传输数据(加密处理)
三,远程连接连接
3.1 基于密码方式远程连接
步骤: ①:ssh+IP地址 ②:输入用户名(主机名称) ③:输入密码(相应主机名称的密码) 例如: ①:ssh 10.0.0.8 ②:root ③:abc123
3.2 基于密钥方式远程连接
可以实现免密登录的效果
3.2.1 简单配置:
管理端服务器(m01-192.168.81.161):
第一步:创建密钥对
[root@m01 ~]# ssh-keygen -t dsa 生成公钥和私钥
保存地址默认,私钥密码选空
[root@m01 ~]# ll ~/.ssh/id*
第二步:管理端分发公钥(在这里需要交互)
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.81.163
第三步:进行远程连接测试(不用输入密码信息可以直接连接)
[root@m01 ~]# ssh root@192.168.81.163 hostname
在这时,存在两个问题,1,如何实现批量管理多台主机 2,如何编写脚本进行批量分发公钥?
编写脚本最简单的方法:堆命令
#!/bin/bash for ip in 163 164 do ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.81.$ip done
但是还是存在问题:
1,需要确认yes/no
2,需要输入密码信息
3,服务端口号变化了,如何分发公钥?
3.2.2 实现免交互输入密码信息分发公钥
第一步:下载安装软件sshpass yum install -y sshpass 第二步: 执行免交互方式分发公钥命令 sshpass -p远程主机密码 ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.81.163 服务端口号发生变化,如何进行批量分发公钥: sshpass -p远程主机密码 ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.81.163 -p 52113 "-o StrictHostKeyChecking=no"
3.2.3 批量分发公钥脚本:
1,准备配合实现脚本的主机地址文件:
cat /server/scripts/ip_list.txt 192.168.81.163 192.168.81.164 192.168.81.165
2,批量分发公钥脚本:
# cat distribute_public_key.sh #!/bin/bash for ip in $(cat /server/scripts/ip_list.txt) do sshpass -p654321 ssh-copy-id -i /root/.ssh/id_rsa.pub $ip -o StrictHostKeyChecking=no &>/dev/null if [ $? -eq 0 ] then echo "to $ip distribute_key " echo "public key distribute success" echo "" else echo "to $ip distribute_key" echo "public key distribute faild" echo "" fi done
3,分发公钥检查脚本(批量管理脚本)-----串行批量管理
[root@m01 scripts]# cat check_pub_key.sh
#!/bin/bash
CMD=$1
for ip in $(cat /server/scripts/ip_list.txt)
do
echo "==================== host $ip check ==================== "
ssh $ip $CMD
echo ""
done
四,SSH服务配置文件解析
/etc/ssh/sshd_config Port 22 --- 指定服务启动端口信息 (默认注释状态 默认端口为22) ListenAddress 0.0.0.0 --- 允许哪个网络通过哪个网卡进行连接 ****** PS: 监听地址一定是本地网卡上拥有的地址 PermitRootLogin no --- 是否允许root用户远程连接,建议改为no PermitEmptyPasswords no --- 是否允许允许远程用户使用空密码登录,建议改为no PasswordAuthentication yes --- 是否支持使用密码方式远程连接 GSSAPIAuthentication no --- 是否关闭GSSAPI认证方式,不用时候关闭 UseDNS no --- 是否开启DNS反向解析,建议进行关闭
五,企业环境批量分发公钥演练
5.1 企业环境
m01 root linux@123 ssh服务端口22 web01 root linux@123 ssh服务端口65531 web02 root linux@123 ssh服务端口65532 nfs01 root linux@123 ssh服务端口65533 backup root linux@123 ssh服务端口65534
5.2 编写主机信息文件
cat /server/scripts/ip_list.txt 192.168.81.162:linxu@123:65531 192.168.81.163:linxu@123:65532 192.168.81.164:linxu@123:65533 192.168.81.165:linxu@123:65534
5.3 编写批量分发公钥文件
# vim /server/scripts/distribute_public_key.sh
#!/bin/bash
#make key:
rm -f /root/.ssh/id* &>/dev/null
yum install -y sshpass
if [ $? == 0 ]
then
#免交互生成密钥对,-f指定存放路径,-P密钥加密的密码 -q减少信息输出
ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" -q
else
echo "intsall shhpass failed"
fi
#分发公钥:
for host in $(cat /server/scripts/ip_list.txt)
do
host_ip=$(echo $host|awk -F ":" '{print $1}')
host_pass=$(echo $host|awk -F ":" '{print $2}')
host_port=$(echo $host|awk -F ":" '{print $3}')
sshpass -p$host_pass ssh-copy-id -i /root/.ssh/id_dsa.pub $host_ip -o StrictHostKeyChecking=no -p$host_port &>/dev/null
if [ $? -eq 0 ]
then
echo "to $host_ip distribute_key "
echo "public key distribute sucess"
echo ""
else
echo "to $host_ip distribute_key"
echo "public key distribute failed"
echo ""
fi
done
测试结果:
[root@m01:/server/scripts]# sh distribute_public_key.sh to 192.168.81.162 distribute_key public key distribute sucess to 192.168.81.163 distribute_key public key distribute sucess to 192.168.81.164 distribute_key public key distribute sucess to 192.168.81.165 distribute_key public key distribute sucess
六,SSH远程服务防范入侵方案
1,用密钥登录,不用密码登陆 VPN/堡垒机 2,牤牛阵法:解决SSH安全问题 a.防火墙封闭SSH,指定源IP限制(局域网、信任公网) b.开启SSH只监听本地内网IP(ListenAddress 192.168.81.162) 3,尽量不给服务器外网IP 4,最小化(软件安装-授权) 5,给系统的重要文件或命令做一个指纹 /etc/profile /etc/rc.local /etc/passwd md5sum 11110000aaaabbbb 监控 inotify /bin 监控 6,重要文件锁上 chattr +i +a
七,远程传输常见问题
利用while read line 读取文件信息时, 循环突然中断 分析点01: 不用ssh命令时,循环是正确 分析点02: 只要ssh命令后,拥有标准输入,循环就正确 分析点03: 将循环方式进行改变,循环正确 分析点04: 将ssh命令放入后台执行, 循环就正确 利用cat命令读取一个文件时, 会将所有信息放入到内存buffer中, 但是while read 读取buffer每行信息时, 正常是逐行读取 while read line + ssh 一下将buffer读取空