스웜을 잠가서 암호화 키 보호하기

스웜을 잠가서 암호화 키 보호하기

스웜 매니저가 사용하는 Raft 로그는 기본적으로 디스크에 암호화되어 저장돼요. 이렇게 저장된 암호화 데이터는 서비스 설정과 데이터를 보호해 주는데, Docker가 재시작될 때 매니저 노드의 메모리에 키가 로드되면서 보안에 취약해질 수 있죠. 이럴 때 자동 잠금(autolock) 기능을 쓰면 키를 직접 관리하면서 매니저를 수동으로 잠금 해제해야만 사용할 수 있게 만들 수 있어요. Docker가 재시작되면 스웜을 잠글 때 생성된 키 암호화 키를 사용해서 먼저 잠금을 해제해야 하고, 이 키 암호화 키는 언제든 회전할 수 있어요.

출처: 공식문서

본문

참고

새 노드가 스웜에 조인할 때는 잠금 해제가 필요 없어요. 키가 상호 TLS를 통해 새 노드로 전달되거든요.

자동 잠금을 활성화한 상태로 스웜 초기화하기

새 스웜을 초기화할 때 --autolock 플래그를 사용하면 Docker가 재시작될 때 스웜 매니저 노드가 자동으로 잠겨요.

$ 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가 재시작되면 스웜을 잠금 해제해야 해요. 잠긴 상태에서는 서비스를 시작하거나 재시작할 때 다음과 같은 오류가 발생해요.

$ 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.

기존 스웜에서 자동 잠금 활성화/비활성화하기

기존 스웜에서 자동 잠금을 켜려면 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.

자동 잠금을 끄려면 --autolockfalse로 설정하면 돼요. 이 경우 상호 TLS 키와 Raft 로그를 읽고 쓰는 데 사용하는 암호화 키가 디스크에 암호화되지 않은 상태로 저장돼요. 암호화 키를 평문으로 저장할 때의 보안 위험과, 매니저를 일일이 잠금 해제하지 않아도 되는 편리함 사이에 트레이드오프가 있다고 볼 수 있어요.

$ docker swarm update --autolock=false

자동 잠금을 끈 후에도 잠금 해제 키를 잠시 동안 보관해 두는 게 좋아요. 매니저가 여전히 이전 키로 잠금을 설정한 상태에서 다운될 수 있거든요.

스웜 잠금 해제하기

잠긴 스웜을 해제하려면 docker swarm unlock 명령을 사용해요.

$ docker swarm unlock

Please enter unlock key:

스웜을 잠그거나 키를 회전할 때 출력된 암호화 키를 입력하면 잠금이 해제돼요.

실행 중인 스웜의 현재 잠금 해제 키 확인하기

스웜이 정상적으로 실행되고 있는데 매니저 노드 하나가 사용 불가능해진 상황을 생각해 볼게요. 문제를 해결하고 물리적 노드를 다시 온라인 상태로 만들었지만, 암호화된 자격 증명과 Raft 로그를 읽으려면 잠금 해제 키를 입력해서 매니저를 잠금 해제해야 해요.

노드가 스웜을 떠난 이후 키가 회전되지 않았고, 스웜에 쿼럼(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 --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.

경고

잠금 해제 키를 회전할 때는 이전 키를 몇 분간 기록해 두세요. 매니저가 새 키를 받기 전에 다운되면 이전 키로 잠금을 해제해야 할 수 있어요.

더 알아보기