远程管理服务(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.1623,尽量不给服务器外网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读取空

 

 

  

 

posted @ 2020-04-19 14:55  michaelni  阅读(467)  评论(0编辑  收藏  举报