安全な構成のためにDockerでTLSを有効にする手順

安全な構成のためにDockerでTLSを有効にする手順

序文

以前、Docker の 2375 Remote API を有効にしていました。会社のセキュリティ部門から、認証を有効にする必要があるというリクエストを受け取りました。公式ドキュメントを調べました。

Dockerデーモンソケットを保護する

TLSを有効にする

Dockerサーバー上でCA秘密鍵と公開鍵を生成する

$ openssl genrsa -aes256 -out ca-key.pem 4096
RSA秘密鍵の生成、4096ビット長の係数
.............................................................................................................................................................................................................................................++
........++
eは65537(0x10001)
ca-key.pem のパスフレーズを入力してください:
検証中 - ca-key.pem のパスフレーズを入力してください:

$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
ca-key.pem のパスフレーズを入力してください:
組み込まれる情報を入力するよう求められます
証明書リクエストに追加します。
これから入力するのは、識別名または DN と呼ばれるものです。
フィールドはたくさんあるが、一部は空白のままにしておくこともできる
いくつかのフィールドにはデフォルト値があります。
「.」を入力すると、フィールドは空白のままになります。
-----
国名(2文字コード)[AU]:
州または県名(フルネーム)[Some-State]:クイーンズランド
地域名(例:都市) []:ブリスベン
組織名(例:会社)[Internet Widgits Pty Ltd]:Docker Inc
組織単位名(例:セクション)[]:営業
共通名(例:サーバーのFQDNまたはあなたの名前)[]:$HOST
メールアドレス []:[email protected]

CAを取得したら、サーバーキーと証明書署名要求(CSR)を作成できます。

$HOSTはサーバーのIPです

$ openssl genrsa -out サーバーキー.pem 4096
RSA秘密鍵の生成、4096ビット長の係数
...............................................................................................++
................................................................................................................................++
eは65537(0x10001)

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

次に、CA を使用して公開キーに署名します。

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

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

キーを生成:

$ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
 -CAcreateserial -out server-cert.pem -extfile extfile.cnf
署名OK
件名=/CN=your.host.com
CA秘密鍵の取得
ca-key.pem のパスフレーズを入力してください:

クライアント キーと証明書署名要求を作成します。

$ openssl genrsa -out キー.pem 4096
RSA秘密鍵の生成、4096ビット長の係数
...............................................................++
................++
eは65537(0x10001)

$ openssl req -subj '/CN=client' -new -key key.pem -out client.csr

extfile.cnf を変更します。

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

署名秘密鍵を生成します:

$ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
 -CAcreateserial -out cert.pem -extfile extfile-client.cnf
署名OK
件名=/CN=クライアント
CA秘密鍵の取得
ca-key.pem のパスフレーズを入力してください:

Dockerサービスを停止し、Dockerサービスファイルを変更します。

[ユニット]
説明=Docker アプリケーション コンテナ エンジン
ドキュメント=http://docs.docker.io

[サービス]
環境="PATH=/opt/kube/bin:/bin:/sbin:/usr/bin:/usr/sbin"
ExecStart=/opt/kube/bin/dockerd --tlsverify --tlscacert=/root/docker/ca.pem --tlscert=/root/docker/server-cert.pem --tlskey=/root/docker/server-key.pem -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
ExecReload=/bin/kill -s HUP $MAINPID
再起動=失敗時
再起動秒数=5
LimitNOFILE=無限大
LimitNPROC=無限大
LimitCORE=無限大
委任=はい
キルモード=プロセス

[インストール]
WantedBy=マルチユーザー.ターゲット

その後、サービスを再起動します

systemctlデーモンリロード
systemctl docker.service を再起動します。

再起動後にサービスの状態を確認します。

systemctl ステータス docker.service
● docker.service - Docker アプリケーション コンテナ エンジン
  ロード済み: ロード済み (/etc/systemd/system/docker.service; 有効; ベンダープリセット: 有効)
  アクティブ: 2019-08-08 19:22:26 CST 木曜日からアクティブ (実行中)、1 分前

