跳转到主要内容

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 格式” 、“PEM 格式”、“PuTTY PPK 格式”。
几乎所有的软件都支持 PEM 格式,但只有较新的软件才支持 OpenSSH 格式,也有很多软件支持 PPK 格式。

如果你使用 PEM 格式,你将不能使用 Ed25519。
OpenSSH 格式相比于 PEM 格式更能抵抗暴力破解,且 Ed25519 只能保存在 OpenSSH 等更新格式中。
PuTTY PPK 有 1、2、3 三个版本,除版本 1 外均支持 Ed25519。
PEM 基本上就是 base64 编码的 DER ( Distinguished Encoding Rules ) ,可以放很多的东西,例如 PKCS1 或 PKCS8 密钥或证书、CSR 等等。

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

如何辨别

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

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

以文本形式打开文件,带有此格式开头和结尾的即为加密旧 PEM 格式(PKCS #1)。此格式仅支持 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: 注释
之后内容省略




生成秘钥

理论上在本地生成密钥对,将公钥发送到服务器更加安全。而不是从服务器下载私钥到本地。

RSA 4096 位

openssl genrsa -aes256 -out private.key 4096

openssl rsa -in private.key -out public.key -pubout

-primes 指定生成 RSA 密钥时要使用的素数数。num参数-a必须是大于 1 且小于 16 的正整数。如果num大于2,则生成的密钥称为“多素”RSA 密钥,该密钥在 RFC 8017 中定义

显然,要达到相同的密钥位数(模的位数),多素数RSA系统比普通RSA系统所需要的素数要小。因此,多素数RSA算法的优点主要表现在两个方面:
1.        
能够减少函数成密钥轮数计算量这个数字越高

2.        应用孙子定理(中国剩余定理)尝试暴力破能够减少密、签名计算量。

-aes256 使用指定的算法aes256-cbc 对私钥进行加码的人就越难——而且您在 SSH,ssh-keygen 登录会话初始化期间必须等待的时间也越长。指定此参数似乎很麻烦



为什么不仅仅使用RSA加密


RSA并非旨在处理大量数据,而且很慢。在这种情况下,建议使用诸如AES(高级加密标准)之类的对称算法。

 

AES + RSA

解决此问题的常用方法是使用AES加密/解密所需的内容,并使用RSA共享AES密钥。这样,您可以利用AES效率,同时最大程度地降低其负面影响(发送密钥)。

 

 

 

 

主要参考

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