CoreOSでTLSを使用してShipyard 2.0.10を安全にセットアップする方法

前書き

Dockerはコンテナー化ソフトウェアの一般的なオプションであり、CoreOSはクラスター環境に特化しており、コンテナー化アプリケーションに最適です。 ただし、すべてのコンテナを整理することは、特にDockerコマンドラインインターフェイスを介してのみ管理されている場合や、CoreOSの複数のインスタンスがある場合は複雑になる可能性があります。

幸い、Shipyardと呼ばれる便利なDocker管理ツールがあります。 便利なGUIを使用して、コンテナを再起動、破棄、および作成することができます。 また、特定のコンテナへのリソース割り当てを管理し、複数のDockerホスト間でコンテナを管理できます。 ただし、DockerサーバーとShipyardシステムが安全であることを確認することは重要です。特に運用環境で使用されている場合は重要です。

このガイドでは、単一のCoreOSサーバーでShipyard 2.0.10をセットアップし、DockerをTLS証明書で保護して、承認されたクライアントのみが接続できるようにします。 TLSはTransport Layer Securityの略です。 データがクライアントからサーバーに転送され、再び戻されるときにデータを暗号化するために使用されます。 私たちの場合、Dockerホストへの接続と、造船所へのDockerの接続を暗号化するために使用します。

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • 512 MB以上のRAMを搭載した1つのCoreOSドロップレット。ただし、1 GB以上を推奨します。 アルファ版またはベータ版ではなく、CoreOSの最新の安定バージョンを選択してください。

    すべてのCoreOSサーバーにはSSHキーが必要です。SSHキーをまだ持っていない場合は、How To Use SSH Keys with DigitalOcean Dropletsの手順1〜3に従ってSSHキーを追加できます。

  • Dockerホストの完全修飾ドメイン名(FQDN)またはサブドメイン。

    まだドメインを所有していない場合は、さまざまなドメインレジストラのいずれかから購入できます。 使用するドメインができたら、How to Point to DigitalOcean Nameservers From Common Domain RegistrarsにDigitalOceanDNSでドメインを設定する方法の説明があります。

    How To Set Up a Host Name with DigitalOceanで説明されているように、Aレコードを追加することで、ドメインをドロップレットにポイントできます。

  • 認証に証明書を使用するようにDockerを設定することはかなり高度なトピックであるため、SSL証明書がどのように機能するかについては、this OpenSSL tutorialを読んでください。

[[step-one -—- creating-the-server-certificate]] ==ステップ1—サーバー証明書の作成

最初に行う必要があるのは、サーバー証明書とクライアント証明書の署名に使用できる認証局を作成することです。 CoreOSには、証明書の生成と署名に使用できるユーティリティであるOpenSSLが付属しています。

まず、RSA秘密キーを作成します。 まず、dockertlsというディレクトリを作成して移動します。これにより、ファイルの場所を簡単に覚えることができます。

mkdir ~/dockertls && cd ~/dockertls

次に、RSA秘密鍵を作成します。 このコマンドにより、キーのパスフレーズを作成するように求められます。

openssl genrsa -aes256 -out private-key.pem 4096

上記のコマンドを分解しましょう。 genrsaは、コマンドが秘密RSA秘密鍵を生成することを意味します。 -out private-key.pemは、生成するファイルの名前(private-key.pem)を指定します。 最後のビット4096は、ビット単位のキーの長さです。 これを4096などの高い数値に維持することをお勧めします。

次に、新しい証明書を生成し、作成した秘密キーで署名します。 キーを作成するときに選択したパスフレーズを入力する必要があります。

openssl req -new -x509 -sha512 -days 365 -key private-key.pem -out myca.pem

OpenSSLは、サーバーのFQDNや組織の基になっている郡など、必要な情報も要求します。 これらの質問にはできるだけ正確に答えるようにしてください。 これは、自己署名認証局(CA)を作成する最後の手順です。

CAができたので、Dockerデーモンで使用するサーバー証明書を実際に作成できます。 次の2つのコマンドは、署名要求を生成します。 必ずexample.comをDockerに使用しているドメインまたはサブドメインに置き換えてください。

openssl genrsa -out docker-1-key.pem 4096
openssl req -subj "/CN=example.com" -sha512 -new -key docker-1-key.pem -out docker.csr

