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
登录。
类似的配置还有AllowGroups
与DenyGroups
。
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 3072
的544
个字符,Ed25519
只有68
个字符 - 更快:生成速度比
RSA
快,同时签名速度也比RSA
快 - 更安全:签名过程不依赖随机数生成器,不依赖哈希函数的防碰撞特性,没有时间通道攻击的问题
生成方式很简单:
ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/ed25519
参数说明如下:
-a
:指定KDF
(Key Derivation Function
)的轮数-t
:指定算法,可选dsa
、ecdsa
、ecdsa-sk
、ed25519
、ed25519-sk
、rsa
-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 使用不同密钥对
假设您有多台服务器:server1
,server2
,server3
,则可以为不同服务器使用不同的密钥对,而不是使用同一个密钥对:
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