背景
对云端服务器进行一次常规的安全加固行为——禁止使用root直接登录。云端服务器默认是root直接登录,虽然已经取消了通过ssh端口进行密码登录,但是为了更规范以及进一步加固于是决定登陆时以用户身份进入,提权操作再单独设置密码。结果一次常规的加固行为没想到直接翻车了。
做了什么
- 通过
adduser yukirin创建了一个普通用户。 - 将
/etc/ssh/sshd_config中的PermitRootLogin项设置为了no,禁止以root身份直接登录进本机。 - 执行
systemctl restart ssh刷新配置(致命一击O.O)。 - 用powershell新开了一个窗口,测试
ssh my_host。得到Permission denied(publickey)。符合预期,在此之前直接使用ssh就可以直接以root身份上机了(密钥验证,无需密码)。 - 继续测试
ssh yukirin@IP,得到Permission deniend(publickey)。又试了几次,最终得到connection time out。是的,现在的我意识到问题的严重性了——用户yukirin的公钥本就没有配置,无法使用密钥验证登录,而密码登录又被禁止了。更绝的是root虽然配置了密钥,但是直接root登录也已经被禁止了。本地来看算是和云端失联了。 - 好在留了一个已经保持连接的窗口,本来想利用该窗口把yukirin的公钥绑上去,结果这个时候连接被断开了!没错,刚刚
restart这个命令会将所有已建立的连接强制踢掉(;´д`)ゞ。这下本地是彻底和服务器断连了——root被禁、yukirin没钥匙。
救援
没办法,只能进网页VNC救援了。至于救援过程嘛,就是常规的将本地公钥写进ssh的授权文件就行了。
1 | |
写完之后继续使用 ssh yukirin@我的服务器IP 测试登录。一会儿后返回超时 Connection Timeout。这次不是Permission denied 只能说明我们的公钥配置可能成功了(为什么是可能?因为Connection Timeout比Permission denied更低一层,超时说明要不就是平台,要不就是防火墙把我们的包丢了,还没到认证阶段)。
因为在这些操作之前我用我的IP扫了几遍自己的服务器,外加上之前的几次登录错误尝试,所以很大概率被服务器ban掉了。于是我又转头去看了看fail2ban的黑名单:fail2ban-client status sshd
1 | |
果不其然,被fail2ban给丢大牢了。使用命令 fail2ban-client set sshd unbanip <我的IP> 成功将我的ip解禁后再次尝试登录。成功登入。
END
一次常规运用捅了这么多篓子,总的说来还是要给自己留好后手吧。
- 加新用户的时候先确保新的能够正确登上,再去修改旧的用户。同时修改但凡中间出了岔子就会出现这种现象。
- 重载ssh配置优先用
systemctl reload ssh,这个命令不会影响已经建立的连接;而systemctl restart ssh会重启整个进程,断开所有已建立的连接。 - 如果自己的IP长期能够确定或是固定网段的话,还是建议将自己的IP放入fail2ban的ignoreip中,防止被误杀。
- 同上,少用管理IP扫服务器,容易触发风控。