日本語

開発者ツール · Docker run から Docker compose コンバーター

root としてコンテナを実行: --user と user: の変更内容とその理由

· なぜそれが重要なのか

ドッカー コンテナ セキュリティ

root としてコンテナーを実行する様子を示す抽象的な図: --user と user: 変更内容とその理由
オリジナル ToolAcre ベクトル イラスト

画像に特に記載がない限り、コンテナ内のプロセスは root です。この投稿では、これがホスト上で何を意味するか、--user と Compose user: キーによってどのように変更されるか、およびそれに伴うファイル所有権の問題について説明します。

削除できないファイル — コンテナーを 1 回実行すると、バインド マウントが root 所有のファイルでいっぱいになります

削除できないファイル — コンテナーを 1 回実行すると、バインド マウントが root 所有のファイルでいっぱいになります。証拠: バインドマウントされた出力では、解析では診断できない ID の不一致が明らかになる可能性があります。使い捨てリテラルを使用してランタイム ID を再現します。各ソース オカレンスをユーザー マウント機能と組み合わせます。宛先レビューのために名前空間と所有権を予約します。

このセキュリティ インシデントでは、別のセキュリティ インシデントの境界として、イメージ USER およびエントリポイント スイッチに検査ソースまたはイメージ ソースが必要であることも明らかになりました。証拠: イメージ USER およびエントリポイント スイッチには検査ソースまたはイメージ ソースが必要です。この実行時の ID 制約は停止点です。製造時の動作を考慮せずにユーザーのマウント機能を検査し、名前空間と所有権に関するホストのチェックを文書化します。

内部のルートは外部のルートです。デフォルトのユーザー名前空間設定では、コンテナー内の UID 0 は、マウントされたファイルのホスト上の UID 0 になります。

内部のルートは外部のルートです。デフォルトのユーザー名前空間設定では、コンテナー内の UID 0 は、マウントされたファイルのホスト上の UID 0 になります。証拠: UID ゼロのホストの影響は、ここでは読み取れない名前空間の構成に依存します。ランタイム ID トークンをユーザー マウント機能にトレースします。順序付けされた値を最終値フィールドから分離します。名前空間と所有権はコレクションの外にあります。

関連するセキュリティ メカニズムの境界は次のとおりです。別のセキュリティ文法の境界は、1000:1000 の例で、所有権の保証ではなく保存を示しています。証拠: 1000:1000 の例は、所有権の保証ではなく保存を示しています。この実行時 ID ファクトを使用して、ユーザー マウント機能の 1 つのメンバーまたはスカラーを予測します。名前空間と所有権について何かを決定する前に、警告を確認してください。

--user は user になります: — 数値 UID:GID と名前、および画像に一致するアカウントがない場合に数値の方が安全である理由

--user は user になります: — 数値 UID:GID と名前、および画像に一致するアカウントがない場合に数値の方が安全である理由。証拠: --user は user になり、数値 UID:GID テキストは引用符で囲まれます。ランタイム ID のシリアル化をそのモデルから判断します。ユーザーマウント機能でのクォートは型を保護しますが、名前空間と所有権の動作証明は提供しません。

2 番目のセキュリティシリアル化の観察は、別個のセキュリティ出力境界は、read_only cap_drop と security_opt がマップされるのに対し、rootless モードはマップされないということです。証拠: read_only cap_drop と security_opt マップはありますが、rootless モードはマップしません。このランタイム ID 出力は、設定を使用できないコンテキストから分離します。ユーザーのマウント機能をレビュー可能な状態に保ち、名前空間と所有権を個別にチェックします。

すでに権限を削除しているイメージ — Dockerfile 内の USER、およびエントリポイントでユーザーを切り替えるイメージ

すでに特権を削除しているイメージ — Dockerfile の USER、およびエントリポイントでユーザーを切り替えるイメージ。推測するのではなく、ランタイム ID 例外で停止します。ユーザー マウント機能に近い追加には、名前空間と所有権に関連付けられた展開固有の理由が必要です。

もう 1 つのセキュリティ例外制約は、名前空間の再マッピングと Kubernetes コンテキストがスコープ外であるという別のセキュリティ例外境界です。証拠: 名前空間の再マッピングと Kubernetes コンテキストは範囲外です。警告の横にある元のランタイム ID コマンドを保持します。この比較により、ユーザー マウント機能に何が含まれているか、またどの名前空間と所有権の決定が手動のままであるかがわかります。

作業例: docker run --user 1000:1000 -v /srv/app:/app — user: キーと結果として得られるディスク上の所有権の変換

作業例: docker run --user 1000:1000 -v /srv/app:/app — user: キーと結果として得られるディスク上の所有権の変換。合成名からランタイム ID の例を構築します。本番環境の名前空間や所有権の詳細を公開することなく、すべてのユーザーのマウント機能項目を追跡可能にします。

同じセキュリティ例のサンプルは、別のセキュリティ例の境界として、レビューのためにマウントと機能の横に ID が表示されることを示しています。証拠: 確認のためにマウントと機能の横に ID が表示されます。ペアになったランタイム ID ファクトは、ユーザー マウント機能に表示される必要があります。その行を記録し、名前空間と所有権についての仮定を避けます。

その他の強化キー — read_only、cap_drop: [ALL]、security_opt no-new-privileges、およびより大きなステップとしての rootless Docker

その他の強化キー — read_only、cap_drop: [ALL]、security_opt no-new-privileges、およびより大きなステップとしての rootless Docker。ランタイム ID の結果を、観察可能な 1 つのユーザー マウント機能の違いに変換します。 Docker は、後の名前空間と所有権の判定を所有します。

セキュリティ影響の実装では、別のセキュリティ影響境界として、バインド マウントされた出力により、解析では診断できない ID の不一致が露呈する可能性があることも示されています。ランタイム ID の責任を分割します。変換はユーザーのマウント機能を書き込み、リポジトリはシークレットを削除し、オペレーターはネームスペースと所有権を検証します。

これでカバーされないもの — ユーザー名前空間の再マッピング構成と Kubernetes securityContext

これでカバーされないもの — ユーザー名前空間の再マッピング設定と Kubernetes securityContext。ランタイム ID の範囲を、ここに示すユーザー マウント機能ブランチに制限します。隣接するフォームとデフォルトは、名前空間と所有権の質問に答えることができません。

もう 1 つのセキュリティ スコープ制限は、「別のセキュリティ制限境界」から続きます。UID ゼロのホスト効果は、ここでは読み取られていない名前空間構成に依存します。このランタイム ID 境界を除外として扱います。名前空間と所有権についての推測よりも、正確なユーザー マウント機能を優先します。

要点: プロセスが誰であるかを決定し、スタックを起動する前にコンバータの出力に user: が含まれていることを確認してください。

要点: プロセスが誰であるかを決定し、スタックを起動する前にコンバータの出力に user: が含まれていることを確認してください。ソース オプション、モデル フィールド、ユーザー マウント機能行および警告としてランタイム ID を監査します。ネームスペースと所有権を確認する前にシークレットを削除してください。

最後に、セキュリティに関するテイクアウェイ ソースは、別のセキュリティ決定境界として、 --user が user になり、数値の UID:GID テキストが引用符で囲まれることを確認しています。ランタイム ID を厳密に絞り込みます。ユーザー マウント機能が候補です。名前空間、所有権、およびシェルの等価性は保証されません。