CoreOSでTLSを使用して造船所2.0.10を安全にセットアップする方法
序章
Dockerはコンテナー化ソフトウェアの一般的なオプションであり、CoreOSはクラスター化された環境に特化しているため、この2つはコンテナー化されたアプリケーションに最適です。 ただし、すべてのコンテナーを整理しておくことは、特にDockerコマンドラインインターフェイスを介してのみ管理されている場合、またはCoreOSの複数のインスタンスがある場合は複雑になる可能性があります。
幸い、Shipyardと呼ばれる便利なDocker管理ツールがあります。 便利なGUIを使用して、コンテナを再起動、破棄、および作成する機能を提供します。 また、特定のコンテナーへのリソース割り当てを管理したり、複数のDockerホスト間でコンテナーを管理したりすることもできます。 ただし、特に本番環境で使用されている場合は、DockerサーバーとShipyardシステムが安全であることを確認することが重要です。
このガイドでは、単一のCoreOSサーバーにShipyard 2.0.10をセットアップし、許可されたクライアントのみが接続できるようにTLS証明書でDockerを保護します。 TLSは、 Transport LayerSecurityの略です。 これは、データがクライアントからサーバーに転送され、また戻ってくるときにデータを暗号化するために使用されます。 この例では、これを使用してDockerホストへの接続とDockerのShipyardへの接続を暗号化します。
前提条件
このチュートリアルに従うには、次のものが必要です。
-
少なくとも512MBのRAMを備えた1つのCoreOSドロップレットですが、1GB以上をお勧めします。 アルファ版やベータ版ではなく、CoreOSの最新の安定版を選択してください。
すべてのCoreOSサーバーにはSSHキーが必要です。まだ持っていない場合は、 DigitalOcean DropletsでSSHキーを使用する方法の手順1〜3に従ってSSHキーを追加できます。
-
Dockerホストの完全修飾ドメイン名(FQDN)またはサブドメイン。
ドメインをまだ所有していない場合は、さまざまなドメインレジストラのいずれかからドメインを購入できます。 使用するドメインを取得したら、共通ドメインレジストラからDigitalOceanネームサーバーを指定する方法に、DigitalOceanDNSでドメインを設定する方法の説明があります。
DigitalOcean でホスト名を設定する方法で説明されているように、Aレコードを追加することで、ドメインをドロップレットにポイントできます。
-
認証に証明書を使用するようにDockerを設定することはかなり高度なトピックであるため、SSL証明書がどのように機能するかについては、このOpenSSLチュートリアルをお読みください。
ステップ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ホストで使用されるサーバー証明書です。
ステップ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
上記のコマンドは、というファイルを作成します client.cnf
コンテンツ付き extendedKeyUsage = clientAuth
テキストエディタを使用する必要はありません。
次に、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
さらに詳しくは、Systemctlを使用してSystemdサービスとユニットを管理する方法をご覧ください。
まず、Dockerユニットファイルを編集することから始めましょう。 のオプションがあります systemctl
オリジナルを直接変更するのではなく、実際のユニットファイルを複製することで役立つコマンド。 これは、Docker構成のオーバーライドのように考えることができます。
を使用して編集するためにDockerユニットファイルを開きます systemctl
.
- sudo systemctl edit --full docker
これにより、を使用して編集するためにファイルが開きます vim
、vimチュートリアルを読むことで使い方を学ぶことができます。
で始まる行を見つける 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:で始まる行を探します。 アクティブ(実行中)以外のメッセージが表示された場合は、ユニットファイルの編集を再確認し、必要なすべてのキーと証明書が生成されていることを確認してください。
最後に、TLS検証をテストできます。
- docker --tlsverify --tlscacert=myca.pem --tlscert=client.pem --tlskey=client-key.pem -H=example.com:2376 info
すべてが順調であれば、Dockerホストに関する基本的なシステム情報を受け取る必要があります。 これは、DockerホストをTLSで保護したことを意味します。 エラーが発生した場合は、を使用してログを確認してください systemctl status docker
.
有効な証明書とクライアントキーを使用して接続している限り、どこからでもDockerホストにアクセスできるようになりました。 クラスタで使用するために必要な数のクライアント証明書を生成して署名できます。
ステップ4—造船所の設置
造船所の設定はかなり簡単なプロセスです。 すべてのパーツは独自のDockerコンテナーを備えた自己完結型であるため、Dockerは必要なイメージを自動的にプルします。
まず、造船所のデータベースを保存するデータボリュームを設定する必要があります。
- docker create --name shipyard-rethinkdb-data shipyard/rethinkdb
これで、RethinkDBの新しいコンテナを実際にプルダウンしてスポーンできます。 これは、Shipyardが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
. これは、サーバーの外部から誰もデータベースにアクセスできないことを意味するため、このデータベースを保護するための良い方法です。
Docker TLSで構成するのが最も簡単なため、Shipyardバージョン2.0.10を使用します。 次のコマンドは、Shipyardを実行する新しいコンテナを起動し、それをRethinkDBコンテナにリンクして、通信できるようにします。
- docker run -it -p 8080:8080 -d --restart=always --name shipyard --link shipyard-rethinkdb:rethinkdb shipyard/shipyard:2.0.10
造船所のセットアップが完了したら、次のWebサイトにアクセスしてください。 http://example.com:8080
また http://your_server_ip:8080
造船所のコントロールパネルにアクセスします。 デフォルトのユーザー名adminとパスワードshipyardでログインできます。
Shipyardは、クラスターに新しいエンジンを追加するように求めるプロンプトを表示します。 緑色の+ADD ボタンをクリックすると、次のようなフォームが表示されます。
次のように情報を入力します。
- 名前は、任意の名前にすることができます。 これがエンジンの名前になります。
- ラベルも好きなようにすることができます。 コンテナを整理しておくことができるように、短くしてください。
- CPUs は、サーバーに搭載されているCPUの数です。
- メモリは、サーバーに搭載されているRAMの量です。
- アドレスは
https://your_server_ip:2376
TLSを使用します。
基本オプションの下に3つの大きなテキスト領域があります。 ここに証明書とキーを貼り付けて、ShipyardがDockerホストに安全に接続できるようにします。
最初のフィールドSSL証明書には、クライアント証明書が必要です。 証明書の内容を印刷します。
- cat ~/dockertls/client.pem
次に、出力をコピーして、SSL証明書ボックスに貼り付けます。
次に、クライアントキーの内容を印刷します。
- cat ~/dockertls/client-key.pem
出力をSSLKeyテキスト領域に貼り付けます。
最後に、CA証明書の内容を印刷します。
- cat ~/dockertls/myca.pem
そのコンテンツをCA証明書ボックスに貼り付けます。
ページ下部の淡い青色のADDボタンをクリックします。 すべてが正しく構成されている場合、Shipyardは次の画面を表示するはずです。
結論
これで、CoreOSサーバーで安全なDockerホストが実行されます。
造船所は、コンテナとホストのクラスターを安全かつ確実に管理するのに役立ちます。 クライアントキーと証明書をローカルマシンに追加して、どこからでもDockerクラスターをリモートで管理できるようにすることもできます。
追加のセキュリティ手順については、Nginxを使用してShipyardサーバーをリバースプロキシできます。 これにより、HTTPSを使用して、ローカルマシンから造船所へのさらに安全な接続を行うことができます。 詳細については、記事 Dockerの説明:Nginxをプロキシとしてコンテナ化して使用する方法を参照してください。 さらに多くのCoreOSサーバーを起動して、Dockerクラスターを試すこともできます。 Shipyardを使用して何百ものエンジンを管理できます。