Red Hat Training

A Red Hat training course is available for RHEL 8

16.13. LUKS를 사용하여 블록 장치 암호화

디스크 암호화는 이를 암호화하여 블록 장치의 데이터를 보호합니다. 장치의 암호 해독된 콘텐츠에 액세스하려면 사용자가 암호 또는 키를 인증으로 제공해야 합니다. 이는 모바일 컴퓨터와 이동식 미디어와 관련해서는 특히 중요합니다. 이 미디어는 시스템에서 물리적으로 제거된 경우에도 장치의 콘텐츠를 보호하는 데 도움이 됩니다. LUKS 형식은 RHEL에서 블록 장치 암호화의 기본 구현입니다.

16.13.1. LUKS 디스크 암호화

Linux Unified Key Setup-on-disk-format(LUKS)을 사용하면 블록 장치를 암호화할 수 있으며 암호화된 장치 관리를 간소화하는 도구 세트를 제공합니다. LUKS는 여러 사용자 키를 사용하여 파티션의 대량 암호화에 사용되는 마스터 키를 해독할 수 있습니다.

RHEL은 LUKS를 사용하여 블록 장치 암호화를 수행합니다. 기본적으로 블록 장치를 암호화하는 옵션은 설치 중에 선택되지 않습니다. 디스크를 암호화할 옵션을 선택하면 시스템을 부팅할 때마다 시스템에서 암호를 입력하라는 메시지가 표시됩니다. 이 암호는 파티션을 해독하는 대규모 암호화 키를 "잠김"합니다. 기본 파티션 테이블을 수정하도록 선택하는 경우 암호화할 파티션을 선택할 수 있습니다. 이는 파티션 테이블 설정에서 설정됩니다.

LUKS의 기능

  • LUKS는 전체 블록 장치를 암호화하므로 이동식 스토리지 미디어 또는 랩톱 디스크 드라이브와 같은 모바일 장치의 콘텐츠를 보호하는 데 적합합니다.
  • 암호화된 블록 장치의 기본 내용은 임의이므로 스왑 장치를 암호화하는 데 유용합니다. 이는 데이터 저장을 위해 특별히 포맷된 블록 장치를 사용하는 특정 데이터베이스에서도 유용할 수 있습니다.
  • LUKS는 기존 장치 매퍼 커널 하위 시스템을 사용합니다.
  • LUKS는 사전 공격으로부터 보호하는 암호 강화를 제공합니다.
  • LUKS 장치에는 여러 개의 키 슬롯이 포함되어 있어 사용자가 백업 키 또는 암호를 추가할 수 있습니다.

LUKS가 수행하지 않는 내용

  • LUKS와 같은 디스크 암호화 솔루션은 시스템이 꺼진 경우에만 데이터를 보호합니다. 시스템이 있고 LUKS가 디스크의 암호를 해독하면 해당 디스크의 파일은 일반적으로 액세스할 수 있는 모든 사용자가 사용할 수 있습니다.
  • LUKS는 많은 사용자가 동일한 장치에 대해 고유한 액세스 키를 사용해야 하는 시나리오에는 적합하지 않습니다. LUKS1 형식은 8개의 키 슬롯, LUKS2 최대 32개의 키 슬롯을 제공합니다.
  • LUKS는 파일 수준 암호화가 필요한 애플리케이션에 적합하지 않습니다.

암호화

LUKS에 사용되는 기본 암호는 aes-xts-plain64 입니다. LUKS의 기본 키 크기는 512비트입니다. Anaconda (XTS 모드)를 사용하는 LUKS의 기본 키 크기는 512비트입니다. 사용 가능한 암호는 다음과 같습니다.

  • AES - 고급 암호화 표준
  • 2-fish (128비트 블록 암호)
  • serpent

16.13.2. RHEL의 LUKS 버전

RHEL에서 LUKS 암호화의 기본 형식은 LUKS2입니다. 레거시 LUKS1 형식은 완벽하게 지원되며 이전 RHEL 릴리스와 호환되는 형식으로 제공됩니다.

LUKS2 형식은 바이너리 구조를 수정할 필요 없이 다양한 부분을 나중에 업데이트할 수 있도록 설계되었습니다. LUKS2는 내부적으로 메타데이터에 JSON 텍스트 형식을 사용하고, 메타데이터의 중복성을 제공하고, 메타데이터 손상을 감지하며, 메타데이터 사본의 자동 복구를 허용합니다.

