この記事では、Docker デーモン プロセスの関連するセキュリティ構成項目について説明します。 1. テスト環境1.1 CentOS 7をインストールするCentOS Linux リリース 7.7.1908 (コア) カーネルをアップグレードして再起動する # yum カーネルをアップデート 1.2 Docker CE 19.03をインストールする# yum install -y yum-utils デバイスマッパー永続データ lvm2 # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # yum インストール -y docker-ce [root@localhost docker]# docker --version Docker バージョン 19.03.8、ビルド afacb8b 2. デーモンのセキュリティ設定デフォルトでは設定ファイルはありません。/etc/docker/daemon.json { "icc": 偽、 "ログレベル": "情報", "ログドライバー": "json ファイル", 「ログオプション」: { "最大サイズ": "10m", "最大ファイル":"5", "ラベル": "somelabel", "env": "os,顧客" }, 「iptables」: 真、 "userns-remap": "デフォルト", 「ユーザーランドプロキシ」:false、 「実験的」:偽、 "selinux-enabled": true、 「ライブリストア」:true、 「新しい権限なし」:true、 "cgroup-parent": "/foobar", "seccomp-profile": "/etc/docker/seccomp/default-no-chmod.json", "tls": 真、 "tlsverify": 真、 "tlscacert": "/etc/docker/CA/ca.pem", "tlscert": "/etc/docker/CA/server-cert.pem", "tlskey": "/etc/docker/CA/server-key.pem" } 2.1 HTTPSと証明書認証を介してDockerデーモンへのアクセスを構成するサーバー証明書 HOST を作成し、ドメインを定義します (IP も OK)。対応する証明書はドメインに従って生成されます。これは通常、証明書に CN を登録するために使用されます。 証明書ディレクトリを作成します。
キー証明書を生成し、キー証明書のパスワードを 2 回入力します。
CA 証明書を生成するには、登録証明書の基本情報を入力する必要があります。
サーバー証明書を作成します。 $ openssl genrsa -out サーバーキー.pem 4096 $ openssl req -subj "/CN=localhsot" -sha256 -new -key server-key.pem -out server.csr 証明書で指定された IP アドレスを設定します。
Docker デーモン キーの拡張使用プロパティをサーバー認証にのみ使用するように設定します。
サーバー証明書を生成します:
クライアント証明書 クライアント証明書を作成します: (現在のディレクトリにまだあります) $ openssl genrsa -out キー.pem 4096 $ openssl req -subj '/CN=localhost' -new -key key.pem -out client.csr キーをクライアント認証に適したものにするには、拡張構成ファイルを作成します。
クライアント証明書を生成します:
使用 証明書に対応する権限を付与します。 $ chmod -v 0400 ca-key.pem key.pem server-key.pem $ chmod -v 0444 ca.pem server-cert.pem cert.pem [root@localhost CA]# ls ca-key.pem ca.pem ca.srl cert.pem client.csr extfile.cnf key.pem server-cert.pem server.csr server-key.pem サーバー構成 "tls": 真、 "tlsverify": 真、 "tlscacert": "/etc/docker/CA/ca.pem", "tlscert": "/etc/docker/CA/server-cert.pem", "tlskey": "/etc/docker/CA/server-key.pem" クライアント構成 クライアント証明書をサーバーに設定し、適切な場所に配置します。 $ cp -v {ca,cert,key}.pem ~/.docker $ エクスポート DOCKER_HOST=tcp://$HOST:2376 DOCKER_TLS_VERIFY=1 シミュレーションテストは次のように実行されます。 $ curl https://$HOST:2376/images/json \ --cert ~/.docker/cert.pem \ --key ~/.docker/key.pem \ --cacert ~/.docker/ca.pem [{"コンテナ":-1,"作成日":1540777343,"Id":"sha256:55e7b305dc477345434ce3bd3941940481f982eea31c8f28c0670d59c63d544b","ラベル":nu 2.2 名前空間分離技術の使用名前空間は分離技術です。Docker は分離技術を使用して特定の名前空間を開き、特別なプロセスを作成します。ただし、名前空間の使用は条件付きです。システムは dockremap を作成し、/etc/subuid と /etc/subuid に対応する id 値を通じてコンテナーにマップします。実際には、自動分離の効果を実現するために dockremap の通常の権限が引き続き使用されます。 まず
この設定を変更するときは注意が必要です。すでに Docker 環境を展開している場合は、このオプションを有効にすると分離された環境に切り替わり、以前の Docker コンテナは使用できなくなります。 [root@localhost docker]# cat /etc/subuid ドックリマップ:100000:65536 2.3 Dockerパーティションの設定コンテナ用に別のパーティションを作成します。デフォルトのパーティションは
100000.100000 ビルダー ビルドキット コンテナ イメージ ネットワーク overlay2 プラグイン ランタイム スウォーム tmp 信頼 ボリューム 2.4 デフォルトのブリッジコンテナ間のトラフィックの制限Docker サービスが開始されると、デフォルトで iptables の FORWARD チェーンに転送ポリシーが追加されます。ポリシーは、--icc=true (デフォルト) または --icc=false が設定されているかどうかに応じて、ACCEPT または DROP のいずれかになります。 --iptables=false を手動で指定すると、iptables ルールは追加されません。 デフォルトでは、デフォルト ブリッジ上の同じホスト上のコンテナー間のすべてのネットワーク通信が許可されます。これが必要ない場合は、すべてのコンテナー間の通信を制限します。 通信する必要がある特定のコンテナをリンクするか、カスタム ネットワークを作成し、そのカスタム ネットワークに通信する必要があるコンテナのみを参加させます。 デフォルトのブリッジ「icc」上のコンテナ間のトラフィックを制限するように設定します: false 2.5 ログの設定集中リモートログを設定し、ログプロセスの--log-levelレベルをinfo、ログ形式をjson、ローカルログを設定します。 "ログレベル": "情報", "ログドライバー": "json ファイル", 「ログオプション」: { "最大サイズ": "10m", "最大ファイル":"5", "ラベル": "somelabel", "env": "os,顧客" }, リモートログの設定 Docker ログ ドライバーはコンテナー ログを受信し、それをリモートの宛先またはファイルに転送します。 デフォルトのログ ドライバーは Journald – コンテナ ログをシステム ジャーナルに保存します。 流暢な例 { "ログドライバー": "fluentd", 「ログオプション」: { "fluentd アドレス": "fluentdhost:24224" } } syslogの使用 { "ログドライバー": "syslog", 「ログオプション」: { "syslog アドレス": "udp://1.2.3.4:1111" } } 2.6 ulimitの設定{ 「デフォルトのulimits」: { "ファイルなし": { "名前": "nofile", 「ハード」: 64000, 「ソフト」:64000 } } } 2.7 cgroupの設定--cgroup-parent オプションを使用すると、コンテナに使用するデフォルトの cgroup 親を設定できます。 このオプションが設定されていない場合、fs cgroup ドライバーの場合はデフォルトで /docker に、systemd cgroup ドライバーの場合は system.slice に設定されます。 cgroup にスラッシュ (/) が含まれている場合、cgroup はルート cgroup の下に作成され、含まれていない場合はデーモン cgroup の下に作成されます。 デーモンが cgroup daemoncgroup で実行されていると仮定すると、 --cgroup-parent=/foobar は /sys/fs/cgroup/memory/foobar に cgroup を作成し、 --cgroup-parent=foobar は systemd cgroup ドライバーには --cgroup-parent に対する異なるルールがあります。 Systemd は階層をスライスで表し、スライスの名前はツリー内の位置をエンコードします。 したがって、systemd cgroup の --cgroup-parent はスライス名である必要があります。 名前は、ルート スライスからスライスまでのパスを表す、ダッシュで区切られた一連の名前で構成できます。 たとえば、--cgroup-parent=user-ab.slice は、コンテナのメモリ cgroup が また、docker create および docker run の --cgroup-parent オプションを使用して、コンテナ ランタイムを使用して設定することもできます。これは、デーモンの --cgroup-parent オプションよりも優先されます。 2.8 seccompの設定使用されるテスト構成ファイルでは、Dockerでのchmodコマンドの使用が禁止されています。 https://github.com/docker/labs/blob/master/security/seccomp/seccomp-profiles/default-no-chmod.json [root@localhost docker]# docker run --rm -it alpine sh / # ls bin etc lib mnt proc run srv tmp var dev home media opt root sbin sys usr / # touch foo.sh / # chmod +x foo.sh chmod: foo.sh: 操作は許可されていません / # 出口 実際に、特定のシステム関連の呼び出しを禁止、許可、警告することができます。参照: https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl 2.9 デーモンをサポートしないコンテナの設定--live-restore は、コンテナに影響を与えずに docker デーモンがシャットダウンされることを保証します。 テスト中、docker デーモンをシャットダウンした後でも、nginx コンテナは通常のアクセスを提供できます。 2.10 Dockerの実験的な機能を無効にする「実験的」に設定: false 2.11 suid または sgid によるコンテナ権限の昇格の制限no-new-privileges セキュリティ オプションは、コンテナー内のアプリケーション プロセスが実行中に新しい権限を取得することを防ぎます。 たとえば、イメージ内に sudo などの setuid/setgid ビットが設定されたプログラムがある場合、コンテナ内のプロセスにはそのプログラムを実行するための (ファイル) 権限も与えられます。setuid/setgid などの機能を通じて権限を取得しようとする試みはすべて拒否されます。 3. デーモン設定例(Linux){ "authorization-plugins": [], //アクセス認証プラグイン "data-root": "", //dockerデータの永続ストレージのルートディレクトリ。デフォルトは/var/lib/docker "dns": [], //DNS サーバー"dns-opts": [], //ポートなどの DNS 構成オプション。"dns-search": [], //DNS 検索ドメイン名"exec-opts": [], //実行オプション"exec-root": "", //実行されたファイルのルート ディレクトリ"experimental": false, //実験的な機能を有効にするかどうか"features": {}, //特定の機能を有効または無効にします。たとえば、{"buildkit": true} は buildkit をデフォルトの Docker イメージ ビルダーにします。 "storage-driver": "",//ストレージ ドライバーの種類 "storage-opts": [],//ストレージ オプション "labels": [],//docker メタデータをマークするためのキーと値のペア "live-restore": true,//dockerd がハングアップしたときにコンテナーを存続させるかどうか (docker サービス例外によるコンテナーの終了を回避する) "log-driver": "json-file", //コンテナログドライバー "log-opts": { "最大サイズ": "10m", "最大ファイル":"5", "ラベル": "somelabel", "env": "os,顧客" }, //コンテナログオプション "mtu": 0, //コンテナネットワークMTU(最大転送単位)を設定する "pidfile": "", //デーモン PID ファイルの場所 "cluster-store": "", //クラスター ストレージ システムの URL "cluster-store-opts": {},//クラスター ストレージを構成する"cluster-advertise": "",//外部アドレス名"max-concurrent-downloads": 3,//各プル プロセスの最大同時実行数を設定する"max-concurrent-uploads": 5,//各プッシュ プロセスの最大同時実行数を設定する"default-shm-size": "64M",//デフォルトの共有メモリ サイズを設定する"shutdown-timeout": 15,//シャットダウン タイムアウト制限を設定する"debug": true,//デバッグ モードをオンにする"hosts": [],//dockerd デーモン プロセスのリッスン アドレス"log-level": "",//ログ レベル"tls": true,//トランスポート層セキュリティ プロトコル TLS をオンにする "tlsverify": true, // トランスポート層セキュリティ プロトコルを有効にし、リモート アドレスを検証します "tlscacert": "", // CA 署名ファイル パス "tlscert": "", // TLS 証明書ファイル パス "tlskey": "", // TLS キー ファイル パス "swarm-default-advertise-addr": "", // swarm 外部アドレス "api-cors-header": "", // CORS (クロス オリジン リソース共有) ヘッダーを設定します "selinux-enabled": false, // selinux (ユーザー、プロセス、アプリケーション、およびファイルに対する必須のアクセス制御) を有効にします "userns-remap": "", // ユーザー名前空間のユーザー/グループを設定します "group": "", // Docker グループ "cgroup-parent": "", // すべてのコンテナの cgroup の親クラスを設定します "default-ulimits": { "ファイルなし": { "名前": "nofile", 「ハード」: 64000, 「ソフト」:64000 } }, //すべてのコンテナのulimitを設定する "init": false, // コンテナーは、シグナルを転送したりプロセスを制御 (reap) するために初期化を実行します "init-path": "/usr/libexec/docker-init", // docker-init ファイルへのパス "ipv6": false, // IPV6 ネットワークをサポートします "iptables": false, // ファイアウォール ルールを開きます "ip-forward": false, // net.ipv4.ip_forward を開きます "ip-masq": false, // IP マスキングを有効にします (IP パケットがルーターまたはファイアウォールを通過するときに送信元または宛先 IP アドレスを書き換える手法) "userland-proxy": false, // ユーザーランド プロキシ "userland-proxy-path": "/usr/libexec/docker-proxy", // ユーザーランド プロキシ パス "ip": "0.0.0.0", // デフォルト IP "bridge": "", // コンテナをブリッジネットワークに接続します "bip": "", // ブリッジ IP を指定します "fixed-cidr": "",//(ipv4) サブネット分割、つまり IP アドレス割り当ての範囲を制限し、コンテナが属するネットワーク セグメントを制御して、コンテナ間 (同じホストまたは異なるホスト) のネットワーク アクセスを実現します。"fixed-cidr-v6": "",//(ipv6) サブネット分割"default-gateway": "",//デフォルト ゲートウェイ"default-gateway-v6": "",//デフォルト ipv6 ゲートウェイ"icc": false,//コンテナ間の通信"raw-logs": false,//生のログ (色なし、完全なタイムスタンプ) "allow-nondistributable-artifacts": [],//外部に配布されない製品用に提出されたレジストリ リポジトリ"registry-mirrors": [],//レジストリ リポジトリ ミラー アクセラレーション アドレス"seccomp-profile": "",//seccomp 構成ファイル"insecure-registries": [],//非 https レジストリ アドレスを構成する"no-new-privileges": false,//新しい優先順位を禁止する"default-runtime": "runc",//OCI Alliance (The Open Container Initiative) のデフォルトのランタイム環境"oom-score-adjust": -500,//メモリ オーバーフローによる強制終了の優先順位 (-1000~1000) "node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"], //パブリックに公開されたリソースノード "runtimes": { "cc-ランタイム": { "パス": "/usr/bin/cc-runtime" }, "カスタム": { "パス": "/usr/local/bin/my-runc-replacement", "ランタイム引数": [ " - デバッグ" ] } }, //ランタイム "default-address-pools":[ {"base":"172.80.0.0/16","size":24}, // デフォルトの DHCP 割り当てアドレス {"base":"172.90.0.0/16","size":24} ] } 要約する Dockerデーモンセキュリティ設定プロジェクトの詳細説明はこれで終了です。Dockerデーモンに関するより詳しい内容については、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも123WORDPRESS.COMをよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Vue 日付時刻ピッカーコンポーネントの使い方の詳細な説明
>>: MySQL ビュー管理ビューの例の詳細説明 [追加、削除、変更、クエリ操作]
目次Axios リクエストQs処理データ分析Vantアップロードファイル形式完全なコードこの記事では...
この記事では、フォームデータの非同期取得を実現するためのJavaScriptの具体的なコードを例とし...
コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...
目次使いやすいプロジェクトを作成するvue-cli 作成ヴィートクリエイションvue-routerを...
この記事では、例を使用して、MySQL ストアド プロシージャでの case ステートメントの使用方...
ウェブサイトを見るというのは、実は美しい女性を評価するようなものです。見た目を見るとき、私たちは見た...
この記事では、マウスの動きに追従する画像を実現するためのJavaScriptの具体的なコードを参考ま...
まずは効果を確認実装コード <div class="box box1"&g...
すりガラス効果がうまく表現されていれば、ページが非常に鮮やかで立体的に見えるようになります。写真に直...
目次1. 前処理2. 前処理塗布方法A. 例: B. 実行計画の変更を追跡するための前処理C. スト...
この記事では、物流タイムライン効果を実現するためのVueの具体的なコードを例として紹介します。具体的...
記述した SQL クエリが遅いのはなぜですか?作成したインデックスが頻繁に失敗するのはなぜですか?こ...
1. 現在のホスト名を表示する [root@fangjian ~]# ホスト名ctl 静的ホスト名:...
MySQL は比較的使いやすいリレーショナル データベースです。今日は、win10 システムを再イ...
最近確認された5件のデータを照会するビジネスがあります。 `id`、`title` を選択 `th_...