Diretório não interativo do ecryptfs criptografar / descriptografar

2

Posso descriptografar um diretório privado ecryptfs de um script?

Meu caso de uso básico para esse tipo de atividade é para fazer backups remotos. Imagine que você tenha uma máquina (chame-a de privatebox) com um diretório privado criptografado que armazene suas fotos (ou alguma outra informação sensível). Ele é descriptografado apenas ao fazer login. E imagine que você queira gravar um script em uma máquina remota que faça login na caixa privada, descriptografe o diretório para adicionar uma foto, criptografar novamente e efetuar logout. Tudo sem etapas interativas do usuário sendo necessário (talvez seja executado a partir do cron). Observe que a frase secreta para o privatebox NÃO seria armazenada no privatebox em texto simples ou qualquer coisa. E como seria criptografado (exceto durante a atualização), ele seria protegido se alguém obtivesse o cartão SD, etc.

Esse script funcionaria assim (em minha mente):

  • configurar o diretório privado no privatebox criptografado com uma frase secreta
  • configura as chaves ssh da máquina local para a privatebox para que você possa usar ssh de forma não interativa (o cron pode efetuar login)
  • Então o que? Como você descriptografa uma pasta privada de maneira não interativa se você conhece a frase secreta?

Parece que o ecryptfs é projetado especificamente para não permitir isso (mesmo com truques de chave SSH, você ainda precisa montar manualmente seu diretório privado).

Basicamente, o que estou procurando é uma versão não interativa de 'ecryptfs-mount-private' ou algo semelhante, se alguém souber uma solução. Algo como:

% ecryptfs-mount-private -p $ PASSFRRASE

Onde eu poderia passar a senha em vez de ter que digitá-la.

Se o ecryptfs não puder fazer isso, alguém sabe de uma alternativa? Obrigado!

    
por jrel 16.02.2015 / 17:57

2 respostas

3

Ok, eu percebi isso. Obrigado pela sua ajuda Xen2050, eu não tenho reputação suficiente aqui para dar-lhe um upvote (ainda).

Aqui está o script que funciona para mim:

#Set this variable to your mount passphrase. Ideally you'd get this from $1 input so that the actual value isn't stored in bash script. That would defeat the purpose.
mountphrase='YOURMOUNTPASSPHRASE' 

#Add tokens into user session keyring
printf "%s" "${mountphrase}" | ecryptfs-add-passphrase > tmp.txt

#Now get the signature from the output of the above command
sig='tail -1 tmp.txt | awk '{print $6}' | sed 's/\[//g' | sed 's/\]//g''
rm -f tmp.txt #Remove temp file

#Now perform the mount
sudo mount -t ecryptfs -o key=passphrase:passphrase_passwd=${mountphrase},no_sig_cache=yes,verbose=no,ecryptfs_sig=${sig},ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=no,ecryptfs_enable_filename_crypto=no /home/user/.Private /home/user/Private

Note que tive que desabilitar a criptografia de nomes de arquivo para que isso funcionasse. Quando tentei usar criptografia de nome de arquivo, recebi um erro de biblioteca durante a montagem. Para não ter criptografia de nome de arquivo, você deve usar o seguinte ao criar seu diretório privado:

ecryptfs-setup-private -n

Isso agora está funcionando para mim.

Em resposta a algumas pessoas que diriam "por que fazer assim?", bem, nem sempre quero montar meus dados particulares em cada login. Eu quero ter uma maneira rápida de montar os dados que não exigem que eu use minha senha de login real do usuário. Imagine que eu queira compartilhar os dados com outra pessoa? Eu teria que dar minha senha. Usar a senha de montagem me permite ter essencialmente uma senha de montagem que pode ser menos segura que meu login. Isso também é útil se você quiser montar automaticamente seus dados e armazenar a frase em algum lugar (talvez em um pendrive como uma chave para desbloquear seus dados). Eu nunca iria querer armazenar minha senha de login em qualquer lugar em texto simples. Mas se você conhece o conteúdo de seus dados e sabe que os dados em si são menos privados do que sua própria conta, essa é uma boa solução.

    
por 28.02.2015 / 23:25
3

Você pode usar primeiro ecryptfs-add-passphrase para colocar sua frase secreta no chaveiro do kernel, pois ao passar sua frase secreta para ela (manter a senha segura, sem deixá-la em um arquivo de texto simples, é uma preocupação):

printf "%s" "passphrase" | ecryptfs-add-passphrase [--fnek] -

Em seguida, usei mount.ecryptfs_private :

mount.ecryptfs_private is a mount helper utility for non-root users to cryptographically mount a private directory, ~/Private by default.

This program optionally takes one argument, ALIAS. If ALIAS is omitted, the program will default to using "Private" using: - $HOME/.Private as the SOURCE - $HOME/Private as the DESTINATION - $HOME/.ecryptfs/Private.sig for the key signatures.

If ALIAS is specified, then the program will look for an fstab(5) style configuration in: - $HOME/.ecryptfs/ALIAS.conf and for key signature(s) in: - $HOME/.ecryptfs/ALIAS.sig

The mounting will proceed if, and only if: - the required passphrase is in their kernel keyring, and - the current user owns both the SOURCE and DESTINATION mount points - the DESTINATION is not already mounted

This program will:

  • mount SOURCE onto DESTINATION
  • as an ecryptfs filesystem
  • using the AES cipher
  • with a key length of 16 bytes
  • using the passphrase whose signature is in ~/.ecryptfs/Private.sig

Ou leia man ecryptfs e configure sua própria linha mount , usando um arquivo-chave ou descritores de arquivo ou variáveis para obter sua frase-senha para o comando mount da maneira que achar melhor. Como em mount -t ecryptfs [SRC DIR] [DST DIR] -o [OPTIONS] prestando atenção a opções como:

   passphrase_passwd=(passphrase)
          The actual password is passphrase. Since the password is  visible
          to  utilities  (like ps under Unix) this form should only be used
          where security is not important.

   passphrase_passwd_file=(filename)
          The   password   should   be   specified   in   a    file    with
          passwd=(passphrase).  It  is  highly recommended that the file be
          stored on a secure medium such as a personal usb key.

   passphrase_passwd_fd=(file descriptor)
          The password is specified through the specified file descriptor.

   openssl_keyfile=(filename)
          The filename should be the filename of a file containing  an  RSA
          SSL key.

etc...

Mas se o diretório criptografado for descriptografado / montado sempre que o usuário fizer login, tudo o que você precisa fazer é efetuar login, não é?

    
por 17.02.2015 / 06:17