一次性 SSH 密码
一次性 SSH 密码(One-Time Password,OTP)是一种使得 Vault 服务可以在客户端想要 SSH 到一台安装有帮助程序的远程服务器上时为其签发一条一次性 SSH 密码的 SSH 机密引擎。
经过身份验证的客户端从 Vault 申请一条一次性密码。当客户端建立起一条到远程服务器的 SSH 连接时,服务端在执行 SSH 身份验证时会将收到的密码交给 Vault 帮助程序,由其交由 Vault 服务进行验证。Vault 在成功验证后会删除该密码,以保证它只能被使用一次。
由于建立 SSH 连接时需要联络 Vault 服务,每一次尝试登录 SSH 以及相关的 Vault 租约信息都会被记录到机密引擎的日志中。
可以在这里 阅读 Vault 的 SSH 帮助程序的详细信息。
缺点
OTP 机密引擎类型的主要风险点是远程主机与 Vault 的连接;如果受到攻击,攻击者可以伪造 Vault 服务器返回的成功响应。可以通过使用 TLS 连接到 Vault 服务并检查证书有效性来减轻这种风险;未来对这个机密引擎的增强可能会在 TLS 的基础上提供额外的安全性。
挂载机密引擎
$ vault secrets enable ssh
Successfully mounted 'ssh' at 'ssh'!
创建角色
将 key_type
设置为 otp
来创建一个角色。角色的 cidr_list
参数所代表的 CIDR 范围内所有的主机都应该预先正确安装并配置好 SSH 帮助程序。
$ vault write ssh/roles/otp_key_role \
key_type=otp \
default_user=username \
cidr_list=x.x.x.x/y,m.m.m.m/n
Success! Data written to: ssh/roles/otp_key_role
创建凭据
为一个属于 otp_key_role
的远程主机的 IP 创建一个 OTP 凭据:
$ vault write ssh/creds/otp_key_role ip=x.x.x.x
Key Value
lease_id ssh/creds/otp_key_role/73bbf513-9606-4bec-816c-5a2f009765a5
lease_duration 600
lease_renewable false
port 22
username username
ip x.x.x.x
key 2f7e25a2-24c9-4b7b-0d35-27d5e5203a5c
key_type otp
建立 SSH 会话
$ ssh username@x.x.x.x
Password: <Enter OTP>
username@x.x.x.x:~$
自动化该流程
可以用一条命令来创建新的一次性密码并使用正确参数调用 SSH 连接到主机:
$ vault ssh -role otp_key_role -mode otp username@x.x.x.x
OTP for the session is `b4d47e1b-4879-5f4e-ce5c-7988d7986f37`
[Note: Install `sshpass` to automate typing in OTP]
Password: <Enter OTP>
一次性密码会被自动交给 sshpass
输入(如果安装了该工具的话):
$ vault ssh -role otp_key_role -mode otp -strict-host-key-checking=no username@x.x.x.x
username@<IP of remote host>:~$
注意:sshpass
无法检查主机证书。可以通过设置 -strict-host-key-checking=no
来关闭该功能。