중요

LUKS1만 지원하는 기존 시스템과 호환되어야 하는 시스템에서 LUKS2를 사용하지 마십시오. RHEL 7은 버전 7.6 이후의 LUKS2 형식을 지원합니다.

주의

LUKS2 및 LUKS1은 다른 명령을 사용하여 디스크를 암호화합니다. LUKS 버전에 잘못된 명령을 사용하면 데이터가 손실될 수 있습니다.

LUKS 버전암호화 명령

LUKS2

cryptsetup 재암호화

LUKS1

cryptsetup-reencrypt

온라인 재암호화

LUKS2 형식은 장치가 사용 중인 동안 암호화된 장치 재암호화를 지원합니다. 예를 들어 다음 작업을 수행하기 위해 장치에서 파일 시스템을 마운트 해제할 필요가 없습니다.

  • 볼륨 키 변경
  • 암호화 알고리즘 변경

암호화되지 않은 장치를 암호화할 때 파일 시스템을 마운트 해제해야 합니다. 암호화를 간단히 초기화한 후 파일 시스템을 다시 마운트할 수 있습니다.

LUKS1 형식은 온라인 재암호화 기능을 지원하지 않습니다.

변환

LUKS2 형식은 LUKS1에서 영향을 받습니다. 특정 상황에서 LUKS1을 LUKS2로 변환할 수 있습니다. 다음 시나리오에서는 변환이 특히 불가능합니다.

  • LUKS1 장치는 PBD - Clevis(정책 기반 암호 해독) 솔루션에서 사용하는 것으로 표시됩니다. cryptsetup 도구는 일부 luksmeta 메타데이터가 감지되면 장치를 변환하는 것을 거부합니다.
  • 장치가 활성 상태입니다. 변환이 가능하려면 장치가 비활성 상태여야 합니다.

16.13.3. LUKS2 재암호화 중에 데이터 보호 옵션

LUKS2는 재암호화 프로세스 중에 성능 또는 데이터 보호 우선 순위를 지정하는 여러 가지 옵션을 제공합니다.

checksum

이는 기본값 모드입니다. 데이터 보호 및 성능 균형 유지.

이 모드에서는 재암호화 영역에 섹터의 개별 체크섬을 저장하므로 복구 프로세스에서 이미 다시 암호화한 LUKS2 섹터를 감지할 수 있습니다. 이 모드에서는 블록 장치 섹터 쓰기가 atomic이어야 합니다.

journal
이것이 가장 안전한 모드이지만 가장 느린 모드이기도 합니다. 이 모드는 바이너리 영역에 재암호화 영역을 저널링하므로 LUKS2는 데이터를 두 번 씁니다.
none
이 모드는 성능에 우선 순위를 지정하며 데이터 보호를 제공하지 않습니다. SIGTERM 신호나 CtrlC 누르는 사용자와 같은 안전한 프로세스 종료로부터만 데이터를 보호합니다. 예기치 않은 시스템 충돌 또는 애플리케이션 충돌로 인해 데이터가 손상될 수 있습니다.

cryptsetup--resilience 옵션을 사용하여 모드를 선택할 수 있습니다.

LUKS2 재암호화 프로세스가 강제 종료되면 LUKS2는 다음 방법 중 하나로 복구를 수행할 수 있습니다.

  • 다음 LUKS2 장치 열기 작업 동안 자동으로. 이 작업은 cryptsetup open 명령으로 트리거되거나 systemd-cryptsetup 으로 장치를 연결하여 트리거됩니다.
  • LUKS2 장치에서 cryptsetup 복구 명령을 수동으로 사용합니다.

16.13.4. LUKS2를 사용하여 블록 장치의 기존 데이터 암호화

이 절차에서는 LUKS2 형식을 사용하여 아직 암호화되지 않은 장치에서 기존 데이터를 암호화합니다. 새 LUKS 헤더가 장치의 헤드에 저장됩니다.

사전 요구 사항

  • 블록 장치에는 파일 시스템이 포함됩니다.
  • 데이터를 백업했습니다.

    주의

    암호화 프로세스 중 하드웨어, 커널 또는 인적 오류로 인해 데이터가 손실될 수 있습니다. 데이터 암호화를 시작하기 전에 신뢰할 수 있는 백업이 있는지 확인합니다.

