docker リモート API のワンクリック TLS 暗号化の実装

docker リモート API のワンクリック TLS 暗号化の実装

最近、同社のサーバーがマイニングされ、その原因は最終的にDockerのポート2375にあることが判明した。

整理してみましょう。まず、原因不明ですが、docker 内にイメージや実行中のコンテナがいくつかあり、CPU を大量に消費していることがわかりました。さらに、ポート 2375 には IP アクセス ルールが設定されていなかったため、誰でもポート 2375 経由で docker を操作し、起動コンテナでホスト フォルダをマウントできます。docker はルート権限で起動されるため、誰でもポート 2375 経由でルート ユーザーとしてホストを制御できます。

対応手順は次のとおりです:

1. Docker の 2375 ポートを別のポートに変更します。これは一時的な対策にすぎません。

$ vi /usr/lib/systemd/system/docker.service

ここに画像の説明を挿入

Dockerを再起動します。

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

2. DockerのTLSを暗号化する

#!/bin/bash
mkdir -p /root/tls/pem
DOMAIN_HOST=`ifconfig eth0 | grep "inet" | awk '{ print $2}' | sed -n '1p;1q'`
#DOMAIN_HOST=`hostname` #最適なドメイン名プランを選択してください HOST=$DOMAIN_HOST
# カスタム情報 PASSWORD="yourPassword"
国=CN
州=gd
都市=gz
組織=dounine
グループ=dg
名前=湖
SUBJ="/C=$COUNTRY/ST=$PROVINCE/L=$CITY/O=$ORGANIZATION/OU=$GROUP/CN=$HOST"
# カスタム情報#================================================================================================================================
#このフォームは、自分自身に証明書を発行するためのものです。CA 組織になることも、第三者組織に発行を委託することもできます。#ルート証明書の RSA 秘密鍵を生成し、秘密鍵のパスワードとしてパスワードを使用します (ID カード)
openssl genrsa -passout pass:$PASSWORD -aes256 -out /root/tls/pem/ca-key.pem 4096
# 2. ルート証明書のRSA秘密鍵を使用して自己署名ルート証明書(ビジネスライセンス)を生成する
openssl req -new -x509 -days 365 -passin pass:$PASSWORD -key /root/tls/pem/ca-key.pem -sha256 -subj $SUBJ -out /root/tls/pem/ca.pem
#============================================================================================
#サーバーに証明書を発行する# 1. サーバーは独自の秘密鍵を生成します openssl genrsa -out /root/tls/pem/server-key.pem 4096
# 2. サーバーは証明書を生成します(公開鍵とサーバー情報が含まれます)
openssl req -new -sha256 -key /root/tls/pem/server-key.pem -out /root/tls/pem/server.csr -subj "/CN=$DOMAIN_HOST"
# 3. どうやって接続するのですか? 複数の IP アドレスを設定し、カンマで区切ることができます echo subjectAltName=IP:$DOMAIN_HOST,IP:0.0.0.0 > /tmp/extfile.cnf
# 4. 認証局は証明書にスタンプを押して有効にします openssl x509 -passin pass:$PASSWORD -req -days 365 -sha256 -in /root/tls/pem/server.csr -CA /root/tls/pem/ca.pem -CAkey /root/tls/pem/ca-key.pem -CAcreateserial -out /root/tls/pem/server-cert.pem -extfile /tmp/extfile.cnf
#============================================================================================
#クライアントに証明書を発行する openssl genrsa -out /root/tls/pem/client-key.pem 4096
openssl req -subj '/CN=client' -new -key /root/tls/pem/client-key.pem -out /root/tls/pem/client.csr
echo 拡張キー使用法 = clientAuth > /tmp/extfile.cnf
openssl x509 -passin pass:$PASSWORD -req -days 365 -sha256 -in /root/tls/pem/client.csr -CA /root/tls/pem/ca.pem -CAkey /root/tls/pem/ca-key.pem -CAcreateserial -out /root/tls/pem/client-cert.pem -extfile /tmp/extfile.cnf
#============================================================================================
# ファイルをクリーンアップします rm -rf /root/tls/pem/ca-key.pem
rm -rf /root/tls/pem/{サーバー、クライアント}.csr
rm -rf /root/tls/pem/ca.srl
# 最終ファイル# ca.pem == CA 証明書# client-cert.pem == クライアント証明書# client-key.pem == クライアント秘密鍵# server-cert.pem == サーバー証明書# server-key.pem == サーバー秘密鍵

