SSH 密钥目录全解 — ~/.ssh 各文件职责与权限
来源:微信公众号「Python运维实践」《一文读懂 ~/.ssh:私钥、公钥、known_hosts 到底各管什么》
定位:用 SSH 登录、配免密、传文件都离不开 ~/.ssh,但目录里一堆文件——id_ed25519、id_ed25519.pub、authorized_keys、known_hosts、config——到底各管什么?哪个能公开、哪个必须保密、权限设多少?照本文执行即可,无需回忆。
一句话结论
- 私钥(id_ed25519)=你证明「我是我」的凭证,必须藏好,绝不能外泄
- 公钥(id_ed25519.pub)=发给对方、贴在门锁上的「钥匙孔」,可以公开
- authorized_keys=服务器上「允许进门」的公钥名单
- known_hosts=你「认识」过的服务器身份证,用来防止中间人冒充
- config=给每台主机写的「快捷方式」和默认参数
关键排查直觉: 把文件复制到新电脑、恢复备份或更改了属主之后,SSH 突然不再接受密钥——先检查这个目录(尤其是权限),往往一步定位。
目录位置
~/.ssh 位于主目录内,OpenSSH 需要时自动创建(生成密钥或首次连接某台主机)。
ls -ld ~/.ssh
输出示例:
drwx------ 2 sara sara 4096 Mar 4 14:22 /home/sara/.ssh
sara 是属主,rwx------ 对应权限位 700——属主完全访问,阻止其他所有人访问。
坑位: OpenSSH 不要求目录中每个文件都保密,但——组或其他用户拥有写权限会让服务器拒绝 authorized_keys;私钥权限过于宽松会让客户端忽略该密钥。
私钥与公钥
生成密钥对(两个文件落入 ~/.ssh):
ssh-keygen -t ed25519 -C "sara@workstation"
输出示例:Generating public/private ed25519 key pair. Enter file in which to save the key (/home/sara/.ssh/id_ed25519): ——按回车接受默认路径。
id_ed25519是私钥:必须留在生成它的那台机器上,绝不可共享。权限 600(仅属主可读写);只要组用户可读,OpenSSH 就会拒绝使用id_ed25519.pub是公钥:用途就是复制到其他机器、粘贴到托管平台后台、或添加到服务器~/.ssh/authorized_keys。权限通常 644
老系统: 可能看到 id_rsa 和 id_rsa.pub,OpenSSH 认识这些默认文件名,未设置 IdentityFile 时会自动尝试。新密钥 Ed25519 是更优默认:密钥更小、认证更快。
authorized_keys(服务器端)
列出允许以该用户身份登录的公钥,每一行是一个完整公钥,与客户端 .pub 文件内容完全一致:
cat ~/.ssh/authorized_keys
输出示例:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE2... sara@workstation
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPgs... sara@laptop
每行授权一个公钥,末尾可选注释(如 sara@workstation)帮识别来源。
- 权限 600,必须归属于使用它的账号,不能被其他用户写入
- StrictModes(默认开启)还会检查父级路径:即便 ~/.ssh 权限正确,主目录也不能对组或其他用户开放写权限
- 复制公钥用
ssh-copy-id [email protected],不要手动编辑文件——该命令追加公钥并避免覆盖已有密钥
known_hosts
记录此前连接过的服务器主机密钥,防止中间人冒充。首次连接某台新主机时,OpenSSH 打印主机指纹并请求确认;确认后密钥被追加到此文件。此后该主机密钥一旦变化,触发强烈警告而不是静默重连。
ssh-keygen -F example.com
输出示例(显示匹配条目及行号):
# Host example.com found: line 3
|1|abc...=|def...= ssh-ed25519 AAAAC3Nz...
末尾 |1| 表示主机名已被哈希(hash)——客户端配置启用 HashKnownHosts yes 时使用此格式(上游默认 no;你的 Linux 发行版可能在 /etc/ssh/ssh_config 中开启)。
服务器更换主机密钥(如重装系统)后:只删除旧条目,不要删整个文件:
ssh-keygen -R example.com
权限 644 常见;共享机器上可用 600 防止其他用户读取未哈希的服务器名称。
config
按主机区分别名与默认参数:
Host work-server
HostName example.com
User sara
Port 2222
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
有了它,ssh work-server 会以 sara 身份经 2222 端口连接 example.com,且仅使用指定密钥。Host * 块适用于所有主机,适合放保活等默认设置。
- OpenSSH 对每个选项取它找到的第一个值 → 具体主机块放前面,通用设置放底部
- 权限 600:不能被其他用户写入(否则拒绝),也防止其他用户读你的主机名和账号名
重置 SSH 权限(复制/恢复后认证失败,先跑这个)
chmod 700 ~/.ssh
find ~/.ssh -maxdepth 1 -type f -name 'id_*' ! -name '*.pub' -exec chmod 600 {} +
find ~/.ssh -maxdepth 1 -type f -name '*.pub' -exec chmod 644 {} +
for file in authorized_keys config; do
[ -e "$HOME/.ssh/$file" ] && chmod 600 "$HOME/.ssh/$file"
done
[ -e ~/.ssh/known_hosts ] && chmod 644 ~/.ssh/known_hosts
第一条 find 把私钥设为 600,第二条把公钥设为 644;后续 [ -e ... ] 检查只更新已存在文件——无论客户端还是服务器账号,直接跑整段脚本都不会因文件缺失报错。
客户端与服务器的目录差异
同一个 ~/.ssh,机器在特定会话中充当客户端还是服务器,存放文件不同。
典型客户端(密钥对 + 连接配置 + 已知服务器记录):
config id_ed25519 id_ed25519.pub known_hosts
典型服务器账号(只需要 authorized_keys 即可接受密钥登录):
authorized_keys
一台机器可同时是客户端又是服务器:工作站用私钥发起对外连接,同时保留 authorized_keys 接收传入的 SCP 传输。
SSH 权限速查表
| 路径 | 用途 | 权限 |
|---|---|---|
~/.ssh/ |
目录本身 | 700 |
~/.ssh/id_ed25519、id_rsa |
私钥 | 600 |
~/.ssh/id_ed25519.pub、id_rsa.pub |
公钥 | 644 |
~/.ssh/authorized_keys |
允许登录本账号的公钥 | 600 |
~/.ssh/known_hosts |
曾连接过的主机密钥 | 644 |
~/.ssh/config |
客户端配置与按主机别名 | 600 |
总结
私钥证明你是谁,公钥让别人认得你,authorized_keys 决定谁能进服务器,known_hosts 防止你连到冒牌服务器,config 帮你省去重复输入。
权限口诀:目录 700,私钥和 authorized_keys 600,公钥和 known_hosts 644。文件复制或恢复后密钥认证失败时——先查这些权限,往往一步定位。
关联页面
| 页面 | 关联点 |
|---|---|
| ssh-connection-debugging-guide | SSH 连接调试完全指南:ssh -vvv 输出解读 / 服务端日志联查 / 典型问题排查 |
| ssh-brute-force-protection-guide | SSH 暴力破解防御指南:公钥认证 / fail2ban / 2FA / 入侵检测 / 应急处置 |
| scp-rsync-file-transfer | SCP/RSYNC 文件传输:免密配置、目录同步与常见坑 |
| server-security-hardening-checklist | 服务器安全加固清单:20 项新机器上线前必做操作 / SSH 加固 |
| linux-hacked-server-emergency-response | Linux 服务器入侵应急响应清单:SSH 加固 / 后门排查 / 取证快照 |