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

推薦する

Windows 10 で MySQL を完全に削除してアンインストールする方法

序文この記事では、Windows 10 システムで MySQL を完全に削除してアンインストールする...

CSS3は、欠けた角の長方形、折り畳まれた角の長方形、欠けた角の境界線を実装しています。

序文数日前、偶然、コーナーの四角形が欠落している機能に遭遇しました。最初に頭に浮かんだのは、必要な場...

フレックスレイアウトを使用してページレイアウトを簡単に実装するためのサンプルコード

では、早速コードを見てみましょう。 1. 上部、中央、下部のレイアウト: <!DOCTYPE ...

MySQLスレーブライブラリの復元の実践記録

状況の説明:今日、MySQL データベースのスレーブ ノード ホストにログインしたところ、/var/...

WeChat ミニプログラム 宝くじ番号ジェネレーター

この記事では、WeChatアプレットの宝くじ番号ジェネレータの具体的なコードを参考までに紹介します。...

Vuexはシンプルなショッピングカートを実装します

この記事では、参考までに、Vuex の具体的なコードを共有して、簡単なショッピングカートを実装します...

JSは文字列内の指定された文字列のn番目の出現位置を取得します

文字の位置を取得するための同様の方法について学習します。 charAt() 文字列内の指定された位置...

ethers.js を使用して Solidity スマート コントラクトをデプロイする方法

Ethereum 上で DApps を開発したことがある場合は、フロントエンド JavaScript...

Blazor における CSS 分離の問題

1. 環境VS 2019 16.9.0 プレビュー 1.0 .NET SDK 5.0.100 2. ...

Vue.jsのレンダリング関数の使い方の詳しい説明

Vue では、ほとんどの場合、テンプレートを使用して HTML を作成することを推奨しています。ただ...

js クロージャとガベージ コレクション メカニズムの例の詳細な説明

目次序文文章1. 終了1.1 クロージャとは何ですか? 1.2 クロージャの特性1.3 クロージャを...

美しいチェックボックススタイル(複数選択ボックス)はIE8/9/10、FFなどと完全に互換性があります。

恥ずかしながら、このようなよく使われるチェックボックスのスタイルを変更するために、Baidu で長い...

HTMLがHikvisionカメラのリアルタイム監視機能を実現

最近、同社は CCFA 関連のいくつかの作業を行う予定で、その 1 つはカメラのリアルタイム監視を再...

基礎知識: ウェブサイトのアドレスの前の http はどういう意味ですか?

HTTPとは何ですか?ウェブサイトを閲覧したいときは、ブラウザのアドレス バーにウェブサイトのアド...

画像をハイパーリンクとして使用したときに表示される青いボックスを削除する方法

最近、Dreamweaver を使用して製品プレゼンテーションを作成し、画像にハイパーリンクを追加し...