Como automatizar o cryptsetup-luksAddKey com a frase secreta?

0

Context: I replaced my passphrase prompted at launch by a keyfile, stored on a USB dongle. My question concerns the step: # cryptsetup luksAddKey /path/to/mykeyfile .

I generated my added key is made this way: dd if=/dev/urandom of=mykeyfile bs=512 count=4 .

**I aim to make it run in a bash (it works...), but without passphrase prompt, and finally with zero prompt. ** My question:

  • Posso fazer algo como cryptsetup luksAddKey -passphrase "Hello, my name is Jolly Roger" /path/to/mykeyfile ?
  • Ou, pelo menos, posso passar a frase secreta para um argumento da minha chamada de script? %código%

It does exist for SSH, sshpass.

Nota de segurança: Eu não me importo em escrever a frase secreta em um script, porque ela é substituída em # sh myscript.sh -passphrase "Jolly..." pelo keyfile. Além disso, o script deve ser usado por membros confidenciais internos. É privado.

    
por ArchiT3K 24.08.2015 / 13:58

2 respostas

1

Se a chave não contiver nenhuma nova linha, você pode simplesmente canalizá-la.

# cryptsetup luksFormat foobar.img originalkey

WARNING!
========
This will overwrite data on foobar.img irrevocably.

Are you sure? (Type uppercase yes): YES

# cryptsetup luksAddKey foobar.img newkey < originalkey

Infelizmente cryptsetup tem vários modos de manipulação de arquivos de chave e trata de novas linhas e de forma tão diferente dependendo de qual modo ela está. Para chaves de caracteres especiais, a tubulação não funciona:

# cryptsetup luksAddKey foobar.img newkey < originalkey
No key available with this passphrase.

Nesse caso, você precisaria da opção keyfile:

# cryptsetup luksAddKey --key-file=originalkey foobar.img newkey

Ou se você ainda quiser canalizá-lo,

# cryptsetup luksAddKey --key-file=- foobar.img newkey < originalkey

Confuso, né? A ambigüidade pode ser evitada se você usar chaves que sejam apenas ASCII, com no máximo 512 caracteres, e que não contenham caracteres não imprimíveis, para que você também possa digitá-las manualmente em um piscar de olhos.

Se possível, você deve evitar coisas como --password=xyz . Esta informação é pública, ela vaza suas senhas para a lista de processos, histórico de shell e possivelmente outros lugares. Sempre use canais ou arquivos com permissões de leitura restritas.

    
por 24.08.2015 / 14:12
0

Para responder à sua pergunta, envie a frase secreta no stdin . Então faça um:

zenity --password | cryptsetup luksAddKey /dev/mydevice /path/to/my/keyfile

Para mais informações, o --key-file permite que você aponte para um arquivo como uma chave para desbloquear o dispositivo. E você poderia usar --key-file = - para usar informações de stdin. Mas isso precisa ser um arquivo-chave. Não é um arquivo que contenha sua senha.

Exemplo:

cat /tmp/fileContainingPassword | cryptsetup luksAddKey /dev/mydevice /path/to/my/new/keyfile

e

cat /path/to/keyfile | cryptsetup luksAddKey --key-file=- /dev/mydevice /path/to/my/new/keyfile

são diferentes. O primeiro lê uma senha para desbloquear o dispositivo em stdin .
O segundo lê um arquivo-chave para desbloquear o dispositivo em stdin .

Keyfiles e senhas são tratados de forma diferente por cryptsetup.

Outra informação: a opção --key-file é apenas ler um arquivo de chaves já atribuído ao dispositivo para desbloquear o dispositivo e adicionar uma nova chave. Para atribuir uma nova chave, você só pode apontar para um arquivo. Não há opções - para ler a partir do stdin . Se você não quiser deixar nada no sistema de arquivos, mas ainda não digitar nada no prompt (nem a frase secreta de desbloqueio, nem a nova frase secreta), então você terá que usar pipes nomeados.

mkfifo /tmp/mytmpkey
# Here we put the process in the background with &,
# otherwise, it would block until
# cryptsetup read the value from /tmp/mytmpkey
dd if=/dev/urandom of=/tmp/mytmpkey bs=512 count=4 & 
cryptsetup luksAddKey --key-file /path/to/unlockKey /tmp/mytmpkey
rm /tmp/mytmpkey 
    
por 15.02.2016 / 21:42