跳转到主要内容

SSH 登录安全实践

设置新服务器后应该做的第一件事,强化你的 SSH 安全。

 

SSH 普遍用于连接远程机器上的 shell,SSH 会话最重要的部分是建立安全连接。

现代客户端仅支持 SSH 2.0 因为 1.0 被发现有缺陷,为了使 SSH 会话正常工作,客户端和服务器都必须支持相同版本的 SSH 协议。

 

 

 

秘钥种类

Host Key 主机秘钥
用于证明主机的身份,第一次连接时会让你确认,避免中间人攻击。

Public Key 公钥
密钥对外公开的部分。

Private Key 私钥
保护好它,给它设置密码,只使用安全方式传输!

算法

理论上 Openssh 8.0/9.0 支持 4 种算法。

  • RSA
  • DSA
  • EcDSA
  • Ed25519(EdDSA)

但 DSA 被证明不安全,默认禁用,打开你的 sshd_config 你应该能看到

HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

sshd 会读取默认会使用这些格式的 host key,可以看到不安全的 DSA 并不在其中。

 

密码学很复杂,这里就不过多叙述了,长话短说吧。

你应该选择 4096 位 RSAEd25519(EdDSA),若要保证最佳兼容性,请选择 4096 RSA。
虽然 Ed25519 要更小也更快,但即便到了今天,某些 SSH 客户端还是并不支持这种算法。

 

更改端口

相信拥有公网服务器的你都经历过 SSH 密码被尝试暴力破解,我们应该将 SSH 修改为非默认端口来降低被暴力破解的可能性。

/etc/ssh/sshd_config 中设置:

Port 你要的端口

默认设置应该被注释了:#Port 22

 
禁用密码认证

一旦你设置了更加安全的方法,那么马上禁用密码认证,这可以有效防止暴力破解。

/etc/ssh/sshd_config 中设置:

PasswordAuthentication no
ChallengeResponseAuthentication no

 

启用密钥认证

这应该是默认启用的

/etc/ssh/sshd_config 中设置:

PubkeyAuthentication yes

 

禁止 Root 登录

/etc/ssh/sshd_config 中设置:

PermitRootLogin no
 
只允许规定的账户登录

即使已使用秘钥,也只应该运行规定的用户登录。
/etc/ssh/sshd_config 中设置:

AllowUsers 用户名

AllowGroups 用户组

 

私钥格式

一般来说 OpenSSH 有 3 种格式来保存私钥,“OpenSSH 格式” 、“PEM 格式”“PuTTY PPK 格式”。
几乎所有的软件都支持 PEM 格式,但只有较新的软件才支持 OpenSSH 格式,也有很多软件支持 PPK 格式。

OpenSSH 格式更能抵抗暴力破解,且 Ed25519 只能保存在 OpenSSH 格式中。
如果你使用 PEM 格式,你将不能使用 Ed25519。
PuTTY PPK 有 1、2、3 三个版本,除版本 1 外均支持 Ed25519。

它们功能都一样,核心内容也相同,而且大部分秘钥可以来回转换。
但一些新加密算法(Ed25519)只能使用新格式储存。
采用哪种格式储存以你的客户端兼容为准。

如何辨别

以文本形式打开文件,带有此格式开头和结尾的即为 OpenSSH 格式

-----BEGIN OPENSSH PRIVATE KEY-----
中间内容省略(BASE64 编码数据)
-----END OPENSSH PRIVATE KEY-----

以文本形式打开文件,带有此格式开头和结尾的即为加密旧 PEM 格式

(PKCS
-----BEGIN#1)。此格式仅支持 PRIVATE KEY-----
中间内容省略
-----END PRIVATE KEY-----

也可能带有算法名称,如:RSA。

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: 加密方法,一串十六进制数字作为初始向量
中间内容省略(BASE64 编码数据)
-----END RSA PRIVATE KEY-----

以文本形式打开文件,带有此格式开头和结尾的即为未加密旧 PEM 格式(PKCS #1)。此格式仅支持 RSA。

-----BEGIN RSA PRIVATE KEY-----
中间内容省略(BASE64 编码数据)
-----END RSA PRIVATE KEY-----

以文本形式打开文件,带有此格式开头和结尾的即为加密 PEM 格式(PKCS #8)

-----BEGIN ENCRYPTED PRIVATE KEY-----
中间内容省略(BASE64 编码数据)
-----END ENCRYPTED PRIVATE KEY-----

以文本形式打开文件,带有此格式开头和结尾的即为未加密 PEM 格式(PKCS #8)

-----BEGIN PRIVATE KEY-----
中间内容省略(BASE64 编码数据)
-----END PRIVATE KEY-----

以文本形式打开文件,带有此格式开头的即为 PuTTY PPK 格式(中文替换为实际内容),具体格式参考这里

PuTTY-User-Key-File-版本号: 算法名称
Encryption: 加密类型
Comment: 注释
之后内容省略

 

 

 

生成秘钥

该参数-a定义密钥派生函数的轮数。这个数字越高,尝试暴力破解您的私钥密码的人就越难——而且您在 SSH 登录会话初始化期间必须等待的时间也越长。

 

 

 

主要参考

https://www.cisecurity.org/benchmark/red_hat_linux

https://goteleport.com/blog/comparing-ssh-keys/

https://stribika.github.io/2015/01/04/secure-secure-shell.html