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 ビュー管理ビューの例の詳細説明 [追加、削除、変更、クエリ操作]

推薦する

忘れられたMySQLパスワードとログインエラーの問題について簡単に説明します

MySQL ログイン パスワードを忘れた場合、解決方法は実はとても簡単です。MySQL メイン構成フ...

Vueグローバルカスタム命令の実践 モーダルドラッグ

目次背景実装のアイデア成果を達成する背景最近取り組んでいるプロジェクトは、Vue2 で構築されたプロ...

Linux の総合システム監視ツール dstat の詳細な例

オールラウンドなシステム監視ツール dstat dstat は、vmstat、iostat、nets...

docker を使用して Windows 10 Home バージョンで Laravel 開発環境を構築する方法の詳細なチュートリアル

オペレーティング·システム: Win10 ホームエディションDockerをインストールします:公式サ...

MySQLデータファイルの保存場所を表示する方法

次のような疑問が湧くかもしれません。MySQLをローカル (自分のコンピュータ) にインストールした...

Alibaba Cloud ECSインスタンスのユーザールートパスワードとリモート接続方法を設定する方法

Alibaba Cloud サーバーを購入した後、新しいインスタンスが正常に動作できるようにするには...

最新の高品質な英語無料フォント36個を公開

01. 無限フォントのダウンロード02. バンダフォントのダウンロード03. ロールアップフォントの...

Alibaba Cloud ドメイン名と IP バインディングの手順と方法

1 Alibaba Cloud コンソールに入り、ドメイン名コンソールを見つけて、バインドするドメイ...

MySQLフィールドのデフォルト値を設定する方法

目次序文: 1. デフォルト値に関する操作2. 使用上の提案要約:序文: MySQL では、テーブル...

docker で PostgreSQL データベースをインストールして永続化する方法

Dockerのインストール手順をスキップする1. postgresqlイメージを取得する docke...

MySQLデータの同時更新を処理する方法

UPDATE はロックしますか?以下のような場合、SQL文はロックされますか? テーブル1を更新しま...

Ubuntu 20.04でAliソースを変更する方法

なお、この記事では、単に 20.04 ソースに変更する方法を説明するのではなく、20.04 に基づい...

テーブルを使用する場合と CSS を使用する場合 (経験の共有)

TW のメインテキスト ページは、以前は小さなモニターと低解像度のユーザーを考慮して幅が 850 ピ...

チャットバブル効果を実現するCSS

1. レンダリングJD効果シミュレーション効果 2. 原則高さと幅が0のボックスを用意しますこのボ...

Linux は、Deepin がルートユーザーとして Google Chrome ブラウザを起動できない問題を解決します

Deepin がルートユーザーとして Google Chrome ブラウザを起動できない問題を解決す...