コンテナのランタイムセキュリティ
ユーザー権限やリソース制限など、実行時にコンテナを保護するためのベストプラクティスを実装します。
「コンテナのランタイムセキュリティ」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。
ランタイムセキュリティの基本
ランタイムコンテナセキュリティへようこそ。安全なイメージを構築することは重要ですが、コンテナが実行中になった後はどうすればよいのでしょうか。
このレッスンでは、アプリケーションが実行中である間に保護するためのベストプラクティスを学び、脆弱性や攻撃による被害を抑える方法を扱います。

最小権限の原則
基本的なセキュリティ概念に最小権限の原則があります。これは、エンティティ(コンテナやユーザーなど)に対して、その機能を実行するために絶対に必要な権限だけを付与し、それ以上の権限は与えないという考え方です。
これを適用すると攻撃対象領域が縮小し、コンテナが侵害された場合の影響を抑えられます。
rootでの実行を避ける
デフォルトでは、Dockerコンテナ内のプロセスは、コンテナ内で完全な管理者権限を持つ root ユーザーとして実行されます。
- リスク: 攻撃者がroot権限を持つコンテナを制御すると、Dockerデーモンやカーネルの脆弱性を悪用して、ホストシステム上のroot権限を取得できる可能性があります。
- ベストプラクティス: コンテナ内のプロセスは必ずroot以外のユーザーとして実行してください。
root以外のユーザーとして実行する
docker run の --user フラグを使うと、コンテナ内のプロセスに使用するユーザーを名前またはUIDで指定できます。ここでは、Alpineコンテナ内で id コマンドをユーザー 1000 として実行します。
ユーザー 1000 が存在しない場合でも、DockerはそのUIDを使用します。
docker run --rm -it --user 1000 alpine idLinux capabilitiesを理解する
従来のLinuxシステムでは、rootユーザーの権限は「すべてか、何もないか」のどちらかでした。Linux capabilitiesは、強力なroot権限を、より小さく独立した単位に分割します。
これにより、プロセスは完全なroot権限を持たなくても、必要な特定のroot相当の権限(低いポートへのバインドやrawネットワークアクセスなど)だけを持てるようになります。
不要なcapabilitiesを削除する
Dockerコンテナは、デフォルトで多数のcapabilitiesを持って実行されます。--cap-drop を使って不要なcapabilitiesを削除し、コンテナで実行できる操作をさらに制限できます。
ここでは NET_RAW capabilityを削除します。NET_RAW を必要とする ping コマンドは失敗するため、制限の効果を確認できます。
docker run --rm -it --cap-drop=NET_RAW alpine ping -c 1 localhost || echo "Ping failed: NET_RAW capability dropped!"コンテナのリソースを制御する
コンテナはホストのカーネルとリソースを共有します。あるコンテナがリソースを制限なく使用すると、他のコンテナやホスト自体でサービス拒否(DoS)が発生する可能性があります。
- CPU制限: コンテナがCPUサイクルを独占するのを防ぎます。
- メモリ制限: コンテナが使用可能なRAMをすべて消費するのを防ぎ、システムの不安定化を抑えます。
リソース制限を設定する
docker run を使うと、CPUとメモリに直接制限を設定できます。この例では、メモリを128MB、CPU使用率を0.5(CPUコア1個の半分)に制限しています。
これにより、コンテナが適切に動作し、他のプロセスのリソースを奪わないようにできます。
docker run --rm -it --memory="128m" --cpus="0.5" alpine sh -c "echo 'Container running with limited resources.' && free -h"読み取り専用ファイルシステム
多くのアプリケーションでは、起動後にルートファイルシステムへ書き込む必要はありません。ファイルシステムを読み取り専用にすると、次のような大きなセキュリティ上のメリットがあります。
- 改ざんを防止する: 攻撃者は既存のファイルを変更したり、新たな悪意のあるファイルを書き込んだりできません。
- 永続化を制限する: 行われた変更は一時的なもので、コンテナの再起動時に失われます。
- 不変性を適用する: コンテナを使い捨てにし、設定を外部で管理する設計を促進します。
読み取り専用コンテナをデプロイする
コンテナの実行時に --read-only フラグを使用してください。明示的にマウントしたボリューム以外のコンテナファイルシステムに書き込もうとすると、失敗します。
この読み取り専用コンテナ内でファイルを作成してみてください。
docker run --rm -it --read-only alpine sh -c "touch /test.txt || echo 'Error: Cannot write to read-only filesystem!'"ランタイムセキュリティチェック
ランタイムでコンテナを保護するための適切なプラクティスは、次のうちどれでしょうか。
ランタイムセキュリティの復習
よくできました。実行中のコンテナのセキュリティを強化する方法を学びました。
- 最小権限: 必要な権限だけを付与します。
- root以外のユーザー:
rootとしてプロセスを実行しないようにします。 - Capabilities: 不要なLinux capabilitiesを削除します。
- リソース制限: CPUとメモリの使用量を制御します。
- 読み取り専用: ファイルシステムを不変にして、書き込みを防ぎます。
これらのプラクティスにより、攻撃対象領域と、侵害された場合の影響を大幅に縮小できます。引き続き練習してください。
よくある質問
「コンテナのランタイムセキュリティ」レッスンは無料ですか?
はい。「コンテナのランタイムセキュリティ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。
「コンテナのランタイムセキュリティ」で何を学びますか?
ユーザー権限やリソース制限など、実行時にコンテナを保護するためのベストプラクティスを実装します。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
DevOps Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「コンテナのランタイムセキュリティ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDevOps Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- コンテナイメージのセキュリティスキャン
- コンテナのランタイムセキュリティ
- Secrets管理とRBAC
- ネットワークポリシーと最小権限ネットワーク