最後に、CAの秘密キーで署名します。 キーパスフレーズをもう一度入力する必要があります。

openssl x509 -req -days 365 -sha256 -in docker.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out final-server-cert.pem

これにより、現在のディレクトリにfinal-server-cert.pemというファイルが作成されます。これは、Dockerホストで使用されるサーバー証明書です。

[[step-two -—- creating-the-client-certificate]] ==ステップ2—クライアント証明書の作成

サーバー証明書を取得したので、クライアント証明書を作成する必要があります。 これは、Dockerホストに接続しようとするたびに使用されます。 接続しているクライアントが実際に個人のCAによって検証および署名されていることを確認します。 したがって、承認されたクライアントのみが接続してDockerにコマンドを送信できます。

最初に、クライアントに対する別の署名要求を作成します。

openssl genrsa -out client-key.pem 4096
openssl req -subj '/CN=client' -new -key client-key.pem -out docker-client.csr

このクライアントリクエストに対して実行する必要がある小さな追加ステップがあります。 結果の証明書を実際にクライアント認証に使用できることを指定する構成ファイルを作成する必要があります。

echo extendedKeyUsage = clientAuth > client.cnf

上記のコマンドは、テキストエディタを使用せずに、コンテンツextendedKeyUsage = clientAuthを含むclient.cnfというファイルを作成します。

次に、CAキーでクライアントに署名します。

openssl x509 -req -days 365 -sha512 -in docker-client.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out client.pem -extfile client.cnf

これで、CA、サーバー証明書、およびクライアント証明書ができました。

[[step-three --- configureing-docker-and-coreos]] ==ステップ3—DockerとCoreOSの構成

この手順では、証明書を使用するようにDockerデーモンを構成します。

Dockerの起動オプションを変更する必要があります。 CoreOSはsystemdを使用してサービスを管理します。 systemdを読み、それについてさらに詳しく知りたい場合は、How To Use Systemctl to Manage Systemd Services and Unitsを読むことができます。

まず、Dockerユニットファイルを編集することから始めましょう。 systemctlコマンドには、元のファイルを直接変更するのではなく、実際のユニットファイルを複製するのに役立つオプションがあります。 Docker構成のオーバーライドと考えることができます。

systemctlを使用して編集するためにDockerユニットファイルを開きます。

sudo systemctl edit --full docker

これにより、vimを使用して編集するためにファイルが開きます。これは、vim tutorialを読み取ることで使用方法を学ぶことができます。

ExecStart=/usr/lib/coreos/dockerdで始まる行を見つけます。 その行の--host=fd://の後に、以下の強調表示されたオプションを追加して、ファイルが次のようになるようにします。

EnvironmentFile=-/run/flannel_docker_opts.env
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
ExecStart=/usr/lib/coreos/dockerd --daemon --host=fd:// --tlsverify --tlscacert=/home/core/dockertls/myca.pem --tlscert=/home/core/dockertls/final-server-cert.pem --tlskey=/home/core/dockertls/docker-1-key.pem -H=0.0.0.0:2376 $DOCKER_OPTS $DOCKER_OPT_BIP $DOCKER_OPT_MTU $DOCKER_OPT_IPMASQ

追加したばかりのオプションを見てみましょう。

  • --tlsverifyは、許可されたクライアントのみが接続できるように、TLS検証をオンにするだけです。

  • --tlscacertは、CAの証明書の場所を指定します。

  • --tlscertは、サーバー証明書の場所を指定します。

  • --tlskeyは、サーバーキーの場所を指定します。

  • -H=0.0.0.0:2376は、Dockerがどこからでも接続をリッスンすることを意味しますが、許可されたクライアントキーまたは証明書を持たない接続は許可されません。

ファイルを保存して閉じ、Dockerデーモンをリロードして新しい構成を使用します。

sudo systemctl restart docker

Dockerのステータスを確認すると、すべてが機能していることを確認できます。

systemctl status docker

Active:で始まる行を探します。 active (running)以外の値が表示されている場合は、ユニットファイルの編集を再確認し、必要なすべてのキーと証明書が生成されていることを確認してください。

最後に、TLS検証をテストできます。

docker --tlsverify --tlscacert=myca.pem --tlscert=client.pem --tlskey=client-key.pem -H=example.com:2376 info

