Dockerのセキュリティについて Docker-TLS暗号化通信の問題

Dockerのセキュリティについて Docker-TLS暗号化通信の問題

1. Dockerのセキュリティ問題

Docker自身の脆弱性

アプリケーションとして、Docker 自体の実装にはコード欠陥があります。 CVE は、Docker の過去のバージョンにおける 20 件を超える脆弱性を公式に記録します。ハッカーが使用する一般的な攻撃方法には、コード実行、権限昇格、情報漏洩、権限バイパスなどがあります。現在、Docker のバージョンは非常に速く更新されるため、Docker ユーザーは Docker を最新バージョンにアップグレードすることをお勧めします。

Docker ソースコードの問題

Docker は、ユーザーが作成したイメージをアップロードして他のユーザーがそれをダウンロードし、環境をすばやく構築できるようにする Docker ハブを提供します。しかし、セキュリティ上の問題も生じます。
たとえば、次の 3 つの方法があります。
(1)ハッカーが悪意のある画像をアップロードする ハッカーが作成した画像にトロイの木馬やバックドアなどの悪意のあるソフトウェアを埋め込んだ場合、環境は最初から安全ではなく、将来的にもセキュリティが全く確保されなくなります。

(2)イメージには脆弱なソフトウェアが使用されている。Docker Hubでダウンロード可能なイメージのうち、75%に脆弱なソフトウェアがインストールされています。したがって、イメージをダウンロードした後、その中のソフトウェアのバージョン情報をチェックして、対応するバージョンに脆弱性がないかを確認し、適時に更新してパッチを適用する必要があります。

(3)中間者攻撃:送信中にイメージの改ざんが発生する可能性があります。新しいバージョンのDockerでは、この問題を防ぐための検証メカニズムが用意されています。

2. Dockerアーキテクチャの欠陥とセキュリティメカニズム

ハッカーがホストマシン上の一部のコンテナを制御したり、パブリッククラウド上でコンテナを構築する方法にアクセスしてホストマシンや他のコンテナを攻撃したりする攻撃シナリオなど、Docker 自体のアーキテクチャとメカニズムから問題が発生する可能性があります。

コンテナ間のLAN攻撃

ホスト上のコンテナはローカル エリア ネットワークを形成できるため、ローカル エリア ネットワークに対する ARP スプーフィング、スニッフィング、ブロードキャスト ストームなどの攻撃を使用できます。したがって、ホスト上に複数のコンテナを展開するには、適切なネットワーク構成と iptable ルールの設定が必要です。

DDoS攻撃はリソースを消耗する

cgroups セキュリティ メカニズムは、このような攻撃を防ぐように設計されています。この問題は、単一のコンテナにあまり多くのリソースを割り当てないことで回避できます。

脆弱なシステムコール

Docker と仮想マシンの重要な違いは、Docker とホストマシンが同じオペレーティング システム カーネルを共有することです。ホストカーネルに権限昇格や特権エスカレーションにつながる脆弱性があると、Docker を通常のユーザーとして実行したとしても、コンテナが侵入されたときに、攻撃者はカーネルの脆弱性を悪用してホストマシンにジャンプし、さらに多くのことを行うことができます。

共有ルートユーザー権限

コンテナをルート ユーザー権限で実行すると、コンテナ内のルート ユーザーにはホスト マシン上のルート権限も付与されます。

3. Dockerコンテナと仮想マシンの違い

隔離と共有

仮想マシンは、ネットワーク カード、メモリ、CPU などの仮想ハードウェアを仮想化するためのハイパーバイザー レイヤーを追加し、その上に仮想マシンを作成します。各仮想マシンには独自のシステム カーネルがあります。 Docker コンテナは、ファイル システム、プロセス、デバイス、ネットワークなどのリソースを分離し、権限や CPU リソースなどを制御することで、コンテナが互いに影響を及ぼさず、ホスト マシンにも影響を与えないようにします。コンテナはカーネル、ファイルシステム、ハードウェア、その他のリソースをホストと共有します。

パフォーマンスと損失

仮想マシンと比較すると、コンテナは消費するリソースが少なくなります。 同じホストマシン上で作成できるコンテナの数は、仮想マシンの数より多くなります。ただし、仮想マシンのセキュリティはコンテナよりもわずかに優れています。仮想マシンからホストマシンや他の仮想マシンに侵入するには、まずハイパーバイザー層に侵入する必要があり、これは非常に困難です。 Docker コンテナはカーネル、ファイル システム、その他のリソースをホスト マシンと共有するため、他のコンテナやホスト マシンに影響を与える可能性が高くなります。

Docker セキュリティ ベースライン標準

以下は、カーネル、ホスト、ネットワーク、イメージ、コンテナなどの 6 つの側面から Docker セキュリティ ベースライン標準をまとめたものです。

カーネルレベル