すでに発効しています。

証明書を使用して接続します。

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

docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$HOST:2375 バージョンが接続できます

docker-java TLS を有効にする

このプロジェクトでは、docker の Java クライアント docker-java を使用して docker を呼び出します。TLS をサポートするには、クライアントの作成時に TLS 設定を追加する必要があります。

まず、ca.pem cert.pem key.pem の 3 つのファイルをローカルの場所にコピーします (例: E:\\docker\\")。

次に、DefaultDockerClientConfig で withDockerTlsVerify を true に設定し、certpath をコピーしたディレクトリに設定します。

DefaultDockerClientConfig.Builder ビルダー =
        デフォルトDockerClientConfig.createDefaultConfigBuilder()
          .withDockerHost("tcp://" + サーバー + ":2375")
          .withApiVersion("1.30");
      コンテナ構成のDockerTlsVerify()を実行すると、
        ビルダー = builder.withDockerTlsVerify(true)
          .withDockerCertPath("E:\\docker\\");
      }
  DockerClientBuilder.getInstance(builder.build()).build() を返します。

大きな仕事は終わりました。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • TLS暗号化通信を使用してDockerにリモート接続する詳細な例
  • Dockerコンテナはルーティングを介して直接通信し、ネットワーク通信を実現します。
  • Dockerのセキュリティについて Docker-TLS暗号化通信の問題

<<:  Reactの簡単な紹介

>>:  Mysqlは日付範囲の抽出方法を指定します

推薦する

SCSS スタイルのコードを 50% 削減する 14 の実践的な経験

序文Sass は CSS3 言語の拡張機能です。Sass を使用すると、より良いスタイルシートをより...

4つの柔軟なScssコンパイル出力スタイル

多くの人は、Scss を使用する瞬間からコンパイル方法を説明されてきました。したがって、コマンドのコ...

VueプロジェクトでReactを書く方法の詳細

jsx/tsxファイルを直接作成できます今回のプロジェクト構成は以下のとおりです。 vueファイルで...

花火効果を実現するJavaScript(オブジェクト指向)

この記事では、花火効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。具...

Linuxでスワップパーティションファイルを作成する方法

スワップの紹介Linux のスワップ (スワップ パーティション) は、Windows の仮想メモリ...

Linux での Redis の永続性、マスター スレーブ同期、Sentinel の詳細な説明

1.0 Redis の永続性Redis はメモリ内データベースです。サーバー プロセスが終了すると、...

js配列の基本的な使い方のまとめ

序文配列は特別な種類のオブジェクトです。 js には実際の配列はなく、オブジェクトを使用して配列をシ...

Vue3+Vue-cli4 プロジェクトで Tencent スライダー検証コードを使用する方法

導入:従来の画像検証コードと比較して、スライダー検証コードには次の利点があります。サーバーは検証コー...

実践で遭遇するフロントエンドの基本(HTML、CSS)

1. div css マウスの手の形は cursor:pointer; です。 2. HTML の相...

JavaScript におけるイベント バブリング メカニズムの詳細な分析

バブリングとは何ですか? DOM イベント フローには、イベント キャプチャ ステージ、ターゲット ...

Node.js+express+socket でオンラインのリアルタイム多人数チャットルームを実現

この記事では、オンラインリアルタイム多人数チャットルームを実現するためのNode.js+expres...

Linux システムで Code Cloud にプロジェクトをアップロードする方法

Code Cloudで新しいプロジェクトtest1を作成します。 公開鍵を取得するには次のコマンドを...

crontab 実行時間とシステム時間の不一致の解決方法

序文LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | gre...

Win32 MySQL 5.7.27 のインストールと設定方法のグラフィックチュートリアル

MySQL 5.7.27のインストールチュートリアルは以下のように記録され、皆さんと共有されています...

TypeScript ジェネリックパラメータのデフォルト型と新しい厳密なコンパイルオプション

目次概要コンポーネントクラスの型定義を作成するジェネリック型を使用してPropsとStateを定義す...