zoukankan      html  css  js  c++  java
  • ssh安全优化免密登陆



    ssh协议


    为什么使用ssh协议?

    在进行传输时,会对数据进行加密,保证会话安全;telnet协议不是加密传输,在传输过程中如果被抓包,就会造成信息泄露,telnet默认不支持root远程。

    # 常用协议端口
    ftp	21
    ssh	22
    telnet 23		# 不支持root登陆
    rsync 873
    rdp   3389
    

    ssh的相关命令


    # 1、ssh远程登陆
    ssh username@IP -p portnumber
    username	表示的是用户名
    -p		指定端口
    IP		表示的是远程主机的IP
    
    # 2、scp文件传输
    scp local_file username@IP:/dir
    
    

    ssh免密登陆

    原理


    SSH免秘钥登录 就是避免了主机之间ssh需要输用户名和密码这一步。

    • 公钥(id_dsa.pub)
    • 私钥(id_dsa)
    • 授权列表文件(authorized_keys)

    实现方法:以A B两台机器为例

    1.A机器分别生成各自的公钥(id_dsa.pub)+私钥(id_dsa),使用ssh-keygen命令,rsa|dsa两种加密方法,任意选一个。

    ssh-keygen 然后全部默认回车;在 ~/.ssh目录下查看生成了 id_dsa.pub+id_dsa

    2.将A的公钥内容添加到B机器的授权列表文件(authorized_keys)

    ssh-copy-id -i /root/.ssh/id_rsa.pub root@B机器的IP
    

    AB机器ssh免秘钥互相登录啦

    登录原理过程:以A机器ssh登录B机器为例。

    1.A向B发送登录请求

    2.B 在自己的授权列表文件中查看是否有A的公钥;没有则拒绝A登录

    3.B中有A公钥,则B随机生成一个字符串,并用A的公钥进行加密,发送给A

    4.A 收到加密后的字符串,用自己的私钥进行解密,得到原始字符串,返回给B

    5.B 对比字符串,如果一致就授权A登录。 A登录B 成功。


    实现过程


    • 客户机(跳板机)----私钥 id_rsa
    • 服务端------公钥 id_rsa.pub

    # 1、创建密钥对
    [root@web02 ~]# ssh-keygen
    -t 指定加密算法    dsa  rsa两种算法
    
    # 2、发送公钥(需要知道root密码)
    [root@web02 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.7
    -i	指定公钥
    
    # 2-1 发送公钥(不需要知道root密码)
    1、客户端查看公钥
    [root@web02 ~]# cat /root/.ssh/id_rsa.pub 
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD+xIvwrNgftG9mVbeTh+iTn4eCheCl4W54yoTurEGBqbVy9iUu1BeN3sc4KmFtAaY8PpvJab4SJnzSwTrrPyq/SZPCMP0jhYfnmFu3YyMFAfF2U3qzuvuJ4HZ20U2dCcCZLbGQxUfFO4tiUkt9fMeORL3G4sas3ENRni6Iq8vLx1auzSaI2XYXEWL0hA2OoeC6V79z/tTfolvY8xKSIatIsMc0GiC5gzDfxWgW1KekU15nFrkai//XPVumDLTprlUHkoI2M5GFm0IcImKzjg2ymMWSrnJCR/WBYNTF6j16DFpN9WLPKxHEOVDdSwS6/aRyc43+vjf5/041NxJoO25n root@web02
    
    2、客户端创建认证目录
    mkdir /root/.ssh
    
    
    3、把公钥复制到服务端
    vi /root/.ssh/authorized_keys 
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD+xIvwrNgftG9mVbeTh+iTn4eCheCl4W54yoTurEGBqbVy9iUu1BeN3sc4KmFtAaY8PpvJab4SJnzSwTrrPyq/SZPCMP0jhYfnmFu3YyMFAfF2U3qzuvuJ4HZ20U2dCcCZLbGQxUfFO4tiUkt9fMeORL3G4sas3ENRni6Iq8vLx1auzSaI2XYXEWL0hA2OoeC6V79z/tTfolvY8xKSIatIsMc0GiC5gzDfxWgW1KekU15nFrkai//XPVumDLTprlUHkoI2M5GFm0IcImKzjg2ymMWSrnJCR/WBYNTF6j16DFpN9WLPKxHEOVDdSwS6/aRyc43+vjf5/041NxJoO25n root@web02
    
    4、授权
    chmod 700 /root/.ssh/
    chmod 600 /root/.ssh/authorized_keys
    

    生产场景案例


    # 1、创建密钥
    [root@m01 ~]# ssh-keygen
    
    # 2、分发公钥
    [root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.7
    [root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.8
    [root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.31
    [root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.41
    
    # 3、在跳板机上编辑脚本
    [root@m01 ~]# vi jump_server.sh
    #!/bin/bash
    web01="172.16.1.7"
    web02="172.16.1.8"
    nfs="172.16.1.31"
    backup="172.16.1.41"
    m01="172.16.1.61"
    cat<EOF
            +-------------------------+
            |     1) web01            |
            |     2) web02            |
            |     3) nfs              |
            |     4) backup           |
            |     h) help             |
            +-------------------------+
    EOF
    read -p 'Please input Number:' num
    if [ $num -eq 1 ];then
            ssh root@web01
    elif [ $num -eq 2 ];then
            ssh root@web02
    elif [ $num -eq 3 ];then
            ssh root@nfs
    elif [ $num -eq 4 ];then
            ssh root@backup
    fi
    

    ssh安全优化


    [root@web01 ~]# vi /etc/ssh/sshd_config
    Port 6666                       # 变更SSH服务远程连接端口
    PermitRootLogin         no      # 禁止root用户直接远程登录
    PasswordAuthentication  no      # 禁止使用密码直接远程登录
    
    
    # 这两个可以减少ssh的延迟尤其是在使用ansible的时候
    UseDNS                  no      # 禁止ssh进行dns反向解析,影响ssh连接效率参数
    GSSAPIAuthentication    no      # 禁止GSS认证,减少连接时产生的延迟
    
    # 在企业中需要优化的内容:
    安全方面的优化:
        ssh 端口
        不允许root登陆
        禁止使用密码登陆
    性能方面的优化:
    	不使用dns反向解析
    	不使用gss的认证
    	
    systemctl restart sshd
    

    expect免交互


    [root@web01 ~]# yum -y install expect
    
    [root@web01 ~]# vi expect.ext
    #!/usr/bin/expect
    set ip 10.0.0.31
    set pass 1
    set timeout 30
    spawn ssh root@$ip
    expect {
            "(yes/no)" {send "yes
    "; exp_continue}
            "password:" {send "$pass
    "}
    }
    expect "root@*"  {send "df -h
    "}
    expect "root@*"  {send "exit
    "}
    expect eof
    

    sshpass免交互


    [root@m01 ~]# yum -y install sshpass
    [root@m01 ~]# sshpass -p 1 ssh -o stricthostkeychecking=no root@10.0.0.31
    -p 			# 指定密码
    


  • 相关阅读:
    Linux 使用 ssh 命令远程连接另一台 Linux
    高并发连接导致打开文件过多:java.io.IOException: Too many open files 解决方法
    WEB安全:Tomcat 只可通过域名访问,禁止通过 IP 访问
    Jmeter
    CentOS 7 开启 SNMP 实现服务器性能监控
    SSM框架、Druid连接池实现多数据源配置(已上线使用)
    Tomcat 服务器安装 SSL证书,实现 HTTP 自动跳转 HTTPS
    java操作远程共享目录
    jobss目录结构
    oracle中if/else的三种实现方式
  • 原文地址:https://www.cnblogs.com/gshelldon/p/13287919.html
Copyright © 2011-2022 走看看