Bastion Host を使用したソリューション
ssh 要塞ホストを使用しても、これが機能するまでにはかなりの時間がかかりました。それが他の誰かを助ける場合に備えて、ここに私が思いついたものがあります。これはControlMaster
ssh 構成オプションを使用し、ansible は通常の ssh を使用するため、同じ ssh 機能を使用するように構成し、リモート ホストに対して開いている接続の数に関係なく、踏み台ホストへの接続を再使用することができます。これらの制御オプションが一般的に推奨されているのを見てきました (おそらくホストが多数ある場合のパフォーマンス上の理由から) が、要塞ホストへの 2FA のコンテキストではそうではありません。
このアプローチでは、sshd 構成の変更は必要ありません。そのためAuthenticationMethods publickey,keyboard-interactive
、要塞サーバーで唯一の認証方法の設定として、要塞publickey
を介してプロキシしている他のすべてのサーバーに対してのみ設定する必要があります。踏み台ホストはインターネットからの外部接続を受け入れる唯一のホストであるため、2FA を必要とする唯一のホストであり、内部ホストは公開鍵認証のためにエージェント転送に依存していますが、2FA は使用していません。
クライアント上で、ansible 環境用の新しい ssh 構成ファイルを、ansible を実行する (ansible.cfg の兄弟) という名前の最上位ディレクトリに作成しましたssh.config
。を含む:
Host bastion-persistent-connection
HostName <bastion host>
ForwardAgent yes
IdentityFile ~/.ssh/my-key
ControlMaster auto
ControlPath ~/.ssh/ansible-%r@%h:%p
ControlPersist 10m
Host 10.0.*.*
ProxyCommand ssh -W %h:%p bastion-persistent-connection -F ./ssh.config
IdentityFile ~/.ssh/my-key
それから ansible.cfg に私は持っています:
[ssh_connection]
ssh_args = -F ./ssh.config
注意すべき点がいくつかあります。
この場合のプライベート サブネットは 10.0.0.0/16 で、上記のホスト ワイルドカード オプションにマップされます。踏み台は、このサブネット上のサーバーへのすべての ssh 接続をプロキシします。
ProxyCommand
この構成ファイルにローカル パスを渡すため、このディレクトリでしか ssh または ansible コマンドを実行できないという点で、これは少し脆弱です。残念ながら、同じ構成ファイルを ProxyCommand に自動的に渡すことができるように、現在使用されている構成ファイルにマップする ssh 変数はないと思います。環境によっては、これに絶対パスを使用する方がよい場合があります。
1 つの落とし穴は、それによって ansible の実行がより複雑になることです。残念ながら、私が知る限り、ansible は 2FA をまったくサポートしていません。そのため、要塞への既存の ssh 接続がない場合、ansible はVerification code:
接続先のプライベート サーバーごとに 1 回出力しますが、実際には入力をリッスンしていないため、何をしても接続は失敗します。
だから私は最初に実行します:ssh -F ssh.config bastion-persistent-connection
これにより にソケット ファイルが作成され~/.ssh/ansible-*
、ssh エージェントはローカルでそのソケットを閉じて、構成可能な時間 (私が 10m に設定した時間) 後に削除します。
ソケットが開いたら、通常のように ansible コマンドを実行できます。たとえばansible all -m ping
、成功します。