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

推薦する

MySQL におけるさまざまな一般的な結合テーブルクエリの例の概要

この記事では、例を使用して、MySQL のさまざまな一般的な結合テーブルクエリについて説明します。ご...

CentOS のファイルと権限の基本操作チュートリアル

序文始める前に、ファイル属性とファイル属性を変更する方法について簡単に理解しておく必要があります。 ...

Docker の win ping 失敗コンテナ回避ガイド

win docker-desktopを使ってコンテナ開発に接続し、ネットワーク上で色々試してみたいと...

Ubuntu 18.0.4 は mysql をインストールし、エラー 1698 (28000): ユーザー ''root''@''localhost'' のアクセスが拒否されましたを解決します

序文最近 Linux を学び、その後 Win から Ubuntu に変更しました。以前インストールし...

VMwareがwin10ホームバージョンに64ビットオペレーティングシステムをインストールできない問題を解決します

問題の説明VMware Workstationが新しい仮想マシンを作成し、64ビットオペレーティング...

MySQL 8のパスワードを忘れた場合のベストな対処法の簡単な分析

序文MySQL に精通している読者は、MySQL が非常に迅速に更新されることに気付くかもしれません...

Linux のソフトリンクとハードリンクの詳細な説明

目次1. ファイルとディレクトリの基本的な保存2. Inコマンドの紹介(1)lnコマンドの基本情報を...

Ubuntu 12.04 でカーネルツリーを構築する実装プロセスの詳細な説明

まず使用しているカーネルのバージョンを確認してくださいlin@lin-仮想マシン:~$ uname ...

カルーセルカルーセルケースのJS実装

この記事の例では、カルーセルカルーセルを実装するためのJSの具体的なコードを参考までに共有しています...

CSS は Apple のスムーズなスイッチ ボタン効果を模倣します

目次1. コード分析2. ソースコードソースコード1. コード分析1.1 HTMLコード分析 <...

Linux システム (CentOS7 インストール) に JDK8 をインストールするための詳細なチュートリアル

JDKのインストールシステムのインストールについてはあまり詳しく説明しません。インストール手順はオン...

JavaScript で配列の最大値と最小値を実装する 6 つの方法

配列[1,8,5,4,3,9,2]が与えられた場合、配列の最大値9と最小値1を取得するアルゴリズムを...

RGBAアルファ透明度変換計算表

IEでのRGBAとフィルター値の変換RGBA 透明度値IE フィルター値0.1 19 0.2 33 ...

CSS3 は、跳ねるボール効果を実現する Web アニメーションを作成します。

基本的な準備この実装には、クラス名が ball である単純な div が必要です。 HTMLコード:...

CSS3 で作成したホバーズーム効果

結果:実装コード: html <link href='https://fonts.go...