대상 OS: Rocky Linux 9

디스크 암호화(LUKS)는 “서버가 꺼졌을 때 데이터가 그대로 털리는” 사고를 크게 줄여줍니다.
하지만 운영 현실에서는 재부팅 때마다 사람이 콘솔에 들어가 패스프레이즈를 넣기 어렵고, 그 불편함 때문에 암호화를 포기하는 경우가 많습니다.
Rocky Linux 9에서는 NBDE(Network-Bound Disk Encryption)로 이 딜레마를 줄일 수 있습니다.
즉, 부팅 시 Tang 서버(키 에스크로 역할)로부터 네트워크 기반으로 자동 해제하되, Tang이 없으면 해제가 안 되게 만들어 “물리적으로 빼간 디스크”를 무력화합니다.
오늘은 Clevis+Tang 조합으로 NBDE를 구성하고, 키 회수/교체/장애 대응까지 운영 관점에서 정리합니다.

---

# I. 위협 모델과 설계 원칙(암호화를 ‘운영 가능하게’ 만들기)

1) 이 방식이 강한 상황

- 디스크/서버를 통째로 탈취(폐기/반납/이전 중 분실)
- 스토리지 스냅샷 유출(암호화 블록만 남아야 함)

2) 이 방식이 약한 상황

- 공격자가 Tang 서버 네트워크에 접근 가능한 내부 침해(네트워크 경계가 무너지면 위험)
- Tang 서버 자체가 탈취(키 에스크로가 뚫리면 전체가 위험)

3) 운영 원칙

- Tang은 “관리망”에서만 접근 가능하게(방화벽/라우팅)
- 자동 해제는 편하지만, 비상 시 수동 해제 경로(콘솔 패스프레이즈)도 반드시 유지
- 키 회수(Revocation)와 교체(Rotation) 절차를 문서화

---

# II. 구성 개요: Tang 서버 1대 + LUKS 클라이언트(암호화 대상)

1) Tang 서버 역할

- 클라이언트가 부팅 중 Clevis가 요청하면, Tang이 공개 정보를 제공해 LUKS 슬롯을 해제할 수 있게 도움
- Tang이 “없으면” 자동 해제가 불가능

2) 클라이언트 역할

- LUKS 볼륨에 Clevis 바인딩 정보를 저장
- initramfs 단계에서 네트워크가 올라오면 자동 해제 시도

---

# III. Tang 서버 구축(Rocky Linux 9)

1) 패키지 설치

sudo dnf install -y tang firewalld
sudo systemctl enable --now tangd.socket
sudo systemctl enable --now firewalld

2) Tang 포트 개방(기본 80/tcp 사용 사례가 많음)

- Tang은 HTTP 기반으로 동작하는 경우가 일반적입니다.
- 운영에서는 반드시 “관리망에서만” 접근되도록 소스 대역 제한을 추가하세요.

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

3) Tang 서비스 확인

sudo systemctl --no-pager -l status tangd.socket | sed -n '1,60p'
ss -lntp | grep ':80' || true

4) (권장) Tang 키 지문을 미리 기록해 두기

- 클라이언트 바인딩 시 “이 Tang가 맞는지” 확인하는 용도입니다.

curl -fsS http://127.0.0.1/adv | sha256sum

---

# IV. 클라이언트 준비: LUKS 장치 식별과 안전 점검

1) 암호화 대상 디바이스 확인

- 아래는 예시입니다. 실제 환경에서는 실수로 OS 디스크를 날리지 않도록 반드시 두 번 확인하세요.

lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
sudo blkid

2) LUKS 여부/상태 확인

sudo cryptsetup luksDump /dev/ 2>/dev/null || true

- 이미 LUKS라면 기존 키 슬롯을 건드리지 않게 주의합니다.
- 아직 LUKS가 아니라면, 먼저 LUKS로 초기화/포맷 계획을 세운 뒤 진행해야 합니다(데이터 파괴 가능).

---

# V. Clevis 설치 및 Tang 바인딩(클라이언트)

