众所周知, SSH 是远程控制中使用最广泛和最重要的工具, 所有 * nix 系统都是默认启动 SSH 服务. 虽然 SSH 可以保证数据传输的安全, 但是默认配置的情况下 SSH 存在被探测, 被暴力破解的危险, 很多主机由此沦为了肉鸡. 本文虫虫给大家介绍一下 SSH 安全最佳实践, 以提高主机安全.
网络限制
信息安全最根本最有效的方法是, 保障网络安全, 通过网络限制可以最大程度保障系统安全, 对 SSH 服务也是如此, 可以通过硬防, 安全组(针对云资源, 相当于硬防), 主机防火墙等限制 SSH 端口, 以保障安全.
防火墙
防火墙的主要工作是使用预定义的规则检查传入和传出的流量. 关于硬件防火墙和安全组在此不在多说.
*nix 系主机可以使用 iptables 防火墙, iptables 是对 netfilter 应用级打包, 可以用来数据包过滤, 接受或拒绝数据包 (或采取其他行动) 以保护系统免受攻击.
使用 iptables 可以定义规则, 限制 IP 地址, 端口或协议的 SSH 流量. 还可以跟踪最近的 SSH 端口连接. 也可以使用速率限制连接, 根据 IP 地址连接到 SSH 的速率来阻止它们.
使用防火墙并调整其配置有助于减少 SSH 攻击的机会. 一个典型 Iptables 白名单访问的例子如下:
- ...
- -A INPUT -s 192.168.1.8 -p tcp -m state --state NEW -m tcp --dport 2022 -j ACCEPT
- -A INPUT -s 192.168.1.6 -p tcp -m state --state NEW -m tcp --dport 2022 -j ACCEPT
- -A INPUT -p tcp --dport 2022 -j REJECT --reject-with icmp-host-prohibite
- ...
以上规则中, 只允许 Ip 地址 192.168.1.6 和 192.168.1.8 访问 2022 端口(修改过的 SSH 端口).
堡垒机
堡垒主是专门设计用于阻止来自网络的恶意流量和攻击的安全网关. 堡垒在公共网络上公开的安全代理和审计服务, 通过堡垒机和限制和审计用户操作, 记录用户操作, 可以对可疑操作进行告警或者直接阻断从而减少对主机威胁.
当两个通道建立 SSH 连接时, 设置堡垒主机可能有助于提高安全性并保护系统.
堡垒机是个非常重要的安全设备, 但是同时它本身也是风险点和单点, 如果堡垒机由于漏洞或者其他因素被人攻陷或者出现故障, 会造成重大问题. 毕竟把所有鸡蛋都放在一个篮子里, 摔了那就都碎了. 所以保障堡垒机安全和高可用至关重要.
双因子认证(2FA)
在双因子认证的体系中, 系统需要两种不同形式的身份验证才能获得访问权限. 最常见的双因子验证是用户登陆时候除了输入用户名和密码外, 还要通过手机短信验证码才能通登陆系统. 虽然发送到移动设备的一次性密码会受到中间人 (MITM) 攻击 , 但使用第二个因子总比没有第二个因子要好.
更安全的双因子认证还有硬件是安全校验卡 YubiKey 和 Apple TouchID 等. 开源方法有基于 google-authenticator 和 FreeOPT 的方式以及基于 freeipa 的方式.
通过启用双因子验证功能, 系统管理员可确保任何通过 SSH 登录远程系统的用户都必须使用多个容易被盗的凭据进行身份验证, 可保证比单独使用密码或 SSH 密钥更安全.
另外在国家网络安全等级保护标准中, 在网络, 主机等部分密码要求都明确要求了双因子认证.
公钥和 SSH Certificate-based 验证
尽管基于 SSH 密钥身份验证是密认证的更好替代方案, 可以增强远程登录过程的安全性, 但它也有其潜在的障碍. 例如, 用户必须将私钥存储在其设备上, 其设备有可能是被盗或者因为攻陷导致泄密. 而且 SSH 证书实际上只是另一个名称的密码, 私钥也可以泄露, 被人利用.
为了防止私钥泄露, 在生成证书时候可以设置密码保护是个很好的做法, 另外将私钥保存在非常用的~/.SSH / 目录也可以一定程度上避免泄露.
基于 CA 签发证书的 SSH Certificate-based 身份验证是一个更好的选择. SSH 证书通过使用 CA 公钥来保护登录过程, 同时还提供证书来验证每个密钥的身份.
通过使用这种身份验证方法, 无需每次去服务器上添加用户公钥, 只需在 sshd_config 添加一 CA 的公钥信任既可以:
TrustedUserCAKeys /etc/SSH/user_ca_key.pub
同时在签发证书时候可以对签发的公钥进行用户名, 时间, 源地址等限制. 配置成功后, 访问 SSH 就是基于用户私钥 (userss) 和 CA 签发的 cert 证书 (user-cert.pub) 认证:
SSH -p2022 -o CertificateFile = user-cert.pub -i userss user@192.168.1.22
为了方便可以配置 SSH config 简化访问时候选项设置:
- Host test
- HostName 192.168.1.22
- Port 2022
- User user
- CertificateFile ~/.SSH/user-cert.pub
- IdentityFile ~/.SSH/users
然后就可以简便的 SSH test 访问了.
SSH Certificate-based 身份验证提供了一种对任何计算环境进行身份验证的安全且可扩展的方法.
修改默认 SSH 设置
OpenSSH 默认选项通常通过文件 / etc/SSH/sshd_config 来配置. 前面我们也提到了, 默认配置存在着安全风险, 需要优化配置.
更改默认 22 端口
默认情况下, SSH 服务监听 tcp 端口 22. 任何一个时候, 在互联网上都存在大量探测机器人对 22 端口进行探测, 并且自动暴力攻击常见用户和字典密码. 你新开一台 VPS 主机, 然后安全组开放 22 端口, 几分钟内就会收到 SSH 密码尝试攻击的日志.
在端口探测时候, 往往都是通过默认 22 端口对 SSH 服务探测, 如果更改为非 22 端口就可以避免绝大多数该类探测. 修改 sshd 默认端口的方法是修改 / etc/SSH/sshd_config 文件
找到:
Port 22
修改为:
Port 2022
修改后重启 sshd 服务即可:
systemctl restart sshd.service
当然也可以设置其他的小于 65535 的端口. 注意修改之前记得先在防火墙上开放该端口, 免得把自己踢出去, 登陆不了了.
Iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 2022 -j ACCEPT
禁用 root 登录
其次, 默认情况下, 用户可以以 root 身份通过 SSH 连接到服务器. SSH 根帐户或超级用户帐户是一个非常危险的功能, 因为它允许完全访问和控制整个系统. 而且网络暴力尝试攻击中, root 用户最容易被攻击的账号. 通过在服务器上禁用 root SSH 登录, 可以避免攻击成功可能性, 而且通过权限分配, 可以更好进行用户行为审计和溯源跟踪. 禁止 root 登陆方法是修改 / etc/SSH/sshd_config 文件, 在最后增加一行:
PermitRootLogin no
禁用密码登陆
前面说了密码认证虽然方便, 但是最容易被暴力攻击, 也容易账号泄露, 这可能是系统被黑的最常见的原因(root 建议密码). 应该完全禁止基于密码的 SSH 身份验证并选择至少使用 SSH 密钥. 禁止密码登陆方法是修改 / etc/SSH/sshd_config 文件, 在最后增加一行:
PasswordAuthentication no
利用 "AllowUsers" 来限制访问
此外, 默认情况下, 所有系统用户都可以使用他们的密码或公钥登录 SSH, 这也带来潜在安全隐患. 并非所有系统用户都需要通过 SSH 远程登录. 同限制特定用户对 SSH 访问极大地增强了安全性. 可以通过 / etc/SSH/sshd_config 文件中配置来设置可以访问 SSH 的白名单:
AllowUsers user1 user2 chongchong
这样系统中就只能有 user1 user2 chongchong 三个用户可以 SSH 登陆. 对应还有
AllowGroups 用户组白名单
DenyUsers 用户黑名单
DenyGroups 用户组黑名单
总结
本本中虫虫给介绍 SSH 安全最佳实践, 但是这是最常见最有效的加固方法. 取决于环境和合规性要求这些方法在实际中可以按需调整. 需要指出的是, 要注意遵循优秀实践并正确实施这些实践通常具有挑战性.
来源: http://netsecurity.51cto.com/art/202201/698950.htm