如何隔离开发机与服务器SSH密钥?防止密钥意外同步
我完全懂你的痛点——SSH代理转发默认会把本地Laptop的SSH Agent带到远程Server上,结果两边的密钥池混在了一起:在Server上添加的只读密钥会跑到Laptop的Agent里,导致推送Bitbucket时用错密钥;删了Laptop的密钥,Server上的也跟着没了。下面给你几个实用的解决办法,按优先级推荐:
1. 直接关闭登录Server时的代理转发(最省心)
你之前改了/etc/ssh/ssh_config但没生效?大概率是因为用户级配置优先级更高,应该改Laptop上的个人SSH配置文件(~/.ssh/config),而不是系统级的。
打开~/.ssh/config(没有就新建一个),添加这段配置:
Host server # 换成你登录Server用的主机名/IP,比如你的Server IP是192.168.1.100就写192.168.1.100 ForwardAgent no
这样以后你用ssh server(或者对应IP)登录时,就不会把Laptop的SSH Agent转发过去。Server只能用自己本地的只读密钥,两边的Agent完全独立,再也不会互相干扰。
⚠️ 注意:如果登录时你加了-A参数强制开启代理转发,那会覆盖这个配置,登录Server时别用-A就行。
2. 给Server上的Bitbucket访问单独指定密钥(保留其他代理转发)
如果你还需要给其他服务器转发Agent,只是不想让Server用Laptop的Agent访问Bitbucket,可以在**Server的~/.ssh/config**里加这段配置:
Host bitbucket.org IdentityFile ~/.ssh/你的只读密钥文件名 # 比如~/.ssh/bitbucket_readonly ForwardAgent no ProxyCommand none
这样Server上执行git pull时,会强制使用本地的只读密钥,完全不碰从Laptop转发过来的Agent。Laptop这边依然用自己的密钥正常推送,两边互不影响。
3. 用单独的配置文件隔离登录场景(灵活度拉满)
要是你平时需要不同的登录配置,还可以给登录Server的场景单独建一个配置文件。比如在Laptop上创建~/.ssh/server_login_config,内容如下:
Host my-server HostName 你的Server IP/主机名 User 你的Server用户名 ForwardAgent no
之后登录Server时,用这个命令:
ssh -F ~/.ssh/server_login_config my-server
这样就确保这次登录完全不转发Agent,彻底隔离两边的密钥环境。
为啥之前的配置没起作用?
你修改/etc/ssh/ssh_config可能被用户级的~/.ssh/config里的配置覆盖了——SSH会优先读取用户个人配置文件。另外,如果你登录时用了-A参数强制开启代理转发,那配置里的ForwardAgent no会被忽略,这点要特别注意。
内容的提问来源于stack exchange,提问作者Jakub Kotrs

