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 位 RSA
或 Ed25519(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参数必须是大于 1 且小于 16 的正整数。如果num大于2,则生成的密钥称为“多素”RSA 密钥,该密钥在 RFC 8017 中定义。
显然,要达到相同的密钥位数(模的位数),多素数RSA系统比普通RSA系统所需要的素数要小。因此,多素数RSA算法的优点主要表现在两个方面:
1. 能够减少生成密钥的计算量。
2. 应用孙子定理(中国剩余定理),能够减少解密、签名的计算量。
-aes256 使用指定的算法aes256-cbc 对私钥进行加密 ,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