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

この鍵はパスワードマネージャーに保存することを忘れないでください。
この鍵を失ってしまうと、マネージャーを再起動することができなくなります。

オートロックを無効にするには--autolockfalseを指定します。 相互 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