用root账号直接操作服务器,在生产环境里是个大忌——权限太大,一不小心删错文件、改错配置,后果可能很严重。正规的做法是创建一个普通用户,给它配上sudo权限,日常操作都用这个普通账号登录,需要管理员权限时再通过sudo临时提权。
但普通用户配置SSH密钥登录,跟root用户不太一样——最大的坑在于权限。很多人在root下配得好好的,换到普通用户就死活连不上,折腾半天发现就是文件权限没设对。这篇文章把非root用户配置SSH密钥登录的完整流程拆开讲,每一步都写清楚,照着做就能通。
准备工作:目标是什么?
最终要实现的效果:在本地电脑上生成一对密钥(公钥和私钥),把公钥放到服务器上某个普通用户的家目录里,然后就能用私钥直接登录这个普通用户账号,不需要输密码。
整个过程可以分为三步:创建普通用户 → 生成并部署密钥 → 配置权限并测试。
第一步:在服务器上创建普通用户
如果你手上还没有一个普通用户账号,先用root登录服务器,创建一个。
创建一个用户,同时自动生成家目录:
useradd -m your_username
-m参数会同时创建/home/your_username这个家目录,省得后面再手动建。
设置登录密码(这一步必须做,即使后面用密钥登录,首次连接也需要密码验证身份):
passwd your_username
系统会提示输入两次密码。注意:这个密码是第一次用SSH连接时验证身份用的,密钥配置好之后就不再需要了。
给这个用户添加sudo权限(可选但强烈推荐):
usermod -aG wheel your_username # CentOS/Rocky
usermod -aG sudo your_username # Ubuntu/Debian
有了sudo权限,普通用户就能在需要时临时提权执行管理员命令,不用动不动切root。
切换到普通用户,后续操作都在这个用户身份下执行:
su - your_username
cd ~
第二步:生成SSH密钥对
检查.ssh目录是否存在。如果第一次用这个用户登录,家目录下可能没有.ssh文件夹,先建一个:
mkdir -p ~/.ssh
生成密钥对:
ssh-keygen -t ed25519 -C "your_email@example.com"
-t ed25519是目前最推荐的算法,比RSA更快更安全。如果系统太老不支持Ed25519,可以用ssh-keygen -t rsa -b 4096替代。
一路按回车,会提示你输入passphrase(私钥保护密码)。强烈建议设一个——即使私钥文件被人偷了,没有passphrase也用不了。
执行完后,~/.ssh/目录下会生成两个文件:
id_ed25519:私钥,绝对不能给别人看,也不能传到服务器上
id_ed25519.pub:公钥,要放到服务器上的authorized_keys文件里
第三步:把公钥加到授权文件里
创建authorized_keys文件:
touch ~/.ssh/authorized_keys
把公钥追加进去:
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
这条命令会把刚才生成的公钥内容写入到授权文件里,一行一个公钥,SSH就是靠这个文件来识别谁能登录的。
第四步:设置正确的权限(最关键的一步)
这是非root用户配置SSH密钥登录时最容易踩的坑。SSH服务对.ssh目录和authorized_keys文件的权限有严格要求——太开放了它反而拒绝使用,因为它担心文件被其他用户篡改。
设置.ssh目录权限为700:
chmod 700 ~/.ssh
只有文件所有者(你自己)可以读写执行,其他用户没有任何权限。
设置authorized_keys文件权限为600:
chmod 600 ~/.ssh/authorized_keys
只有所有者可以读写,其他用户连看都看不了。
如果私钥也要用ssh -i方式指定,也把私钥权限设成600:
chmod 600 ~/.ssh/id_ed25519
验证一下权限是否正确:
ls -la ~/.ssh/
应该看到:
drwx------(700)对应.ssh目录
-rw-------(600)对应authorized_keys和id_ed25519
为什么权限这么重要? 如果.ssh目录权限是drwxrwxr-x(775)或者authorized_keys权限是-rw-rw-r--(664),SSH会直接忽略公钥认证,然后提示你输入密码。这个坑在root用户下不太明显,到了普通用户这里就特别容易中招。
第五步:从客户端测试连接
回到你本地电脑,执行:
ssh -i /path/to/private_key your_username@你的服务器IP
如果是第一次连接,系统会提示确认服务器指纹,输入yes即可。
登录成功后,用whoami确认当前身份是你创建的普通用户,而不是root。
如果提示“Permission denied (publickey)”,检查几件事:
1. ~/.ssh目录权限是不是drwx------(700)
2. ~/.ssh/authorized_keys权限是不是-rw-------(600)
3. 公钥是否真的写进了authorized_keys文件,有没有拼写错误或换行问题。
第六步(可选):禁用root登录和密码登录
密钥验证通过之后,可以考虑进一步加固SSH配置。
编辑/etc/ssh/sshd_config(需要sudo权限):
sudo vi /etc/ssh/sshd_config
找到下面几行,改成:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
重启SSH服务让配置生效:
sudo systemctl restart sshd
重要提醒:改这个之前,务必确保你已经能用普通用户的密钥登录成功。否则把自己锁在门外就麻烦了。
总结:非root用户配置SSH密钥登录,流程跟root用户差不多,区别就在于权限要求更严格、更敏感。把权限这道关过了,普通用户的密钥登录就顺了。
推荐文章