Linux系统中,免密登录通常基于SSH密钥认证实现,通过将本地公钥添加到远程服务器的~/.ssh/authorized_keys
文件中,实现无需输入密码即可登录,若需要解除免密登录(如安全需求变更、密钥泄露或仅需临时禁用),可通过以下方法操作,具体场景和步骤如下:
解除免密登录的核心方法
免密登录的核心是SSH密钥认证的启用与配置,解除操作需围绕“移除公钥”“禁用密钥认证”或“重置密钥”展开,具体分为以下四种常见场景:
移除特定用户的免密登录权限(精准控制)
适用场景:仅禁止某个特定用户(如旧设备或离职用户)的免密登录,保留其他用户的免密权限。
操作对象:远程服务器(目标机器)。
关键步骤:
- 登录服务器并定位公钥文件:
通过SSH或直接登录远程服务器,进入用户家目录的.ssh
文件夹(默认路径~/.ssh/
),该文件存储所有允许免密登录的公钥。cd ~/.ssh ls -la # 查看文件,确认存在authorized_keys
- 编辑并删除目标公钥:
使用vi
/nano
等编辑器打开authorized_keys
文件,找到需要解除的公钥行(通常以ssh-rsa
、ssh-ed25519
等开头,后跟密钥内容和用户标识),直接删除该行。vi authorized_keys # 保存后退出(vi中按:wq)
- 检查文件权限:
SSH服务对authorized_keys
的权限敏感,需确保权限为600
(仅所有者可读写),否则可能认证失败:chmod 600 authorized_keys chmod 700 ~/.ssh # 确保.ssh目录权限为700
完全禁用远程服务器的免密登录(全局禁用)
适用场景:服务器需强制所有用户使用密码登录(如高安全环境),彻底关闭密钥认证通道。
操作对象:远程服务器(需root权限)。
关键步骤:
- 修改SSH服务配置文件:
编辑/etc/ssh/sshd_config
(SSH服务的全局配置文件),找到PubkeyAuthentication
配置项,将其值改为no
(默认为yes
):vi /etc/ssh/sshd_config # 定位到PubkeyAuthentication yes,改为no
- 禁用密码登录(可选):
若需同时禁用密码登录(仅保留密钥认证,但实际已禁用密钥),可设置PasswordAuthentication no
,但若禁用密钥后未开启密码登录,可能导致无法登录,需谨慎操作。 - 重启SSH服务使配置生效:
修改配置后需重启SSH服务,新配置才会生效:systemctl restart sshd # CentOS/RHEL系统 systemctl restart ssh # Ubuntu/Debian系统
重置本地SSH密钥(本地密钥泄露场景)
适用场景:本地私钥(如~/.ssh/id_rsa
)可能泄露(如设备丢失、私钥文件被拷贝),需重新生成密钥对并更新服务器,避免旧密钥继续免密登录。
操作对象:本地机器 + 远程服务器。
关键步骤:
- 本地生成新密钥对:
执行ssh-keygen
命令生成新的密钥对(建议使用ed25519
算法,安全性更高),覆盖旧密钥或指定新文件名(如id_rsa_new
):ssh-keygen -t ed25519 -f ~/.ssh/id_rsa_new -C "new_key_comment" # 按提示输入密码(可选,建议设置,避免私钥无密码直接使用)
- 上传新公钥到服务器:
使用ssh-copy-id
命令将新公钥(id_rsa_new.pub
)添加到服务器的authorized_keys
中:ssh-copy-id -i ~/.ssh/id_rsa_new.pub user@remote_server # 输入用户密码完成上传
- 清理旧密钥(可选):
若旧密钥无需保留,可删除本地旧私钥和服务器上的旧公钥(参考方法1)。
临时禁用免密登录(测试或紧急场景)
适用场景:临时测试密码登录是否正常,或紧急情况下临时关闭免密登录,无需修改配置文件。
操作对象:本地机器。
关键步骤:
- 使用SSH参数强制密码认证:
连接远程服务器时,通过-o
参数指定认证方式为密码,忽略本地密钥:ssh -o PreferredAuthentications=password user@remote_server
- 修改本地SSH配置文件(临时):
在本地~/.ssh/config
文件中针对特定主机添加PasswordAuthentication yes
,临时覆盖全局配置:vi ~/.ssh/config # 添加以下内容(示例) Host remote_server HostName remote_server_ip User username PasswordAuthentication yes
不同解除方法的对比总结
为方便快速选择,以下表格汇总上述方法的适用场景和操作要点:
方法名称 | 适用场景 | 操作对象 | 关键命令/步骤 |
---|---|---|---|
移除特定用户公钥 | 精准禁止某个用户免密登录 | 远程服务器 | 编辑~/.ssh/authorized_keys 删除目标行,检查权限(chmod 600) |
完全禁用服务器密钥认证 | 全局关闭所有免密登录 | 远程服务器(需root) | 修改/etc/ssh/sshd_config 中PubkeyAuthentication no ,重启SSH服务 |
重置本地SSH密钥 | 本地私钥泄露,需更换密钥对 | 本地+远程服务器 | 本地ssh-keygen 生成新密钥,ssh-copy-id 上传新公钥 |
临时强制密码登录 | 测试或紧急场景,临时关闭免密登录 | 本地机器 | 连接时加-o PreferredAuthentications=password 或修改本地~/.ssh/config |
注意事项
- 权限问题:
~/.ssh
目录权限必须为700
,authorized_keys
权限必须为600
,否则SSH服务会拒绝加载密钥,导致免密登录失败(即使公钥存在)。 - 配置备份:修改
/etc/ssh/sshd_config
前建议备份原文件(cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
),避免误操作导致SSH服务无法启动。 - 多用户环境:若服务器有多个用户,需逐用户检查
~/.ssh/authorized_keys
,避免遗漏其他用户的免密配置。
相关问答FAQs
Q1:解除免密登录后,为什么仍然可以免密登录?
A:可能原因包括:① 未重启SSH服务(修改sshd_config
后需执行systemctl restart sshd
);② authorized_keys
文件权限错误(非600
);③ 本地SSH客户端仍缓存了密钥(可尝试ssh -l user remote_server -o IdentitiesOnly=yes
强制使用指定密钥);④ 服务器存在其他密钥认证文件(如authorized_keys2
,旧版SSH可能使用)。
Q2:如何验证免密登录是否已成功解除?
A:可通过以下方式验证:① 尝试免密登录,若提示Permission denied (publickey,password)
,说明密钥认证已禁用;② 使用ssh -v user@remote_server
(-v
显示详细日志),查看认证过程是否包含publickey
,若日志中仅出现password
认证,则免密登录已解除;③ 在服务器上检查/var/log/auth.log
(Ubuntu)或/var/log/secure
(CentOS),查看登录认证记录,确认无publickey
成功的日志。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/28522.html