(1)カーネルを適時に更新する。
(2)ユーザーネームスペース(コンテナ内のルート権限はコンテナ外では非高権限状態になります)。
(3)Cgroup(リソースの割り当てとメトリクス)。
(4)SELiux/AppArmor/GRSEC(ファイルアクセス権限を制御する)。
(5)能力(権限の分担)
(6)Seccomp(制限されたシステムコール)。
(7)コンテナ名前空間をホストプロセス名前空間と共有することは禁止されている。

ホストレベル

(1)コンテナごとに独立したパーティションを作成する。
(2)必要なサービスのみ実行する。
(3)ホスト上の機密ディレクトリをコンテナにマッピングすることは禁止されています。
(4)Dockerデーモン、関連ファイル、ディレクトリを監査します。
(5)ファイル記述子の適切なデフォルト数を設定する。

(ファイル記述子: カーネルはファイル記述子を使用してファイルにアクセスします。ファイル記述子は負でない整数です。既存のファイルを開いたり、新しいファイルを作成したりすると、カーネルはファイル記述子を返します。ファイルの読み取りと書き込みでも、読み取りと書き込みの対象となるファイルを指定するためにファイル記述子を使用する必要があります)

(6)rootユーザー権限でのDocker関連ファイルのアクセス権限は644以下にしてください。
(7)各ホストのコンテナリストを定期的にチェックし、不要なコンテナをクリーンアップする。

ネットワークレベル

(1)iptablesを通じてコン​​テナ間のネットワークトラフィックを禁止または許可するルールを設定します。
(2)Dockerがiptablesを変更できるようにします。
(3)Dockerを他のIP/ポートまたはUnixソケットにバインドすることは禁止されています。
(4)コンテナ上の特権ポートのマッピングは禁止されている。
(5)コンテナ上では必要なポートのみが開かれる。
(6)コンテナ上でホストネットワークモードを使用することは禁止されています。
(7)ホストマシンに複数のネットワークカードがある場合は、コンテナの着信トラフィックを特定のホストネットワークカードにバインドします。

画像レベル

(1)ローカルイメージリポジトリサーバーを作成します。
(2)画像内のソフトウェアは最新バージョンです。
(3)信頼できる画像ファイルを使用し、安全なチャネルを通じてダウンロードします。
(4)コンテナとイメージにパッチを適用する代わりに、イメージを再構築します。
(5)画像タグを適切に管理し、使用されなくなった画像は適時に削除する。
(6)ミラースキャンを使用する。
(7)画像署名を使用する。

コンテナレベル

(1)コンテナと最小限のオペレーティングシステムイメージセットを最小化する。
(2)コンテナは単一のメインプロセスとして実行されます。
(3)特権タグは特権コンテナを使用することを禁止する。
(4)コンテナ上でsshサービスを実行することは禁止されています。
(5)コンテナのルートディレクトリシステムを読み取り専用モードでマウントします。
(6)コンテナに属するデータドライブ文字を明確に定義する。
(7) on-failureを設定することで、コンテナの再起動回数を制限できます。コンテナの再起動を繰り返すと、データが失われやすくなります。
(8)フォーク爆弾を防ぐためにコンテナ内で利用可能なプロセスツリーを制限する。

その他の設定

(1)ホストシステムとコンテナのセキュリティ監査を定期的に実施する。
(2)最小限のリソースと最小限の権限を使用してコンテナを実行する。
(3)同一ホスト上に多数のコンテナを展開することは避け、管理可能な数を維持する。
(4)Dockerコンテナの使用状況、パフォーマンス、その他の指標を監視します。
(5)リアルタイムの脅威検出およびインシデント対応機能を追加する。
(6)中央およびリモートログ収集サービスを使用する

Docker-TLS暗号化通信

Docker 通信中にリンク ハイジャック、セッション ハイジャック、その他の問題によって中間者攻撃が発生するのを防ぐには、c/s の両端で暗号化された方法で通信する必要があります。

フォルダを作成し、ホスト名を変更する(後で使用するため)

[root@server1 ~]# mkdir /tls

[root@server1 ~]# cd /tls

[root@server1 tls]# hostnamectl set-hostname マスター

[root@server1 tls]# bash

[ルート@マスター tls]#

クライアントの追加:

[root@client ~]# vim /etc/hosts 

CAキーを作成し、キーパスワードを設定する

[root@master tls]# openssl genrsa -aes256 -out ca-key.pem 4096

RSA秘密鍵の生成、4096ビット長の係数

...............................................++

.............................................................................................................................................................................................................++

eは65537(0x10001)

ca-key.pem のパスフレーズを入力してください:

検証中 - ca-key.pem のパスフレーズを入力してください:

CA証明書を作成する

[root@master tls]# openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=liuwei" -out ca.pem

ca-key.pem のパスフレーズを入力してください: ### パスワードを入力してください

サーバーの秘密鍵を作成する

[root@master tls]# openssl genrsa -out server-key.pem 4096

RSA秘密鍵の生成、4096ビット長の係数

...............................++

..................................++

eは65537(0x10001)

署名秘密鍵

[root@master tls]# openssl req -subj "/CN=lw" -sha256 -new -key server-key.pem -out server.csr

