综合架构之SSH服务

  • 远程服务概念说明
  • 远程服务连接原理
  • 远程服务连接方式
  • 远程服务配置文件
  • 远程访问防范入侵方案

远程服务概念说明:

ssh 远程安全连接 22 互联网服务器 可以默认root用户远程登录
telnet 远程连接 23 网络设备连接 机房局域网中 不可以使用root远程登录

telnet服务
linux系统中的 telnet-server服务不支持root用户登陆 只能以普通用户登陆 紧接着使用 su 命令
linux系统中 ssh@root 172.16.1.41 不加用户时代表当前用户


远程服务连接原理

远程服务连接原理
    1) 客户端 -- 服务端   请求建立远程连接
    2) 服务端 -- 客户端   确认连接信息
    3) 客户端 -- 服务端   确认连接 
    4) 服务端 -- 客户端   发送公钥信息 确认密码信息
    5) 客户端 -- 服务端   接收公钥并保存(~/.ssh/known_hosts)  并且输入密码信息
    6) 服务端 -- 客户端   确认密码输入正确
    后续数据传输过程: 客户端公钥加密 --- 服务端私钥解密
                                       服务端也会加密 但这个加密的条件是谁发过来的,只能时谁解密。

私钥和公钥:
对传输的数据进行加密处理

远程服务连接方式

基于密码连接方式: 密码复杂度(不安全)
基于密钥连接方式(安全)

通过密钥的形式

第一个历程: 管理端 创建密钥对信息
生成的公钥和私钥的对

ssh-keygen -t(类型 dsa rsa ) dsa
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
[root@nfs01 ~]# ll /root/.ssh/
total 12
-rw------- 1 root root 668 Jul 22 16:51 id_dsa
-rw-r--r-- 1 root root 600 Jul 22 16:51 id_dsa.pub

第二个历程: 管理端 分发公钥信息

ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
   使用ssh 172.16.1.41 ip a 可以进行远程命令输入了。

PS:ssh-copy-id 命令原理
01. ssh和远程主机连接
02. 将公钥文件传输到远程主机, /root/.ssh/
将公钥文件内容保存到/root/.ssh/authorized_keys(600) 这个文件可在sshd_con中去改。如果没这个文件,默认就是密码。
03. 连接建立时,ssh服务会加载authorized_keys, 实现基于密钥连接通讯

如何批量分发公钥

管理主机: 10.0.0.61/172.16.1.61
被管理主机: 172.16.1.31 172.16.1.41 172.16.1.7
如何批量分发公钥?

利用脚本如何批量分发:

思路

    1. 需要输入确认信息
      ssh -o StrictHostKeyChecking=no 172.16.1.31
      Warning: Permanently added '172.16.1.31' (ECDSA) to the list of known hosts.
      [email protected]'s password:

远程的时候可以免于确认。

    1. 需要输入密码信息
      yum install -y sshpass
      [root@m01 scripts]# sshpass -p654321 ssh 172.16.1.31
      Last login: Mon Jul 22 16:17:39 2019 from 10.0.0.1

远程的时候可以免于输密码

 #!/bin/bash
    . /etc/init.d/functions
    
    for ip in {7,31,41}
    do

       echo "====================172.16.1.$ip start fenfa key===================="
       sshpass -p654321 ssh-copy-id -i /root/.ssh/id_dsa.pub -o StrictHostKeyChecking=no 172.16.1.$ip &>/dev/null
       if [ $? -eq 0 ]
       then 
         echo  "公钥分发成功"  /bin/true
         echo  ""
       else
         echo  "公钥分发失败"  /bin/false
         echo  ""
       fi
    done

注意:分发的过程时串行的 ansible是并行的。

脚本的优化

