14

duosecurity を使用して ssh の 2 要素認証を有効にしました (このプレイブックhttps://github.com/CoffeeAndCode/ansible-duoを使用)。

ansible を使用してサーバーを今すぐ管理するにはどうすればよいですか。このため、SSH 呼び出しは事実の収集に失敗します。プレイブックを実行する人に、プレイブックを実行する前に 2 要素コードを入力してもらいたいです。

展開ユーザーの 2 要素を無効にすることは可能な解決策ですが、回避したいセキュリティ上の問題が発生します。

4

3 に答える 3

7

これはハックですが、2fac 対応の SSH 接続を介して非 2fac Ansible SSH 接続をトンネリングできます。

概要

2 人のユーザーをセットアップします: ansibleAnsible が使用するユーザーになります。Ansible でサポートされている方法で認証する必要があります (つまり、2fac ではありません)。このユーザーは、 以外から接続できないように制限されるため127.0.0.1、マシンの外部からはアクセスできません。

2 番目のユーザーansible_tunnelは外部に公開されますが、2 つの要素によって認証され、ローカル マシンへの SSH 接続のトンネリングのみが許可されます。

すべてではなく一部のユーザーに対してのみ 2 要素認証を構成できる必要があります。

SSH トンネルに関する情報

ターゲット マシンで:

  1. 次の 2 つのユーザーansibleを作成します。ansible_tunnel
  2. 公開鍵~/.ssh/authorized_keysを両方のユーザーに入れます
  3. のシェルを に設定するansible_tunnel/bin/false、ユーザーをロックします。コマンドの実行ではなく、トンネリング専用に使用されます。
  4. に次を追加します/etc/ssh/sshd_config

    AllowTcpForwarding no
    
    AllowUsers ansible@127.0.0.1 ansible_tunnel
    
    Match User ansible_tunnel
      AllowTcpForwarding yes
      PermitOpen 127.0.0.1:22
      ForceCommand echo 'This account can only be used for tunneling SSH sessions'
    
  5. のみに2 要素認証を設定するansible_tunnel
  6. sshd を再起動します

Ansible を実行しているマシンで:

  1. Ansible を実行する前に、以下を実行します (ターゲットではなく Ansible マシン上で)。

    ssh -N -L 8022:127.0.0.1:22 ansible_tunnel@<host>
    

    2 つの要素を使用して認証されます。

  2. トンネルが起動したら ( で確認) 、とnetstatで Ansible を実行します。ansible_ssh_user=ansibleansible_ssh_port=8022ansible_ssh_host=localhost

要約

  • ansible_tunnel外部からしか接続できず、2 要素で認証されます
  • トンネルがセットアップされると8022、ローカル マシンのポートへの接続は、リモート マシンの sshd への接続と同じになります。
  • ansibleローカルホスト経由で行われる場合にのみ SSH 経由での接続を許可しているため、トンネリングされた接続のみが許可されます。

規模

これは、マシンごとに個別のトンネルを開く必要があり、手動での操作が必要なため、複数のサーバーには適切に拡張できません。ただし、サーバーに 2 要素認証を選択した場合は、各サーバーに接続するために手動で何らかのアクションを実行する用意があります。このソリューションでは、スクリプト ラッピングによるオーバーヘッドが少し追加されるだけです。

[追加するために編集]

ボーナス

便宜上、メンテナンス アカウントに直接ログインして、トンネルを設定するプロセスを経由せずに手作業を行うことができます。この場合、トンネルを介して 2fac なしで接続する機能を維持しながら、2fac 認証を要求するように SSH を構成できます。

# All users must authenticate using two factors
AuthenticationMethods publickey,keyboard-interactive

# Allow both maintenance user and tunnel user with no restrictions
AllowUsers ansible ansible_tunnel

# The maintenance user is allowed to authenticate using a single factor only
# when connecting from a local address - it should be impossible to connect to
# this user using a single factor from the outside (the only way to do that is
# having an existing access to the machine, or use the two-factor tunnel)
Match User ansible Address 127.0.0.1
  AuthenticationMethods publickey
于 2015-09-27T21:26:08.663 に答える
3

ssh と ansibleの機能を利用して、ssh と 2FA で ansible を使用できますControlMaster

ControlPath私のローカル ssh クライアントは、多重化接続用のソケットをダンプするように構成されています。Ansible は、同じソケットを使用するように構成されています。

ローカル ssh クライアント

この構成により、すべての接続の多重化が有効になります。私は個人的にこの設定を `~/.ssh/config に保存します:

Host *
    ControlMaster auto
    ControlPath ~/.ssh/master-%r@%h:%p.socket
    ControlPersist 1m

接続が確立されると、ディレクトリにソケットが表示されます$HOME/.ssh。このソケットは、切断後 1 分間保持されます。

アンシブルを構成する

Ansible は、ローカル ソケットを再利用するように構成されています。

これをansible 構成ファイル(例~/.ansible.cfg: )に追加します。

[ssh_connection]

control_path=~/.ssh/master-%%r@%%h:%%p.socket

変数置換の double に注意してください%

使用法

  1. 通常の ssh コマンド ( ssh user@server) を使用してサーバーに接続し、2FA を実行します。
  2. 通常どおり ansible コマンドを起動します。

ステップ 2 はControlPersist構成内で実行するか、別の端末で ansible コマンドを起動するときに端末で ssh 接続を維持する必要があります。

次を使用して、必要のないときに接続を強制的に閉じることもできますssh -O exit user@server

3 番目のターミナルを開いて を実行するssh user@serverと、資格情報を求められないことに注意してください。1. で確立された接続が再利用されます。

欠点

ネットワークの状態が悪い場合

場合によっては、接続が失われると、ソケットが持続します。それ以降のすべての接続がハングします。を使用して、この接続を手動で切断する必要がありますssh -O exit user@server。これは、この方法の唯一の既知の欠点です。

参考文献:

于 2020-11-03T22:26:59.237 に答える
3

Bastion Host を使用したソリューション

ssh 要塞ホストを使用しても、これが機能するまでにはかなりの時間がかかりました。それが他の誰かを助ける場合に備えて、ここに私が思いついたものがあります。これはControlMasterssh 構成オプションを使用し、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、成功します。

于 2017-02-13T19:55:19.613 に答える