前書き
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ボタンをクリックすると、次のようなフォームが表示されます。
次のように情報を入力します。
-
Nameは、任意の値にすることができます。 これはエンジンの名前になります。
-
Labelsも任意の値にすることができます。 コンテナを整理しておくことができるように短くしてください。
-
CPUsは、サーバーに搭載されているCPUの数です。
-
Memoryは、サーバーに搭載されているRAMの量です。
-
TLSを使用するには、Addressが
https://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ボタンをクリックします。 すべてが正しく構成されている場合、造船所は次の画面を表示するはずです。
結論
これで、CoreOSサーバーで実行されている安全なDockerホストができました!
造船所は、コンテナとホストのクラスターを安全かつ安全に管理するのに役立ちます。 クライアントキーと証明書をローカルマシンに追加して、どこからでもDockerクラスターをリモートで管理することもできます。
追加のセキュリティ手順については、Nginxを使用してShipyardサーバーをリバースプロキシできます。 これにより、ローカルマシンから造船所へのより安全な接続にHTTPSを使用できます。 詳細については、Docker Explained: How To Containerize and Use Nginx as a Proxyの記事をご覧ください。 spin up more CoreOS serversを実行して、Dockerクラスターを試すこともできます。 Shipyardを使用して数百のエンジンを管理できます。