cryptsetup 명령을 실행하면 "기존 암호를 입력하십시오:"라는 명령줄 출력으로 응답합니다.
많은 파티션을 해독하고 사용자에게 매번 암호를 입력하도록 요청하는 것이 불가능하기 때문에 콘솔에서 내 스크립트로 이것을 읽고 스크립트 자체에서 암호를 전달하고 싶습니다.
명령 실행:
cryptsetup luksAddKey /dev/LUKS_device_name /etc/keyfile
기존 암호를 입력하세요.
이에 대한 도움을 주셔서 감사합니다.
답변1
내 대답은 필요한 Linux 커널 기능에 따라 다릅니다.CONFIG_KEYS
.
거기에서 사용하려는 키스크립트 명령이 있습니다.
https://github.com/gebi/keyctl_keyscript
그것은커널 키 보유 서비스(이것은오랫동안 주위에) 명령으로keyctl
cryptsetup
암호 문구를 아직 찾지 못한 경우 메모리에 물어보고 임시 저장하고, 여러 명령 의 관련 호출에 이를 사용합니다 . 아마도 대부분의 배포판에 포함되어 있을 것입니다(예: 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/loop0
및 969933847
).
가짜 디스크에서 테스트 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