절차

  1. 암호화하려는 장치에서 모든 파일 시스템을 마운트 해제합니다. 예를 들면 다음과 같습니다.

    # umount /dev/sdb1
  2. LUKS 헤더 저장에 사용 가능한 공간을 만듭니다. 시나리오에 맞는 다음 옵션 중 하나를 선택합니다.

    • 논리 볼륨을 암호화하는 경우 파일 시스템의 크기를 조정하지 않고 논리 볼륨을 확장할 수 있습니다. 예를 들면 다음과 같습니다.

      # lvextend -L+32M vg00/lv00
    • parted 와 같은 파티션 관리 도구를 사용하여 파티션을 확장합니다.
    • 장치의 파일 시스템을 축소합니다. ext 2, ext3 또는 ext4 파일 시스템에 resize2fs 유틸리티를 사용할 수 있습니다. XFS 파일 시스템을 축소할 수 없습니다.
  3. 암호화를 초기화합니다. 예를 들면 다음과 같습니다.

    # cryptsetup reencrypt \
                 --encrypt \
                 --init-only \
                 --reduce-device-size 32M \
                 /dev/sdb1 sdb1_encrypted

    명령은 암호를 요청하고 암호화 프로세스를 시작합니다.

  4. 장치를 마운트합니다.

    # mount /dev/mapper/sdb1_encrypted /mnt/sdb1_encrypted
  5. /etc/crypttab에 영구 매핑 항목을 추가

    1. luksUUID 를 찾습니다.

      # cryptsetup luksUUID /dev/mapper/sdb1_encrypted

      선택한 장치의 luksUUID 가 표시됩니다.

    2. 선택한 텍스트 편집기에서 /etc/crypttab 파일을 열고 이 파일에 장치를 추가합니다.

      $ vi /etc/crypttab
      /dev/mapper/sdb1_encrypted luks_uuid none
    3. dracut 을 사용하여 initramfs 새로 고침 :

      $ dracut -f --regenerate-all
  6. 영구 마운트 항목을 /etc/fstab 파일에 추가합니다.

    1. 활성 LUKS 블록 장치의 FS UUID 찾기

      $ blkid  -p /dev/mapper/sdb1_encrypted
    2. 선택한 텍스트 편집기에서 /etc/fstab 파일을 열고 이 파일에 장치를 추가합니다. 예를 들면 다음과 같습니다.

      $ vi  /etc/fstab
      fs__uuid /home auto rw,user,auto 0 0
  7. 온라인 암호화를 시작합니다.

    # cryptsetup reencrypt --resume-only /dev/sdb1

추가 리소스

  • cryptsetup(8), lvextend(8), resize2fs(8)parted(8) 도움말 페이지

16.13.5. 분리된 헤더로 LUKS2를 사용하여 블록 장치에서 기존 데이터 암호화

이 절차에서는 LUKS 헤더를 저장하기 위한 여유 공간을 생성하지 않고 블록 장치의 기존 데이터를 암호화합니다. 헤더는 분리된 위치에 저장되며 추가 보안 계층 역할을 합니다. 절차에서는 LUKS2 암호화 형식을 사용합니다.

사전 요구 사항

  • 블록 장치에는 파일 시스템이 포함됩니다.
  • 데이터를 백업했습니다.

    주의

    암호화 프로세스 중 하드웨어, 커널 또는 인적 오류로 인해 데이터가 손실될 수 있습니다. 데이터 암호화를 시작하기 전에 신뢰할 수 있는 백업이 있는지 확인합니다.

절차

  1. 장치에서 모든 파일 시스템을 마운트 해제합니다. 예를 들면 다음과 같습니다.

    # umount /dev/sdb1
  2. 암호화를 초기화합니다.

    # cryptsetup reencrypt \
                 --encrypt \
                 --init-only \
                 --header /path/to/header \
                 /dev/sdb1 sdb1_encrypted

    /path/to/header 를 분리된 LUKS 헤더로 파일 경로로 바꿉니다. 암호화된 장치를 나중에 잠금 해제할 수 있도록 분리된 LUKS 헤더에 액세스할 수 있어야 합니다.

    명령은 암호를 요청하고 암호화 프로세스를 시작합니다.

  3. 장치를 마운트합니다.

    # mount /dev/mapper/sdb1_encrypted /mnt/sdb1_encrypted
  4. 온라인 암호화를 시작합니다.

    # cryptsetup reencrypt --resume-only --header /path/to/header /dev/sdb1

