SSH自锁事故复盘

背景

对云端服务器进行一次常规的安全加固行为——禁止使用root直接登录。云端服务器默认是root直接登录,虽然已经取消了通过ssh端口进行密码登录,但是为了更规范以及进一步加固于是决定登陆时以用户身份进入,提权操作再单独设置密码。结果一次常规的加固行为没想到直接翻车了。

做了什么

  1. 通过 adduser yukirin 创建了一个普通用户。
  2. 将 /etc/ssh/sshd_config 中的 PermitRootLogin 项设置为了no,禁止以root身份直接登录进本机。
  3. 执行 systemctl restart ssh 刷新配置(致命一击O.O)。
  4. 用powershell新开了一个窗口,测试 ssh my_host 。得到 Permission denied(publickey) 。符合预期,在此之前直接使用ssh就可以直接以root身份上机了(密钥验证,无需密码)。
  5. 继续测试 ssh yukirin@IP ,得到Permission deniend(publickey)。又试了几次,最终得到 connection time out。是的,现在的我意识到问题的严重性了——用户yukirin的公钥本就没有配置,无法使用密钥验证登录,而密码登录又被禁止了。更绝的是root虽然配置了密钥,但是直接root登录也已经被禁止了。本地来看算是和云端失联了。
  6. 好在留了一个已经保持连接的窗口,本来想利用该窗口把yukirin的公钥绑上去,结果这个时候连接被断开了!没错,刚刚 restart 这个命令会将所有已建立的连接强制踢掉(;´д`)ゞ。这下本地是彻底和服务器断连了——root被禁、yukirin没钥匙。

救援

没办法,只能进网页VNC救援了。至于救援过程嘛,就是常规的将本地公钥写进ssh的授权文件就行了。

1
2
3
4
5
su - yukirin
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "我的公钥" > ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

写完之后继续使用 ssh yukirin@我的服务器IP 测试登录。一会儿后返回超时 Connection Timeout。这次不是Permission denied 只能说明我们的公钥配置可能成功了(为什么是可能?因为Connection Timeout比Permission denied更低一层,超时说明要不就是平台,要不就是防火墙把我们的包丢了,还没到认证阶段)。

因为在这些操作之前我用我的IP扫了几遍自己的服务器,外加上之前的几次登录错误尝试,所以很大概率被服务器ban掉了。于是我又转头去看了看fail2ban的黑名单:fail2ban-client status sshd

1
2
`- Banned IP list:    我的IP

果不其然,被fail2ban给丢大牢了。使用命令 fail2ban-client set sshd unbanip <我的IP> 成功将我的ip解禁后再次尝试登录。成功登入。


END

一次常规运用捅了这么多篓子,总的说来还是要给自己留好后手吧。

  • 加新用户的时候先确保新的能够正确登上,再去修改旧的用户。同时修改但凡中间出了岔子就会出现这种现象。
  • 重载ssh配置优先用systemctl reload ssh,这个命令不会影响已经建立的连接;而 systemctl restart ssh 会重启整个进程,断开所有已建立的连接。
  • 如果自己的IP长期能够确定或是固定网段的话,还是建议将自己的IP放入fail2ban的ignoreip中,防止被误杀。
  • 同上,少用管理IP扫服务器,容易触发风控。

VsCode 本地与 SSH 云端双窗口切换问题

之前一直在用PowerShell跑ssh与云端连接,最近突然想换一换工具于是准备在VsCode上跑ssh插件与云端进行连接。环境安装过程一切正常,直到关闭所有窗口再重新打开VsCode之后,发现除了ssh以及一些美化插件之外,其它工程拓展全部“丢了”(Keil/ESP Tools等等)——也就是默认打开VsCode后不再是我的工程面板,而是云端ssh连接。


一开始还以为是装ssh插件的时候误删了我的工程拓展插件,不过越想越不可能。我核实了一下我的本地拓展,全部都齐全,没有出现丢失的情况。

后来发现在打开VsCode默认窗口的基础上再开启一个新工作区窗口之后我的拓展又全部都回来了。

经查问题出现在VsCode的窗口打开机制上面。ssh插件是窗口级别的,也就是一个云端机一个窗口;而我之前的Keil等拓展插件只是普通插件,绑定在本地LOCAL窗口上,因此在启用并进入ssh后这些拓展并不会被加载,自然就出现了所谓的“丢失”现象。

至于为什么默认启动是ssh而不是原先的工作区——VSC默认的打开行为是恢复上一次的窗口,我们上一次关闭VSC的时候停在了ssh窗口,因此下一次启动直接就默认启动ssh了,而不是工作区。具体见下列文件:

1
AppData\Roaming\Code\User\settings.json

该文件是用户的全局配置文件,在里面加上一条:"window.restoreWindows": "none",

这样每次启动就会默认启动本地工作区了,需要用到ssh的时候再手动启动ssh工作区。

音乐
0:000:00