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

前書き

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

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

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

前提条件

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

  • 512 MB以上のRAMを搭載した1つのCoreOSドロップレット。ただし、1 GB以上を推奨します。 アルファ版またはベータ版ではなく、CoreOSの最新の安定バージョンを選択してください。 +すべてのCoreOSサーバーにはSSHキーが必要であるため、まだ持っていない場合は、https://www.digitalocean.com/community/tutorials/how-to-use-のステップ1〜3に従って追加できます。 ssh-keys-with-digitalocean-droplets [DigitalOcean DropletsでSSHキーを使用する方法]。

  • Dockerホストの完全修飾ドメイン名(FQDN)またはサブドメイン。 +まだドメインを所有していない場合は、さまざまなドメインレジストラーのいずれかから購入できます。 使用するドメインを取得したら、https://www.digitalocean.com/community/tutorials/how-to-point-to-digitalocean-nameservers-from-common-domain-registrars [DigitalOcean Nameservers from Common Domain Registrars]には、DigitalOcean DNSでの設定方法に関する指示があります。 + How DigitalOceanでホスト名を設定するには

  • 認証に証明書を使用するようにDockerをセットアップすることはかなり高度なトピックなので、https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrsを読んでください。 [このOpenSSLチュートリアル]では、SSL証明書の仕組みについて説明しています。

ステップ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つのコマンドは、署名要求を生成します。 必ず++をDockerに使用しているドメインまたはサブドメインに置き換えてください。

openssl genrsa -out docker-1-key.pem 4096
openssl req -subj "/CN=" -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ホストで使用されるサーバー証明書です。

ステップ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、サーバー証明書、およびクライアント証明書ができました。

ステップ3-DockerとCoreOSの構成

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

Dockerの起動オプションを変更する必要があります。 CoreOSは `+ systemd `を使用してサービスを管理します。 ` systemd +`を読み、さらに詳しく知りたい場合は、https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-を読むことができます。 services-and-units [Systemctlを使用してSystemdサービスとユニットを管理する方法]。

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

`+ systemctl +`を使用して、Dockerユニットファイルを編集用に開きます。

sudo systemctl edit --full docker

これにより、 `+ vim +`を使用してファイルを編集用に開きます。これは、https://www.digitalocean.com/community/tutorials/installing-and-using-the-vim-text-editorを読むことで使用方法を学ぶことができます。 -on-a-cloud-server#modal-editing [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://  $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=:2376 info

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

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

ステップ4-造船所の設置

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

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

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

これで、実際にhttps://www.digitalocean.com/community/tutorials/how-to-install-and-configure-rethinkdb-on-an-ubuntu-12-04-vps [ 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://:8080 `または ` http://:8080 +`にアクセスして、造船所のコントロールパネルにアクセスします。 デフォルトのユーザー名* admin およびパスワード shipyard *でログインできます。

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

image:https://assets.digitalocean.com/articles/shipyard_security/shipyard1.png [Shipyard Add]

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

  • *名前*には、好きな名前を指定できます。 これはエンジンの名前になります。

  • *ラベル*には、好きなものを指定できます。 コンテナを整理しておくことができるように短くしてください。

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

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

  • TLSを使用するには、*アドレス*が `+ https://:2376 +`でなければなりません。

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

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

cat ~/dockertls/client.pem

次に、出力をコピーして[* SSL証明書*]ボックスに貼り付けます。

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

cat ~/dockertls/client-key.pem

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

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

cat ~/dockertls/myca.pem

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

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

image:https://assets.digitalocean.com/articles/shipyard_security/shipyard2.png [造船所エンジンリスト]

結論

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

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

追加のセキュリティ手順については、Nginxを使用してShipyardサーバーをリバースプロキシできます。 これにより、ローカルマシンから造船所へのより安全な接続にHTTPSを使用できます。 詳細については、記事https://www.digitalocean.com/community/tutorials/docker-explained-how-to-containerize-and-use-nginx-as-a-proxy[Dockerの説明:方法Nginxをコンテナ化してプロキシとして使用する]。 https://www.digitalocean.com/community/tutorials/how-to-set-up-a-coreos-cluster-on-digitalocean [他のCoreOSサーバーをスピンアップ]してDockerクラスターを試すこともできます。 Shipyardを使用して数百のエンジンを管理できます。

Related