要管理服务器,我们就必须远程登录来传递指令,而黑客拥有和我们一样的需求。如何用最短的时间控制尽量多的服务器,以便获取经济利益呢?
黑客们不可能一台一台接一台地攻破,一方面没有那么多的时间和精力,另一方面,现在的系统和软件安全性越来越高,大部分服务器的漏洞其实是用户本身。这些黑客们通过脚本和程序大规模地扫描,使用密码字典穷举破解,从而获取大量“肉鸡”。
为什么要设置密钥登录?
如何避免服务器成为黑客们的“肉鸡”,单从服务器的设置来考虑:
- 使用复杂且较长的密码,增加字典穷举的难度;
- 使用普通账户,禁止 Root 用户远程登录。
假设使用的密码正好是与某个网络密码相同,而这个密码不小心泄露了,那么以上方案不一定能够把黑客阻挡在门外。我们有一个更安全、更便捷的方法——SSH 密钥。
本文以阿里云 ECS 为例,创建密钥有 3 种方式:
- 通过 ECS 后台创建
- 登录服务器创建,再下载私钥到本地
- 本地创建密钥,再推送公钥到服务器
我们推荐使用第三种方法,一方面避免下载密钥的麻烦,另一方面,无论 Linux、MacOS 还是 Windows 都自带 SSH 功能,无需任何第三方软件,可以很方便地进行设置。
本地系统以用户最多的 Windows 为例。
创建密钥
为了彰显 Windows 系统的生产力属性,同时与 Linux 接轨,微软近年来坚持推广并开源 PowerShell,在目前推送的系统版本中,PowerShell 已经替代 CMD 成为默认终端。
按 Win + R 打开运行窗口,输入 PowerShell 并回车,在终端窗口中输入:
ssh-keygen
输入密钥存放路径,默认在当前用户的 .ssh 文件夹下,按回车即可。
接着输入私钥密码,任何需要调用私钥的情景下都需要输入密码,避免私钥被盗用。如果希望实现无密码登录,此处应留空。
出现以下提示即创建成功:
推送公钥,允许密钥登录
如果没有修改存放位置,密钥文件就会保存在当前用户目录的 .ssh 文件夹下,里面包含私钥和公钥,以 .pub 结尾的就是公钥文件,我们要把它推送到服务器上。
ssh-copy-id -i ~/.ssh/id_rsa.pub xxx@host
上面代码中的 id_rsa.pub 是公钥文件,xxx 是 ECS 服务器的用户名(希望用密钥登录哪个用户就写哪个用户名),host 是服务器 IP 地址。如果修改过 SSH 的端口,还应该在结尾添加 -p 端口号
。
接着输入用户密码,很快就会看到上传成功的提示。此时可以试试以下命令,看是否跳过输密码的步骤,直接登录成功:
ssh xxx@host
如果依旧要求输入密码,那就需要检查服务器上的 /etc/ssh/sshd_config 文件,正确设置如下:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
修改后需运行 service sshd restart
来重启 SSH 服务。还未解决的话则需要修改用户目录权限:
chmod 755 /home/xxx
禁止密码登录
确认密钥能够登录成功之后,我们需要把密码登录禁止,否则就失去使用密钥的安全意义。
依旧编辑 ECS 上的 /etc/ssh/sshd_config 文件,取消密码验证:
PasswordAuthentication no
运行 service sshd restart
重启 SSH 服务使之生效,使用密码登录服务器就会收到 deny 提示:Permission denied (publickey,gssapi-keyex,gssapi-with-mic).