SSH로 LUKS 원격 잠금 해제: dropbear-initramfs와 cryptroot-unlock
원격 서버의 LUKS 루트를 부팅 시 잠금 해제하세요. dropbear-initramfs를 설치하고, 키를 추가하고, 포트와 IP를 설정하고, initramfs를 재생성한 뒤 SSH로 접속해 cryptroot-unlock을 실행합니다.
짧은 답변: `dropbear-initramfs`를 설치하고, SSH 공개 키를 `/etc/dropbear/initramfs/authorized_keys`(Debian 12/13, Ubuntu 24.04)에 넣고, initramfs에 네트워크 설정을 준 다음 `update-initramfs -u`를 실행하고 재부팅하세요. 서버가 패스프레이즈를 기다리는 동안 별도 포트의 작은 Dropbear 서버에 SSH로 접속해 `cryptroot-unlock`을 실행하면 부팅이 정상적으로 계속됩니다.
이 가이드는 LUKS 암호화 루트 가이드에서처럼 루트 파일 시스템이 이미 LUKS 위에 있고, Debian과 Ubuntu 설치 프로그램의 기본값대로 `/boot`가 암호화되지 않았다고 가정합니다. 커널과 initramfs를 직접 제어할 수 있는 모든 KVM VPS에서 작동하며, 소형 VPS 셀프호스팅 스택의 서비스들을 디스크에 올리기 전에 갖춰 두기 좋은 기반입니다.
원격 잠금 해제의 작동 방식
암호화된 루트 시스템에서 커널은 먼저 initramfs를 불러옵니다. initramfs는 `/boot`에 암호화되지 않은 상태로 저장된 작은 임시 루트 파일 시스템입니다. 그 역할은 LUKS 장치를 찾고, 패스프레이즈를 묻고, 장치를 열어 실제 루트로 넘겨주는 것입니다. 보통 프롬프트는 로컬 콘솔에만 나타납니다.
`dropbear-initramfs`는 initramfs에 세 가지를 추가합니다. Dropbear SSH 서버, 네트워크 설정 단계, 그리고 `cryptroot-unlock` 도우미입니다. Dropbear는 패스프레이즈 프롬프트 전에 시작되어 미리 넣어 둔 키로만 공개 키 로그인을 허용하며, `cryptroot-unlock`은 당신의 패스프레이즈를 대기 중인 `cryptsetup` 프롬프트로 전달합니다. 루트가 열리면 initramfs가 Dropbear를 종료하고 실제 OpenSSH 서버가 평소처럼 시작됩니다.
버전에 따라 다른 파일 경로
Dropbear 2022.83이 도입되면서 설정 디렉터리가 이동했습니다. 많은 오래된 튜토리얼이 여전히 이전 경로를 보여 주며, 그곳에 둔 키는 현재 릴리스에서 아무 경고 없이 무시됩니다. 명령어를 복사하기 전에 릴리스를 확인하세요.
Note · 옵션 파일은 모든 릴리스에서 같은 디렉터리의 `dropbear.conf`입니다. initramfs 호스트 키(`dropbear_ed25519_host_key` 등)도 그곳에 있으며, 실행 중인 시스템의 OpenSSH 호스트 키와는 별개입니다.
| 릴리스 | 설정 디렉터리 | 키 파일 |
|---|---|---|
| Debian 13 (trixie) | `/etc/dropbear/initramfs/` | `/etc/dropbear/initramfs/authorized_keys` |
| Debian 12 (bookworm) | `/etc/dropbear/initramfs/` | `/etc/dropbear/initramfs/authorized_keys` |
| Ubuntu 24.04 (noble) | `/etc/dropbear/initramfs/` | `/etc/dropbear/initramfs/authorized_keys` |
| Debian 11, Ubuntu 22.04 및 이전 | `/etc/dropbear-initramfs/` | `/etc/dropbear-initramfs/authorized_keys` |
Debian 12/13 및 Ubuntu 24.04 단계별 설정
- 01.패키지를 설치하세요: `apt install dropbear-initramfs`. 이 시점에 `authorized_keys` 파일이 없거나 유효하지 않다는 경고가 나오는 것은 정상입니다.
- 02.공개 키(가급적 전용 Ed25519 키)를 `/etc/dropbear/initramfs/authorized_keys`에 한 줄에 하나씩 추가하고, 잠금 해제만 할 수 있도록 제한하세요.
- 03.`/etc/dropbear/initramfs/dropbear.conf`에서 Dropbear 옵션을 설정하세요. initramfs 호스트 키가 `known_hosts`의 일반 SSH 호스트 키와 충돌하지 않도록 기본값이 아닌 포트를 지정합니다.
- 04.`ip=` 커널 파라미터(고정)로 initramfs 네트워크를 설정하거나, VPS 네트워크가 지원한다면 DHCP에 맡기세요.
- 05.`update-initramfs -u`로 initramfs를 재생성하고, 커널 명령줄을 변경했다면 `update-grub`을 실행하세요.
- 06.대비책으로 콘솔 접속을 열어 둔 채 재부팅한 다음, 접속해 `cryptroot-unlock`을 실행하세요.
apt install dropbear-initramfs
# 1. Key (forced command: the key can only unlock)
echo 'no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="/bin/cryptroot-unlock" ssh-ed25519 AAAA...yourkey unlock@laptop' \
> /etc/dropbear/initramfs/authorized_keys
chmod 600 /etc/dropbear/initramfs/authorized_keys
# 2. Options in /etc/dropbear/initramfs/dropbear.conf
# -p 2222 listen on port 2222
# -s disable password logins
# -j -k no local/remote port forwarding
# -I 300 drop idle sessions after 300 s
DROPBEAR_OPTIONS="-p 2222 -s -j -k -I 300"
# 3. Rebuild
update-initramfs -uinitramfs의 네트워크 설정
initramfs는 `/etc/network/interfaces`, netplan, systemd-networkd를 읽지 않습니다. 커널 `ip=` 파라미터나 `/etc/initramfs-tools/initramfs.conf`의 `IP=` 줄을 사용합니다. 둘 다 설정하지 않으면 모든 인터페이스에서 DHCP를 시도하는데, 많은 클라우드에서는 작동하지만 고정 할당을 쓰는 VPS에서는 보장되지 않습니다.
형식은 `ip=<client-ip>::<gateway-ip>:<netmask>:<hostname>:<device>:off`입니다. 실행 중인 시스템에서 `ip -4 addr`와 `ip route`로 얻은 값을 사용하세요. initramfs 안의 인터페이스 이름은 보통 같은 예측 가능한 이름(예: `ens3` 또는 `eth0`)입니다. 확실하지 않다면 장치 필드를 비워 두면 첫 번째 인터페이스가 사용됩니다. initramfs 네트워크 단계의 IPv6 지원은 제한적이므로 여기서는 IPv4가 확실한 선택입니다.
# /etc/default/grub (static IPv4 example, documentation addresses)
GRUB_CMDLINE_LINUX="ip=203.0.113.10::203.0.113.1:255.255.255.0::ens3:off"
update-grub
update-initramfs -u
# From your workstation after reboot:
ssh -p 2222 [email protected]
# without the forced command, type: cryptroot-unlock잠금 해제와 일상적인 사용
재부팅 후 서버가 2222번 포트에서 응답할 때까지 기다린 다음 `root`로 접속하세요. 설정 단계의 강제 명령이 있다면 `cryptroot-unlock`이 즉시 시작되어 LUKS 패스프레이즈를 묻습니다. 없다면 BusyBox 셸이 나오므로 직접 `cryptroot-unlock`을 입력하세요. 성공하면 세션이 닫히고 initramfs가 부팅을 계속하며, 1분쯤 후 SSH 강화 가이드대로 강화된 일반 SSH 서버가 22번 포트에서 응답합니다.
잠금 해제 포트에는 별도의 `known_hosts` 항목을 사용하세요. 예를 들어 `~/.ssh/config`에 `Port 2222`와 `HostKeyAlias myserver-unlock`이 있는 `Host myserver-unlock` 블록을 만듭니다. 커널이 업데이트될 때마다 Debian과 Ubuntu는 initramfs를 재생성하면서 Dropbear 키와 옵션을 유지하지만, 메이저 업그레이드 후에는 한 번 재부팅해 테스트하세요.
- ▹Connection refused: 네트워크 설정이 잘못되었습니다. 콘솔에서 `ip=` 값을 확인하세요.
- ▹호스트 키 경고: 일반 별칭으로 initramfs 호스트 키에 접속하고 있습니다. 별도 별칭을 사용하세요.
- ▹`cryptroot-unlock`이 대기 중인 장치가 없다고 표시: 시스템이 이미 부팅되었거나 `/etc/crypttab`에 루트 항목이 없습니다.
- ▹키 변경이 반영되지 않음: 이전 경로 `/etc/dropbear-initramfs/`를 수정했거나 `update-initramfs -u`를 잊었습니다.
위협 모델: 원격 잠금 해제가 보호하는 것과 보호하지 않는 것
원격 잠금 해제를 갖춘 LUKS는 저장된 데이터를 보호합니다. 전원이 꺼진 디스크, 복사된 디스크 이미지, 폐기된 드라이브, 꺼진 상태에서 압수된 서버에서는 암호문만 드러납니다. 이는 VPS에 실질적이고 유용한 보장입니다.
하지만 호스트를 통제하는 사람으로부터 실행 중인 서버를 보호하지는 못합니다. `/boot`의 initramfs와 커널은 암호화되지 않았으므로, 하이퍼바이저나 콘솔 접근 권한이 있는 사람은 이를 수정해 다음 부팅 때 패스프레이즈를 기록할 수 있고, LUKS 마스터 키를 포함한 실행 중인 VM의 메모리는 호스트에서 읽을 수 있습니다. 원격 잠금 해제는 적대적인 하이퍼바이저가 아니라 압수와 디스크 유출에 대한 보호로 생각하세요. Dropbear 호스트 키 변경 같은 재부팅 시의 이상 징후는 조사할 가치가 있습니다.
Note · NoctisNode VPS에서는 Debian 13/12 및 Ubuntu 24.04 이미지로 KVM 위의 전체 root 권한을 얻으므로, 이 설정이 설명대로 작동합니다. 어디서나 마찬가지로 같은 한계가 적용됩니다. 암호화는 디스크를 보호할 뿐 실행 중인 게스트를 보호하지 않습니다. 업체 측에서 무엇을 기록하고 기록하지 않는지는 노로그 VPS 설명을 참고하세요.
FAQ
QDebian 12에서 dropbear initramfs의 authorized_keys 파일은 어디에 있나요?
ADebian 12와 13, Ubuntu 24.04에서는 `/etc/dropbear/initramfs/authorized_keys`입니다. Debian 11과 Ubuntu 22.04는 `/etc/dropbear-initramfs/authorized_keys`를 사용했습니다. 변경 후에는 `update-initramfs -u`를 실행하세요.
Qcryptroot-unlock은 무엇을 하나요?
A`cryptroot-unlock`은 initramfs 안의 도우미로, 대기 중인 LUKS 패스프레이즈 프롬프트를 찾아 입력한 패스프레이즈를 전달합니다. 장치가 열리면 부팅이 계속되고 Dropbear 세션이 종료됩니다.
Qdropbear-initramfs의 SSH 포트를 변경하려면 어떻게 하나요?
A`/etc/dropbear/initramfs/dropbear.conf`에 `DROPBEAR_OPTIONS="-p 2222"`(및 기타 플래그)를 설정한 다음 `update-initramfs -u`를 실행하고 재부팅하세요.
QVPS에서 SSH를 통한 LUKS 원격 잠금 해제는 안전한가요?
A전원이 꺼지거나 복사된 디스크의 데이터를 보호합니다. 암호화되지 않은 initramfs를 변경하거나 실행 중인 VM의 메모리를 읽을 수 있는 하이퍼바이저 접근 권한자로부터는 보호하지 못합니다.
Qdropbear-initramfs와 함께 LUKS2를 쓸 수 있나요?
A네. 잠금 해제는 Linux 사용자 공간에서 `cryptsetup`으로 이루어지므로 Argon2id를 사용하는 LUKS2도 작동합니다. 형식 차이는 LUKS2 vs LUKS1을 참고하세요.