추가 리소스

  • cryptsetup(8) 도움말 페이지

16.13.6. LUKS2를 사용하여 빈 블록 장치 암호화

다음 절차에서는 LUKS2 형식을 사용하여 빈 블록 장치를 암호화하는 방법에 대해 설명합니다.

사전 요구 사항

  • 빈 블록 장치.

절차

  1. 파티션을 암호화된 LUKS 파티션으로 설정:

    # cryptsetup luksFormat /dev/sdb1
  2. 암호화된 LUKS 파티션을 엽니다:

    # cryptsetup open /dev/sdb1 sdb1_encrypted

    그러면 파티션의 잠금을 해제하고 장치 매퍼를 사용하여 새 장치에 매핑합니다. 이 경우 장치가 암호화된 장치 임을 커널로 경고하고 암호화된 데이터를 덮어쓰지 않도록 /dev/mapper/device_mapped_name 을 사용하여 LUKS를 통해 처리해야 합니다.

  3. 암호화된 데이터를 파티션에 작성하려면 장치 매핑 이름을 통해 액세스해야 합니다. 이렇게 하려면 파일 시스템을 만들어야 합니다. 예를 들면 다음과 같습니다.

    # mkfs -t ext4 /dev/mapper/sdb1_encrypted
  4. 장치를 마운트합니다.

    # mount /dev/mapper/sdb1_encrypted mount-point

추가 리소스

  • cryptsetup(8) 도움말 페이지

16.13.7. 스토리지 RHEL 시스템 역할을 사용하여 LUKS 암호화 볼륨 생성

스토리지 역할을 사용하여 Ansible 플레이북을 실행하여 LUKS로 암호화된 볼륨을 생성하고 구성할 수 있습니다.

사전 요구 사항

  • crypto_policies 시스템 역할로 설정하려는 하나 이상의 관리형 노드에 대한 액세스 및 권한.
  • Red Hat Ansible Core가 기타 시스템을 구성하는 시스템인 제어 노드에 대한 액세스 및 권한.

    제어 노드에서 다음을 수행합니다.

    • ansible-corerhel-system-roles 패키지가 설치됩니다.
중요

RHEL 8.0-8.5는 Ansible 기반 자동화를 위해 Ansible Engine 2.9가 포함된 별도의 Ansible 리포지토리에 대한 액세스를 제공했습니다. Ansible Engine에는 ansible, ansible-playbook, dockerpodman과 같은 커넥터, 여러 플러그인 및 모듈과 같은 명령줄 유틸리티가 포함되어 있습니다. Ansible Engine을 확보하고 설치하는 방법에 대한 자세한 내용은 Red Hat Ansible Engine 지식베이스를 다운로드하고 설치하는 방법에 대한 지식베이스 문서를 참조하십시오.

RHEL 8.6 및 9.0에서는 Ansible 명령줄 유틸리티, 명령 및 소규모의 기본 제공 Ansible 플러그인 세트가 포함된 Ansible Core( ansible-core 패키지로 제공)를 도입했습니다. RHEL은 AppStream 리포지토리를 통해 이 패키지를 제공하며 제한된 지원 범위를 제공합니다. 자세한 내용은 RHEL 9 및 RHEL 8.6 이상 AppStream 리포지토리 지식 베이스에 포함된 Ansible Core 패키지에 대한 지원 범위에 대한 지식베이스 문서를 참조하십시오.

  • 관리 노드를 나열하는 인벤토리 파일.

절차

  1. 다음 내용으로 새 playbook.yml 파일을 생성합니다.

    - hosts: all
      vars:
        storage_volumes:
          - name: barefs
            type: disk
            disks:
             - sdb
            fs_type: xfs
            fs_label: label-name
            mount_point: /mnt/data
            encryption: true
            encryption_password: your-password
      roles:
       - rhel-system-roles.storage
  2. 선택 사항: 플레이북 구문을 확인합니다.

    # ansible-playbook --syntax-check playbook.yml
  3. 인벤토리 파일에서 플레이북을 실행합니다.

    # ansible-playbook -i inventory.file /path/to/file/playbook.yml

추가 리소스