ポイント: Dockerコンテナのセキュリティは、堅牢なIT環境を維持するために不可欠です。推奨されるプラクティスには、信頼できる最小限のベースイメージの使用、Dockerバージョンの定期的な更新、脆弱性を減らすための最小特権ユーザーアクセスの実装が含まれます。
- 未使用のコンポーネントを削除してスリムなコンテナを維持します。
- Dockerイメージを定期的に脆弱性や更新のためにスキャンします。
アプリケーションのコンテナ化は、アプリケーションコードを依存関係と共に仮想コンテナにパッケージ化することを含みます-必要なライブラリ、フレームワーク、設定ファイル。このアプローチはポータビリティを助け、さまざまなコンピューティング環境とインフラストラクチャで一貫して動作し、効率を失うことはありません。
特に人気のあるコンテナプラットフォームの1つはDockerです。組織は次のようなアプリケーションを開発するためにDockerを使用します:
- 効率的に最適化された
- 非常にスケーラブル
- ポータブル
- アジャイル
軽量の実行環境を通じて、DockerコンテナはDevOps環境をサポートするアプリケーションをホストするために基盤のオペレーティングシステムを共有します。クラウドネイティブフレームワークの重要な要素であるDockerは、あなたのソフトウェア開発ライフサイクル(SDLC)にも多くの利点をもたらします。しかし、その利点にはリスクが伴います。特にDockerフレームワークのセキュリティを確保する際には複雑さに直面する可能性があります。
デフォルトでは、Dockerコンテナは安全です。しかし、潜在的なセキュリティリスクから保護するアプローチを採用するためには、考えられる脆弱性を知ることが不可欠です。
この記事では、Dockerベースのアーキテクチャを保護するためのベストプラクティスを3つの主要な分野に分けて見ていきます:
- インフラストラクチャ
- イメージ
- アクセスと認証
始めましょう。
(
Dockerインフラストラクチャの保護
コンテナはアプリケーションをホストできる仮想ユニットです。そのため、コンテナは:
- コードバイナリ
- 設定ファイル
- 関連する依存関係
コンテナはクラウドネイティブセットアップの基盤を形成するため、潜在的な攻撃ベクトルから保護することは、コンテナライフサイクル全体を通じて重要な活動です。このようなフレームワークを保護するための包括的なアプローチは、Dockerコンテナだけでなく、その基盤のインフラストラクチャも保護することです。
インフラストラクチャを保護するための最良のアプローチを分解し、それがどのように機能するかを見てみましょう。
Dockerバージョンを定期的に更新する
まず最初に: Dockerのバージョンが最新であることを確認してください。古いバージョンはセキュリティ攻撃に対して脆弱です。新しいバージョンのリリースには、古いバージョンの脆弱性に対処するパッチやバグ修正が含まれていることがよくあります。
ホスト環境についても同様です: サポートアプリケーションが最新であり、既知のバグやセキュリティの抜け穴がないことを確認してください。
スリムでクリーンなコンテナを維持する
拡張されたコンテナ環境は攻撃面を広げ、スリムなセットアップよりもセキュリティ侵害に対して比較的脆弱です。これを避けるために、コンテナを構成して、必要なコンポーネントのみを含むようにします:
- ソフトウェアパッケージ
- ライブラリ
- 設定ファイル
さらに、未使用のコンテナやベースイメージを定期的にチェックし、使用されていないものは破棄してください。
APIとネットワークを構成する
DockerエンジンはHTTP APIsを使用してネットワーク経由で通信します。適切に構成されていないAPIは、ハッカーによって悪用されるセキュリティ上の欠陥を抱えています。
これを避けるために、APIを安全に構成し、コンテナが公に公開されないように制限します。1つのアプローチは、証明書ベースの認証を有効にして暗号化通信を強制することです。
(Docker APIsの保護に関する詳細情報を取得します。
システムリソースの使用を制限する
各コンテナが使用できるインフラストラクチャリソースの割合に制限を設定します。これらのインフラストラクチャリソースには:
- CPU
- メモリ
- ネットワーク帯域幅
Dockerは、さまざまなプロセス間のリソースの割り当てと配分を制限するControl Groupsを使用します。このアプローチにより、侵害されたコンテナが過剰なリソースを消費し、セキュリティ侵害の際にサービス提供を妨げることを防ぎます。
ホストのアイソレーションを維持する
異なるセキュリティ要件を持つコンテナを別のホストで実行します。
異なる名前空間を通じてコンテナのアイソレーションを維持することは、重要なデータを完全な攻撃から保護するために役立ちます。このアプローチはまた、うるさい隣人がプールベースのアイソレーションで過剰なリソースを消費し、他のコンテナのサービスに影響を与えることを防ぎます。
コンテナの権限を制限する
デフォルトでは、Dockerコンテナはそのコアサービスを実行するために必要な場合もあれば必要でない場合もある追加の特権を保持し、取得できます。
ベストプラクティスとして、コンテナの権限をそのアプリケーションを実行するために必要なものだけに制限するべきです。そのためには、Dockerコンテナのすべての権限をドロップするコマンドを使用します:
$ docker run --cap-drop ALL
その後、--cap-addフラグを使用してコンテナに特定の権限を追加します。このアプローチは、Dockerコンテナがセキュリティ侵害の際に悪用される不必要な特権を取得するのを制限します。
システムコールをフィルタリングする
コンテナがLinuxカーネルに対してどのコールを行うことができるかを選択できるシステムコールフィルタを適用します。
このアプローチはセキュアコンピューティングモードを有効にし、特にカーネルの脆弱性を悪用するのを避けるために可能な露出ポイントを減少させます。
Dockerイメージの保護
次に、インフラストラクチャを超えたセキュリティベストプラクティスに移りましょう。
Dockerイメージは、コンテナを作成してアプリケーションをホストするために使用される実行可能コードのテンプレートです。Dockerイメージはランタイムライブラリとルートファイルシステムで構成されており、イメージはDockerコンテナの最も重要な基本の1つです。
Dockerイメージの保護に関して従うべきベストプラクティスをいくつか紹介します。
信頼できるイメージを使用する
Dockerベースのイメージを信頼できるソースからのみ取得し、最新で適切に構成されていることを確認します。
さらに、Dockerイメージが正しく署名されていることを確認するためにDockerコンテンツ信頼機能を有効にして、不安全な疑わしいソースをフィルタリングします。
イメージを定期的にスキャンする
Dockerイメージの堅牢なセキュリティプロファイルを維持し、脆弱性を定期的にスキャンすることが重要です。これは、イメージをダウンロードする前の初回スキャンに加えて、安全に使用できることを確認します。
定期的なイメージスキャンにより、次のように露出を最小限に抑えることもできます:
- 重要なファイルとディレクトリの監査
- 最新のセキュリティパッチで更新する
最小限のベースイメージを好む
大型の一般的なDockerイメージの使用を避け、小型のものを使用することでセキュリティ脆弱性を最小限に抑えます。これにより、2つの価値ある成果が得られます:
- 攻撃面を減少させる
- ハッキングに対してより脆弱なデフォルト設定を排除する
アクセスと認証管理
Dockerセキュリティの最終カテゴリは、アクセスと認証に関するものです。
アクセス制御を通じてDockerデーモンを保護することは、しばしば最初のセキュリティ層を適用すると言われています。Dockerデーモンを保護しなければ、すべてが常に脆弱です:
- 基盤となる操作
- アプリケーション
- ビジネス機能
最小特権ユーザーを実装する
デフォルトでは、Dockerコンテナ内のプロセスはroot権限を持ち、コンテナとホストの両方に管理者アクセスを付与します。これにより、コンテナと基盤となるホストは、ハッカーが悪用する可能性のあるセキュリティ脆弱性にさらされます。
これらの脆弱性を避けるために、コンテナを実行するために必要な権限のみを付与する最小権限ユーザーを設定してください。あるいは、特権ユーザーの使用を禁止するランタイム設定を制限します。
シークレット管理ツールを使用する
Dockerfileにシークレットを保存しないでください。これにより、Dockerfileにアクセスできるユーザーが、フレームワーク全体のセキュリティを誤って保存したり、誤用したり、危険にさらしたりする可能性があります。
標準のベストプラクティスは、Hashicorp Vaultのようなサードパーティツールでキーシークレットを安全に暗号化することです。このアプローチは、アクセス資格情報以外の他のコンテナシークレットにも同様に適用できます。
コンテナファイルへの直接アクセスを制限する
一時的なコンテナは、継続的なアップグレードとバグ修正を必要とします。その結果、そのようなコンテナファイルは、ユーザーがアクセスするたびに露出します。
ベストプラクティスとして、コンテナログをコンテナの外部に維持します。これにより、コンテナファイルへの継続的な直接使用が大幅に削減されます。また、チームがコンテナディレクトリ内のログにアクセスせずに問題をトラブルシューティングできるようになります。
暗号化通信を有効にする
Dockerデーモンへのアクセスを限られた数のユーザーのみに制限します。さらに、一般ユーザーのためにSSH専用アクセスを強制することでコンテナファイルへの直接アクセスを制限します。
ホストレベルの通信を暗号化するためにTLS証明書を使用します。また、未使用のポートを無効にし、デフォルトポートは内部使用のみのために公開されるようにすることも重要です。
DockerのセキュリティはIT環境を守る
IT環境内のセキュリティは、決して見過ごしてはいけない重要な任務です。
クラウドネイティブフレームワークを保護するための最初のステップは、フレームワークの重要な要素の脆弱性を考慮することです。その結果、組織はコンテナとその基盤となるインフラストラクチャを中心とした堅牢なセキュリティプロファイルを維持する必要があります。
エンドツーエンドのセキュリティの実装に対するアプローチは異なる場合がありますが、目標は常に脆弱なポイントを考慮し、リスクを軽減するためのベストプラクティスを採用することです。
関連文献
Dockerガイド
これらの投稿は私自身の意見であり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。