Dockerデーモンのセキュリティ設定項目の詳細な説明

Dockerデーモンのセキュリティ設定項目の詳細な説明

この記事では、Docker デーモン プロセスの関連するセキュリティ構成項目について説明します。

1. テスト環境

1.1 CentOS 7をインストールする

CentOS Linux リリース 7.7.1908 (コア)

カーネルをアップグレードして再起動する

# yum カーネルをアップデート
[root@localhost docker]# uname -a
Linux localhost 3.10.0-1062.12.1.el7.x86_64 #1 SMP 火曜 2月 4日 23:02:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost docker]# cat /etc/redhat-release
CentOS Linux リリース 7.7.1908 (コア)

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 /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 を登録するために使用されます。

証明書ディレクトリを作成します。

$ mkdir -p /etc/docker/dockerd/CA && cd /etc/docker/dockerd/CA

キー証明書を生成し、キー証明書のパスワードを 2 回入力します。

$ openssl genrsa -aes256 -out ca-key.pem 4096

CA 証明書を生成するには、登録証明書の基本情報を入力する必要があります。

$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

サーバー証明書を作成します。

$ openssl genrsa -out サーバーキー.pem 4096

$ openssl req -subj "/CN=localhsot" -sha256 -new -key server-key.pem -out server.csr

証明書で指定された IP アドレスを設定します。

$ echo subjectAltName = DNS:localhost,IP:127.0.0.1 >> extfile.cnf

Docker デーモン キーの拡張使用プロパティをサーバー認証にのみ使用するように設定します。

$ echo 拡張キー使用法 = serverAuth >> extfile.cnf

サーバー証明書を生成します:

$ openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf

クライアント証明書

クライアント証明書を作成します: (現在のディレクトリにまだあります)

$ openssl genrsa -out キー.pem 4096
$ openssl req -subj '/CN=localhost' -new -key key.pem -out client.csr

キーをクライアント認証に適したものにするには、拡張構成ファイルを作成します。

$ echo 拡張キー使用法 = clientAuth >> extfile.cnf

クライアント証明書を生成します:

$ openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf

使用

証明書に対応する権限を付与します。

$ 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

サーバー構成/etc/docker/daemon.json

"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 の通常の権限が引き続き使用されます。

まず/etc/sysctl.confを変更します

# echo "user.max_user_namespaces=15076" >> /etc/sysctl.conf

/etc/docker/daemon.jsonに設定項目 "userns-remap": "default" を追加します。

この設定を変更するときは注意が必要です。すでに Docker 環境を展開している場合は、このオプションを有効にすると分離された環境に切り替わり、以前の Docker コンテナは使用できなくなります。

[root@localhost docker]# cat /etc/subuid
ドックリマップ:100000:65536

2.3 Dockerパーティションの設定

コンテナ用に別のパーティションを作成します。デフォルトのパーティションは\var\lib\docker\にあり、ローカル イメージ、コンテナ、ネットワーク、およびその他の関連項目が含まれます。

[root@localhost docker]# ls /var/lib/docker

100000.100000 ビルダー ビルドキット コンテナ イメージ ネットワーク overlay2 プラグイン ランタイム スウォーム tmp 信頼 ボリューム
デフォルトのパーティションの場所は、「data-root」:「」を使用して設定できます。

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 ログ ドライバーはコンテナー ログを受信し、それをリモートの宛先またはファイルに転送します。 デフォルトのログ ドライバーはjson-fileです。 コンテナ ログを JSON 形式でローカル ディスクに保存します。 Docker にはログ記録用のプラグイン アーキテクチャがあるため、オープン ソース ツールと商用ツールの両方にプラグインがあります。

Journald – コンテナ ログをシステム ジャーナルに保存します。
Syslog ドライバー – UDP、TCP、TLS をサポート
Fluentd – TCP または Unix ソケットを Fluentd に接続することをサポートします
Splunk – Splunk サーバーへの HTTP/HTTPS 転送
Gelf – Graylog2 への UDP ログ転送

