如何创建一个足够安全的SSH链接?

1 概述

使用SSH链接服务器是一件很日常的事,可是,链接是否足够安全是一个使人担心的问题。本文从以下几个方面介绍了如何创建一个足够安全的SSH链接:python

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

2 端口

第一步就是修改默认端口22,修改/etc/ssh/sshd_config中的Port便可,好比这里修改成1234端口:算法

Port 1234

注意这里须要配合SELinu添加端口,不然不能启动sshd服务,在CentOS8中能够经过semanage添加端口,首先查看是否安装policycoreutils-python-utilsubuntu

rpm -qa | grep policycoreutils-python-utils

若是没有安装就使用yum安装:安全

sudo yum install policycoreutils-python-utils

接着添加ssh端口:bash

sudo semanage port -m -t ssh_port_t -p tcp 1234

查看是否添加成功:服务器

sudo semanage port -l | grep ssh

在这里插入图片描述

3 SSH协议

SSH2协议要比SSH1安全,所以建议使用,一样修改配置文件:ssh

Protocol 2 # 若是没有就末尾添加

注意服务器添加Protocol 2后,客户端也须要在/etc/ssh/sshd_config中添加Protocol 2tcp

4 超时断开

修改成60s未操做自动断开:函数

ClientAliveInterval 60 
# 以秒为单位,超过60s未操做自动断开

ClientAliveCountMax 0 
# 若是客户端没有响应则判断一次超时,该参数设置容许超时的次数

5 限制用户

5.1 禁用Root用户登陆

PermitRootLogin no

5.2 指定用户登陆

AllowUsers testuser

这样只能经过ssh testuser@ip链接到该服务器。加密

另外还能够为用户添加指定ip,好比笔者的本机内网ip192.168.1.7,修改成:

AllowUser testuser@192.168.1.7

这样其余ip就不能登陆了。

5.3 禁用特定用户登陆

DenyUser testuser

禁止经过testuser登陆。

相似的配置还有AllowGroupsDenyGroups

6 密码

6.1 禁用(空)密码登陆

PermitEmptyPasswords no
PasswordAuthentication no

6.2 错误次数

MaxAuthTries 6

默认为最多容许3次密码错误(须要除2),修改成2则表示若是密码输入错误一次即自动断开。

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 100 -t ed25519 -f ~/.ssh/ed25519

参数说明以下:

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

生成以后复制公钥便可:

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

8.2 私钥密码

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

在这里插入图片描述

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

在这里插入图片描述

8.3 使用不一样密钥对

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

ssh-keygen -a 100 -t ed25519 -f ~/.ssh/server1
ssh-keygen -a 100 -t ed25519 -f ~/.ssh/server2
ssh-keygen -a 100 -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 参考