부팅시 단일 암호를 사용하여 여러 암호화 된 디스크 잠금 해제


23

내 컴퓨터에는 SSD가있어 시스템을 설치하고 HDD를 사용하여 대용량 및 / 또는 자주 사용하지 않는 파일의 저장 장치로 사용합니다. 둘 다 암호화되어 있지만 동일한 암호를 사용하기로 선택했습니다. SSD는 마운트되어 /있고 HDD 는 마운트되어 있습니다 /usr/hdd(개별 사용자는 각자 디렉토리를 가지고 있으며 홈 디렉토리에서 원하는대로 심볼릭 링크 할 수 있습니다).

시스템이 부팅되면 SSD에 대한 암호를 즉시 요청하고 몇 초 후에 HDD에 대한 암호를 요구합니다 (자동 마운트 됨). 두 암호가 모두 같다면 시스템이 한 번만 요청하도록 구성 할 수 있습니까?


expect시스템에서 수행하는 대신 디스크를 마운트하도록 호출 되는 스크립트 또는 이와 유사한 스크립트를 작성할 수 있습니다 . 대신 시스템은 스크립트를 호출하여 암호를 요청하고 저장 한 다음 각 마운트 작업에 암호를 제공합니다.
h3rrmiller

아이디어를 올바르게 이해하면 시스템이 부팅되는 위치이므로 SSD에 적용 할 수 없습니다. 그러나 여전히 HDD의 암호를 별도로 입력해야하기 때문에 의미가 없습니다. 아니면 아니?
05 초

/etc/crypttab 두 번째 드라이브의 잠금을 해제하는 데 사용할 수 있습니다 .
jasonwryan

1
@jasonwryan 그것이 답변으로 확장 될 수 있다면 ... 답변은 의견이 아닌 답변으로 게시되어야합니다.
derobert

1
@derobert 때때로 사람들은 좋은 대답을 쓸 시간이나 성향이 없습니다.
jasonwryan

답변:


24

데비안 기반 배포판 :

데비안과 우분투는 암호 캐싱 스크립트 decrypt_keyctlcryptsetup 패키지 와 함께 제공 합니다.

decrypt_keyctl 스크립트는 여러 개의 암호화 된 LUKS 대상에 동일한 비밀번호를 제공하므로 여러 번 입력하지 않아도 됩니다. crypttab 에서 keyscript=decrypt_keyctl옵션을 사용하여 활성화 할 수 있습니다 . 키 파일 필드에 동일한 식별자가있는 대상에 동일한 암호가 사용됩니다 . 각 식별자의 부팅시 암호가 한 번 묻습니다.

crypttab 예 :

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl
part2_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl

cryptab을 업데이트 한 후에 는 변경 사항을 적용하기 위해 initramfs를 업데이트해야합니다. 사용하십시오 update-initramfs -u.

decrypt_keyctl에 대한 전체 추가 정보는 다음 위치에 있습니다. /usr/share/doc/cryptsetup/README.keyctl

불행히도 현재 버그 로 인해 systemd init를 사용하는 데비안 시스템에서는 작동하지 않습니다 (다른 init 시스템에는 영향을 미치지 않아야 함). 데비안 crypttab 매뉴얼 페이지initramfs부팅의 initramfs 단계에서 처리를 강제 하는 옵션을 사용하는 해결 방법으로 제안 합니다.


decrypt_keyctl 스크립트를 제공하지 않는 배포판 :

경우 decrypt_keyctrl이 배포판에서 제공하지 않는 장치는 암호화 된 루트 파일 시스템의 키 파일을 사용하여 잠금을 해제 할 수 있습니다. 루트 파일 시스템을 다른 암호화 된 장치보다 먼저 잠금 해제하고 마운트 할 수있는 경우입니다.

LUKS는 여러 키 슬롯을 지원합니다. 키 파일을 사용할 수 없거나 분실 된 경우 암호를 사용하여 장치의 잠금을 해제 할 수도 있습니다.

  1. 임의의 데이터로 키를 생성하고 누출을 피하기 위해 소유자가 읽을 수있는 권한 만 설정하십시오. 키 파일은 먼저 잠금이 해제 된 루트 파티션에 있어야합니다.

    dd if=/dev/urandom of=<path to key file> bs=1024 count=1
    chmod u=rw,g=,o= <path to key file>
    
  2. LUKS 장치에 키 추가

    cryptsetup luksAddKey <path to encrypted device> <path to key file>
    
  3. 키 파일을 사용하도록 crypttab 을 구성 하십시오. 장치는 crypttab에 나열된 순서대로 잠금 해제되므로 첫 번째 행은 루트 장치 여야합니다 . 키 파일에는 절대 경로를 사용하십시오.

    <target>      <source>         <keyfile>                  <options>
    root_crypt    /dev/disk/...    none                       luks
    part1_crypt   /dev/disk/...    <path to key file>         luks
    

readme의 첫 번째 줄에서 매우 유망한 것으로 보입니다. 감사합니다. 내일 확인하겠습니다 (지금 다시 부팅하고 싶지 않음).
doublep

불행히도 (변경 사항이없는 것처럼) 작동하지 않습니다. 참조 crypttab (I은 터치하지 않은 UUID=시스템 설치 프로그램에 의해 만들어진, 나는 그것이 문제가되지해야 추측) 의 결과 항목/var/log/syslog . 오류는 이해할 수 있지만 오류에 대해 어떻게해야할지 모르겠습니다. 파일 /lib/cryptsetup/scripts/decrypt_keyctl이 존재하므로 알 수없는 옵션에 대해 불평하는 이유를 모르겠습니다. 나는 또한 키 파일로 지정하는 것을 아무 생각이 없다, 나는 더 설명 어디 ... 볼
doublep

