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

推薦する

バインドを使用してDNSサーバーを設定する方法

DNS(ドメインネームサーバー)は、ドメイン名とそれに対応する IP アドレスを変換するサーバーです...

Dockerにelasticsearchとkibanaをインストールする方法

Elasticsearchは現在非常に人気があり、多くの企業が利用しているため、esを知らないと軽蔑...

VMware に Linux システム (Redhat8) と仮想マシンのネットワーク構成をインストールする方法

目次1. VMwareをインストールする1.1 VMwareworkstationsをダウンロードし...

浮遊要素によって引き起こされる問題と解決策の詳細な説明

1. 問題複数のフローティング要素は親要素の幅を拡張できず、親要素の高さが 0 になる可能性がありま...

Element-UI の Select と Cascader にポップアップ下部アクション ボタンを追加する方法

下図のように、 selectポップアップレイヤーの下部に操作ボタンを配置するのが一般的な設計方法です...

12個のJavascriptテーブルコントロール(DataGrid)が整理されています

DataGrid コントロールの DataSource プロパティがデザイン時に設定されている場合、...

Linux コマンドラインターミナルで画面を分割するための 2 つのツール

ターミナル分割画面ツールは2つあります: screen と tmux 1. 画面分割を使用する(上下...

CentOS 上の Docker に Jupyter をインストールしてポートを開く方法

目次jupyterをインストールするDocker ポートマッピングjupyterをインストールするp...

CSS 変数に基づくテーマ切り替えに最適なソリューション (推奨)

この要件を受け取ったとき、Baidu は、CSS リンクの置き換え、className の変更、le...

Vue は Echarts をインポートして折れ線グラフを実現します

この記事では、VueでEchartsをインポートして線散布図を実現する具体的なコードを参考までに共有...

CSSはletter-spacingプロパティを通じて単語間の間隔を制御します。

letter-spacing プロパティ: 文字間のスペース (文字間隔) を増減します。このプロ...

Vueは、商品の数を制御するためのコンポーネントのパッケージ化と使用を実装します。

Vueのコントロール商品数量コンポーネントのカプセル化と使用は参考までに。具体的な内容は以下のとお...

MySQL で binlog を使用する際のフォーマットの選択方法

目次1. binlogの3つのモード1.ステートメントレベルモード2. 行レベルモード3. 混合モー...

Python スクリプトを Ubuntu で直接実行する方法

翻訳プログラムを例に挙げてみます。前回はWindowsでのアプリケーションのパッケージ化についてお話...

Vue が Ref を使用してレベル間でコンポーネントを取得する手順

VueはRefを使用してレベル間でコンポーネントインスタンスを取得します例の紹介開発プロセスでは、レ...