流暢な例

{
 "ログドライバー": "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 は/sys/fs/cgroup/memory/daemoncgroup/foobarに cgroup を作成します。

systemd cgroup ドライバーには --cgroup-parent に対する異なるルールがあります。 Systemd は階層をスライスで表し、スライスの名前はツリー内の位置をエンコードします。 したがって、systemd cgroup の --cgroup-parent はスライス名である必要があります。 名前は、ルート スライスからスライスまでのパスを表す、ダッシュで区切られた一連の名前で構成できます。 たとえば、--cgroup-parent=user-ab.slice は、コンテナのメモリ cgroup が/sys/fs/cgroup/memory/user.slice/user-a.slice/user-ab.slice/docker-<id>.scope <id>.scope に作成されることを意味します。

また、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をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker View プロセス、メモリ、カップ消費量
  • Dockerはプロセス操作を管理するためにSupervisorを使用する
  • Dockerコンテナ内で2つのプロセスを開始するときのDockerfile実装コード
  • Dockerデーモンの設定と操作方法
  • Dockerクライアントとデーモンについての簡単な説明
  • Dockerデーモンの設定とログの詳細な説明
  • Docker コマンドラインとデーモンプロセスを操作する方法
  • プロセスからDocker分離技術を理解する

<<:  Vue 日付時刻ピッカーコンポーネントの使い方の詳細な説明

>>:  MySQL ビュー管理ビューの例の詳細説明 [追加、削除、変更、クエリ操作]

推薦する

写真をアップロードして顔を認識する Vue+axios サンプルコード

目次Axios リクエストQs処理データ分析Vantアップロードファイル形式完全なコードこの記事では...

JavaScriptはフォームデータの非同期取得を実装します

この記事では、フォームデータの非同期取得を実現するためのJavaScriptの具体的なコードを例とし...

HTML ハイパーリンク スタイル (4 つの異なる状態) の設定例

コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...

vue3+TypeScript+vue-routerの使い方

目次使いやすいプロジェクトを作成するvue-cli 作成ヴィートクリエイションvue-routerを...

MySQL ストアド プロシージャで case ステートメントを使用する詳細な例

この記事では、例を使用して、MySQL ストアド プロシージャでの case ステートメントの使用方...

優れたウェブサイトのコピーライティングと優れたユーザーエクスペリエンス

ウェブサイトを見るというのは、実は美しい女性を評価するようなものです。見た目を見るとき、私たちは見た...

マウスで画像を動かすJavaScript

この記事では、マウスの動きに追従する画像を実現するためのJavaScriptの具体的なコードを参考ま...

CSS3はグラフィックの落下アニメーション効果を実現します

まずは効果を確認実装コード <div class="box box1"&g...

CSS3 すりガラス効果

すりガラス効果がうまく表現されていれば、ページが非常に鮮やかで立体的に見えるようになります。写真に直...

Mysqlのprepare前処理の具体的な使用法

目次1. 前処理2. 前処理塗布方法A. 例: B. 実行計画の変更を追跡するための前処理C. スト...

Vueは物流タイムライン効果を実現します

この記事では、物流タイムライン効果を実現するためのVueの具体的なコードを例として紹介します。具体的...

MySQLインデックス最適化分析に関する簡単な説明

記述した SQL クエリが遅いのはなぜですか?作成したインデックスが頻繁に失敗するのはなぜですか?こ...

Linuxでホスト名を変更する方法

1. 現在のホスト名を表示する [root@fangjian ~]# ホスト名ctl 静的ホスト名:...

MySQL 5.7.10 winx64 のインストールと設定方法のグラフィック チュートリアル (win10)

MySQL は比較的使いやすいリレーショナル データベースです。今日は、win10 システムを再イ...

MySQL inndbジョイントインデックスを正しく使用する方法を徹底的に理解するためのケーススタディ

最近確認された5件のデータを照会するビジネスがあります。 `id`、`title` を選択 `th_...