decrypt_keyctl이 initramfs에 포함되는지 확인 했습니까? 이미지를 업데이트 할 때 verbose 옵션을 사용하여 확인하십시오 : update-initramfs -u -k $(uname -r) -v, 출력해야합니다 Adding binary /lib/cryptsetup/scripts/decrypt_keyctl.
sebasth

1
initramfs에 포함 된 내용을 보려면 :lsinitramfs /boot/initrd.img-$(uname -r)
sebasth

3
죄송합니다. 이제 말씀하신 내용에 더 많은 관심을 기울 update-initramfs였으므로이 사실을 알게되었습니다 E: /usr/share/initramfs-tools/hooks/cryptkeyctl failed with return 1.. 약간의 인터넷 검색 후 keyutils패키지가 실제로 필요하다는 것을 알았습니다 (실제로는 설치되지 않았습니다). 이제 update-initramfs성공하고 lsinitramfs언급 decrypt_keytls합니다. 다음 부팅 후 (내일 가능성이 있음) 업데이트됩니다.
doublep

3

@sebasth가 위에서 언급 한 버그를 감안할 때 데비안에 대한 해결 방법은 다음과 같습니다.

설정이 약간 다릅니다. 암호화 된 루트 파티션과 많은 레이드 디스크가 있습니다. 나를 위해 crypttab에 initramfs 옵션을 추가해야했습니다.

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs
part2_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs

이것은 update-initramfs에게이 crypttab 항목을 initramfs에 마운트하고 싶다고 알려줍니다. 나는 crypttab을 실행하여 확인했다.

cryptdisks_start part1_crypt
cryptdisks_start part2_crypt

내 레이드 디스크는 일반 dm-crypt입니다. 이것은 systemd 키 스크립트 버그를 해결하는 luks 키 파일 방법을 사용할 수 없음을 의미했습니다. 일반 dm-crypt의 경우 암호를 일반 텍스트로 저장해야합니다.

암호화 된 디스크 update-initramfs는 실행 되기 전에 마운트해야 합니다. 그렇지 않으면 오류가 발생합니다. 내 initramfs를 만들 때 다음 줄을 찾아야했습니다.

update-initramfs -k -u -v | grep 'keyctl'

다음 두 파일이 표시되었습니다.

/bin/keyctl
cryptkeyctl

initramfs에 추가됩니다.

마지막으로 위에서 언급 한 버그를 처리하기 위해 crypttab을 처리하는 systemd를 비활성화해야했습니다. systemd는 crypttab의 keyscript 옵션을 지원하지 않습니다. 이를 위해 커널 옵션을 추가했습니다

GRUB_CMDLINE_LINUX_DEFAULT="quiet luks.crypttab=no"     

/ etc / default / grub으로 가서 실행하십시오 update-grub. systemd는 이제 crypttab을 무시하고 모든 암호화 된 파티션이 initramfs에로드됩니다.

암호화 된 루트 파티션이 있으므로 cryptroot가 내 키를 캐시하지 않는 것 같습니다. 즉, 비밀번호를 두 번 입력해야합니다. 하나는 루트 파티션이고 다른 하나는 RAID 배열입니다.


1

또 다른 옵션은 /lib/cryptsetup/scripts/decrypt_derived데비안 / 우분투에서 cryptsetup의 일부인 스크립트 를 사용하는 것 입니다.

키를 캐싱하는 대신 한 디스크의 볼륨 키를 두 번째 디스크의 추가 암호로 사용합니다. 이를 위해서는 두 번째 및 세 번째 등의 암호화 된 디스크에 두 번째 암호를 추가해야하지만 LUKS는이를 지원합니다. 따라서이 솔루션은 여러 암호화 된 디스크가 동일한 암호를 사용하지 않는 경우에도 작동합니다.

sda6crypt에서 sda5로 키를 추가하는 예 :

sda5의 추가 비밀번호로 sda6crypt의 볼륨 키를 추가하십시오.

mkfifo fifo
/lib/cryptsetup/scripts/decrypt_derived sda6crypt > fifo &
cryptsetup luksAddKey /dev/sda5 fifo
rm fifo

에서 sda5crypt가 자동으로 잠금 해제되도록 구성 /etc/crypttab

ls -la /dev/disk/by-uuid/ | grep sda5
echo "sda5crypt UUID=<uuid> sda6crypt luks,initramfs,keyscript=/lib/cryptsetup/scripts/decrypt_derived" >> /etc/crypttab

fifo볼륨 키를 디스크의 임시 파일에 저장하지 않아도되도록 명명 된 파이프 ( )를 사용하여 키를 전달합니다.

keyscript옵션 crypttab은 데비안의 원래 cryptsetup 도구로 처리 된 경우에만 작동 하며, 시스템 재 구현은 현재이를 지원하지 않습니다. 시스템에서 systemd (대부분의 시스템)를 사용하는 경우 initramfssystemd를 시작하기 전에 cryptsetup 도구를 사용하여 initrd에서 처리를 강제 실행 하는 옵션 이 필요합니다 .

/unix//a/32551/50793 기반


데비안 10 버스터에서 딸꾹질없이 방망이로 작업했습니다!
야누스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.