ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SSH免密登录原理与实战:从ssh-keygen到排错全解析

SSH免密登录原理与实战:从ssh-keygen到排错全解析 做运维这些年我最常被同事问的一句话就是能不能帮我配一下那台新机器的免密登录问的人多了我发现一个规律很多人不是不会用ssh-keygen而是对整个免密登录的机制一知半解配通了纯属运气一旦换台机器、换个用户、换把密钥就抓瞎。今天这篇就把 Passwordless SSH 从原理到实战完整拆一遍覆盖单机配置、多主机管理、权限排查、生产环境进阶玩法希望能让看完的人不仅会配还能自己排查问题。这套内容适合谁刚接触 Linux 的新手可以先照着配置走通被权限报错折磨过的运维可以直接跳到第 4 节和第 6 节想用免密登录接自动化脚本、定时任务、跳板机场景的朋友第 5 节是给你准备的。我先说结论免密登录不是玄学它的每一步背后都有明确的安全模型和系统检查逻辑搞懂了这些排错就是按图索骥的事。1. 为什么我宁愿折腾一次也要彻底摆脱密码适用场景与底层原理1.1 密码认证的三个痛点与密钥认证的定位先想想不用免密登录时你每天在经历什么连测试服务器输一次密码跳板到生产机再输一次跑个scp传文件又是一次每天重复十几次输入相同密码。如果你管理的是几十台 Linux 服务器密码认证的痛点会被无限放大我归纳下来基本是三个效率低每台机器都要手动输入密码tab 键补全用户名和主机名唯独密码没法补全。难以自动化脚本、定时任务、CI/CD 流水线需要非交互式登录密码认证天然不配合。你总不能在每个 cron 任务里写死密码那不仅是维护噩梦更是安全漏洞。风险集中密码一旦被暴力破解或者泄露等于把整批机器的入口都交了出去。而不同机器用不同密码又根本记不住很多人最后全用同一个密码风险进一步放大。密钥认证解决的不是有没有密码的问题而是要不要每次手动确认身份的问题。它用一对密钥文件代替密码来证明你是你私钥留在本地公钥放到服务器上。连接时服务器给客户端出一道只有持有对应私钥才能解开的题解开了就放行。这样既满足了自动化需求又比密码更抗暴力破解因为私钥不是通过网络传输的攻击者无法通过监听抓包拿到它。1.2 公钥与私钥的配合逻辑一次类比讲清楚很多人第一次接触公私钥对时会被术语绕晕我习惯用锁和钥匙来类比。公钥就是一把锁你把它挂到服务器的大门上私钥是你贴身带着的钥匙。任何人只要手里有这把锁的钥匙就能开门但问题是钥匙只在你自己手里。服务器不关心你是谁它只验证你出示的钥匙能不能打开我这把锁。技术细节上SSH 的密钥认证通常有两种验证方式。一种是签名验证服务器发送一段随机数据给客户端客户端用私钥对它签名服务器用公钥验证签名是否有效。另一种是加密验证早期协议版本用过服务器用公钥加密一段数据客户端能用私钥解出来才算通过。现代 OpenSSH 默认推荐的是签名方式因为私钥从不离开本地也不需要服务器保存任何解密所需的信息安全性更高。这里有个新手常常搞反的点公钥不是机密可以随便分发私钥才是你唯一的凭证绝不能离开本地机器。我之前见过有人把私钥放到 GitHub 仓库里用来备份这等于把家门钥匙拍了张照片发到网上风险极大。记住一条铁律私钥文件的权限永远是 600所有者是你自己任何多余的用户和组权限都会让 SSH 拒绝使用这个密钥。2. 首次配置完整走一遍从生成密钥对到第一条免密连接2.1 ssh-keygen生成密钥对时的关键参数选择生成密钥对的命令是ssh-keygen但参数怎么选直接决定了后续使用的顺滑程度和安全性。我的习惯是ssh-keygen -t ed25519 -C deploy-key -f ~/.ssh/id_ed25519逐个参数说清楚-t ed25519指定密钥算法。Ed25519 是目前我推荐的默认选择密钥短公钥就几十字节、生成快、安全性高而且 OpenSSH 对它的支持已经很成熟。如果你的服务器 SSH 版本比较老比如 CentOS 6 上的 OpenSSH 5.3可能不支持 Ed25519那就退一步用-t rsa -b 4096兼容性最好但密钥文件会长一些生成也慢一点。-C deploy-key注释信息。它不影响认证纯粹是人类可读的标识方便你区分这把密钥是给哪台机器、哪个用途用的。我强烈建议写上尤其是密钥多的时候否则后期ls ~/.ssh看到一堆文件根本对不上号。-f ~/.ssh/id_ed25519指定私钥文件路径。如果你用默认路径回车到底就行但要是你生成多把密钥用于不同场景比如一把给个人开发机一把给部署服务器就必须用-f分开命名否则后生成的会把前面的覆盖掉。执行过程中会提示你设置 passphrase口令短语也就是给私钥再加一层密码保护。有人会嫌麻烦直接回车留空这个看场景如果你这台机器只有你一个人用、安全环境可控留空确实方便配好之后 SSH 完全无感但如果私钥文件有泄露风险比如笔记本容易被偷一定要设置 passphrase。配合后面的 ssh-agent第 5 节会细讲设置 passphrase 的麻烦几乎可以忽略安全性却高了一个量级。生成完确认一下文件ls -l ~/.ssh/id_ed25519*你会看到两个文件id_ed25519是私钥id_ed25519.pub是公钥。这时就能把公钥内容打开看看它会以ssh-ed25519开头后面是一长串 base64 编码的字符串这就是要放到服务器上的锁。2.2 ssh-copy-id 与手工部署 authorized_keys密钥对生成后下一步是把公钥送到服务器正确的位置。服务器端保存公钥的文件叫authorized_keys位于对应用户家目录的.ssh目录下。你需要把公钥内容追加到这个文件的末尾。最省事的办法是ssh-copy-idssh-copy-id -i ~/.ssh/id_ed25519.pub useryour-server它会自动登录一次服务器这时还要输密码然后帮你在服务器上创建~/.ssh目录、调整权限、把公钥追加到authorized_keys。整个过程一条命令搞定。如果你的服务器没有ssh-copy-id有些精简系统没有装这个工具或者你想完全手动控制就用管道一把梭cat ~/.ssh/id_ed25519.pub | ssh useryour-server mkdir -p ~/.ssh chmod 700 ~/.ssh cat ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys这条命令在远端依次执行四件事建目录、改目录权限、追加公钥、改文件权限。我特别强调两个细节用追加而不是覆盖。如果你之前已经在authorized_keys里放过别的公钥覆盖操作会把你自己的旧钥匙也删掉到时候连你自己都登不进去只能让管理员从带外方式接入了。目录权限 700、文件权限 600 不是可选项。OpenSSH 的StrictModes默认开启如果.ssh目录或authorized_keys文件对组用户或其他人开放了写权限服务器会直接拒绝使用这个公钥哪怕内容完全正确。权限问题导致的免密失败占了所有配好了还是不生效案例的一大半具体排查方法第 4 节展开。如果服务器上已经配了多个用户的公钥注意authorized_keys文件里每个公钥占一行你可以用注释行以#开头来标注每把钥匙属于谁方便后期管理。2.3 验证连接与 known_hosts 的正确处理方式公钥放好后测试免密登录ssh useryour-server如果能直接进入 shell 而不需要密码恭喜你最基础的免密登录已经通了。但如果提示Permission denied (publickey)先别急着怀疑密钥按第 4 节的排查思路走一遍。这里还有一个大多数教程不会提到的细节第一次连接时SSH 会提示你确认服务器的主机公钥指纹Are you sure you want to continue connecting (yes/no)?。这个指纹存放在本地~/.ssh/known_hosts文件里作用是防止中间人攻击——确保你连接的确实是那台服务器而不是某台伪装的机器。千万不要随手敲yes了事。正确做法是比对服务器的真实指纹。你可以在服务器上执行ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub拿到服务器的公钥指纹再和你本地提示里显示的指纹比对一致才输入 yes。特别是生产环境这个确认动作一定不能省。对于需要自动化、无法交互确认指纹的场景可以用ssh-keyscan预先批量收集主机指纹写入 known_hosts或者用-o StrictHostKeyCheckingaccept-new首次连接时自动接受这个选项只接受新出现过的主机对已存在但指纹变化的主机仍然会拒绝安全上相对可控。3. 多服务器场景下的管理利器~/.ssh/config 配置文件3.1 让 ssh 命令短一半的别名配置技巧当你手里的服务器超过三五台每次敲ssh root192.168.1.10 -p 2222这种长命令会非常痛苦。这时候~/.ssh/config文件就派上用场了。它的核心作用是把主机信息、账号、端口、密钥路径汇总成一个别名让你一条简短命令直达目标。我的一个典型配置Host web-prod HostName 192.168.1.10 User deploy Port 22 IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60 Host db-backup HostName db.internal.example.com User backup Port 2222 IdentityFile ~/.ssh/id_backup配置完成后登录生产 Web 服务器只需ssh web-prodIdentityFile指定使用哪把私钥。这特别适合多密钥场景比如你给公司服务器配了一把密钥给个人云主机配了另一把不用手动指定SSH 会根据Host自动匹配对应的私钥。ServerAliveInterval 60是我强烈建议加上的参数它让客户端每 60 秒发一个心跳包给服务器避免长时间操作 SSH 会话被无情的 NAT 网关或防火墙静默掐断。对需要长时间跑日志、挂断就会中断任务的场景非常有用。配置文件的权限同样敏感建议设为 600chmod 600 ~/.ssh/config如果你的 config 文件权限不对在某些客户端上会直接报错导致整个配置被忽略特别是 Windows 下的 OpenSSH第 6 节会专门讲这个坑。3.2 多密钥多主机IdentityFile 与 Host 块的匹配规则密钥多起来之后最怕的就是 SSH 拿着错误的私钥去试目标主机。理解匹配规则能帮你少踩很多坑。SSH 读取 config 文件时会从上到下逐个匹配Host字段。Host后面可以跟多个模式比如Host *.example.com my-server User admin IdentityFile ~/.ssh/id_example这表示所有以.example.com结尾的主机以及别名为my-server的主机都使用admin用户和id_example私钥。有个容易混淆的点Host匹配的是你在命令行里输入的别名而不是HostName的完整域名。比如上面的配置中命令行执行ssh my-serverSSH 才匹配到这一段配置如果直接执行ssh 192.168.1.10配置不生效。还有一个注意点SSH 默认会依次尝试当前 agent 中的所有私钥和默认路径下的私钥文件。如果你的~/.ssh下放了 id_rsa、id_ed25519、id_backup 等多把钥匙而配置里又没写IdentityFileSSH 可能会把所有钥匙都试一遍服务器端日志里就会看到一堆Failed publickey for user记录。这虽然不会直接导致认证失败但会让排查变得混乱同时也会增加被服务器临时限速的风险。所以我的建议是每个 Host 块都明确指定IdentityFile让 SSH 只尝试该试的钥匙。3.3 跳板机配置从本机直连内网服务器生产环境最常见的拓扑是你没法直接 SSH 内网服务器必须先登录一台跳板机堡垒机再从跳板机跳到目标机器。传统做法是手动登录跳板机然后再输入一次 SSH 命令操作繁琐不说密钥还要复制到跳板机上等于把私钥暴露给了中间机器。OpenSSH 7.3 之后引入了ProxyJump直接在本地配置里描述跳转关系私钥始终不离开本地。配置方式Host jump-server HostName jump.example.com User admin Host internal-server HostName 10.0.0.5 User appuser ProxyJump jump-server之后直接执行ssh internal-serverSSH 会自动先连接跳板机再从跳板机连接目标内网机器全程只需要一步操作而且不用把私钥拷贝到跳板机上。如果跳板机和目标机的用户名或端口不一致可以分别指定Host internal-server HostName 10.0.0.5 User appuser Port 2222 ProxyJump adminjump.example.com:22022这里要特别注意ProxyJump 本质上是在跳板机上建立一条到目标机的 SSH 隧道所以跳板机本身必须能访问目标机的端口。如果你的内网环境有更复杂的多维跳转ProxyJump还支持逗号分隔的链式跳转ProxyJump jump1,jump2,jump3个人经验是能用ProxyJump就不要用老式的ForwardAgent下一节讲 Agent 转发时会细说前者在安全性和可维护性上都明显更优。4. 免密登录失败的90%原因都在这权限、sshd配置与系统安全策略4.1 三个层级权限检查用户目录、.ssh目录与公钥文件如果密钥配好了还是免密失败第一反应应该是检查权限而不是怀疑密钥有问题。SSH 对文件权限有严格的要求优先级从外到内是三层级对象推荐权限说明用户家目录~755 或 700不能对组用户或其他用户开放写权限.ssh目录700仅所有者可读可写可进入authorized_keys文件600仅所有者可读写私钥文件600绝不能对其他人开放任何权限在服务器上逐一检查ls -ld /home/username ls -ld /home/username/.ssh ls -l /home/username/.ssh/authorized_keys常见的错误结果是家目录是 777、.ssh是 755、authorized_keys是 644。这些都是 SSH 严格模式下会拒绝的。修复命令chmod 700 /home/username/.ssh chmod 600 /home/username/.ssh/authorized_keys chmod 755 /home/username # 或者 chmod 700取决于你是否希望其他人能进入家目录为什么 SSH 对权限这么强迫症因为authorized_keys控制着谁能登录系统如果它对组用户可写意味着任何能登录系统的其他用户都能往这个文件里追加自己的公钥等于给攻击者留了一扇后门。StrictModes就是通过检查这些权限来堵住这类漏洞。4.2 sshd_config 中与密钥认证直接相关的开关权限没问题还不通就要看服务器的 SSH 服务端配置了。主配置文件通常位于/etc/ssh/sshd_config检查这几个关键项grep -E PubkeyAuthentication|PasswordAuthentication|AuthorizedKeysFile|StrictModes /etc/ssh/sshd_config各项含义PubkeyAuthentication yes启用公钥认证。如果被设为 no密钥放得再对也无效。PasswordAuthentication默认通常是 yes也就是密码认证仍然开启。这不影响免密登录本身但如果你想彻底关闭密码登录、只允许密钥认证生产环境强烈建议把它改成no。改之前务必确认密钥认证已经测试通过否则你会把自己锁在服务器外面。AuthorizedKeysFile .ssh/authorized_keys指定公钥文件的查找路径。默认是用户家目录下的.ssh/authorized_keys一般不用动。如果你改过这个路径注意公共服务器的不同发行版可能有细微差异。StrictModes yes开启严格权限检查就是我上面说的那套权限校验逻辑默认开启建议保持。修改完配置后需要重启服务才生效sudo systemctl restart sshd # 或者在一些老系统上 sudo service sshd restart重启前有个保命技巧先开着另一个 SSH 会话别关或者用sshd -t验证配置语法是否正确。sshd -t只检查语法不应用配置如果这个命令都报错千万不要重启否则服务直接挂掉你也连不上了。4.3 SELinux、AppArmor 与家目录加密的隐性影响在 RHEL/CentOS 系服务器上权限和配置都对的情况下仍免密失败就要考虑 SELinux 的干预。SELinux 会给每个文件打上安全上下文标签如果.ssh目录和文件的上下文标签不对SSH 进程读取authorized_keys时会被 SELinux 策略拦截。症状通常是journalctl里出现 denied 记录而普通 SSH 日志里只显示认证失败。修复方法restorecon -Rv /home/username/.ssh这个命令会把.ssh及其中文件的 SELinux 上下文恢复到系统默认的user_home_t等正确类型。如果你把整个 home 目录或.ssh目录迁移过、用 tar 解压过、或者从别的机器 rsync 过来非常容易出现这种上下文丢失或错乱的问题。Ubuntu/Debian 系的 AppArmor 也有类似机制但默认配置下一般不影响 SSH 读取用户 home 目录。真正让我踩过坑的是home 目录加密的场景有些系统比如 Ubuntu 安装时开了 ecryptfs home 加密在用户未登录时home 目录里的内容是加密态。当你用 SSH 密钥登录时如果 PAM 模块没有正确解密 home 目录authorized_keys文件根本读不到免密认证直接失败。这种情况下只能临时先用密码登录一次让 home 目录挂载解密再测试免密或者检查 PAM 配置中是否有pam_ecryptfs相关的模块放在正确的位置。这类问题比较罕见但一旦遇到就非常困惑因为你检查所有常规项目都是正常的。5. 生产环境中的进阶玩法密钥生命周期、Agent转发与自动化任务5.1 passphrase、ssh-agent 与 ssh-add 的使用回到第 2 节提到的 passphrase。很多人的疑问是我设置了 passphrase那免密登录是不是就废了完全不是。passphrase 保护的是私钥文件本身——即使文件泄露没有 passphrase 也无法使用。而 ssh-agent 解决了每次使用私钥都要输 passphrase的麻烦。登录本地机器后把私钥加入 agenteval $(ssh-agent -s) ssh-add ~/.ssh/id_ed25519输入一次 passphrase之后这把私钥就缓存在 agent 内存里后续所有 SSH 连接、scp、git 推送都不会再问你 passphrase直到 agent 关闭或显式清空。查看当前 agent 里加载了哪些钥匙ssh-add -l ssh-add -L # 显示对应的公钥内容桌面 Linux 环境下GNOME Keyring 和 KWallet 一般会自动接管 ssh-agent 的流程图形登录时自动解锁私钥体验已经很流畅。服务器环境或者纯终端环境我会在~/.bashrc里加一段条件判断只在不存在的 agent 时启动并添加默认密钥避免每次开终端都重复向 agent 添加同一把钥匙。密码学上有个细节值得了解给 Ed25519 私钥设置 passphrase 时OpenSSH 会使用 bcrypt 类的强 KDF 对你的 passphrase 做密钥派生意味着即使攻击者拿到私钥文件暴力破解 passphrase 的成本也相当高。RSA 老版本私钥用的是相对较弱的加密格式如果你还有老私钥可以用ssh-keygen -p -f ~/.ssh/id_rsa重新设置 passphrase 时自动升级到新格式。5.2 Agent转发和ProxyJump在跳板场景的取舍Agent 转发ForwardAgent yes是另一个常见需求你在本地加载了私钥跳板机上不想放私钥但需要从跳板机继续 SSH 到内网其他机器。配置Host jump-server HostName jump.example.com ForwardAgent yes原理是 SSH 客户端把本地 agent 的 UNIX socket 转发到跳板机上让跳板机上的 ssh 进程可以借用本地的私钥进行认证。这个机制很方便但也是生产环境安全事故的高发地。风险在于如果你转发的 agent socket 在跳板机上被恶意进程访问攻击者就能借用你的私钥虽然不能读取私钥内容但能使用它去登录任何你用这个 agent 能登录的主机。一旦跳板机被攻破蔓延范围不可控。因此我强烈建议跳板机是多人共用、无法完全信任的环境不要开ForwardAgent。需要中转跳转的场景优先用第 3.3 节的ProxyJump它只在跳板机上建立加密隧道不暴露任何 agent 能力。某些企业安全基线会直接禁用ForwardAgent如果遇到检查工具报警大概率是这条配置命中。如果确实需要 agent 转发可以加上AgentForwarding相关限制比如在目标机上通过authorized_keys的选项限制该公钥的来源主机但这类配置管理成本较高我的底线原则是能不用就不用。5.3 在脚本和定时任务中使用免密登录的正确姿势免密登录最大的自动化价值就是让脚本、定时任务、CI/CD 在无人值守时也能安全登录服务器执行操作。以 crontab 为例你可以这样写0 2 * * * /usr/local/bin/backup.sh /var/log/backup.log 21backup.sh 内部#!/bin/bash ssh -o BatchModeyes -o ConnectTimeout10 backup-userdb-server mysqldump -u root --all-databases | gzip -9 /backup/db_$(date %F).sql.gz这里-o BatchModeyes是脚本场景的关键参数它禁止所有交互式提示包括密码输入、指纹确认、passphrase 询问。如果认证失败命令立即报错退出而不是卡在那里等待人工输入这对无人值守任务至关重要。还有两个配套建议严格主机指纹检查。在脚本里用-o StrictHostKeyCheckingaccept-new或提前把目标主机指纹加入 known_hosts避免首次连接时脚本被指纹确认卡住。生产环境更推荐在构建镜像或初始化脚本时用ssh-keyscan预置 known_hosts。专钥专用。自动化任务的密钥不要和你日常操作的密钥共用。给备份脚本、部署脚本分别生成独立的密钥对并在服务器端通过authorized_keys的前缀选项限制它能执行的命令比如command/usr/local/bin/backup-wrapper.sh,no-agent-forwarding ssh-ed25519 ...这样即使这把密钥泄露攻击者也只能执行受限命令爆破出 shell 的难度大大增加。用command限制密钥能执行的指令是很多人没意识到的安全特性。我在生产环境的备份账号上全部用了这个方案直接杜绝了备份密钥被偷后攻击者拿到 shell的极端情况。6. 复盘踩过的坑权限报错、多密钥错配与批量分发注意事项6.1 bad owner or permissions 类报错的排查链路先说一个极具代表性的 Windows 客户端报错Bad owner or permissions on C:\Users\thinkpad\.ssh\config这个信息在 OpenSSH for Windows 上很经典。原因是 Windows 下的 OpenSSH 对config文件的安全要求比较严格文件上如果继承了某些奇怪的 ACL比如 Users 组的写权限、Authenticated Users 的读权限等OpenSSH 宁可拒绝使用整个配置文件也不愿冒配置被篡改的风险。排查链路我一般按三步走右键C:\Users\thinkpad\.ssh\config打开属性 - 安全查看组或用户名列表里有哪些条目。正常情况下应该只保留当前用户和 SYSTEM其他用户和组全部删掉。如果权限条目太多最简单的修复命令是在 cmd 里执行icacls C:\Users\thinkpad\.ssh /inheritance:r icacls C:\Users\thinkpad\.ssh\config /inheritance:r/inheritance:r会移除所有继承来的权限项再手动给当前用户加完全控制权限。注意.ssh目录下的其他文件也要一并检查。一步到位完全重置权限的方式icacls C:\Users\thinkpad\.ssh\* /reset icacls C:\Users\thinkpad\.ssh\config /grant:r %USERNAME%:F另外我还遇到过一个隐藏很深的变种Windows 用户把~/.ssh目录建在了一个网络映射盘或者 WSL 挂载的 Linux 目录上这种跨文件系统的场景权限检查逻辑会变得奇怪OpenSSH 会认为权限不可控直接拒绝。解决办法是把.ssh目录挪到本地 NTFS 分区然后重新生成或复制密钥。排查这类问题有一个万能法宝切换高调试级别日志。执行ssh -vvv userhostSSH 会输出认证过程中的每一步。看到Offering public key、Authentications that can continue: publickey、Permission denied (publickey)这些输出时结合第 4 节的权限检查基本能定位到问题环节。6.2 密钥错配与 agent 中多密钥的顺序问题第二个常见坑是本地有多把密钥SSH 尝试顺序和你想的不一样导致一直用错钥匙、免密失败。假设你加载了 id_rsa 和 id_ed25519 两把钥匙而目标服务器只认 ed25519 的公钥。SSH 默认会先尝试 id_rsa服务器返回拒绝再尝试 id_ed25519成功。如果服务器开启了比较严格的认证失败计数或限速策略可能在第一把钥匙失败后暂时冻结认证通道导致后续即使拿出正确钥匙也被拒。解决办法要么通过 config 文件明确IdentityFile让 SSH 只尝试指定密钥推荐。要么把不常用的密钥从 agent 里移除ssh-add -D清空后只添加当前需要的密钥。如果不知道服务器到底接受哪把公钥可以登录服务器查看cat ~/.ssh/authorized_keys把本地所有.pub文件内容比对一遍确认哪把公钥在服务器上。这种配好了但偶尔能连偶尔不能连的间歇性问题多半就是多密钥尝试顺序不稳定导致的。我还遇到过把公钥和私钥内容搞混的极端案例有人把id_rsa.pub的内容粘贴到一个名为id_rsa的文件里SSH 读取时发现格式不对直接跳过这把私钥去试其他钥匙。遇到密钥格式报错时用file ~/.ssh/id_ed25519检查文件内容类型私钥应该显示OpenSSH private key如果显示 ASCII text 之类就要警惕内容是不是放错了。6.3 批量部署时安全与效率的平衡最后一个场景是批量分发。几十台新服务器上线一台台ssh-copy-id确实很累但批量自动化有安全红线。最粗暴的方案是用sshpass在循环里自动输密码sshpass -p password ssh-copy-id -i ~/.ssh/id_ed25519.pub userhost作为一个流程中的一次性操作这个方案确实快但它有几个致命问题密码出现在命令行参数里会被ps和 shell history 记录同样会被日志系统收录。密码一旦被写入脚本文件下次再运行就是一次泄露事件。我做批量部署时更推荐两条安全路径所有服务器初始密码或临时 key 由密钥管理系统Vault、Ansible Vault 等下发初始化脚本通过受保护的渠道取用用后立即轮换。使用 Ansible 这类配置管理工具直接在 playbook 里部署公钥- name: Deploy SSH public key authorized_key: user: deploy state: present key: {{ lookup(file, /local/path/id_ed25519.pub) }}Ansible 的authorized_key模块不仅帮你处理权限自动设置.ssh700、authorized_keys600而且管理的是声明式状态之后删用户、换密钥、审计都很清晰是批量场景最可控的姿势。批量部署完千万别忘了两件事第一把临时密码或初始密钥轮换掉第二在sshd_config里明确只允许需要的用户用密钥登录并考虑禁用 root 直接密码登录。我见过不少团队批量装完机器后所有服务器共用一个默认密码挂着等于免密配置白做安全等级反而下降了。最后再说一句个人经验免密的免不是绝对保险它只是把认证凭证从可被猜测的字符串换成了物理上更难获取的密钥文件。真正安全的生产环境应该是密钥认证 跳板审计 最小权限 定期轮换的组合缺一不可。我这套配置和排查方法在几十台服务器的环境里滚了几年最大的感受是把原理搞清楚之后免密登录就从碰运气变成了可预期。希望你读完这篇能少熬几个排查免密问题的夜。
返回列表