sshd 加固的顺序与验证
一句话总结
更改sshd设置时,最重要的是不是输入什么值,而是以什么顺序确认。弄错了的话会锁住自己。
为什么需要这个?
修复远程服务器的sshd设置就像砍掉树枝一样。设置不正确的话,sshd不会出现,不出现的话就没有进入的方法。如果是没有控制台访问的云实例,可能需要重新生成整个实例。
所以有程序。
- 保持当前会话再打开一个新的终端
- 修改设置文件
sshd -t检查语法- 重新注册服务
- 请不要关闭现有会话在新的终端确认连接
- 只有确认结束后才会关闭现有会话。
跳过3号和5号的人真的很多。而且其中一部分在凌晨去数据中心。
怎么行动
有两个检查命令。
sshd -t # 문법만 검사
sshd -T | sort | head -40 # 실제 적용될 유효 설정 전체 출력
sshd -T -C user=deploy,host=10.0.3.14,addr=10.0.3.14 | grep -i 'passwordauth\|pubkey'
-t只看语法。-T显示了最终应用的值全部。这种差异重要的原因是最近发行版正在修改设置。
Include /etc/ssh/sshd_config.d/*.conf
**如果出现多次相同的键,sshd会使用第一个值。**所以Include如果在文件前面,碎片文件会赢,如果在后面,正文会赢。“明明改了,但还是吃不消”的一半就出自这里。-T通过确认的习惯可以阻止这个问题的发生。
推荐设置和各值的含义。
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
AllowGroups sshusers
X11Forwarding no
PermitEmptyPasswords no
LogLevel VERBOSE
PermitRootLogin基本值是prohibit-password全部。**即使在基本状态下,root的密码登录已经被阻止,允许使用键盘登录。**要完全阻止的话no.PasswordAuthentication基本值是yes如果已转换为身高认证,请务必明确说明。no**应该换成。KbdInteractiveAuthentication基本值也yes都。我以为密码被锁住了,但也有通过这个路径进入的情况,所以一起锁上。旧名字ChallengeResponseAuthentication银是被废弃的别称。MaxAuthTries默认6. 如果失败达到这个值的一半,从那时起就会记录在日志中。LoginGraceTime基本120秒。为了不长时间保持无法登录的连接,最好减少。LogLevel VERBOSE在日志中留下用于认证的密钥的指纹。如果有感谢要求的话,实际上是必须的。
Match用块创建例外。
Match Group sftponly
ChrootDirectory /srv/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
Match如果条件符合的话,接下来Match我覆盖了文件末尾的设置。**如果相同的关键词在多个Match中满足,则只应用第一个。**顺序会改变结果,所以sshd -T -C ...必须进行验证。
在现场相遇的样子
**无法连接时的按层次诊断。**三个信息的区分是诊断的一半。
Connection refused→ 没有恶魔在Connection timed out→路线被堵住了Permission denied (publickey)→ 被粘上了,但在认证中失败了。
还有ssh -vvv阅读的诀窍。debug1: Connecting to如果不能到那里的话,就是网络问题,Offering public key下次Authentications that can continue如果重复,服务器就会拒绝该密钥。
锁上后不让自己锁上自己的方法
修改sshd设置的工作是能把自己推出去的少数工作。 遵守顺序的话,那个危险就会消失。
现在绝对不会断开会话。即使重新启动sshd,已经建立的连接也会保持。 所以在保留那个会话的情况下,在新窗口中尝试连接。如果成功的话,就把原来的会话 关闭,如果不行的话,会从原来的会话中恢复。
sshd -t # 문법 검사. 통과해야 재시작한다
systemctl reload sshd
ssh -o BatchMode=yes user@host true # 다른 창에서
**一起看两个设置文件。**最近的发行版是/etc/ssh/sshd_config.d/*.conf
阅读后,**第一个出现的值获胜。**我修改了这个文件,如果不吃的话,请取消注册。
是在前面决定的。
sshd -T | grep -iE 'permitrootlogin|passwordauth|pubkeyauth|port'
sshd -T显示实际应用的值。比起读取文件,这个更准确。
**一次不犯错。**在关闭密码认证之前,所有人都可以用钥匙进入。 先确认有没有。如果不确认就关掉的话,从那一刻开始就会出现无法接听的人。 那个事实是在那个人需要的时候才知道的。
更换端口不是为了安全,而是为了减少噪音。虽然自动扫描日志减少了,但实际
不能阻止攻击。相反,用防火墙限制可以连接的出发地或
fail2ban重复阻止失败是有实效的。
真正价格高的三个是这些。
| 设置 | 效果 |
|---|---|
PasswordAuthentication no |
不可以无差别地代入 |
PermitRootLogin no |
还要弄清楚一个账号名。 |
AllowGroups ssh-users |
新账户不会自动获得连接权限 |
确保对控制台的访问。可以进入云的串行控制台或IPMI吗? 提前确认。在只能通过ssh访问的服务器上安装sshd设置是没有退路的 成为工作。
下次实习要做的事情
用drop-in设置文件硬编码sshd,sshd -t哇sshd -T通过验证。Match制作块,确认是否进行条件性应用,最后实际测试**是否仍然可以连接****密钥,是否拒绝密码认证。