SSH禁用ROOT登录和密码登录
只要你有一台公网服务器,用 lastb -n 30
查看登录失败日志,你就会发现几乎每分钟都有机器人在尝试登录你的服务器。
前段时间群友的腾讯云服务器还真给人把密码给破了,客服还给他发了邮件。
为了增强服务器安全性,这里介绍 SSH 禁用 ROOT 登录和密码登录的方式。
在文章开头简单提一嘴,命令以
#
开头表示 root 用户,以$
开头表示非 root 用户
1. 新增一个非 root 用户 (Serverside)
既然我们要禁用 root 登录,那自然需要一个非 root 用户,用户名以 andy 为例,创建一个 sudo
组的用户
# useradd -m -G "sudo" -s "/bin/bash" andy
如果是 CentOS 系统,sudo 的用户组并非
sudo
,而是wheel
:# useradd -m -G "wheel" -s "/bin/bash" andy
然后为 andy 设置密码
# passwd andy
切换到 andy
# su - andy
接下来使用 sudo 基本都需要 andy 的密码,如果你不希望输入密码,编辑 sudo 的配置文件
$ EDITOR=vim sudo visudo
找到如下配置并解注释 NOPASSWD: ALL
这一行,强迫症可以把之前这行注释掉,但没必要
## Allows people in group wheel to run all commands
#%wheel ALL=(ALL) ALL
## Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
我们推荐接下来都使用 andy 来操作,这样你的服务器更不容易玩坏,当然 root 权限更高,你更喜欢掌控一切的感觉
$ sudo su -
2. 配置免密登录
配置免密登录有两种方式
- 其一:在本地生成 ssh key,然后将公钥发给服务器
- 其二:在服务器生成 ssh key,然后将密钥下载到本地
无论哪种方案,我们都需要妥善保管密钥,建议多地备份,如果失去了密钥,那么我们就没有办法登录服务器了。
2.1 方案一
2.1.1 生成 SSH key
给你的 SSH key 随便签个名,这里以 [email protected] 为例,2022 年了我们推荐 ed25519 加密 (Localside)
$ ssh-keygen -t ed25519 -C "[email protected]"
2.1.2 将公钥交给服务器
用 ssh-copy-id 命令将公钥交给服务器 (Localside)
$ ssh-copy-id andy@{serverip}
或者以手动的方式将公钥交给服务器
查看本地公钥 (Localside)
$ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAXXXXXXXXXXXXXAAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [email protected]
编辑远程 auth 文件 (Serverside)
$ vim ~/.ssh/authorized_keys
将公钥写在文件末尾,如果已经有其他公钥,需要另起一行 (Serverside)
ssh-ed25519 AAAAXXXXXXXXXXXXXAAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [email protected]
保存退出后修改 auth 文件权限,ssh-copy-id
命令会自动设置权限无需额外操作 (Serverside)
$ chmod 600 ~/.ssh/authorized_keys
2.2 方案二
2.2.1 生成 SSH key (Serverside)
$ ssh-keygen -t ed25519 -C "[email protected]"
2.2.2 将密钥下载到本地 (Localside)
随便设置一个文件名,这里以 foobar 为例
$ scp andy@{serverip}:~/.ssh/id_ed25519 ~/.ssh/foobar
修改密钥权限
$ chmod 600 ~/.ssh/foobar
接下来有两种方案,
- 其一:将密钥添加到 ssh-agent
- 其二:配置 ssh config
Linux/macOS 推荐第一种,因为 ssh agent 服务会在登录时自动运行;WSL/windows 则推荐第二种,免去配置 ssh-agent 的烦恼
将密钥添加到 ssh-agent
$ ssh-add ~/.ssh/foobar
编辑 ssh config
vim ~/.ssh/config
添加如下内容,Host 一行可以取一个好记得名字,之后可以用简写登录 ssh {servername}
,这里以 andy_server 为例
Host andy_server
HostName {serverip}
Port 22
User andy
IdentityFile /home/cmos/.ssh/foobar
IdentitiesOnly yes
都可以配置 ssh config 来达到简写登录的目的
3. 测试免密登录 (Localside)
$ ssh andy@{serverip}
或者你配置过了 ~/.ssh/config
$ ssh andy_server
4. 禁用 root 用户登录和密码登录 (Serverside)
修改 sshd 配置
$ sudo vim /etc/ssh/sshd_config
找到如下配置并修改,从上至下分别是:禁用 root 登录、允许密钥登录和禁用密码登录
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
改完后重启 sshd
$ sudo systemctl restart sshd
再次测试能否免密登录
5. 问题排查
首先排查文件权限,查看以下文件权限是否正确
服务器上:
-rw-------. 1 andy andy 88 Jun 15 21:29 authorized_keys
-rw-------. 1 andy andy 399 Jun 15 21:29 id_ed25519
-rw-r--r--. 1 andy andy 88 Jun 15 21:29 id_ed25519.pub
如果不对
$ chmod 600 authorized_keys
$ chmod 600 id_ed25519
$ chmod 644 id_ed25519.pub
本地:
-rw------- 1 {username} {username} 399 Jun 15 18:53 foobar
如果不对
$ chmod 600 foobar
然后排查 sshd 配置
PermitRootLogin no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
如果你还在使用 RSA 密钥,则需要
RSAAuthentication yes
如果还是有问题,先百度(Google)一下看看,如果还是不行,那就找个论坛问问小伙伴吧,记得附上 debug 日志:
$ ssh -vvv {username}@{server_ip}