web-dev-qa-db-ja.com

Ansibleセキュリティのベストプラクティス

データセンターにAnsibleを導入するつもりです。制御マシンの場所とSSHキーの管理方法に関するセキュリティのベストプラクティスを探しています。

質問1:制御マシン

もちろん、制御機器も必要です。制御マシンには公開SSHキーが保存されています。攻撃者が制御マシンにアクセスできる場合、潜在的にデータセンター全体(またはAnsibleが管理するサーバー)にアクセスできます。それでは、データセンターに専用のコントロールマシンを配置するか、リモートコントロールマシン(データセンターにリモートで接続されている私のラップトップなど)を配置する方が良いでしょうか。

私のラップトップを使用することがベストプラクティスである場合(もちろん盗まれる可能性がありますが、公開鍵をクラウドで安全にオンラインで保存したり、ポータブル暗号化デバイスでオフラインで保存したりできます)、いくつかのWebインターフェイスを使用する必要がある場合Ansible、Ansible Tower、Semaphore、Rundeck、Foremanのように、集中管理されたマシンにデータセンターにインストールする必要がありますか?それを保護し、「単一の攻撃ポイント」になるのを防ぐ方法は?

質問2:SSHキー

ルートで実行する必要があるいくつかのタスク(ソフトウェアパッケージのインストールなど)を実行するためにAnsibleを使用する必要があると仮定します。ベストプラクティスは、制御されたサーバーでrootユーザーを使用するのではなく、Sudo権限を持つAnsibleの通常のユーザーを追加することです。ただし、Ansibleがほぼすべてのタスクを実行する必要がある場合、Sudoを介してすべてのコマンドにアクセスできる必要があります。それで、最良の選択は何ですか:

  • ansibleにrootユーザーを使用させます(公開鍵は~/.ssh/authorized_keysに保存されています)
  • sudoアクセスでAnsible専用の非特権ユーザーを作成する
  • ansibleユーザーがパスワードを指定してSudoを介してすべてのコマンドを実行できるようにします(これは一意であり、Ansibleを使用してそのサーバーを制御するすべてのシステム管理者が知っている必要がある)
  • ansibleユーザーがパスワードを指定せずにSudoを介してすべてのコマンドを実行できるようにする
  • 他のヒント?
39
Mat

要塞ホスト(Ansible Control Center)は別のサブネットに属しています。外部から直接アクセスすることはできません。from管理対象サーバーから直接アクセスすることはできません。

あなたのラップトップは、すべての中で最も安全性の低いデバイスです。 1つの愚かなメール、1つの愚かなフラッシュの脆弱性、1つの愚かなゲストWifi、それが仕掛けられます。

サーバーの場合、sshを介したrootアクセスをまったく許可しないでください。多くの監査はこれを侮辱します。

念のため、すべての管理者が各ターゲットサーバーで独自の個人アカウントを使用できるようにし、パスワードを使用してSudoを許可します。この方法では、パスワードは2人の間で共有されません。各サーバーで誰が何をしたかを確認できます。個人アカウントがパスワード、sshキーのみ、または両方を必要とするログインを許可するかどうかは、あなた次第です。

明確にするためにansibleは単一のターゲットログイン名を使用する必要はありません。各管理者は、個人のターゲットログイン名を持つことができます。

補足:パスワードがある場合は、Wordと呼ばれるアカウント(「ansible」、「admin」、「cluster」、「management」、「operator」など)を作成しないでください。パスワードを持つアカウントの唯一の適切な名前は、「jkowalski」のような人間の名前です。人間だけが、アカウントを介して行われたアクションの責任を負うことができ、パスワードを不適切に保護する責任を負うことができます。

17
kubanczyk

>質問1:制御マシン

Userify(完全な開示:実際にはsshキーを管理するためのソフトウェアを提供しています)では、最大のSSHキーウェアハウスも実行しているため、常にこれに対処しています。一般に、クラウドを使用するよりもローカルインストールをお勧めします。制御を強化し、表面積を減らして、既知の信頼できるネットワークだけにロックすることができます。

