Dockerを使用すると、ソフトウェア開発者とDevOpsエンジニアは、アプリケーションを本番用に迅速にパッケージ化できます。 Dockerコンテナーは、ホストとはほとんど独立して動作しますが、セキュリティの脅威に影響されません。 Docker Engineのインストールを監査して、ホストとワークロードのセキュリティを最大限に確保する方法は次のとおりです。
Dockerのリスクを評価するための最初のステップは、テクノロジーが実際にどのように機能するかを理解することです。 Dockerは、次の3つの異なるコンポーネントを利用しています。
- DockerEngineデーモン –コンテナと画像を使用して舞台裏の操作を管理するバックグラウンドサービス。
- REST API – Docker Engineは、Dockerデーモンにコマンドを送信するRESTAPIを提供します。 APIは通常RESTソケットを介して提供されますが、HTTPを介して公開される場合もあります。
- Dockerコマンドラインクライアント – Docker CLIは、
docker
を使用すると実行されます ターミナルで。 Dockerデーモンにコマンドを送信します。コマンドは、実行するアクションを決定するために処理されます。
これらのコンポーネントのいずれかを侵害する攻撃者は、環境にアクセスする可能性があります。適切に構成することで、ワークロードを保護し、増加できます。 ホスト上で直接アプリケーションを実行する場合と比較した場合のセキュリティ。
Dockerデーモンは、最大の攻撃対象領域を示します。デーモンの制御を取得すると、ホストとすべてのコンテナーにアクセスできるようになります。デーモンは通常、root
として実行されます 、したがって、侵入が成功すると、物理マシンへの無制限のアクセスが許可されます。
Dockerデーモンソケット(/var/run/docker.sock
)を確認する必要があります )root
以外はアクセスできません ユーザー。デーモンはホストにアクセスできるため、ソケットへのアクセスを提供すると、マシンの制御が効果的に受け渡されます。
Dockerのデーモンは、ネットワークを介したリモート制御を可能にするTCPソケットをサポートしています。この機能を有効にすると、認証なしで暗号化されていない通信が提供されます。
安全であるように特別に構成されたネットワーク環境にいる場合を除いて、TCP接続の使用は避けてください。 TLSを設定し、許可されたクライアントのみが接続を許可されていることを確認する必要があります。
一部のDockerイメージでは、Dockerソケットをコンテナーにマウントする必要がある場合があります。これは、ホスト上で実行されているコンテナーへのインターフェースを提供するDocker管理ツールによってよく使用されます。このようにソケットを取り付けることにより、コンテナ内のあらゆるものがシステムを制御できるようになります。ワークロードにDockerソケットが必要であることが確実でない限り、コンテナがDockerソケットを受け取ることはありません。
Dockerは、root
なしでDockerを実行できるルートレスモードをサポートするようになりました。 アクセス。これはセキュリティの向上に役立ちますが、セットアップ時にさらに複雑になります。
ルートレスモードを使用すると、Dockerとコンテナーがユーザー名前空間内で実行されます。いくつかの制限はありますが、ほとんどのDocker機能は機能します。
すべてのストレージドライバーが利用できるわけではなく、オーバーレイネットワークはサポートされておらず、コンテナーネットワークは完全に名前が付けられています。つまり、最初に専用のネットワーク名前空間を入力しないと、ホストからコンテナIPに直接アクセスすることはできません。
ルートレスモードの使用は、ホストの整合性が最優先される高セキュリティ環境で役立ちます。より広いシステムを改ざんする機会を制限することで、攻撃の成功による影響を軽減するのに役立ちます。
RESTAPIセキュリティ
Docker REST APIは通常、UNIXソケットを介してアクセスされます。権限チェックは、標準のUNIXメカニズムを使用して行われます。
TCPソケットを介してAPIを公開し、HTTP経由でアクセスできるようにすることができます。これにより、侵害のリスクが高まります。トラフィックが承認されたホストからのみ発信できるように、ネットワークアクセス制御が設定されていることを確認する必要があります。
Docker APIと相互作用する可能性のあるデバイスを見落とさないように、ファイアウォールポリシーを監査する必要があります。接続をlocalhost
に制限することを忘れないでください 十分ではありません。これでも、マシンで実行されているDockerコンテナ内からのアクセスが許可され、意図しない特権の昇格が可能になる可能性があります。
Dockerを使用すると、すべてのコンテナーがデフォルトのdocker0
を介して相互に通信できます。 ブリッジネットワーク。侵害されたコンテナは、このネットワークをスヌープしてその環境について学習する可能性があります。ブリッジネットワークを有利なポイントとして使用して、ワークロードのより広範な浸透を開始できます。
コンテナ間の通信を無効にすると、コンテナの分離が強化され、セキュリティ体制が向上します。 --link=ContainerName
を使用して、コンテナを明示的にリンクする必要があります フラグまたは独自のDockerネットワーク。
--icc=false
を使用してDockerデーモンを実行します docker0
を介した通信を無効にするフラグ ブリッジ。
Conainerの機能を制限する
Linuxカーネル機能は、root
を使用してユーザーが使用できるアクションを定義します アクセス。機能は、root
として実行されているプロセスをロックダウンするのに役立ちます 、Dockerコンテナなど。各プロセスには、必要な最小限の機能セットを提供する必要があります。
Dockerは、機能の選択が制限されたコンテナーを自動的に実行します。このリストでさえ、Webサーバーなどの単純なワークロードでは過剰になることがよくあります。コンテナで使用できる機能の独自のリストを指定することで、さらに制限することができます。
docker run --cap-drop all --cap-add SYSLOG example-image:latest
上記のコマンドは、SYSLOG
のみでコンテナを実行します 容量。 --cap-drop
フラグはデフォルトの機能リストを無視します。その後、機能は--cap-add
で追加されます。 、ホワイトリストを作成します。
カーネル機能リストに対してコンテナを評価する価値があります。本番環境で実行されているコンテナから未使用の機能を削除します。これにより、侵害されたコンテナが引き起こす可能性のある被害を制限できます。
カーネルに組み込まれているセキュリティ機能を無視しないでください。 Dockerは、AppArmorやSELinuxなどの既存のテクノロジーと連携します。
RedHat Linuxなどの一部のディストリビューションには、Dockerのセキュリティを強化する事前定義されたSELinuxシステムポリシーが付属しています。 --selinux-enabled
を指定してDockerデーモンを実行することにより、SELinuxサポートを手動で追加できます。 国旗。これにより、Dockerポリシーがアクティブになり、コンテナーにSELinuxラベルが設定されます。 SELinuxは、コンテナープロセスをホストプロセスからより適切に分離し、セキュリティ体制を改善します。
ルートレスモード、デーモンアクセス、コンテナ通信など、Dockerセキュリティの複雑な側面に固執するのは簡単です。ただし、基本を見逃さないでください。標準のセキュリティ慣行が引き続き適用されます。
最新のバグ修正が行われるように、DockerEngineは常に最新の状態に保ってください。また、ホストのカーネルに完全にパッチが適用されていることを確認する必要があります。コンテナはホストと同じカーネルを共有しているため、コンテナ化されたアプリケーションによって脆弱性が悪用される可能性があります。
特定の物理マシンまたはVMをDockerの実行専用にすることをお勧めします。ホスト上で他のサービスを直接実行しないでください。代わりにそれらをコンテナとして実行して、ホストの侵害が成功した場合の影響を軽減できます。
正しく構成されている場合、Dockerはアプリケーションを分離することでセキュリティを強化します。時間をかけて自分の立場を評価することは、潜在的なリスクを特定し、攻撃がどのように始まるかを理解するのに役立ちます。コンテナー特権をロックダウンし、Dockerデーモンを保護し、ホストを最新の状態に保つことは、コンテナーを強化するのに役立ちます。