
コンテナの世界では、シークレットとはSSHキー、SSL証明書、パスワードといった資産であり、クラウドアカウント、API、他のコンテナなどのサービスへの接続に使用されます。シークレットは、コンテナの実行時に必要となる機密データを管理するために使用できます。問題は、これらのシークレットをイメージ内やソースコード内に保存しないことです。深刻なセキュリティ問題につながる可能性があるためです。
悪意のあるユーザーがDocker Swarmに侵入し、パスワードや証明書を閲覧してアカウントにアクセスしようとするとどうなるか想像してみてください。そんなのは絶対に許されません。
このようなシナリオを回避するには、シークレットの使用を検討する必要があります。パスワードをコンテナやイメージ内に保存する代わりに、Dockerで暗号化されたシークレットを作成し、それをコンテナに渡すことで、平文で表示されることを防ぎます。このシステムにより、サイバー犯罪者がシークレットを悪用することがより困難になります。
Docker でシークレットを作成する方法と、それを使用して Docker サービスをデプロイする方法を説明します。
参照: 採用キット: バックエンド開発者 (TechRepublic Premium)
必要なもの
これを実行するには、Dockerのインスタンスが稼働している必要があります。Linux、macOS、Windowsで稼働している単一のインスタンスでも、完全なDocker Swarmクラスターでも構いません。必要なのはこれだけです。それでは、秘密を少しだけお教えしましょう。
秘密を作成する方法
まず最初に、シークレットを作成します。printfコマンドを使用し、その出力をdockerコマンドにパイプして、 というシークレットを作成しますmy_test_secret
。これを行うには、Dockerコントローラーにログインし、以下のコマンドを実行します。
printf "This is my super secret secret" | docker secret create my_test_secret -
次のコマンドを使用して現在のすべてのシークレットを一覧表示することで、シークレットが正常に作成されたかどうかを確認できます。
docker secret ls
次のようなリストが表示されます。
ttx3h2zarswj4wxgum5heobfx my_test_secret 4 seconds ago 4 seconds ago
秘密情報を利用するサービスの作成方法
これから、シークレットへのフルアクセスを持つRedisサービスを作成します。この方法の良い点は、コンテナ自体がシークレットを内部に保存せず、docker secretsメカニズムを介して使用できることです。
シークレットを使用してそのサービスをデプロイするにはmy_test_secret
、コマンドは次のようになります。
docker service create --name redis --secret my_test_secret redis:alpine
次のコマンドでサービスが実行されていることを確認します。
docker service ps redis
次のようなリストが表示されます。
0z6v0js2hu5q redis.1 redis:alpine dockernode1 Running Running 34 seconds ago
次のコマンドを使用して、サービスがシークレットにアクセスできることを確認します。
docker container exec $(docker ps --filter name=redis -q) ls -l /run/secrets
出力には次のようなものが表示されます。
-r--r--r-- 1 root root 17 May 24 13:16 my_test_secret
最後に、次のコマンドでシークレットの内容を表示できます。
docker container exec $(docker ps --filter name=redis -q) cat /run/secrets/my_test_secret
出力は次のようになります。
This is my super secret secret
コンテナをコミットすると、シークレットは利用できなくなります。以下のコマンドでコミットしてください。
docker commit $(docker ps --filter name=redis -q) committed_redis
次のコマンドで、シークレットが利用できなくなったことを確認します。
docker run --rm -it committed_redis cat /run/secrets/my_test_secret
出力には次のようなものが表示されます。
cat: can't open '/run/secrets/my_test_secret': No such file or directory
failed to resize tty, using default size
次のコマンドを使用して、シークレットへのアクセスを削除できます。
docker service update --secret-rm my_test_secret redis
これが、Docker でシークレットを作成し、それをサービス内で使用する方法です。
Dockerについてさらに詳しく知るには
Docker についてさらに詳しく知りたい場合は、TechRepublic Academy の以下のリソースをお見逃しなく。
- Dockerコンテナのハッキングとセキュリティ保護
- Linux & Docker コーディングバンドル
- Docker および Kubernetes 認定トレーニングバンドル
Jack Wallen によるビジネス プロフェッショナル向けの最新のテクノロジー アドバイスをすべて知るには、YouTube で TechRepublic の How To Make Tech Work を購読してください。