知らせ:

  • DOMAIN_HOST がドメイン名に設定されている場合、echo subjectAltName=IP:$DOMAIN_HOST,IP:0.0.0.0 > /tmp/extfile.cnf を実行します。このコード内の $DOMAIN_HOST は、サーバーのパブリック IP アドレスに置き換える必要があります。
  • echo subjectAltName=IP:$DOMAIN_HOST,IP:0.0.0.0 > IP:0.0.0.0 in /tmp/extfile.cnf は、証明書を携帯することですべての IP にアクセスできることを意味します。ここではすべて設定されていますが、サーバーのパブリック IP は省略しないでください。つまり、IP:$yourip,IP:0.0.0.0 であり、IP:0.0.0.0 ではありません。

ファイルに実行権限を付与します。

$ chmod +x tls.sh

シェル スクリプトを実行すると、/root/tls/pem ディレクトリに ca.pem、client-cert.pem、client-key.pem、server-cert.pem、server-key.pem が生成されます。

次に、docker 構成を変更します。

$ vim /usr/lib/systemd/system/docker.service

に追加:

		--tlsverify \
        --tlscacert=/root/tls/pem/ca.pem \
        --tlscert=/root/tls/pem/server-cert.pem \
        --tlskey=/root/tls/pem/サーバーキー.pem \


Dockerを再起動します。

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

次に、docker リモート API を使用して接続します。

認証なし:

$ docker -H tcp://192.168.0.150:2376 バージョン

認証が成功しなかったことを示すエラー メッセージが表示されます。

認証方法を持ちます:

docker --tlsverify --tlscacert=/root/tls/pem/ca.pem --tlscert=/root/tls/pem/client-cert.pem --tlskey=/root/tls/pem/client-key.pem -H tcp://192.168.0.150:2376 バージョン

これで、docker リモート API のワンクリック TLS 暗号化の実装に関するこの記事は終了です。docker リモート API のワンクリック TLS 暗号化に関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • TLS暗号化通信を使用してDockerにリモート接続する詳細な例
  • Docker で TLS と CA 認証を有効にする方法
  • Docker は 2003 年の問題を解決するために MySQL リモート接続を導入しました
  • Dockerは安全なTLSリモート接続アクセスを可能にします

<<:  CSS ボックスモデル内のパディングと略語の詳細な説明

>>:  MySQLのロック機構に関する最も包括的な説明

推薦する

Navicat PremiumはMySQLデータベースを操作します(SQL文を実行します)

1. Navicatの紹介1. Navicat とは何ですか? Navicat は強力な MySQ...

MySQLインデックスの使用に関するヒントと注意事項

1. インデックスの役割一般的なアプリケーション システムでは、読み取りと書き込みの比率は約 10:...

vue3+TypeScript+vue-routerの使い方

目次使いやすいプロジェクトを作成するvue-cli 作成ヴィートクリエイションvue-routerを...

MySQL5.7 シングルインスタンス自動起動サービスの設定プロセス

1.MySQLのバージョン [root@clq システム]# mysql -v MySQL モニター...

JavaScript のデシェイクとスロットリングの例

目次安定スロットル: 手ぶれ防止: 一定時間内に最後のタスクのみを実行します。スロットル: 一定期間...

Mysql 複数データベースのバックアップ コード例

この記事は主にMysqlの複数データベースのバックアップのコード例を紹介します。この記事ではサンプル...

dockerfile における ENTRYPOINT と CMD の組み合わせと違い

前回の記事【dockerコンテナのためのdockerfileを詳しく解説】では、dockerfile...

ウェブページのテーブルの境界線を設定する方法

<br />前回は、Web テーブルにセルの線を設定する方法を学びました。今日は、Web...

純粋なCSSを使用してスクロールシャドウ効果を実現します

端的に言うと、スクロール可能な要素には非常によくある状況があります。通常、スクロールすると、要素が現...

Vueのウェブページスクリーンショット機能の詳しい説明

最近、プロジェクトで写真をアップロードする要件があるのですが、顧客がアップロードする写真のサイズがま...

JavaScript は setTimeout を使用してカウントダウン効果を実現します

JavaScript ネイティブ コードの記述能力を高め、setTimeout() の使用を強化する...

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

この記事では、参考として MySQL 5.7.23 のインストール チュートリアルを記録します。 1...

ドメイン名を nginx サービスにバインドする方法

nginx.conf で複数のサーバーを設定します。 http リクエストを処理する際、nginx ...

反応ジャンプ後にルートが変更されてもページが更新されない場合の解決策

目次質問解決質問この問題には多くの理由があるようです。私の問題は、パラメータ付きのURLを更新できな...

CSS3 で背景の透明化と不透明テキストを実装するサンプルコード

最近、画像上に半透明の背景でテキストを表示する必要があるという要件に遭遇しました。その効果は次のよう...