비밀번호를 한 번 읽은 다음 이를 cryptsetup 명령에 반복적으로 전달하려면 어떻게 해야 합니까?

비밀번호를 한 번 읽은 다음 이를 cryptsetup 명령에 반복적으로 전달하려면 어떻게 해야 합니까?

cryptsetup 명령을 실행하면 "기존 암호를 입력하십시오:"라는 명령줄 출력으로 응답합니다.

많은 파티션을 해독하고 사용자에게 매번 암호를 입력하도록 요청하는 것이 불가능하기 때문에 콘솔에서 내 스크립트로 이것을 읽고 스크립트 자체에서 암호를 전달하고 싶습니다.

명령 실행:

cryptsetup luksAddKey /dev/LUKS_device_name /etc/keyfile

기존 암호를 입력하세요.

이에 대한 도움을 주셔서 감사합니다.

답변1

내 대답은 필요한 Linux 커널 기능에 따라 다릅니다.CONFIG_KEYS.

거기에서 사용하려는 키스크립트 명령이 있습니다.

https://github.com/gebi/keyctl_keyscript

그것은커널 키 보유 서비스(이것은오랫동안 주위에) 명령으로keyctlcryptsetup암호 문구를 아직 찾지 못한 경우 메모리에 물어보고 임시 저장하고, 여러 명령 의 관련 호출에 이를 사용합니다 . 아마도 대부분의 배포판에 포함되어 있을 것입니다(예: Debian에서는 패키지암호 설정) 로 되어 있습니다 /lib/cryptsetup/scripts/decrypt_keyctl.

일반적으로 배포 내에 통합되어 /etc/crypttab주어진 예와 같은 파일에 구성되어 사용됩니다.

test1   /dev/sda1    test_pw         luks,keyscript=decrypt_keyctl
test2   /dev/sda2    test_pw         luks,keyscript=decrypt_keyctl
test3   /dev/sda3    test_other_pw   luks,keyscript=decrypt_keyctl

test1에 대한 암호를 묻는 메시지가 트리거되면 test2에 대한 답변을 재사용하고(키 ID가 이전 ID와 동일하고 암호가 이미 제공되었기 때문에) test3에 대한 새 질문을 합니다.

이제 시스템 통합이 아닌 이 도구를 직접 사용하려면 명령을 실행하고 cryptsetup.

업데이트: 환경에 따라 달라지는 몇 가지 값을 제외하고 재현할 수 있는 전체 예제를 입력하세요(여기 /dev/loop0969933847).

가짜 디스크에서 테스트 LUKS 장치를 만듭니다.정말 조심하세요저것losetup 실제로이 예제를 반환 /dev/loop0하거나 중단합니다.

# dd if=/dev/zero seek=$(( 2 ** 30 - 1 )) bs=1 count=1 of=/tmp/block.img
1+0 records in
1+0 records out
1 byte copied, 6.0997e-05 s, 16.4 kB/s
# losetup --find --show /tmp/block.img 
/dev/loop0
# echo -n goodpass | cryptsetup luksFormat /dev/loop0
# cryptsetup luksDump /dev/loop0
LUKS header information for /dev/loop0

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha256
Payload offset: 4096
MK bits:        256
MK digest:      4e 98 86 0b bf 63 3f 68 08 f5 cc 4f 61 ec 8c 19 71 c3 2a 33 
MK salt:        dc ce 7b a1 56 79 70 c5 02 ad ec 4c 85 c1 6f c1 
                af 50 f3 8c 89 b9 a9 3a 02 62 5c 2d 3f 7a 9d 52 
MK iterations:  312000
UUID:           61a3a890-9564-4c98-866a-1216474b839e

Key Slot 0: ENABLED
    Iterations:             2467468
    Salt:                   04 82 b5 b7 0b 90 e4 62 45 96 e3 c3 ef ba 6d 66 
                            1d 93 6b e0 e9 03 40 3d 39 b9 fe 2c 6f 9e 46 e4 
    Key material offset:    8
    AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

이제 를 사용하여 작업을 시도해 보세요 decrypt_keyctl. 구문은 이전에 설정된 대로입니다: goodpass. 이 예제 를 /etc/crypttab직접 실행하는 데는 사용되지도 필요하지도 않습니다(Debian 9의 수정 버전에서는 무해한 경고를 방지하고 예상 환경 외부에서 사용될 때 여전히 외관상 "예제"를 인쇄하기 위해 두 개의 변수가 있음).

# echo -n securepass > /tmp/newkey
# export CRYPTTAB_TRIED=0 CRYPTTAB_SOURCE=example
# /lib/cryptsetup/scripts/decrypt_keyctl lazy | cryptsetup luksOpen /dev/loop0 test1
Caching passphrase for example:  ********
# cryptsetup close test1
# cryptsetup status test1
/dev/mapper/test1 is inactive.
# /lib/cryptsetup/scripts/decrypt_keyctl lazy | cryptsetup luksAddKey /dev/loop0 /tmp/newkey
Using cached passphrase for example.
# /lib/cryptsetup/scripts/decrypt_keyctl lazy | cryptsetup luksOpen /dev/loop0 test1
Using cached passphrase for example.
# cryptsetup status test1
/dev/mapper/test1 is active.
  type:    LUKS1
  cipher:  aes-xts-plain64
  keysize: 256 bits
  device:  /dev/loop0
  loop:    /tmp/block.img
  offset:  4096 sectors
  size:    2093056 sectors
  mode:    read/write

물론 직접 사용할 수도 있습니다 keyctl. 다음은 이전 luks 장치를 계속 사용하는 다음과 같은 (정말 나쁜) 예입니다. 이 예는 바로 다음에 수행할 수 있습니다.

# cryptsetup close test1
# echo -n goodpass | keyctl padd user lazy @u
969933847
# keyctl timeout 969933847 120
# keyctl pipe 969933847 | cryptsetup luksOpen /dev/loop0 test1 && echo OK
OK
# keyctl pipe 969933847 | cryptsetup luksAddKey /dev/loop0 /tmp/newkey && echo OK
OK
# keyctl clear @u

대청소:

# cryptsetup close test1
# losetup -d /dev/loop0    
# rm /tmp/block.img

관련 정보