署名にはCA証明書と秘密鍵証明書を使用します。123456と入力します。

[root@master tls]# openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

署名OK

件名=/CN=lw

CA秘密鍵の取得

ca-key.pem のパスフレーズを入力してください: 

クライアントキーを生成する

[root@master tls]# openssl genrsa -out key.pem 4096 

署名クライアント

[root@master tls]# openssl req -subj "/CN=client" -new -key key.pem -out client.csr

設定ファイルを作成する

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

署名証明書、123456 を入力、必須 (署名クライアント、CA 証明書、CA キー)

[root@master tls]# openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf

署名OK

件名=/CN=クライアント

CA秘密鍵の取得

ca-key.pem のパスフレーズを入力してください: 

docker設定ファイルを変更し、サービスを再起動する

ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2388 -H unix:///var/run/docker.sock 

Dockerを再起動する

[root@master tls]# systemctl daemon-reload

[root@master tls]# systemctl dockerを再起動します

3つのファイル /tls/ca.pem /tls/cert.pem /tls/key.pem をクライアントにコピーします。

[root@master tls]# scp ca.pem [email protected]:/etc/docker 

[root@master tls]# scp cert.pem [email protected]:/etc/docker 

[root@master tls]# scp key.pem [email protected]:/etc/docker 

TLSを検証する際は、秘密鍵で設定されたIDを使用する必要があるため、上記のホスト名をlwに変更する必要があります。

ローカル認証

[root@lw tls]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://lw:2388 バージョン

NGINXイメージをダウンロードする

[root@lw tls]# docker pull nginx

クライアント環境を展開し、TLSを検証する

/etc/dockerディレクトリに入る

クライアント側のDockerバージョンを確認する

[root@クライアント docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://lw:2388 バージョン

展開環境、TLSの検証

クライアントの画像を見る

[root@クライアント docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://lw:2388 イメージ

DockerのセキュリティとDocker-TLS暗号化通信に関する記事はこれで終わりです。Docker TLS暗号化通信についてさらに詳しく知りたい方は、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • TLS暗号化通信を使用してDockerにリモート接続する詳細な例
  • docker リモート API のワンクリック TLS 暗号化の実装

<<:  uniappとvueの違いの詳細な説明

>>:  MySQL8のパスワードを忘れた場合の簡単な解決策

推薦する

JS の精度外数値問題の解決

精度の問題に対する最もわかりやすい説明たとえば、1÷3=0.33333333...という数字は、3が...

http:// の代わりに // を使用する利点は何ですか (アダプティブ https)

//デフォルトプロトコル/ デフォルト プロトコルの使用は、リソース アクセス プロトコルが現在の...

MySql 8.0.11 のインストール プロセスと Navicat とのリンク時に発生する問題の概要

私のシステムとソフトウェアのバージョンは次のとおりです。システム環境: win7、64ビットMySQ...

純粋な CSS 流星群の背景サンプルコード

GitHubアドレス、気に入ったらスターを付けてくださいプラグインのプレビューチュートリアルコード表...

Ubuntu 20.04は静的IPアドレスを設定します(異なるバージョンを含む)

Ubuntu 20.04はnetplanを通じてネットワークを管理するため、以前のバージョンとは少...

Windows で IP アドレスを指定してサーバーへのリモート アクセスを設定する方法

当社には、外部ネットワークからの干渉を受けることが多いサーバーが多数あります。侵入者はポート 338...

すべてのホストがmysqlにアクセスできるようにする方法

1. MySQLデータベースのユーザーテーブルのレコードのHostフィールド値を%に変更します。奇妙...

WeChat 8.0の爆発的な特殊効果を実現するために300行以上のCSSコードが必要

WeChat 8.0 アップデートの主な特徴は、アニメーション絵文字のサポートです。送信するメッセー...

素晴らしい CSS ナビゲーション バーの下線効果

中国初のカッター github.com/chokcocoまず、ここに画像があります。純粋な CSS ...

JavaScript デザインパターン 責任連鎖パターン

目次概要コードの実装パラメータ定義成し遂げる責任連鎖パターンの実装改善概要責任チェーン パターンは、...

vuex での mapState の考え方の応用

目次1. マップ方式2. 応用背景:需要開発プロセス中に、一部のインターフェースは、ページに表示する...

Vue3 コンポジション API でロジックの再利用を実装する方法

Composition API はロジック再利用手順を実装します。ロジックコードを関数に抽出します。...

IdeaでMySQLデータベースに接続すると中国語の文字化けが発生する問題

問題: JDBCを使用してMySQLデータベースに接続すると、中国語の文字を挿入すると文字化けした文...

複数クリックを防ぐVueの実践

通常、クリック イベントは、メッセージ リマインダーのさまざまな状況に分割されます。これらが処理され...

ReactにおけるRefの相互利用の詳細な説明

目次1. まずRefとは何かを説明しましょう2. フックでのrefの使用1. HTMLDomフックで...