コンテナセキュリティ:イメージの堅牢化とランタイム保護
不要なパッケージを削除し、非rootユーザーで実行することでDockerイメージを堅牢化し、ランタイムセキュリティツール(Falco、Sysdig)で異常なコンテナの挙動を検出します。
「コンテナセキュリティ:イメージの堅牢化とランタイム保護」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
コンテナセキュリティの基礎
コンテナは、アプリケーションコードとその依存関係を、ホストOSのカーネルを共有する分離された単位にパッケージ化します。完全なゲストOSを含むVMとは異なります。この共有によってコンテナは軽量かつ高速になりますが、異なるセキュリティモデルも生じます。コンテナエスケープの脆弱性があると、攻撃者がコンテナの外へ脱出してホストカーネルに直接アクセスし、他のすべてのコンテナに影響を与える可能性があります。コンテナセキュリティは、3つの層に重点を置きます。イメージ(何が組み込まれているか)、ランタイム(実行中のコンテナが何をできるか)、そしてオーケストレーションプラットフォーム(コンテナをどのように管理するか)です。
最小ベースイメージ:攻撃対象領域の縮小
コンテナイメージにインストールされるすべてのパッケージは、攻撃対象領域になり得ます。最小ベースイメージの原則では、可能な限り小さな基盤から始めます。たとえば、Alpine Linux(5MB、最小限のパッケージ)、distrolessイメージ(シェルやパッケージマネージャーを含まず、ランタイムとアプリケーションだけを含むGoogleのイメージ)、またはscratch(完全に空で、静的コンパイルされたバイナリ向け)です。シェルを含まないコンテナでは、攻撃者がコード実行に成功しても、wget、curlなどのツールを簡単に実行して攻撃を拡大することはできません。これは最小限の露出による防御と呼ばれる原則です。
# Bad: starts from a full OS image
FROM ubuntu:22.04
# Better: minimal Alpine base
FROM alpine:3.18
# Best: distroless for Java apps
FROM gcr.io/distroless/java17-debian11非rootで実行する:最初のルール
デフォルトでは、Dockerコンテナはroot(UID 0)として実行されます。攻撃者がコンテナ化されたアプリケーションの脆弱性を悪用すると、コンテナ内でroot権限を取得します。コンテナがボリュームを共有している場合やホストマウントを持つ場合、コンテナ内のrootがホスト上のrootと同等になる可能性があります。対策は簡単です。Dockerfileで専用ユーザーを作成し、最終的なCMD/ENTRYPOINTの前にUSERディレクティブでそのユーザーに切り替えます。多くのコンテナセキュリティスキャンツールは、非rootユーザーのないイメージを検出結果として報告します。
FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
COPY --chown=appuser:appgroup app /app/app
USER appuser
CMD ["/app/app"]イミュータブルコンテナと読み取り専用ファイルシステム
イミュータブルコンテナとは、実行時にファイルシステムを変更できないコンテナです。Dockerで--read-onlyを有効にする(またはKubernetesでreadOnlyRootFilesystem: trueを設定する)と、攻撃者によるディスクへのマルウェアの書き込み、設定ファイルの変更、実行中のコンテナ内へのツールのインストールを防げます。データを書き込む必要があるアプリケーション(ログや一時ファイルなど)は、特定のtmpfsボリュームを一時的な書き込み用にマウントできます。イミュータブルコンテナは、実行時の状態が、CI/CDのセキュリティパイプラインを迂回するコンテナ内の変更ではなく、イメージと設定だけから生じるべきだという原則を徹底します。
# Run container with read-only root filesystem
docker run --read-only \
--tmpfs /tmp \
--tmpfs /var/run \
myapp:latestイメージスキャン:デプロイ前にCVEを検出
コンテナイメージスキャンツールは、Dockerイメージにインストールされたパッケージを脆弱性データベース(NVD、CVE)と照合し、既知のCVEを報告します。代表的なスキャナーには、Trivy(Aqua Security、高速かつ無料)、Grype(Anchore)、Snyk Container、AWS ECR image scanningがあります。スキャンはCI/CDパイプラインに組み込み、重大度がCriticalまたはHighのCVEを含むイメージがレジストリにプッシュされる前に、パイプラインを失敗させるようにします。また、スキャナーでイメージレイヤーに誤って埋め込まれたシークレット(APIキー、パスワード)がないかも確認する必要があります。
# Scan a Docker image with Trivy
trivy image --severity HIGH,CRITICAL myapp:latest
# Fail CI pipeline if vulnerabilities found
trivy image --exit-code 1 --severity CRITICAL myapp:latestシークレット管理:イメージレイヤーに保存しない
よくある危険な誤りは、シークレット(APIキー、データベースパスワード、TLS証明書)をDockerイメージに埋め込むことです。これは、イメージに焼き付けた環境変数を使用した場合や、COPYで追加したファイルに保存した場合に発生します。イメージにアクセスできる人は、docker historyを使ったりイメージレイヤーを抽出したりすることで、これらのシークレットを確認できます。後続のレイヤーでファイルを削除しても、イメージの履歴には残り続けます。シークレットは、シークレットマネージャーから環境変数を使ってランタイムに注入するか、Docker secretsまたはボリュームとしてマウントしたKubernetes Secretsを使用する必要があります。
# Never bake secrets into images
# Bad: ENV DATABASE_PASSWORD='supersecret'
# Good: inject at runtime via environment
docker run -e DATABASE_PASSWORD=$(vault read -field=password secret/db) myapp:latest
# Or use Docker secrets in Swarm/K8sランタイム保護:Falcoとシステムコール監視
ランタイムセキュリティツールは、コンテナの実行中の挙動を監視し、異常なアクティビティを検知すると警告またはブロックします。Falco(CNCFプロジェクト)は、eBPFまたはカーネルモジュールを使用してLinuxカーネルにフックし、システムコールを捕捉してルールと照合します。たとえば、コンテナがシェル(execve('/bin/sh'))を起動した場合、想定外のポートでネットワーク接続を開いた場合、または/etc/shadowを読み取った場合に警告するルールを設定できます。こうした挙動の兆候は、既知のCVEが悪用されていなくても、攻撃が進行中であることを示す場合があります。Sysdig SecureとAqua Securityは、商用のランタイム保護プラットフォームを提供しています。
# Example Falco rule: alert on shell execution in container
# - rule: Shell Spawned in Container
# desc: A shell was spawned in a container
# condition: container and proc.name in (bash, sh, zsh)
# output: Shell spawned (user=%user.name container=%container.name)
# priority: WARNINGLinuxケーパビリティとSeccompプロファイル
Dockerコンテナはデフォルトで多くのLinuxケーパビリティを削除しますが、それでも大半のアプリケーションが必要とする以上の権限を保持しています。ケーパビリティは、root権限を個別の単位に分割します(例:CAP_NET_ADMIN、CAP_SYS_ADMIN)。ベストプラクティスは、すべてのケーパビリティを削除し、--cap-drop=ALL --cap-add=NET_BIND_SERVICEを使って必要なものだけを再追加することです。Seccomp(Secure Computing Mode)プロファイルは、コンテナによる実行を許可するシステムコールをホワイトリストで指定します。Dockerには、危険なシステムコール約44個をブロックするデフォルトのSeccompプロファイルが含まれています。アプリケーションごとにカスタムSeccompプロファイルを作成すれば、アプリケーションが正当に使用しないすべてのシステムコールをブロックして、さらに制限できます。
# Drop all capabilities, add only what's needed
docker run \
--cap-drop=ALL \
--cap-add=NET_BIND_SERVICE \
--security-opt seccomp=/etc/docker/seccomp-custom.json \
myapp:latestコンテナレジストリとイメージ署名
コンテナレジストリ(Docker Hub、AWS ECR、Google Artifact Registry)は、イメージを保存および配布します。レジストリを保護するには、プッシュ時の脆弱性スキャンを有効にすること、プッシュアクセスをCI/CDサービスアカウントのみに制限すること、Sigstore/CosignまたはDocker Content Trust (Notary)を使ったイメージ署名を有効にすることが必要です。これにより、ランタイム環境は信頼できるソースから暗号学的に署名されたイメージのみをプルできます。また、イメージの不変性を設定してタグの上書きを禁止します。これにより、攻撃者が信頼された:latestタグを悪意のあるイメージに置き換えるタグ改変攻撃を防止できます。
# Sign a container image with Cosign
cosign sign --key cosign.key myregistry.io/myapp:v1.2.3
# Verify signature before deployment
cosign verify --key cosign.pub myregistry.io/myapp:v1.2.3コンテナエスケープの手法と防御
コンテナ内でコード実行に成功した攻撃者は、ホストに到達するためにコンテナエスケープを試みることがあります。一般的な手法には、脆弱な特権コンテナの悪用(--privilegedはホストへのほぼ無制限のアクセスを許可します)、公開されたDockerソケットの悪用(/var/run/docker.sockをコンテナにマウントすると、特権コンテナの作成を含むDocker APIへの完全なアクセスが可能になります)、保護されていないケーパビリティを介したカーネルの脆弱性の悪用があります。防御策は、絶対に必要な場合を除いて特権モードを使用しないこと、アプリケーションコンテナにDockerソケットをマウントしないこと、ホストカーネルにパッチを適用して最新の状態に保つこと、強力な分離が必要なワークロードにはgVisorまたはKata Containersを使用することです。
# DANGEROUS: never do this in production
# docker run --privileged -v /:/host myapp:latest
# Check if a container is running privileged
docker inspect mycontainer | grep -i privilegedCIS Docker Benchmarkへの準拠
Center for Internet Security (CIS) Docker Benchmarkは、Dockerホストとコンテナ向けに、デーモン設定、イメージの衛生管理、コンテナランタイム設定、ネットワーク制御を対象とした詳細なセキュリティ設定ガイドラインを提供します。Docker Bench for Securityなどのツールを使うと、CISベンチマークに基づく準拠チェックを自動化し、合否項目をスコア付きのレポートとして出力できます。このベンチマークを定期的に実行し、CI/CDに統合することで、セキュリティ設定のドリフトを迅速に検出できます。Security+の受験者は、試験においてCIS BenchmarksがOSとプラットフォームのハードニングに関する主要な参照資料であることを理解しておく必要があります。
# Run Docker Bench for Security
docker run -it --net host --pid host --userns host --cap-add audit_control \
-v /var/lib:/var/lib -v /var/run/docker.sock:/var/run/docker.sock \
-v /etc:/etc docker/docker-bench-securityクイックチェック
このレッスンで扱ったCompTIA Security+(SY0-701)の概念について、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、最小構成のベースイメージと非rootユーザーによって、コンテナ化されたワークロードの攻撃対象領域と権限レベルを下げられること、Falcoなどのランタイム保護ツールによって、コンテナ内で攻撃が進行していることを示す異常なシステムコールパターンを検知できること、そして特権コンテナを使用したりDockerソケットをアプリケーションコンテナにマウントしたりしてはならないことを学びました。これらの設定はコンテナエスケープを可能にするためです。次は、RBAC、ネットワークポリシー、Pod Security Standardsなど、Kubernetesのセキュリティについて学びます。
よくある質問
「コンテナセキュリティ:イメージの堅牢化とランタイム保護」レッスンは無料ですか?
はい。「コンテナセキュリティ:イメージの堅牢化とランタイム保護」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
「コンテナセキュリティ:イメージの堅牢化とランタイム保護」で何を学びますか?
不要なパッケージを削除し、非rootユーザーで実行することでDockerイメージを堅牢化し、ランタイムセキュリティツール(Falco、Sysdig)で異常なコンテナの挙動を検出します。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cloud & IT Cert Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「コンテナセキュリティ:イメージの堅牢化とランタイム保護」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?
はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- コンテナセキュリティ:イメージの堅牢化とランタイム保護
- Kubernetesセキュリティ:RBAC、ネットワークポリシー、Podセキュリティ
- サーバーレスと関数のセキュリティ
- Infrastructure as Codeのセキュリティスキャン