すべてが順調であれば、Dockerホストに関する基本的なシステム情報が返されます。これは、TLSでDockerホストを保護したことを意味します。 エラーが発生した場合は、systemctl status dockerを使用してログを確認してください。

有効な証明書とクライアントキーを使用して接続している限り、どこからでもDockerホストにアクセスできます。 クラスターで使用するクライアント証明書をいくつでも生成して署名できます。

[[step-four -—- installing-shipyard]] ==ステップ4-Shipyardのインストール

造船所のセットアップはかなり簡単なプロセスです。 すべてのパーツは、独自のDockerコンテナー内に内蔵されているため、Dockerは必要なイメージを自動的にプルします。

まず、造船所のデータベースが保存されるデータボリュームを設定する必要があります。

docker create --name shipyard-rethinkdb-data shipyard/rethinkdb

これで、実際にプルダウンして、RethinkDBの新しいコンテナを生成できます。 これは、造船所がDockerからのリアルタイムデータを追跡するために使用するデータベースエンジンです。

docker run -it -d --name shipyard-rethinkdb --restart=always --volumes-from shipyard-rethinkdb-data -p 127.0.0.1:49153:8080 -p 127.0.0.1:49154:28015 -p 127.0.0.1:29015:29015 shipyard/rethinkdb

このコマンドは、RethinkDBがlocalhostのみをリッスンすることも保証します。 これは、誰もサーバーの外部からアクセスできないことを意味するため、このデータベースを保護する良い方法です。

Shipyardバージョン2.0.10を使用します。これは、Docker TLSを使用して設定するのが最も簡単だからです。 次のコマンドは、Shipyardを実行する新しいコンテナーを開始し、RethinkDBコンテナーにリンクして、それらが通信できるようにします。

docker run -it -p 8080:8080 -d --restart=always --name shipyard --link shipyard-rethinkdb:rethinkdb shipyard/shipyard:2.0.10

造船所のセットアップが完了したら、http://example.com:8080またはhttp://your_server_ip:8080にアクセスして造船所のコントロールパネルにアクセスします。 デフォルトのユーザー名adminとパスワードshipyardでログインできます。

造船所は、クラスターに新しいエンジンを追加するように求めます。 緑色の+ ADDボタンをクリックすると、次のようなフォームが表示されます。

Shipyard Add

次のように情報を入力します。

  • Nameは、任意の値にすることができます。 これはエンジンの名前になります。

  • Labelsも任意の値にすることができます。 コンテナを整理しておくことができるように短くしてください。

  • CPUsは、サーバーに搭載されているCPUの数です。

  • Memoryは、サーバーに搭載されているRAMの量です。

  • TLSを使用するには、Addresshttps://your_server_ip:2376である必要があります。

基本オプションの下に3つの大きなテキスト領域があります。 ここで、ShipyardがDockerホストに安全に接続できるように、証明書とキーを貼り付けます。

最初のフィールドSSL Certificateには、クライアント証明書が必要です。 証明書の内容を印刷します。

cat ~/dockertls/client.pem

次に、出力をコピーして、SSL Certificateボックスに貼り付けます。

次に、クライアントキーの内容を印刷します。

cat ~/dockertls/client-key.pem

出力をSSL Keyテキスト領域に貼り付けます。

最後に、CA証明書の内容を印刷します。

cat ~/dockertls/myca.pem

そのコンテンツをCA Certificateボックスに貼り付けます。

ページの下部にある淡い青色のADDボタンをクリックします。 すべてが正しく構成されている場合、造船所は次の画面を表示するはずです。

Shipyard Engine List

結論

これで、CoreOSサーバーで実行されている安全なDockerホストができました!

造船所は、コンテナとホストのクラスターを安全かつ安全に管理するのに役立ちます。 クライアントキーと証明書をローカルマシンに追加して、どこからでもDockerクラスターをリモートで管理することもできます。

追加のセキュリティ手順については、Nginxを使用してShipyardサーバーをリバースプロキシできます。 これにより、ローカルマシンから造船所へのより安全な接続にHTTPSを使用できます。 詳細については、Docker Explained: How To Containerize and Use Nginx as a Proxyの記事をご覧ください。 spin up more CoreOS serversを実行して、Dockerクラスターを試すこともできます。 Shipyardを使用して数百のエンジンを管理できます。