Docker Security
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Dockerエンジンは、LinuxカーネルのネームスペースとCgroupsを使用してコンテナを隔離し、基本的なセキュリティ層を提供します。追加の保護は、Capabilities dropping、Seccomp、およびSELinux/AppArmorを通じて提供され、コンテナの隔離が強化されます。authプラグインは、ユーザーのアクションをさらに制限できます。
Dockerエンジンには、Unixソケットを介してローカルでアクセスするか、HTTPを使用してリモートでアクセスできます。リモートアクセスの場合、機密性、整合性、および認証を確保するためにHTTPSとTLSを使用することが重要です。
Dockerエンジンは、デフォルトでunix:///var/run/docker.sock
のUnixソケットでリッスンします。Ubuntuシステムでは、Dockerの起動オプションは/etc/default/docker
に定義されています。Docker APIとクライアントへのリモートアクセスを有効にするには、次の設定を追加してDockerデーモンをHTTPソケット経由で公開します:
しかし、HTTP経由でDockerデーモンを公開することはセキュリティ上の懸念から推奨されません。接続をHTTPSで保護することをお勧めします。接続を保護するための主なアプローチは2つあります:
クライアントがサーバーのアイデンティティを確認します。
クライアントとサーバーが互いのアイデンティティを相互認証します。
証明書はサーバーのアイデンティティを確認するために使用されます。両方の方法の詳細な例については、このガイドを参照してください。
コンテナイメージは、プライベートまたはパブリックリポジトリに保存できます。Dockerはコンテナイメージのためのいくつかのストレージオプションを提供しています:
Docker Hub: Dockerのパブリックレジストリサービス。
Docker Registry: ユーザーが自分のレジストリをホストできるオープンソースプロジェクト。
Docker Trusted Registry: ロールベースのユーザー認証とLDAPディレクトリサービスとの統合を特徴とするDockerの商用レジストリオファリング。
コンテナは、ベースイメージのため、またはベースイメージの上にインストールされたソフトウェアのためにセキュリティ脆弱性を持つ可能性があります。Dockerは、コンテナのセキュリティスキャンを行い、脆弱性をリストするNautilusというプロジェクトに取り組んでいます。Nautilusは、各コンテナイメージレイヤーを脆弱性リポジトリと比較することでセキュリティホールを特定します。
詳細については、こちらをお読みください。
docker scan
**docker scan
**コマンドを使用すると、イメージ名またはIDを使用して既存のDockerイメージをスキャンできます。たとえば、次のコマンドを実行してhello-worldイメージをスキャンします:
Dockerイメージの署名は、コンテナで使用されるイメージのセキュリティと整合性を確保します。以下は簡潔な説明です:
Dockerコンテンツトラストを有効にするには、export DOCKER_CONTENT_TRUST=1
を設定します。この機能は、Dockerバージョン1.10以降ではデフォルトでオフになっています。
この機能が有効な場合、署名されたイメージのみがダウンロードできます。最初のイメージプッシュには、ルートおよびタグ付けキーのパスフレーズを設定する必要があり、Dockerはセキュリティを強化するためにYubikeyもサポートしています。詳細はこちらで確認できます。
コンテンツトラストが有効な状態で署名されていないイメージをプルしようとすると、「No trust data for latest」というエラーが発生します。
最初のイメージプッシュの後、Dockerはイメージに署名するためにリポジトリキーのパスフレーズを要求します。
プライベートキーをバックアップするには、次のコマンドを使用します:
Dockerホストを切り替える際は、操作を維持するためにルートおよびリポジトリキーを移動する必要があります。
Trickestを使用して、世界で最も高度なコミュニティツールによって強化されたワークフローを簡単に構築および自動化します。 今すぐアクセスを取得:
Namespacesは、Linuxカーネルの機能で、カーネルリソースを分割し、あるセットのプロセスがあるセットのリソースを見る一方で、別のセットのプロセスが異なるセットのリソースを見ることができるようにします。この機能は、リソースとプロセスのセットに同じ名前空間を持たせることによって機能しますが、それらの名前空間は異なるリソースを指します。リソースは複数の空間に存在することがあります。
Dockerは、コンテナの隔離を実現するために以下のLinuxカーネルのNamespacesを利用しています:
pid namespace
mount namespace
network namespace
ipc namespace
UTS namespace
名前空間に関する詳細情報は、以下のページを確認してください:
NamespacesLinuxカーネルの機能cgroupsは、一連のプロセス間でcpu、memory、io、network bandwidthなどのリソースを制限する能力を提供します。Dockerは、特定のコンテナのリソース制御を可能にするcgroup機能を使用してコンテナを作成できます。 以下は、ユーザースペースのメモリが500mに制限され、カーネルメモリが50mに制限され、cpuシェアが512、blkio-weightが400に設定されたコンテナです。CPUシェアは、コンテナのCPU使用量を制御する比率です。デフォルト値は1024で、範囲は0から1024です。3つのコンテナが同じCPUシェア1024を持つ場合、各コンテナはCPUリソースの競合が発生した場合に最大33%のCPUを使用できます。blkio-weightは、コンテナのIOを制御する比率です。デフォルト値は500で、範囲は10から1000です。
コンテナのcgroupを取得するには、次のようにします:
For more information check:
CGroupsCapabilities allow finer control for the capabilities that can be allowed for root user. Docker uses the Linux kernel capability feature to limit the operations that can be done inside a Container irrespective of the type of user.
When a docker container is run, the process drops sensitive capabilities that the process could use to escape from the isolation. This try to assure that the process won't be able to perform sensitive actions and escape:
Linux CapabilitiesThis is a security feature that allows Docker to limit the syscalls that can be used inside the container:
SeccompAppArmorは、コンテナを制限されたリソースのセットにプログラムごとのプロファイルで制限するためのカーネル拡張です。:
AppArmorラベリングシステム: SELinuxは、すべてのプロセスとファイルシステムオブジェクトに一意のラベルを割り当てます。
ポリシーの強制: プロセスラベルがシステム内の他のラベルに対してどのようなアクションを実行できるかを定義するセキュリティポリシーを強制します。
コンテナプロセスラベル: コンテナエンジンがコンテナプロセスを開始するとき、通常は制限されたSELinuxラベル、一般的にはcontainer_t
が割り当てられます。
コンテナ内のファイルラベリング: コンテナ内のファイルは通常container_file_t
としてラベル付けされます。
ポリシールール: SELinuxポリシーは、container_t
ラベルを持つプロセスがcontainer_file_t
としてラベル付けされたファイルとのみ相互作用(読み取り、書き込み、実行)できることを主に保証します。
このメカニズムにより、コンテナ内のプロセスが侵害された場合でも、対応するラベルを持つオブジェクトとのみ相互作用するように制限され、そうした侵害からの潜在的な損害が大幅に制限されます。
SELinuxIn Docker, an authorization plugin plays a crucial role in security by deciding whether to allow or block requests to the Docker daemon. This decision is made by examining two key contexts:
Authentication Context: This includes comprehensive information about the user, such as who they are and how they've authenticated themselves.
Command Context: This comprises all pertinent data related to the request being made.
These contexts help ensure that only legitimate requests from authenticated users are processed, enhancing the security of Docker operations.
AuthZ& AuthN - Docker Access Authorization PluginIf you are not properly limiting the resources a container can use, a compromised container could DoS the host where it's running.
CPU DoS
帯域幅DoS
次のページでは**--privileged
フラグが何を意味するか**を学ぶことができます:
攻撃者が低特権ユーザーとしてアクセスを得ることができるコンテナを実行している場合、誤って設定されたsuidバイナリがあると、攻撃者はそれを悪用し、コンテナ内で特権を昇格させる可能性があります。これにより、彼はコンテナから脱出できるかもしれません。
no-new-privileges
オプションを有効にしてコンテナを実行すると、この種の特権昇格を防ぐことができます。
For more --security-opt
options check: https://docs.docker.com/engine/reference/run/#security-configuration
シークレットをDockerイメージに直接埋め込んだり、環境変数を使用したりすることは避けることが重要です。これらの方法は、docker inspect
やexec
のようなコマンドを通じてコンテナにアクセスできる誰にでも機密情報を露出させてしまいます。
Dockerボリュームは、機密情報にアクセスするためのより安全な代替手段です。これらはメモリ内の一時ファイルシステムとして利用でき、docker inspect
やログに関連するリスクを軽減します。ただし、ルートユーザーやコンテナへのexec
アクセスを持つ者は、依然としてシークレットにアクセスできる可能性があります。
Dockerシークレットは、機密情報を扱うためのさらに安全な方法を提供します。イメージビルドフェーズ中にシークレットが必要なインスタンスには、BuildKitがビルド時のシークレットをサポートし、ビルド速度を向上させ、追加機能を提供する効率的なソリューションを提供します。
BuildKitを活用するには、以下の3つの方法で有効化できます:
環境変数を通じて: export DOCKER_BUILDKIT=1
コマンドにプレフィックスを付けて: DOCKER_BUILDKIT=1 docker build .
Docker設定でデフォルトで有効にする: { "features": { "buildkit": true } }
、その後Dockerを再起動します。
BuildKitは、--secret
オプションを使用してビルド時のシークレットを利用でき、これらのシークレットがイメージビルドキャッシュや最終イメージに含まれないようにします。コマンドの例:
実行中のコンテナに必要な秘密情報について、Docker Compose と Kubernetes は堅牢なソリューションを提供します。Docker Compose は、docker-compose.yml
の例に示すように、秘密ファイルを指定するためにサービス定義内で secrets
キーを利用します:
この設定により、Docker Composeを使用してサービスを起動する際にシークレットを使用することができます。
Kubernetes環境では、シークレットがネイティブにサポートされており、Helm-Secretsのようなツールでさらに管理できます。Kubernetesのロールベースアクセス制御(RBAC)は、Docker Enterpriseと同様にシークレット管理のセキュリティを強化します。
gVisorは、Goで書かれたアプリケーションカーネルで、Linuxシステムの表面の大部分を実装しています。これは、アプリケーションとホストカーネルの間に隔離境界を提供するrunsc
というOpen Container Initiative (OCI)ランタイムを含んでいます。runsc
ランタイムはDockerとKubernetesと統合されており、サンドボックス化されたコンテナを簡単に実行できます。
Kata Containersは、軽量の仮想マシンを使用して安全なコンテナランタイムを構築するために活動しているオープンソースコミュニティです。これにより、コンテナのように感じられ、動作しますが、ハードウェア仮想化技術を使用して、より強力なワークロードの隔離を提供します。
--privileged
フラグを使用したり、 Dockerソケットをコンテナ内にマウントしないでください。 Dockerソケットはコンテナを生成することを可能にするため、例えば--privileged
フラグを使用して別のコンテナを実行することでホストを完全に制御する簡単な方法です。
コンテナ内でrootとして実行しないでください。 異なるユーザーを使用し 、 ユーザーネームスペースを使用してください。 コンテナ内のrootは、ユーザーネームスペースで再マップされない限り、ホストのrootと同じです。主にLinuxネームスペース、能力、およびcgroupsによって軽く制限されています。
すべての能力を削除 (--cap-drop=all
)し、必要なものだけを有効にしてください (--cap-add=...
)。多くのワークロードは能力を必要とせず、追加すると潜在的な攻撃の範囲が広がります。
“no-new-privileges”セキュリティオプションを使用してください 。これにより、プロセスがより多くの特権を取得するのを防ぎます。例えば、suidバイナリを通じて。
コンテナに利用可能なリソースを制限してください。 リソース制限は、サービス拒否攻撃からマシンを保護できます。
seccomp 、AppArmor (またはSELinux)プロファイルを調整して、コンテナに必要な最小限のアクションとシステムコールを制限してください。
公式のdockerイメージを使用し 、署名を要求するか、これに基づいて自分のものを構築してください。 バックドア付きのイメージを継承したり使用しないでください。 また、ルートキーやパスフレーズを安全な場所に保管してください。DockerはUCPでキーを管理する計画を持っています。
定期的に イメージを再構築して、ホストとイメージにセキュリティパッチを適用してください。
シークレットを賢く管理し、攻撃者がアクセスしにくくしてください。
Dockerデーモンを公開する場合は、クライアントとサーバーの認証を使用してHTTPSを使用してください。
Dockerfileでは、ADDの代わりにCOPYを優先してください。 ADDは自動的に圧縮ファイルを抽出し、URLからファイルをコピーできます。COPYにはこれらの機能がありません。可能な限りADDの使用を避け、リモートURLやZipファイルを通じた攻撃に対して脆弱にならないようにしてください。
各マイクロサービスに対して別々のコンテナを持ってください。
コンテナ内にsshを置かないでください。 “docker exec”を使用してコンテナにsshできます。
より小さなコンテナイメージを持ってください。
もしあなたがdockerコンテナ内にいるか、dockerグループのユーザーにアクセスできる場合、脱出して特権を昇格させることを試みることができます:
Docker Breakout / Privilege Escalationもしあなたがdockerソケットにアクセスできるか、dockerグループのユーザーにアクセスできるが、docker認証プラグインによって行動が制限されている場合、それをバイパスできるか確認してください:
AuthZ& AuthN - Docker Access Authorization Pluginツールdocker-bench-securityは、プロダクションでDockerコンテナを展開する際の一般的なベストプラクティスをチェックするスクリプトです。テストはすべて自動化されており、CIS Docker Benchmark v1.3.1に基づいています。 このツールは、dockerを実行しているホストまたは十分な特権を持つコンテナから実行する必要があります。READMEでの実行方法を確認してください: https://github.com/docker/docker-bench-security。
Trickestを使用して、世界で最も高度なコミュニティツールによって駆動されるワークフローを簡単に構築し、自動化してください。 今日アクセスを取得:
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)