16.3. Tang 서버 암호화 키 관리

암호화 키를 다시 생성하는 암호화 메커니즘은 노드에 저장된 인식되지 않은 키와 관련 Tang 서버의 개인 키를 기반으로 합니다. Tang 서버 개인 키와 노드의 암호화된 디스크를 모두 취득한 공격자의 가능성을 보호하기 위해 주기적으로 다시 키를 변경하는 것이 좋습니다.

Tang 서버에서 이전 키를 삭제하려면 모든 노드에 대해 키 다시 입력 작업을 수행해야 합니다. 다음 섹션에서는 이전 키를 다시 키우고 삭제하는 절차를 제공합니다.

16.3.1. Tang 서버의 키 백업

Tang 서버는 /usr/libexec/tangd-keygen 을 사용하여 새 키를 생성하고 기본적으로 /var/db/tang 디렉터리에 저장합니다. 실패 시 Tang 서버를 복구하려면 이 디렉터리를 백업하십시오. 키는 민감하며 이를 사용한 모든 호스트의 부팅 디스크 암호 해독을 수행할 수 있으므로 키를 적절하게 보호해야 합니다.

절차

  • /var/db/tang 디렉토리에서 키를 복원할 수 있는 temp 디렉토리로 백업 키를 복사합니다.

16.3.2. Tang 서버의 키 복구

백업에서 키에 액세스하여 Tang 서버의 키를 복구할 수 있습니다.

절차

  • 백업 폴더에서 /var/db/tang/ 디렉터리로 키를 복원합니다.

    Tang 서버가 시작되면 이 복원된 키를 알리고 사용합니다.

16.3.3. Tang 서버 키 다시 지정

이 절차에서는 각각 고유한 키가 있는 세 개의 Tang 서버 세트를 예제로 사용합니다.

중복된 Tang 서버를 사용하면 노드가 자동으로 부팅되지 않을 가능성이 줄어듭니다.

Tang 서버 및 연결된 모든 NBDE 암호화 노드를 다시 입력하는 것은 3단계 절차입니다.

사전 요구 사항

  • 하나 이상의 노드에 작동하는 NBDE(Network-Bound Disk Encryption)를 설치합니다.

절차

  1. 새 Tang 서버 키를 생성합니다.
  2. 새 키를 사용하도록 모든 NBDE 암호화 노드를 다시 입력합니다.
  3. 이전 Tang 서버 키를 삭제합니다.

    참고

    모든 NBDE 암호화 노드가 키 변경을 완료하기 전에 이전 키를 삭제하면 해당 노드가 다른 구성된 Tang 서버에 지나치게 의존하게 됩니다.

그림 16.1. Tang 서버 재키핑을 위한 워크플로우 예

Tang 서버 키 다시 지정

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

절차

  1. Tang 서버 키를 저장하는 디렉터리를 찾아 액세스합니다. 일반적으로 /var/db/tang 디렉토리입니다. 현재 공개된 키 지문을 확인합니다.

    # tang-show-keys 7500

    출력 예

    36AHjNH3NZDSnlONLz1-V4ie6t8

  2. Tang 서버 키 디렉토리를 입력합니다.

    # cd /var/db/tang/
  3. 현재 Tang 서버 키를 나열합니다.

    # ls -A1

    출력 예

    36AHjNH3NZDSnlONLz1-V4ie6t8.jwk
    gJZiNPMLRBnyo_ZKfK4_5SrnHYo.jwk

    일반적인 Tang 서버 작업 중에는 이 디렉터리에 두 개의 .jwk 파일이 있습니다. 하나는 서명 및 확인용이고 다른 하나는 키 파생을 위한 것입니다.

  4. 이전 키의 알림을 비활성화합니다.

    # for key in *.jwk; do \
      mv -- "$key" ".$key"; \
    done

    새 클라이언트는 NBDE(Network-Bound Disk Encryption) 또는 요청 키를 설정해도 더 이상 이전 키가 표시되지 않습니다. 기존 클라이언트는 삭제될 때까지 이전 키에 계속 액세스하고 사용할 수 있습니다. Tang 서버는 UNIX 숨겨진 파일에 저장된 키를 읽지만 알림은 하지 않으며 . 문자로 시작합니다.

  5. 새 키를 생성합니다.

    # /usr/libexec/tangd-keygen /var/db/tang
  6. 현재 Tang 서버 키를 나열하여 이전 키가 현재 숨겨진 파일이고 새 키가 있는지 확인합니다.

    # ls -A1

    출력 예

    .36AHjNH3NZDSnlONLz1-V4ie6t8.jwk
    .gJZiNPMLRBnyo_ZKfK4_5SrnHYo.jwk
    Bp8XjITceWSN_7XFfW7WfJDTomE.jwk
    WOjQYkyK7DxY_T5pMncMO5w0f6E.jwk

    Tang은 새 키를 자동으로 알립니다.

    참고

    보다 최근 Tang 서버 설치에는 광고 비활성화 및 새 키를 동시에 생성하는 도우미 /usr/libexec/tangd-rotate-keys 디렉토리가 있습니다.

  7. 동일한 주요 자료를 공유하는 로드 밸런서 장치에서 여러 Tang 서버를 실행하는 경우, 계속하기 전에 여기서 변경한 사항이 전체 서버 집합에서 올바르게 동기화되는지 확인하십시오.