覚えておくべき重要なことは、このように適切に構築されたシステムでは、攻撃者に漏らされる可能性のある重要な秘密があるべきではないことです。誰かがフォークリフトをあなたのデータセンターに押し込み、あなたのサーバーを持って立ち去った場合、それらは、いくつかの高度にハッシュされたパスワード、おそらくいくつかの高度に暗号化されたファイル、および対応する秘密鍵のないいくつかの公開鍵を除いて、多くを得ることはありません。つまり、それほどではありません。

ご指摘のとおり、ここでの実際の脅威ベクトルは攻撃者がそのマシンの制御を取得した場合に起こり、それを使用して自分のユーザーアカウントと(公開)キーを展開します。これは、事実上すべてのクラウドプラットフォーム(例:Linode)にとってリスクです。コントロールプレーンへのアクセスの防止に最も重点を置く必要があります。つまり、攻撃対象領域を最小限に抑え(少数のポートのみを公開し、それらのポートを可能な限りロックダウンし)、できれば特権の昇格やさまざまな攻撃に対して強化されたソフトウェアを使用します( SQLインジェクション、XSS、CSRFなど)コントロールプレーンへの2FA/MFAアクセスを有効にし、そのコントロールプレーンを可能な限りロックダウンすることに焦点を当てます。

それでは、データセンターに専用のコントロールマシンを配置するか、リモートコントロールマシン(データセンターにリモートで接続されている私のラップトップなど)を配置する方が良いでしょうか。

安全なデータセンターに専用の制御マシンを配置することは間違いなく優れています。それを隔離してロックし、盗難や不正アクセスのリスクを防止/最小化できるためです。

私のラップトップを使用することがベストプラクティスである場合(もちろん盗まれる可能性がありますが、公開鍵をクラウドで安全にオンラインに保存したり、ポータブル暗号化デバイスでオフラインに保存したりできます)、中央のマシンにデータセンターにインストールする必要があるAnsible Tower、Semaphore、Rundeck、ForemanなどのAnsibleでいくつかのWebインターフェイスを使用する必要がある場合

数値が大きくなるために管理上の問題に取り掛かるのに十分な大きさになるまで、キー(Userifyも含む)を管理するためにWebインターフェイスやセカンダリコントロールプレーンを実行する必要はありません。サーバー間でのユーザーおよびさまざまなレベルの承認の数、またはAnsibleへの知識やアクセス権を持たないユーザーがキーを更新するための追加の手持ちが必要です。最初のUserifyは一連のシェルスクリプト(今日はおそらくAnsibleになるはずです!)にすぎませんでした。追加の管理制御と管理/回転の簡単な方法が必要になるまで、何も問題はありません。独自のキー。 (もちろん、その時点に到達したら、Userifyを見てください!)

それを保護し、「単一の攻撃ポイント」になるのを防ぐ方法は?

まあ、もちろん、物事をロックするためにネット上のすべてのリソースをチェックしてください、しかし最も重要なことは安全な基盤から始めてください:

1。最初からセキュリティを念頭に置いてソリューションを設計します。従来は問題が少なかったテクノロジ(データベース、言語など)を選択し、セキュリティを最優先でコーディングします。信頼できるユーザーからのデータであっても、すべての受信データを無害化します。パラノイアは美徳です。

2。最終的に、すべてが壊れます。発生したときの損傷を最小限に抑えます。すでに指摘したように、秘密の資料の取り扱いを最小限に抑えるようにしてください。

3。シンプルに保つ。測定可能かつ証明可能なほどセキュリティが向上することが確実でない限り、最新のエキゾチックなことを行わないでください。たとえば、X25519/NaCl(libsodium)をAESではなく暗号化レイヤーに選択しました(静止状態および動作中のすべてを暗号化します)。これは、もともとは信頼できる誰か(DJBなど)によって設計および記述され、世界中でレビューされたためです。 -SchneierやGoogleのセキュリティチームなどの有名な研究者。単純であると深いバグを隠すことが難しくなるため、新しいものである場合は単純になりがちなものを使用します。

4。セキュリティ基準を満たします。PCIやHIPAAのセキュリティルールなどのセキュリティ体制に該当しない場合でも、それらの基準を読み、それらの基準を満たす方法、または少なくとも非常に強力な代替コントロールを見つけます。これにより、本当に「ベストプラクティス」を確実に満たすことができます。

