Модуль 19 / 24
Безопасность и certificate rotation
Содержание
1. Цели и результат модуля
После модуля вы проверите mTLS identity узлов, безопасно смените join tokens, испытаете manager autolock и выполните CA rotation без потери quorum и доступности.
- читать subject, issuer и expiry
- не раскрывать tokens и unlock key
- различать transport identity и data-at-rest protection
- проверять кластер после ротации
2. Теория: PKI и mTLS
Встроенная CA выдаёт каждому node сертификат с cluster ID, role и node ID. Managers и workers взаимно аутентифицируют control-plane соединения через mTLS; сертификаты автоматически обновляются до истечения NodeCertExpiry.
Join token нужен только для присоединения и содержит CA digest и секрет роли. Его ротация блокирует новые join со старым token, но не отзывает сертификаты уже присоединённых nodes.
3. Autolock и ключи на диске
Managers хранят Raft state, включая configs и secrets. Autolock шифрует ключ, которым Engine открывает это состояние после рестарта. Пока operator не введёт unlock key, node показывает locked и не участвует в manager duties.
Unlock key должен храниться вне кластера в secret manager с резервной копией и контролем доступа. Потеря ключа при остановке всех managers означает потерю возможности открыть Raft state.
4. CA rotation и границы защиты
CA rotation создаёт новый root, временно использует cross-signing и перевыпускает node certificates. Изменение CA fingerprint и serial подтверждает ротацию. Операция меняет доверительную основу кластера и не является обычным cleanup.
mTLS не заменяет firewall, host hardening, image provenance и минимальные privileges. Swarm control и overlay ports доступны только между nodes выделенной сети.
5. Методические указания
- Перед изменением проверьте три Ready managers
- Не печатайте join token в журнал
- Создавайте unlock file с umask 077
- Перезапускайте один manager
- Сначала unlock и quorum, затем CA rotation
- После проверки удалите временный ключ
6. Лабораторная работа: identity baseline
Снимите CA config и поля node certificates. OU показывает manager role, CN — node ID, issuer — swarm-ca.
ssh swarm-manager-3 docker info --format 'swarm={{.Swarm.LocalNodeState}} control={{.Swarm.ControlAvailable}} node={{.Swarm.NodeID}}'
ssh swarm-manager-3 docker swarm inspect --format '{{json .Spec.CAConfig}}'
ssh swarm-manager-3 docker node ls
for host in swarm-manager-1 swarm-manager-2 swarm-manager-3; do ssh "$host" sudo openssl x509 -in /var/lib/docker/swarm/certificates/swarm-node.crt -noout -subject -issuer -serial -dates; done7. Лабораторная работа: join token rotation
Смените оба токена, перенаправив чувствительный вывод. Существующие nodes должны остаться Ready.
ssh swarm-manager-3 docker swarm join-token --rotate manager >/dev/null
ssh swarm-manager-3 docker swarm join-token --rotate worker >/dev/null
ssh swarm-manager-3 docker node ls8. Лабораторная работа: autolock и unlock
Включите autolock, сохраните ключ во временный файл mode 0600, перезапустите один manager и наблюдайте locked. Передайте ключ через stdin, удалите файл и подтвердите Reachable.
umask 077
ssh swarm-manager-3 docker swarm update --autolock=true >/dev/null
ssh swarm-manager-3 docker swarm unlock-key -q > /tmp/swarm-m19-unlock
ssh swarm-manager-1 sudo systemctl restart docker
sleep 8
ssh swarm-manager-1 docker info --format '{{.Swarm.LocalNodeState}}'
cat /tmp/swarm-m19-unlock | ssh swarm-manager-1 sudo docker swarm unlock
rm -f /tmp/swarm-m19-unlock
sleep 12
ssh swarm-manager-3 docker node ls9. Лабораторная работа: CA rotation и диагностика
Сравните fingerprint и serial до и после ротации, затем проверьте quorum, replicas и HTTPS.
ssh swarm-manager-3 docker swarm ca | openssl x509 -noout -fingerprint -sha256
ssh swarm-manager-1 sudo openssl x509 -in /var/lib/docker/swarm/certificates/swarm-node.crt -noout -serial
ssh swarm-manager-3 docker swarm ca --rotate >/dev/null
sleep 20
ssh swarm-manager-3 docker swarm ca | openssl x509 -noout -fingerprint -sha256
ssh swarm-manager-1 sudo openssl x509 -in /var/lib/docker/swarm/certificates/swarm-node.crt -noout -serial
ssh swarm-manager-3 docker node ls
ssh swarm-manager-3 docker service ls
curl --fail --show-error --output /dev/null https://swarm-demo.goretskiy.pro/- node locked — нужен действующий unlock key
- Down после unlock — проверяйте Engine и manager traffic
- сертификат не обновился — проверьте CA rotation status и время
- service 3/3, но HTTPS недоступен — проверяйте ingress path отдельно
10. Контроль, критерии освоения и cleanup
- Что удостоверяет node certificate?
- Что инвалидирует token rotation?
- Что защищает autolock?
- Почему unlock key нельзя хранить на manager?
- Зачем cross-signing при CA rotation?
- Какие проверки подтверждают успех?
Модуль освоен, если вы наблюдали locked, восстановили manager, получили новые CA fingerprint и node serial при сохранении 3/3. Cleanup удаляет временный ключ и отключает учебный autolock; новая CA остаётся штатной CA кластера.
rm -f /tmp/swarm-m19-unlock
ssh swarm-manager-3 docker swarm update --autolock=false >/dev/null
ssh swarm-manager-3 docker info --format 'autolock={{.Swarm.Cluster.Spec.EncryptionConfig.AutoLockManagers}} rotation={{.Swarm.Cluster.Spec.CAConfig.NodeCertExpiry}}'
ssh swarm-manager-3 docker node ls
ssh swarm-manager-3 docker service ls