1) 패키지 설치

sudo dnf install -y clevis clevis-luks clevis-dracut

2) Tang 서버 접근 확인

curl -fsS http:///adv | head

3) LUKS에 Tang 바인딩 추가

- `-s`는 사용할 LUKS 슬롯을 지정합니다.
- 운영에서는 “기존 수동 패스프레이즈 슬롯”을 남기고, 새 슬롯 하나를 Clevis에 할당하는 방식이 안전합니다.

sudo clevis luks bind -d /dev/ tang '{"url":"http://"}'

4) 바인딩 테스트(즉시 해제 시도)

sudo clevis luks list -d /dev/
sudo clevis luks unlock -d /dev/ -n nbde_test
sudo cryptsetup status nbde_test || true
sudo cryptsetup close nbde_test || true

---

# VI. 부팅 자동 해제 활성화: initramfs(dracut) 갱신

1) dracut로 initramfs 재생성

sudo dracut -f

2) 다음 부팅에서 네트워크가 올라오는지 확인(중요)

- NBDE는 initramfs 단계에서 네트워크가 필요합니다.
- 서버가 DHCP/정적 IP/본딩/VLAN 등 복잡하면, initramfs에서 네트워크가 안 올라와 자동 해제가 실패할 수 있습니다.

(운영 환경마다 설정이 다르므로, 부팅 후 아래 로그로 결과를 확인하는 습관이 중요합니다.)

sudo journalctl -b --no-pager | egrep -i 'clevis|tang|dracut|crypt|luks' | tail -n 200

---

# VII. 장애 대비: Tang 장애/네트워크 단절 시의 복구 경로

1) 절대 하지 말아야 할 것

- 수동 패스프레이즈 슬롯을 제거한 뒤 NBDE만 남기는 것
- Tang 장애가 곧 전체 서비스 중단으로 이어집니다.

2) 안전한 기본값

- “수동 패스프레이즈” 1개 이상 유지
- Tang 서버 2대 구성(가능하면)
- Tang 접근은 관리망에서만 허용

3) 수동 해제 절차(콘솔)

sudo cryptsetup luksOpen /dev/ cryptdata

---

# VIII. 키 회수/교체 운영: ‘Tang 바인딩 해제’와 ‘재바인딩’

1) 현재 바인딩 목록 확인

sudo clevis luks list -d /dev/

2) 특정 슬롯의 Clevis 바인딩 해제(회수)

- 슬롯 번호는 환경에 따라 다릅니다.

sudo clevis luks unbind -d /dev/ -s 

3) Tang 교체/이전(재바인딩)

- Tang 서버를 교체하거나, 키를 로테이션해야 할 때는 “unbind → bind → dracut -f → 테스트 부팅” 흐름을 표준화하세요.

sudo clevis luks bind -d /dev/ tang '{"url":"http://"}'
sudo dracut -f

---

# IX. 보안 하드닝 체크: Tang 서버를 ‘키 인프라’로 다루기

1) Tang 접근 제한(관리망 소스 IP로만)

- 아래는 예시이며, 실제 대역에 맞춰 조정하세요.

sudo firewall-cmd --permanent --remove-service=http
sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.0.0.0/24 service name=http accept'
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

2) Tang 서버 최소화

- Tang 서버에는 불필요한 서비스/패키지를 올리지 않고, 업데이트를 빠르게 적용합니다.

sudo dnf update -y
sudo systemctl --failed --no-pager

3) 가시성 확보

- Tang 접근 로그(프록시/로드밸런서/방화벽 로그)를 남기면, 이상 징후 탐지에 도움이 됩니다.

---

# X. 결론: “암호화는 해야 하는데 운영이 무섭다”를 해결하는 패턴

1) NBDE는 자동화로 편의성을 얻고, Tang/네트워크 경계로 보안성을 확보한다

2) 수동 해제 경로를 남겨 ‘완전 잠김’을 방지한다

3) unbind/bind/dracut/test를 하나의 운영 런북으로 만든다