5。外部/独立した侵入テストを取り入れ、バグ報奨金を実行して、継続的にこれらのベストプラクティスに従っていることを確認します。スマートで意欲的な人々がそれに叩きつけられるまで、すべてが素晴らしいように見えます...それが完了すると、あなたはあなたのソリューションに大きな自信を持つことになります。


質問2:SSHキー最良の選択は何ですか?Ansibleにrootユーザーを使用させます(公開キーは~/.ssh/authorized_keysに保存されます)/ Ansibleユーザーにパスワードを指定してSudoを介してすべてのコマンドを実行させます(これは固有のニーズです)そのサーバーを制御するためにAnsibleを使用するすべてのシステム管理者に知られている)

Sudoの場合でも、サーバーでパスワードを使用しないようにしてください。これはシークレットを処理し、最終的にはセキュリティを損なうことになります(マシン間でSudoパスワードを非常に簡単に変更することはできません) 、どこかに保存する必要があります。パスワードは、サーバー間自動化を実際には実行できないことを意味します。SSHをデフォルトのままにすると、これらのパスワードがブルートフォースされる可能性があります。また、キーを意味のないものにします。また、目的に応じてrootユーザーを使用しないでください(特にリモートログイン)。

SudoアクセスでAnsible専用の非特権ユーザーを作成する/ Ansibleユーザーがパスワードを指定せずにSudoを介してすべてのコマンドを実行できるようにする

その通りです。 Sudoロールを使用してansibleに監査できる非特権ユーザー。理想的には、Sudoアクセス(パスワードなし)を使用したサーバー間/ ansible通信専用の標準ユーザーを作成します。

...注:Userifyを使用していた場合、私が推奨する方法は、AnsibleのUserifyユーザーを作成することです(複数のAnsible制御マシンがある場合は、プロジェクトまたはサーバーグループでこれを分割することもできます)。制御サーバー上のSSH鍵、およびそのUserifyプロファイルページで公開鍵を提供します。 (このテキストボックスは基本的に/home/ansible/.ssh/authorized_keysになります)。 ansibleシステムアカウントは、リモートバックアップアカウント、シークレット管理など、他のサーバー間システムアカウントとは別にしておく必要があります。その後、人間を招待すれば、人間も独自のキーを作成および管理でき、すべてが分離されたままになります。ただし、Ansibleコントロールサーバーをロックダウンする場合と同じように、同じ方法でUserifyサーバー(またはデプロイするソリューション)をロックダウンしてみてください。

他のヒント?

あなたは間違いなくこれを正しい方法で行っており、適切な質問をしていると思います。この種のことについて話し合いたい場合は、メール(userifyの姓名)でメールを送ってください。最終的にどのような方向に進んでも、チャットをさせていただきます。幸運を!

17
Jamieson Becker

回答1:制御機械

両方の少し、ラップトップを使用してサーバーに接続することができますVIA要塞ホスト。

Host private1
  IdentityFile ~/.ssh/rsa_private_key
  ProxyCommand ssh user@bastion -W %h:%p

Host bastion
  IdentityFile ~/.ssh/bastion_rsa_key

要塞ホストの詳細

要塞サーバーのキーがあり、その背後にあるホストの別のキーがある場合。 (個人的にはgpg-agent/ssh-agentを使用します)

回答2:認証

「ansible」固有のベストプラクティスが他のssh接続のベストプラクティスとどのように異なるかはわかりません。

次の認証の組み合わせ:

その他の考え:

  • 常にシークレット/プライベート情報をansible-vaultに保存します。
  • Ansibleでは、実行にSudo/rootが必要でない限り、Sudo/Rootを実行する必要はありません。
  • Ansibleはさまざまな方法で権限を昇格できます

最後に、あなたは窓について何も言及しませんでした。したがって、私はあなたがこれを使用していないと仮定することができます。ただし、この場合は、デリゲートオプションを使用して、ノートパソコンに要塞ホスト(delegate_to:bastion.hostname.fqdn)およびkerberos/winrm httpsとkerberosチケット。

見逃した場合は、計算のベストプラクティス、ルートとして何もしないで、常に名前付きアカウントを使用してください

5
Jacob Evans