if [ $# -ne 1 ] $#代表的参数
    then  
       echo "usage: 请在执行脚本后面输入一个合法命令,命令之间有空格,请用双引号括起来"
       exit 2 //脚本运行失败的返回值
    fi
    
    cmd="$1" //脚本中的传参命令
    
    for ip in {7,31,41}
    do
      echo "=================check 172.16.1.$ip================="
      ssh 172.16.1.$ip $cmd //如果没输入参数  则会直接远程主机
      echo ""
    done

思考:如果一台主机远程服务端口号改动了,如何再分发公钥?

案例:
多台主机 ssh连接信息不一致
172.16.1.31 22 密码 654321
172.16.1.41 22 密码 123456
172.16.1.7 52113 密码 654321

第一个历程: 编辑一个主机连接文件

    cat >> /server/scripts/host_info.txt <

第二个历程: 调取文件中信息

cat /server/scripts/host_info.txt|\
    while read line
    do 
    IP_info="$(echo $line|awk '{print $1}')"
    Port_info="$(echo $line|awk '{print $2}')"
    Pass_info="$(echo $line|awk '{print $3}')"
      echo $IP_info $Port_info $Pass_info 
    done      

第三个历程: 编写脚本:

[root@m01 scripts]# vim fenfa_key.sh 
    #!/bin/bash
    . /etc/init.d/functions
    
   cat /server/scripts/host_info.txt|\
    while read line
    do
       IP_info="$(echo $line|awk '{print $1}')"
       Port_info="$(echo $line|awk '{print $2}')"
       Pass_info="$(echo $line|awk '{print $3}')"
       echo "====================$IP_info start fenfa key===================="
       sshpass -p$Pass_info ssh-copy-id -i /root/.ssh/id_dsa.pub -o StrictHostKeyChecking=no $IP_info -p $Port_info &>/dev/null
       if [ $? -eq 0 ]
       then
         echo  "公钥分发成功"  /bin/true
         echo  ""
       else
         echo  "公钥分发失败"  /bin/false
         echo  ""
       fi
    done

案例:思考:如果一台主机远程远程服务端口号改动了,如何再分发公钥

多台主机 ssh连接信息不一致
172.16.1.31 22 密码 654321
172.16.1.41 22 密码 123456
172.16.1.7 52113 密码 654321

第一个历程:编辑一个主机连接文件

cat >>/server/scripts/host_info.txt<
第二个历程:调取文件中的信息
while read line 
IP_info="$(awk {print $1})"
Port_info="$(awk '{print $2}')"
Pass_info="$(awk '{print $3}')"

第三个历程:编写脚本


图片.png

验证脚本的编写

#!/bin/bash

if [ $# -ne 1 ]
then  
   echo "usage: 请在执行脚本后面输入一个合法命令,命令之间有空格,请用双引号括起来" #判断输入的命令
   exit 2
fi

cmd="$1" #传参使用的参数,脚本后面跟命令。 

for ip in {7,31,41}
do
  echo "=================check 172.16.1.$ip================="
  ssh 172.16.1.$ip $cmd
  echo ""
done

远程服务配置文件:/etc/ssh/sshd_conf

17 #Port 52113
19 #ListenAddress 0.0.0.0
   # 监听的地址只能是本地主机网卡上有的地址  web服务  负载均衡 ****** 
20 #PermitEmptyPasswords no    --- 不允许空密码连接主机
21 #PermitRootLogin yes        --- 禁止root用户远程连接  no
22 GSSAPIAuthentication no     --- 关闭GSSAPI认证  加快SSH连接效率
23 UseDNS no                   --- 关闭DNS反向解析 加快SSH连接效率
# 在SSH服务配置文件, 很多注释的信息不是没有作用, 表示的是默认配置

远程访问防范入侵方案:

案例分享

  • 1、用密钥登录,不用密码登陆(课后作业)。
  • 2、牤牛阵法:解决SSH安全问题
    • a.防火墙封闭SSH,指定源IP限制(局域网、信任公网)
    • b.开启SSH只监听本地内网IP(ListenAddress 172.16.1.61)。
  • 3、尽量不给服务器外网IP 负载均衡
  • 4、最小化安装服务(软件安装-授权)
  • 5、给系统的重要文件或命令做一个指纹 root --- oldboy --- /etc/shadow /etc/passwd 定时任务文件 防火墙文件
    md5sum
  • 6、给他锁上 chattr +i +a

你可能感兴趣的:(综合架构之SSH服务)