安全な構成のために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は日付範囲の抽出方法を指定します

推薦する

Vueルーティング相対パスジャンプメソッド

目次Vueルーティング相対パスジャンプ1. 属性の追加2.router.resolveメソッドVue...

Vuex ステートマシンの簡単な理解とサンプルアプリケーション

目次1. 概念の素早い理解: 1. コンポーネント間でデータを共有する方法: 2. vuex とは何...

Apache の一般的な仮想ホスト設定方法の分析

1. Apacheサーバーのインストールと設定yum インストール httpd -y systemc...

nginxリバースプロキシを介したデバッグコードの実装

背景現在、会社のプロジェクトは、フロントエンドとバックエンドが分離された方法で開発されています。新し...

Mysqlクエリ条件で文字列の末尾にスペースがあっても一致しない問題の詳細な説明

1. テーブル構造テーブル人id名前1あなた2あなた(スペース) 3あなた(スペース2つ) 2. ク...

Vue プロジェクトで TS (TypeScript) を使用するための入門チュートリアル

目次1. Typescriptの紹介2. 設定ファイル webpack 設定3. プロジェクトに.t...

Vue3 で状態管理を実装するために provide を使用する方法

目次序文provide/inject を通じて Vuex 関数を実装する方法このプラグインをアプリケ...

CentOS6 アップグレード glibc 操作手順

目次背景glibc 2.14をコンパイルするソフトリンクを変更するやっと背景テスト環境には Cent...

JavaScript が Taobao の虫眼鏡効果を模倣

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

Linuxシステムにおけるキー認証に基づくSSHサービスのプロセス

ご存知のとおり、SSH は現在、リモート ログイン セッションやその他のネットワーク サービスにセキ...

Docker で Let's Encrypt から永久無料 SSL 証明書を取得する方法

1. 原因公式の cerbot は面倒すぎます。野生の成長よりもさらに悪い acme.sh の使用は...

JS デコレータ パターンと TypeScript デコレータ

目次デコレータパターンの紹介TypeScript のデコレータデコレータの使用デコレーターファクトリ...

MySQL 5.6 ルートパスワード変更チュートリアル

1. MySQL 5.6をインストールした後、正常に有効化できないMySQL の圧縮バージョンは、解...

MySQL 権限制御の詳細分析

目次1. グローバルレベル2. データベースレベル3. 表面レベル4. 列レベルの権限5. サブルー...

resizeを使用して画像切り替えプレビュー機能を実装する方法

要点CSS resize プロパティを使用すると、要素のサイズ変更可能性を制御できます。サイズ変更を...