검증

  1. Tang 서버가 새 키를 알리고 이전 키를 알리지 않는지 확인합니다.

    # tang-show-keys 7500

    출력 예

    WOjQYkyK7DxY_T5pMncMO5w0f6E

  2. 이전 키가 보급되지는 않았지만 암호 해독 요청에 계속 사용할 수 있는지 확인합니다.

    # clevis decrypt </tmp/encrypted.oldkey

16.3.3.2. 모든 NBDE 노드 키 다시 지정

원격 클러스터에 다운타임을 발생시키지 않고 DaemonSet 오브젝트를 사용하여 원격 클러스터의 모든 노드를 다시 입력할 수 있습니다.

참고

노드를 다시 시작하는 동안 전원이 손실되는 경우 부팅할 수 없게 될 수 있으며 RHACM(Red Hat Advanced Cluster Management) 또는 GitOps 파이프라인을 통해 다시 배포해야 합니다.

사전 요구 사항

  • NBDE(Network-Bound Disk Encryption) 노드가 있는 모든 클러스터에 대한 cluster-admin 액세스가 있어야 합니다.
  • Tang 서버의 키가 변경되지 않은 경우에도 모든 Tang 서버에 다시 키를 눌러서 모든 Tang 서버에 액세스할 수 있어야 합니다.
  • Tang 서버 URL과 모든 Tang 서버의 키 지문을 가져옵니다.

절차

  1. 다음 템플릿을 기반으로 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 서버의 현재 지문도 지정해야 합니다. 키 재지정 작업의 모든 지문을 지정하지 않으면 메시지 가로채기 공격의 기회가 열립니다.

  2. 다시 키를 지정해야 하는 모든 클러스터에 데몬 세트를 배포하려면 다음 명령을 실행합니다.

    $ 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 검색을 사용하여 모든 데몬 세트 상태를 쿼리할 수도 있습니다.

16.3.3.3. Tang 서버의 임시 키 재지정 오류 문제 해결

Tang 서버를 다시 입력하는 오류 조건이 일시적인지 확인하려면 다음 절차를 수행합니다. 임시 오류 상태에는 다음이 포함될 수 있습니다.

  • 임시 네트워크 중단
  • Tang 서버 유지 관리

일반적으로 이러한 유형의 임시 오류 조건이 발생하면 데몬 세트가 오류를 성공적으로 해결하거나 데몬 세트를 삭제하고 임시 오류 조건이 해결될 때까지 다시 시도할 수 없습니다.

절차

  1. 일반적인 Kubernetes pod 재시작 정책을 사용하여 키 재지정 작업을 수행하는 Pod를 다시 시작합니다.
  2. 연결된 Tang 서버를 사용할 수 없는 경우 모든 서버가 다시 온라인 상태가 될 때까지 다시 키를 입력합니다.

16.3.3.4. Tang 서버의 영구적인 키 재지정 오류 문제 해결

Tang 서버를 다시 시작한 후 READY 수는 연장된 기간이 지나면 DESIRED 개수와 동일하지 않으므로 영구적인 오류 상태를 나타낼 수 있습니다. 이 경우 다음 조건이 적용될 수 있습니다.

  • NEW_TANG_PIN 정의의 Tang 서버 URL 또는 지문의 오타 오류입니다.
  • Tang 서버가 해제되거나 키가 영구적으로 손실됩니다.

