Swarm のロックと暗号鍵の保護
読む時間の目安: 4 分
Swarm マネージャーが利用する Raft ログは、デフォルトで暗号化されて保存されます。 Raft ログへのアクセスを試みようとする攻撃者がいても、ログの静止時には暗号化されているので、サービス設定やデータ内容を守ることができます。 この機能が導入された理由の 1 つが Docker secrets をサポートするためでした。
Docker が再起動した際には、Swarm ノード間通信の暗号化に用いられる TLS 鍵、およびディスク上の Raft ログの暗号化、復号化に用いられる鍵は、ともにマネージャーノードのメモリにロードされます。 相互 TLS 暗号鍵(mutual TLS encryption key)と、静止時の Raft ログの暗号化、複合化に用いられる鍵を、いずれも保護する機能があります。 それらの鍵の所有権はユーザーに属していて、マネージャーのロック解除は手動で行う必要があります。 この機能は「オートロック」(autolock)機能と呼ばれます。
Docker の再起動時には、Swarm のロック解除 をまずはじめに行う必要があります。 その際には Docker が Swarm をロックした際に生成される「鍵暗号化鍵」(key encryption key)を用います。 この鍵暗号化鍵は、いつでもローテートすることができます。
メモ: 新たなノードを Swarm に参加させる際には Swarm のロックを解除する必要はありません。 相互 TLS を通じてその鍵が受け渡されているからです。
オートロック機能を有効にした Swarm の初期化
新たに Swarm を初期化する際に--autolock
フラグを指定して、Docker 再起動時の Swarm マネージャーノードのオートロック機能を有効にすることができます。
$ docker swarm init --autolock
Swarm initialized: current node (k1q27tfyx9rncpixhk69sa61v) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0j52ln6hxjpxk2wgk917abcnxywj3xed0y8vi1e5m9t3uttrtu-7bnxvvlz2mrcpfonjuztmtts9 \
172.31.46.109:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:
SWMKEY-1-WuYH/IX284+lRcXuoVf38viIDK3HJEKY13MIHX+tTt8
$ docker swarm init --autolock
Swarm が初期化されました: カレントノード (k1q27tfyx9rncpixhk69sa61v) がマネージャーになりました。
この Swarm にワーカーを追加するには、以下のコマンドを実行してください。
docker swarm join \
--token SWMTKN-1-0j52ln6hxjpxk2wgk917abcnxywj3xed0y8vi1e5m9t3uttrtu-7bnxvvlz2mrcpfonjuztmtts9 \
172.31.46.109:2377
この Swarm にマネージャーを追加するには 'docker swarm join-token manager'を実行し、
以下の手順に従ってください。
Swarm マネージャーを再起動した後にロック解除を行うには、`docker swarm unlock`を実行して、
以下の鍵を入力してください。
SWMKEY-1-WuYH/IX284+lRcXuoVf38viIDK3HJEKY13MIHX+tTt8
上で示された鍵は、パスワードマネージャーなどの安全な場所に保存しておいてください。
Docker を再起動したら Swarm のロック解除 が必要です。 Swarm がロックされたままでいると、サービスの起動や再起動を行おうとした際に、以下のようなエラーが発生します。
$ sudo service docker restart
$ docker service ls
Error response from daemon: Swarm is encrypted and needs to be unlocked before it can be used. Use "docker swarm unlock" to unlock it.
$ sudo service docker restart
$ docker service ls
デーモンからエラーレスポンス: Swarm が暗号化されているので、利用する前にロック解除が必要です。
ロック解除には「docker swarm unlock」を利用してください。
既存 Swarm におけるオートロックの有効化、無効化
既存 Swarm のオートロック機能を有効にするにはautolock
フラグをtrue
に設定します。
$ docker swarm update --autolock=true
Swarm updated.
To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:
SWMKEY-1-+MrE8NgAyKj5r3NcR4FiQMdgu+7W72urH0EZeSmP/0Y
Please remember to store this key in a password manager, since without it you
will not be able to restart the manager.
$ docker swarm update --autolock=true
Swarm が更新されました。
Swarm マネージャーを再起動した後にロック解除を行うには、`docker swarm unlock`を実行して、
以下の鍵を入力してください。
SWMKEY-1-+MrE8NgAyKj5r3NcR4FiQMdgu+7W72urH0EZeSmP/0Y
この鍵はパスワードマネージャーに保存することを忘れないでください。
この鍵を失ってしまうと、マネージャーを再起動することができなくなります。
オートロックを無効にするには--autolock
にfalse
を指定します。
相互 TLS 鍵と、Raft ログの読み書きに用いられる暗号鍵は、暗号化が解かれた状態でディスクに保存されます。
ここには、暗号状態を解いた状態で鍵を保存するリスクと、各マネージャーの暗号解除を不要として Swarm の再起動を可能とする利便性との間でのトレードオフがあります。
$ docker swarm update --autolock=false
それまでの古い鍵を使ってロックする設定が残っていて、その間にマネージャーがダウンしてしまうことも考えられます。 したがってオートロックを無効化しても、解除鍵はしばらくの間は保存しておくようにしてください。
Swarm のロック解除
ロックされている Swarm のロック解除を行うにはdocker swarm unlock
を用います。
$ docker swarm unlock
Please enter unlock key:
$ docker swarm unlock
解除鍵を入力してください:
Swarm のロック時、あるいは鍵のローテート時のコマンド実行によって、生成され出力表示された暗号鍵をここで入力します。 これにより Swarm のロックが解除されます。
実行中 Swarm に対するロック解除鍵の表示
Swarm が望みどおりに稼動している状態で、マネージャーノードが利用できなくなったとします。 この問題を解決するためには、物理的なノードをオンラインに戻すことを行います。 ただしそのためには、マネージャーに対して解除鍵を使ってロック解除を行う必要があります。 この解除鍵がないと、暗号化された資格情報や Raft ログを読み込むことができません。
Swarm 内にそのノードが残っている状態で、鍵のローテートを今までに行ったことがない場合、そして Swarm 内で有効なマネージャーノードの quorum を得ている場合は、解除鍵を確認することができます。
これにはdocker swarm unlock-key
コマンドを引数なしで実行します。
$ docker swarm unlock-key
To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:
SWMKEY-1-8jDgbUNlJtUe5P/lcr9IXGVxqZpZUXPzd+qzcGp4ZYA
Please remember to store this key in a password manager, since without it you
will not be able to restart the manager.
$ docker swarm unlock-key
Swarm マネージャーを再起動した後にロック解除を行うには、`docker swarm unlock`を実行して、
以下の鍵を入力してください。
SWMKEY-1-8jDgbUNlJtUe5P/lcr9IXGVxqZpZUXPzd+qzcGp4ZYA
この鍵はパスワードマネージャーに保存することを忘れないでください。
この鍵を失ってしまうと、マネージャーを再起動することができなくなります。
Swarm ノードが利用不能となった後に鍵のローテートを実施済みであって、古い鍵の記録を保存していない場合は、マネージャーを強制的に Swarm から削除することになります。 そして新たなマネージャーとして Swarm に再参加することが必要です。
解除鍵のローテート
Swarm のロックを解除する鍵は、定期的なスケジュールを立ててローテートするべきです。
$ docker swarm unlock-key --rotate
Successfully rotated manager unlock key.
To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:
SWMKEY-1-8jDgbUNlJtUe5P/lcr9IXGVxqZpZUXPzd+qzcGp4ZYA
Please remember to store this key in a password manager, since without it you
will not be able to restart the manager.
$ docker swarm unlock-key --rotate
マネージャーの解除鍵のローテートに成功しました。
Swarm マネージャーを再起動した後にロック解除を行うには、`docker swarm unlock`を実行して、
以下の鍵を入力してください。
SWMKEY-1-8jDgbUNlJtUe5P/lcr9IXGVxqZpZUXPzd+qzcGp4ZYA
この鍵はパスワードマネージャーに保存することを忘れないでください。
この鍵を失ってしまうと、マネージャーを再起動することができなくなります。
swarm, manager, lock, unlock, autolock, encryption警告
解除鍵のローテートを行った後も、古い鍵の記録はしばらくは保存しておいてください。 マネージャーが新たな鍵を得る前にダウンしてしまうと、古い鍵によってロック解除したままとなってしまうためです。