Quando executo o comando cryptsetup, ele responde com uma saída de linha de comando - "Digite qualquer senha existente:".
Quero ler isso do console para o meu script e passar a senha do próprio script, pois estou descriptografando muitas partições e pedindo ao usuário para inserir a senha sempre que não é viável.
Execução de comando:
cryptsetup luksAddKey /dev/LUKS_device_name /etc/keyfile
Insira qualquer senha existente:
Agradeço qualquer ajuda nisto.
Responder1
Minha resposta depende do recurso necessário do kernel LinuxCONFIG_KEYS
.
Existe um comando keyscript destinado ao que você deseja disponível:
https://github.com/gebi/keyctl_keyscript
Ele usa oServiço de retenção de chave do kernel(que tem sidopor aí há muito tempo) com o comandokeyctl
para perguntar e armazenar temporariamente a senha na memória, se ainda não for encontrada, e usá-la para quaisquer invocações relacionadas de vários cryptsetup
comandos. Provavelmente está incluído na maioria das distribuições (por exemplo: no Debian, o pacoteconfiguração de criptografiatem como /lib/cryptsetup/scripts/decrypt_keyctl
).
Normalmente você o usaria integrado à distribuição e configurado em um /etc/crypttab
arquivo como o exemplo dado:
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
O que acionaria a solicitação de uma senha para o teste1, reutilizaria a resposta no teste2 (porque seu ID de chave é o mesmo que o anterior e a senha já foi fornecida) e faria uma nova pergunta para o teste3.
Agora, se quiser usar esta ferramenta diretamente, e não junto com a integração do sistema, você pode executar o comando e canalizá-lo diretamente para cryptsetup
.
ATUALIZAR: Coloque um exemplo completo que pode ser reproduzido exceto pelos poucos valores que dependerão do ambiente (aqui /dev/loop0
e 969933847
):
Crie um dispositivo LUKS de teste a partir de um disco falso.Tenha muito cuidadoquelosetup
na verdaderetornou /dev/loop0
ou anulou este exemplo:
# 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
Agora tente operações nele usando decrypt_keyctl
. A prassphrase é a definida anteriormente: goodpass
. Observe que /etc/crypttab
não é usado nem necessário para este exemplo ser executado diretamente (na versão modificada do Debian 9, aqui com duas variáveis para evitar um aviso inofensivo e ainda imprimir um "exemplo" cosmético quando usado fora do ambiente esperado):
# 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
Claro que você poderia até usar diretamente keyctl
, aqui está um exemplo (muito ruim) a seguir, ainda usando o dispositivo luks anterior, que pode ser feito logo em seguida:
# 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
Limpar:
# cryptsetup close test1
# losetup -d /dev/loop0
# rm /tmp/block.img