사전 요구 사항

  • 이 절차에 표시된 명령은 Tang 서버 또는 Tang 서버에 대한 네트워크 액세스 권한이 있는 Linux 시스템에서 실행할 수 있습니다.

절차

  1. 데몬 세트에 정의된 대로 각 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

  2. 근본 원인을 확인한 후 기본 상황을 해결합니다.

    1. 작동하지 않는 데몬 세트를 삭제합니다.
    2. 데몬 세트 정의를 편집하여 기본 문제를 해결합니다. 여기에는 다음 작업이 포함될 수 있습니다.

      • Tang 서버 항목을 편집하여 URL과 지문을 수정합니다.
      • 더 이상 서비스 중이 아닌 Tang 서버를 제거합니다.
      • 해제된 서버를 대체하는 새 Tang 서버를 추가합니다.
  3. 업데이트된 데몬 세트를 다시 배포합니다.
참고

구성에서 Tang 서버를 교체, 제거 또는 추가할 때 현재 서버를 포함하여 하나 이상의 원본 서버가 계속 작동하는 한 키 재지정 작업이 성공적으로 수행됩니다. 원래 Tang 서버가 작동하지 않거나 복구할 수 없는 경우 시스템을 복구할 수 없으며 영향을 받는 노드를 다시 배포해야 합니다.

검증

데몬 세트의 각 pod에서 로그를 확인하여 키 재지정이 성공적으로 완료되었는지 확인합니다. 키 재지정에 성공하지 못하면 로그에 실패 조건이 표시될 수 있습니다.

  1. 데몬 세트에서 생성한 컨테이너의 이름을 찾습니다.

    $ oc get pods -A | grep tang-rekey

    출력 예

    openshift-machine-config-operator  tang-rekey-7ks6h  1/1  Running   20 (8m39s ago)  89m

  2. 컨테이너의 로그를 출력합니다. 다음 로그는 성공적인 키 재지정 작업에서 가져온 것입니다.

    $ 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

16.3.4. 이전 Tang 서버 키 삭제

사전 요구 사항

  • Tang 서버를 실행하는 Linux 시스템의 root 쉘입니다.

절차

  1. Tang 서버 키가 저장된 디렉터리를 찾아 액세스합니다. 일반적으로 /var/db/tang 디렉토리입니다.

    # cd /var/db/tang/
  2. 공개된 키와 의도하지 않은 키를 표시하여 현재 Tang 서버 키를 나열합니다.

    # ls -A1

    출력 예

    .36AHjNH3NZDSnlONLz1-V4ie6t8.jwk
    .gJZiNPMLRBnyo_ZKfK4_5SrnHYo.jwk
    Bp8XjITceWSN_7XFfW7WfJDTomE.jwk
    WOjQYkyK7DxY_T5pMncMO5w0f6E.jwk

  3. 이전 키를 삭제합니다.

    # rm .*.jwk
  4. 현재 Tang 서버 키를 나열하여 의도하지 않은 키가 더 이상 존재하지 않는지 확인합니다.

    # ls -A1

    출력 예

    Bp8XjITceWSN_7XFfW7WfJDTomE.jwk
    WOjQYkyK7DxY_T5pMncMO5w0f6E.jwk

검증

이 시점에서 서버는 새 키를 계속 알립니다. 그러나 이전 키를 기반으로 암호를 해독하려는 시도는 실패합니다.

  1. 현재 공개된 키 지문을 위해 Tang 서버를 쿼리합니다.

    # tang-show-keys 7500

    출력 예

    WOjQYkyK7DxY_T5pMncMO5w0f6E

  2. 이전에 만든 테스트 파일을 해독하여 이전 키에 대한 암호 해독이 실패하는지 확인합니다.

    # clevis decrypt </tmp/encryptValidation

    출력 예

    Error communicating with the server!

동일한 주요 자료를 공유하는 로드 밸런서 장치에서 여러 Tang 서버를 실행하는 경우 계속하기 전에 변경 사항이 전체 서버 세트에서 올바르게 동기화되는지 확인하십시오.