15.3. Tang 서버 암호화 키 관리
암호화 키를 다시 생성하는 암호화 메커니즘은 노드에 저장된 인식되지 않은 키와 관련 Tang 서버의 개인 키를 기반으로 합니다. Tang 서버 개인 키와 노드의 암호화된 디스크를 모두 취득한 공격자의 가능성을 보호하기 위해 주기적으로 다시 키를 변경하는 것이 좋습니다.
Tang 서버에서 이전 키를 삭제하려면 모든 노드에 대해 키 다시 입력 작업을 수행해야 합니다. 다음 섹션에서는 이전 키를 다시 키우고 삭제하는 절차를 제공합니다.
15.3.1. Tang 서버의 키 백업
Tang 서버는 /usr/libexec/tangd-keygen
을 사용하여 새 키를 생성하고 기본적으로 /var/db/tang
디렉터리에 저장합니다. 오류가 발생할 경우 Tang 서버를 복구하려면 이 디렉터리를 백업하십시오. 키는 민감하며, 사용된 모든 호스트의 부팅 디스크 암호 해독을 수행할 수 있기 때문에 키를 적절하게 보호해야 합니다.
절차
-
/var/db/tang
디렉토리에서 키를 복원할 수 있는 temp 디렉토리로 백업 키를 복사합니다.
15.3.2. Tang 서버의 키 복구
백업에서 키에 액세스하여 Tang 서버의 키를 복구할 수 있습니다.
절차
백업 폴더에서
/var/db/tang/
디렉터리로 키를 복원합니다.Tang 서버가 시작되면 이 복원된 키를 알리고 사용합니다.
15.3.3. Tang 서버 키 다시 지정
이 절차에서는 각각 고유한 키가 있는 세 개의 Tang 서버 세트를 예제로 사용합니다.
중복된 Tang 서버를 사용하면 노드가 자동으로 부팅되지 않을 가능성이 줄어듭니다.
Tang 서버 및 연결된 모든 NBDE 암호화 노드를 다시 입력하는 것은 3단계 절차입니다.
사전 요구 사항
- 하나 이상의 노드에 작동하는 NBDE(Network-Bound Disk Encryption)를 설치합니다.
절차
- 새 Tang 서버 키를 생성합니다.
- 새 키를 사용하도록 모든 NBDE 암호화 노드를 다시 입력합니다.
이전 Tang 서버 키를 삭제합니다.
참고모든 NBDE 암호화 노드가 키 변경을 완료하기 전에 이전 키를 삭제하면 해당 노드가 다른 구성된 Tang 서버에 지나치게 의존하게 됩니다.
그림 15.1. Tang 서버 재키핑을 위한 워크플로우 예
15.3.3.1. 새 Tang 서버 키 생성
사전 요구 사항
- Tang 서버를 실행하는 Linux 시스템의 root 쉘입니다.
Tang 서버 키 교체를 쉽게 확인하려면 이전 키를 사용하여 작은 테스트 파일을 암호화합니다.
# echo plaintext | clevis encrypt tang '{"url":"http://localhost:7500”}' -y >/tmp/encrypted.oldkey
암호화에 성공하고 파일을 해독하여 동일한 문자열
plaintext
를 생성할 수 있는지 확인합니다.# clevis decrypt </tmp/encrypted.oldkey
절차
Tang 서버 키를 저장하는 디렉터리를 찾아 액세스합니다. 일반적으로
/var/db/tang
디렉토리입니다. 현재 공개된 키 지문을 확인합니다.# tang-show-keys 7500
출력 예
36AHjNH3NZDSnlONLz1-V4ie6t8
Tang 서버 키 디렉토리를 입력합니다.
# cd /var/db/tang/
현재 Tang 서버 키를 나열합니다.
# ls -A1
출력 예
36AHjNH3NZDSnlONLz1-V4ie6t8.jwk gJZiNPMLRBnyo_ZKfK4_5SrnHYo.jwk
일반적인 Tang 서버 작업 중에는 이 디렉터리에 두 개의
.jwk
파일이 있습니다. 하나는 서명 및 확인용이고 다른 하나는 키 파생을 위한 것입니다.이전 키의 알림을 비활성화합니다.
# for key in *.jwk; do \ mv -- "$key" ".$key"; \ done
새 클라이언트는 NBDE(Network-Bound Disk Encryption) 또는 요청 키를 설정해도 더 이상 이전 키가 표시되지 않습니다. 기존 클라이언트는 삭제될 때까지 이전 키에 계속 액세스하고 사용할 수 있습니다. Tang 서버는 UNIX 숨겨진 파일에 저장된 키를 읽지만 알림은 하지 않으며
.
문자로 시작합니다.새 키를 생성합니다.
# /usr/libexec/tangd-keygen /var/db/tang
현재 Tang 서버 키를 나열하여 이전 키가 현재 숨겨진 파일이고 새 키가 있는지 확인합니다.
# ls -A1
출력 예
.36AHjNH3NZDSnlONLz1-V4ie6t8.jwk .gJZiNPMLRBnyo_ZKfK4_5SrnHYo.jwk Bp8XjITceWSN_7XFfW7WfJDTomE.jwk WOjQYkyK7DxY_T5pMncMO5w0f6E.jwk
Tang은 새 키를 자동으로 알립니다.
참고보다 최근 Tang 서버 설치에는 광고 비활성화 및 새 키를 동시에 생성하는 도우미
/usr/libexec/tangd-rotate-keys
디렉토리가 있습니다.- 동일한 주요 자료를 공유하는 로드 밸런서 장치에서 여러 Tang 서버를 실행하는 경우, 계속하기 전에 여기서 변경한 사항이 전체 서버 집합에서 올바르게 동기화되는지 확인하십시오.
검증
Tang 서버가 새 키를 알리고 이전 키를 알리지 않는지 확인합니다.
# tang-show-keys 7500
출력 예
WOjQYkyK7DxY_T5pMncMO5w0f6E
이전 키가 보급되지는 않았지만 암호 해독 요청에 계속 사용할 수 있는지 확인합니다.
# clevis decrypt </tmp/encrypted.oldkey
15.3.3.2. 모든 NBDE 노드 키 다시 지정
원격 클러스터에 다운타임을 발생시키지 않고 DaemonSet
오브젝트를 사용하여 원격 클러스터의 모든 노드를 다시 입력할 수 있습니다.
노드를 다시 시작하는 동안 전원이 손실되는 경우 부팅할 수 없게 될 수 있으며 RHACM(Red Hat Advanced Cluster Management) 또는 GitOps 파이프라인을 통해 다시 배포해야 합니다.
사전 요구 사항
-
NBDE(Network-Bound Disk Encryption) 노드가 있는 모든 클러스터에 대한
cluster-admin
액세스가 있어야 합니다. - Tang 서버의 키가 변경되지 않은 경우에도 모든 Tang 서버는 재키를 수행하는 모든 EgressIP 노드에서 액세스할 수 있어야 합니다.
- Tang 서버 URL과 모든 Tang 서버의 키 지문을 가져옵니다.
절차
다음 템플릿을 기반으로
DaemonSet
오브젝트를 생성합니다. 이 템플릿은 3개의 중복 Tang 서버를 설정하지만 다른 상황에 맞게 쉽게 조정할 수 있습니다.NEW_TANG_PIN
환경의 Tang 서버 URL과 지문을 사용자 환경에 맞게 변경합니다.apiVersion: apps/v1 kind: DaemonSet metadata: name: tang-rekey namespace: openshift-machine-config-operator spec: selector: matchLabels: name: tang-rekey template: metadata: labels: name: tang-rekey spec: containers: - name: tang-rekey image: registry.access.redhat.com/ubi8/ubi-minimal:8.4 imagePullPolicy: IfNotPresent command: - "/sbin/chroot" - "/host" - "/bin/bash" - "-ec" args: - | rm -f /tmp/rekey-complete || true echo "Current tang pin:" clevis-luks-list -d $ROOT_DEV -s 1 echo "Applying new tang pin: $NEW_TANG_PIN" clevis-luks-edit -f -d $ROOT_DEV -s 1 -c "$NEW_TANG_PIN" echo "Pin applied successfully" touch /tmp/rekey-complete sleep infinity readinessProbe: exec: command: - cat - /host/tmp/rekey-complete initialDelaySeconds: 30 periodSeconds: 10 env: - name: ROOT_DEV value: /dev/disk/by-partlabel/root - name: NEW_TANG_PIN value: >- {"t":1,"pins":{"tang":[ {"url":"http://tangserver01:7500","thp":"WOjQYkyK7DxY_T5pMncMO5w0f6E"}, {"url":"http://tangserver02:7500","thp":"I5Ynh2JefoAO3tNH9TgI4obIaXI"}, {"url":"http://tangserver03:7500","thp":"38qWZVeDKzCPG9pHLqKzs6k1ons"} ]}} volumeMounts: - name: hostroot mountPath: /host securityContext: privileged: true volumes: - name: hostroot hostPath: path: / nodeSelector: kubernetes.io/os: linux priorityClassName: system-node-critical restartPolicy: Always serviceAccount: machine-config-daemon serviceAccountName: machine-config-daemon
이 경우
tangserver01
을 다시 입력하더라도tangserver01
의 새 지문뿐만 아니라 다른 모든 Tang 서버의 현재 지문도 지정해야 합니다. 키 재지정 작업의 모든 지문을 지정하지 않으면 메시지 가로채기 공격의 기회가 열립니다.다시 키를 지정해야 하는 모든 클러스터에 데몬 세트를 배포하려면 다음 명령을 실행합니다.
$ oc apply -f tang-rekey.yaml
그러나 대규모로 실행하려면 ACM 정책에서 데몬 세트를 래핑합니다. 이 ACM 구성에는 데몬 세트를 배포하기 위한 하나의 정책, 모든 데몬 세트 pod가 준비되었는지 확인하는 두 번째 정책 및 적절한 클러스터 세트에 적용하는 배치 규칙이 포함되어야 합니다.
데몬 세트가 모든 서버를 성공적으로 다시 시작했는지 확인한 후 데몬 세트를 삭제합니다. 데몬 세트를 삭제하지 않으면 다음 키 재지정 작업을 수행하기 전에 삭제해야 합니다.
검증
데몬 세트를 배포한 후 데몬 세트를 모니터링하여 키 지정 작업이 성공적으로 완료되었는지 확인합니다. 예제 데몬 세트의 스크립트는 키 재지정에 실패한 경우 오류와 함께 종료되고 성공한 경우 CURRENT
상태로 유지됩니다. 키 재지정이 성공적으로 완료되면 Pod를 READY
로 표시하는 준비 프로브도 있습니다.
다음은 키 재지정이 완료되기 전에 데몬 세트의 출력 목록의 예입니다.
$ oc get -n openshift-machine-config-operator ds tang-rekey
출력 예
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE tang-rekey 1 1 0 1 0 kubernetes.io/os=linux 11s
다음은 키 재지정을 성공적으로 완료한 후 데몬 세트의 출력 목록의 예입니다.
$ oc get -n openshift-machine-config-operator ds tang-rekey
출력 예
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE tang-rekey 1 1 1 1 1 kubernetes.io/os=linux 13h
키를 다시 입력하는 데는 일반적으로 몇 분이 소요됩니다.
ACM 정책을 사용하여 데몬 세트를 여러 클러스터에 배포하는 경우 모든 데몬 세트의 준비 수가 DESIRED 수인지 확인하는 규정 준수 정책을 포함해야 합니다. 이러한 방식으로 이러한 정책에 대한 규정 준수는 모든 데몬 세트 Pod가 READY이고 키 재지정이 성공적으로 완료되었음을 보여줍니다. ACM 검색을 사용하여 모든 데몬 세트 상태를 쿼리할 수도 있습니다.
15.3.3.3. Tang 서버의 임시 키 재지정 오류 문제 해결
Tang 서버를 다시 입력하는 오류 조건이 일시적인지 확인하려면 다음 절차를 수행합니다. 임시 오류 상태에는 다음이 포함될 수 있습니다.
- 임시 네트워크 중단
- Tang 서버 유지 관리
일반적으로 이러한 유형의 임시 오류 조건이 발생하면 데몬 세트가 오류를 성공적으로 해결하거나 데몬 세트를 삭제하고 임시 오류 조건이 해결될 때까지 다시 시도할 수 없습니다.
절차
- 일반적인 Kubernetes pod 재시작 정책을 사용하여 키 재지정 작업을 수행하는 Pod를 다시 시작합니다.
- 연결된 Tang 서버를 사용할 수 없는 경우 모든 서버가 다시 온라인 상태가 될 때까지 다시 키를 입력합니다.
15.3.3.4. Tang 서버의 영구적인 키 재지정 오류 문제 해결
Tang 서버를 다시 시작한 후 READY
수는 연장된 기간이 지나면 DESIRED
개수와 동일하지 않으므로 영구적인 오류 상태를 나타낼 수 있습니다. 이 경우 다음 조건이 적용될 수 있습니다.
-
NEW_TANG_PIN
정의의 Tang 서버 URL 또는 지문의 오타 오류입니다. - Tang 서버가 해제되거나 키가 영구적으로 손실됩니다.
사전 요구 사항
- 이 절차에 표시된 명령은 Tang 서버 또는 Tang 서버에 대한 네트워크 액세스 권한이 있는 Linux 시스템에서 실행할 수 있습니다.
절차
데몬 세트에 정의된 대로 각 Tang 서버의 구성에 대해 간단한 암호화 및 암호 해독 작업을 수행하여 Tang 서버 구성을 확인합니다.
이는 잘못된 지문이 있는 암호화 및 암호 해독 시도의 예입니다.
$ echo "okay" | clevis encrypt tang \ '{"url":"http://tangserver02:7500","thp":"badthumbprint"}' | \ clevis decrypt
출력 예
Unable to fetch advertisement: 'http://tangserver02:7500/adv/badthumbprint'!
올바른 지문이 있는 암호화 및 암호 해독 시도의 예입니다.
$ echo "okay" | clevis encrypt tang \ '{"url":"http://tangserver03:7500","thp":"goodthumbprint"}' | \ clevis decrypt
출력 예
okay
근본 원인을 확인한 후 기본 상황을 해결합니다.
- 작동하지 않는 데몬 세트를 삭제합니다.
데몬 세트 정의를 편집하여 기본 문제를 해결합니다. 여기에는 다음 작업이 포함될 수 있습니다.
- Tang 서버 항목을 편집하여 URL과 지문을 수정합니다.
- 더 이상 서비스 중이 아닌 Tang 서버를 제거합니다.
- 해제된 서버를 대체하는 새 Tang 서버를 추가합니다.
- 업데이트된 데몬 세트를 다시 배포합니다.
구성에서 Tang 서버를 교체, 제거 또는 추가할 때 현재 서버를 포함하여 하나 이상의 원본 서버가 계속 작동하는 한 키 재지정 작업이 성공적으로 수행됩니다. 원래 Tang 서버가 작동하지 않거나 복구할 수 없는 경우 시스템을 복구할 수 없으며 영향을 받는 노드를 다시 배포해야 합니다.
검증
데몬 세트의 각 pod에서 로그를 확인하여 키 재지정이 성공적으로 완료되었는지 확인합니다. 키 재지정에 성공하지 못하면 로그에 실패 조건이 표시될 수 있습니다.
데몬 세트에서 생성한 컨테이너의 이름을 찾습니다.
$ oc get pods -A | grep tang-rekey
출력 예
openshift-machine-config-operator tang-rekey-7ks6h 1/1 Running 20 (8m39s ago) 89m
컨테이너에서 로그를 출력합니다. 다음 로그는 성공적인 키 재지정 작업에서 가져온 것입니다.
$ oc logs tang-rekey-7ks6h
출력 예
Current tang pin: 1: sss '{"t":1,"pins":{"tang":[{"url":"http://10.46.55.192:7500"},{"url":"http://10.46.55.192:7501"},{"url":"http://10.46.55.192:7502"}]}}' Applying new tang pin: {"t":1,"pins":{"tang":[ {"url":"http://tangserver01:7500","thp":"WOjQYkyK7DxY_T5pMncMO5w0f6E"}, {"url":"http://tangserver02:7500","thp":"I5Ynh2JefoAO3tNH9TgI4obIaXI"}, {"url":"http://tangserver03:7500","thp":"38qWZVeDKzCPG9pHLqKzs6k1ons"} ]}} Updating binding... Binding edited successfully Pin applied successfully
15.3.4. 이전 Tang 서버 키 삭제
사전 요구 사항
- Tang 서버를 실행하는 Linux 시스템의 root 쉘입니다.
절차
Tang 서버 키가 저장된 디렉터리를 찾아 액세스합니다. 일반적으로
/var/db/tang
디렉토리입니다.# cd /var/db/tang/
공개된 키와 의도하지 않은 키를 표시하여 현재 Tang 서버 키를 나열합니다.
# ls -A1
출력 예
.36AHjNH3NZDSnlONLz1-V4ie6t8.jwk .gJZiNPMLRBnyo_ZKfK4_5SrnHYo.jwk Bp8XjITceWSN_7XFfW7WfJDTomE.jwk WOjQYkyK7DxY_T5pMncMO5w0f6E.jwk
이전 키를 삭제합니다.
# rm .*.jwk
현재 Tang 서버 키를 나열하여 의도하지 않은 키가 더 이상 존재하지 않는지 확인합니다.
# ls -A1
출력 예
Bp8XjITceWSN_7XFfW7WfJDTomE.jwk WOjQYkyK7DxY_T5pMncMO5w0f6E.jwk
검증
이 시점에서 서버는 새 키를 계속 알립니다. 그러나 이전 키를 기반으로 암호를 해독하려는 시도는 실패합니다.
현재 공개된 키 지문을 위해 Tang 서버를 쿼리합니다.
# tang-show-keys 7500
출력 예
WOjQYkyK7DxY_T5pMncMO5w0f6E
이전에 만든 테스트 파일을 해독하여 이전 키에 대한 암호 해독이 실패하는지 확인합니다.
# clevis decrypt </tmp/encryptValidation
출력 예
Error communicating with the server!
동일한 주요 자료를 공유하는 로드 밸런서 장치에서 여러 Tang 서버를 실행하는 경우 계속하기 전에 변경 사항이 전체 서버 세트에서 올바르게 동기화되는지 확인하십시오.