linux设置密钥登录,仅允许一个低权限用户密码登录
为了提升安全性,通常应该为服务器设置密钥登录。但是有时意外地需要在其它设备上登录这台服务器时可能手头没有密钥,因此对我个人而言能够兼顾安全性和可用性的方法是:
- SSH禁用所有用户,尤其是root的密码登录,只允许密钥登录。
- 仅允许一个低权限用户使用密码登录,这个用户几乎什么都做不了。
- 给高权限用户设置复杂的密码。
如此一来,大部分用户都只能用密钥登录,如果偶发地需要在没有密钥的设备上登录这台服务器,就需要先用SSH登录低权限用户,然后在bash里登录高权限用户。这样就需要两层用户认证才能触及linux的高权限。
首先用以下命令创建一个低权限用户:
useradd testuser
passwd testuser
登录高权限用户(也就是你常用的那个用户),使用以下命令生成和保存ssh-key
ssh-keygen -t ed25519
mkdir -p ~/.ssh
chmod 700 ~/.ssh
cat ~/.ssh/id_ed25519.pub > ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chown -R testuser:testuser ~/.ssh
上述命令生成了ssh密钥并把公钥写入了authorized_keys来生效。接下来使用winscp等工具把id_ed25519私钥文件拷贝出来用于登录,然后在服务器上删除密钥:
rm ~/testuser/.ssh/id_ed25519*
至此我们能够在客户端使用密钥登录服务器了,接下来我们把服务器上SSH密码登录给禁用掉:
PasswordAuthentication no
ChallengeResponseAuthentication no # 某些新版改名为KbdInteractiveAuthentication,作用一样的
PubkeyAuthentication yes
然后再写一个match来允许testuser的密码登录:
# Example of overriding settings on a per-user basis
Match User wangjiahua
PasswordAuthentication yes
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
PasswordAuthentication yes
最后再执行下面的命令重启ssh
sudo systemctl restart ssh # 或者sudo systemctl restart sshd
至此配置结束,可以尝试使用ssh命令来登录,除了testuser以外的用户都无法使用密码登录了。