强制 ssh 使用代理,而不回退到直接访问 IdentityFile

强制 ssh 使用代理,而不回退到直接访问 IdentityFile

公司政策要求将一些 ssh 密钥安全存储,例如存储在专用 USB 设备上。使用 gnupg 可以完美地使用未存储在主机上的密钥enable-ssh-support,即使使用多个密钥也是如此:

Host example.com
    HostName ssh.example.com
    IdentityFile ~/.ssh/smartcard.pub
Host example.net
    HostName git.example.net
    IdentityFile ~/.ssh/another-smartcard.pub
Host example.org
    HostName sftp.example.org
    IdentityFile ~/.ssh/id_rsa.pub

IdentitiesOnly yes
PasswordAuthentication no
PubkeyAuthentication yes

但是,当拔下硬件时,gpg 会从代理中删除密钥,随后的 ssh 调用将导致:

Enter passphrase for key '/home/user/.ssh/smartcard.pub':

这看起来很奇怪,因为 ssh 和 ssh-agent 都应该很清楚该文件只包含一个公钥。如果无法访问指定的密钥,是否有一个好的方法可以让 ssh 详细失败,而不是要求输入(毫无意义的)密码?

不完整的解决方案:

  1. 删除IdentitiesOnly- ssh 将尝试所有可用的键正如预期的那样 - 但会导致服务器限制每个会话的身份验证尝试次数
  2. 以某种方式包装 ssh alias ssh='grep ^4096 <(ssh-add -l)' && ssh'- 可以工作,但如果有人想知道为什么他的 ssh 设置被破坏了,就会很麻烦

答案1

使用 OpenSSH 7.9 或更高版本,它至少会打印一些错误:

$ ssh example.com
Load key "/home/user/.ssh/smartcard.pub": invalid format
[email protected]: Permission denied (publickey).

相关内容