SSH密钥管理最佳实践:安全存储与版本控制排除
直接给出底线:SSH私钥路径必须写入.gitignore,并从Git索引中完全抹除。一旦私钥被推送至远程仓库,所有服务器都将暴露——攻击者可凭此直接登录任何机器。这一步骤没有任何妥协余地。
以下是经过实战检验的操作流程,按步骤执行即可。
定位私钥文件及命名规则
在终端中运行ls -la ~/.ssh/。重点查找以id_开头且不带.pub后缀的文件(例如id_ed25519或gitcode_id_rsa),这些便是私钥。公钥始终带有.pub后缀,切勿混淆。
若你使用自定义名称(如prod-server-key),确认该文件未出现在任何Git仓库的根目录或子目录下——私钥严禁置于项目代码树内部,这是不可违背的原则。
将私钥路径添加至.gitignore
进入项目根目录,编辑.gitignore文件。在末尾追加一行:~/.ssh/id_*。该规则会忽略所有符合标准命名的私钥文件。
若私钥存放在项目目录内部(如./config/secrets/id_prod),则需指定精确路径:config/secrets/id_prod。仅写secrets/可能遗漏其他敏感文件。
保存后执行git check-ignore -v config/secrets/id_prod。若返回匹配行,表示规则生效;若无任何输出,说明路径未被忽略,需调整规则。
确认私钥是否已被Git索引缓存
运行git ls-files --cached | grep -i "id_"。若输出结果,表明私钥已被Git跟踪,需要立即清除。
执行清除命令:git rm --cached ~/.ssh/id_ed25519(请替换为实际私钥路径)。该操作仅从Git索引中移除,不会删除本地文件。
再次运行git ls-files --cached | grep -i "id_",确认无输出。至此私钥已彻底脱离版本控制。
配置SSH以绑定密钥路径
方式一:通过标准~/.ssh/config文件
运行mkdir -p ~/.ssh && touch ~/.ssh/config,然后使用编辑器打开。添加以下内容(根据实际情况替换主机名和密钥路径):
Host prod-server
HostName 192.168.10.5
User admin
IdentityFile ~/.ssh/id_ed25519
注意:IdentityFile后的路径必须使用绝对路径,避免使用~/缩写——OpenSSH在部分环境中无法正确解析~。
方式二:针对多平台隔离密钥(推荐)
创建独立配置块:
Host gitcode.com
HostName gitcode.com
User git
IdentityFile ~/.ssh/gitcode_id_ed25519
IdentitiesOnly yes
IdentitiesOnly yes至关重要——该指令强制SSH仅使用你指定的密钥,不会尝试默认密钥,从而防止误用或泄露。
测试连接并核验密钥未上传
步骤一:执行ssh -T git@gitcode.com。若出现Welcome to GitCode!,表明公钥已正确加载且连接成功。
步骤二:运行git remote get-url origin,确认URL以git@gitcode.com:开头而非https://——只有SSH协议才能使用你配置的密钥。
步骤三:前往GitHub、GitCode等平台的SSH密钥管理页面,确认列表中只包含公钥(.pub文件内容),绝无私钥痕迹。
