• 如何建立一个足够安全的SSH连接?


    1 概述

    使用SSH连接服务器是一件很平常的事,但是,连接是否足够安全是一个令人担忧的问题。本文从如下几个方面介绍了如何建立一个足够安全的SSH连接:

    • 端口
    • 协议
    • 用户
    • 密码
    • 密钥对
    • ssh-agent

    2 端口

    第一步就是修改默认端口22,修改/etc/ssh/sshd_config中的Port即可,比如这里修改为1234端口:

    Port 1234
    

    在这里插入图片描述

    Debian系的系统中直接修改端口就可以了,在RedHat中还需要使用semanage去开启端口:

    yum install policycoreutils-python #没有安装的话需要先安装
    semanage port -a -t ssh_port_t -p tcp 1234 # 添加端口
    semanage port -l | grep ssh # 验证是否添加成功
    

    3 SSH协议

    SSH2协议要比SSH1安全,因此建议使用,同样修改配置文件:

    Protocol 2 # 如果没有就末尾添加
    

    这样客户端连接的时候就不能使用Protocol 1协议连接:

    ssh -1 username@ip
    

    会提示

    SSH protocol v.1 is no longer supported
    

    4 超时断开

    修改为60s未操作自动断开:

    ClientAliveInterval 60 
    # 以秒为单位,超过60s未操作自动断开
    
    ClientAliveCountMax 0 
    # 如果客户端没有响应则判断一次超时,该参数设置允许超时的次数
    

    5 限制用户

    5.1 禁用root用户登录

    PermitRootLogin no
    

    当然禁用之前需要先创建好登录的用户,这里假设创建一个叫aa的用户:

    useradd aa
    passwd aa
    vim /etc/sudoers
    

    复制一行root的权限并修改用户名:

    在这里插入图片描述

    然后输入:wq!强制保存退出。

    5.2 指定用户登录

    AllowUsers testuser
    

    这样只能通过该用户连接到该服务器,另外,如果出现拒绝登录的问题:

    kex_exchange_identification: read: Connection reset by peer
    

    则需要去开启对应允许的ip登录,修改/etc/hosts.allow,添加:

    sshd: ALL
    

    5.3 禁用特定用户登录

    DenyUser testuser
    

    禁止通过testuser登录。

    类似的配置还有AllowGroupsDenyGroups

    6 密码

    禁用(空)密码登录:

    PermitEmptyPasswords no
    PasswordAuthentication no
    

    7 日志

    LogLevel VERBOSE
    

    默认为INFO,修改为VERBOSE可以得到更加详细的信息。

    8 密钥对

    8.1 生成密钥对

    上面已经设置了不能使用密码登录,那么,换句话说需要使用密钥登录,生成密钥并不难:

    ssh-keygen -t rsa 
    

    只需要指定算法即可,默认为3072位,可选4096位。

    但是,相比起传统的RSA,在OpenSSH 6.5中引入了另一种叫Ed25519的更加安全的算法,使用椭圆曲线进行加密。Ed25519相比起RSA的优点有:

    • 体积更小:相比起RSA 3072544个字符,Ed25519只有68个字符
    • 更快:生成速度比RSA快,同时签名速度也比RSA
    • 更安全:签名过程不依赖随机数生成器,不依赖哈希函数的防碰撞特性,没有时间通道攻击的问题

    生成方式很简单:

    ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/ed25519
    

    参数说明如下:

    • -a:指定KDFKey Derivation Function)的轮数
    • -t:指定算法,可选dsaecdsaecdsa-sked25519ed25519-skrsa
    • -f:指定位置

    生成之后复制公钥即可:

    ssh-copy-id -i ~/.ssh/ed25519.pub user@ip
    

    8.2 私钥密码

    比如按上述方式生成密钥对时,会提示输入私钥密码:

    在这里插入图片描述

    这里的密码会在使用私钥连接的时候提示:

    在这里插入图片描述

    8.3 配合ssh-add

    默认情况下每次使用私钥登录的时候都需要输入私钥的密码,如果不想每次输出,可以使用ssh-add

    ssh-add ~/.ssh/test # ~/.ssh/test替换成对应的私钥路径
    

    这样只需要输入一次私钥密码,下一次连接的时候就不需要输入私钥密码连接了。

    8.4 使用不同密钥对

    假设您有多台服务器:server1server2server3,则可以为不同服务器使用不同的密钥对,而不是使用同一个密钥对:

    ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server1
    ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server2
    ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server3
    

    接着复制公钥到对应的服务器上:

    ssh-copy-id user@server1 -i ~/.ssh/server1.pub
    ssh-copy-id user@server2 -i ~/.ssh/server2.pub
    ssh-copy-id user@server3 -i ~/.ssh/server3.pub
    

    9 ssh-agent

    9.1 这是什么?

    ssh-agent是一个程序,可以帮助管理私钥。代理能提供如下用途:

    • 自动选择密钥:使用不同密钥连接到不同主机时,需要手动指定密钥(比如上面的使用不同密钥对的例子中,连接到不同服务器时需要加上-i参数),ssh-agent可以自动选择,不需要手动指定
    • 自动输入私钥密码:如果私钥设置了密钥(比如上面的私钥密码例子),但是又需要频繁地使用私钥进行认证时,ssh-agent可以帮助自动输入私钥的密码

    9.2 使用

    首先启动:

    eval `ssh-agent` # 注意是反引号
    

    接着添加私钥:

    # 以上面“使用不同的密钥对”为例
    ssh-add ~/.ssh/server1
    ssh-add ~/.ssh/server1
    ssh-add ~/.ssh/server1
    

    这样连接的时候就不需要手动指定-i参数了。

    如果私钥指定了密码,会在ssh-add时进行提示输入:

    在这里插入图片描述

    这样下次使用带密钥的私钥连接时就不需要输入密码了。

    10 2FA

    Two-Factor Authentication,缩写2FA,意为双重认证双因子认证等等,顾名思义就是进行两步认证的操作,可选的应用有:

    • Google Authenticator
    • Authy
    • Yubico
    • Duo

    比如Google Authenticator,安装之后,连接服务器需要进行输入验证码的操作。

    具体的话就不演示了,因为笔者需要经常连接,因此这个选项对笔者来说不太实际,想要实现的话具体可以参考这里

    11 其他选项

    11.1 设置最大错误次数

    MaxAuthTries 6
    

    默认为最多允许3次密码错误(需要除2),修改为2则表示如果密码输入错误一次即自动断开。

    11.2 主动断开会话

    LoginGraceTime 120
    

    LoginGraceTime指定的时间内如果没有连接成功,则自动断开会话,默认单位为秒,可以指定以分钟为单位,比如:

    LoginGraceTime 2m
    

    12 最后

    修改完配置文件/etc/ssh/ssd_config后,对sshd服务进行重启:

    systemctl restart sshd
    

    13 参考

  • 相关阅读:
    (转载) 随机数原理
    ZOJ 2588 Burning Bridges(求桥的数量,邻接表)
    生成不重复的随机数对(C/C++)
    比较两个文件是否相同(C/C++语言)
    计算文件大小(C/C++语言)
    (转载)Nim游戏博弈(收集完全版)
    将一串字符串全排列输出(回溯法)
    Linux中使用Crontab定时监测维护Tomcat应用程序的方法
    Nginx单向认证的安装配置
    非关系型数据库 2017-02-12 22:27 189人阅读 评论(2) 收藏
  • 原文地址:https://www.cnblogs.com/6b7b5fc3/p/13536473.html
Copyright © 2020-2023  润新知