Criptografando arquivo apenas com SSH -priv-key?

22

Suponha que eu queira criptografar um arquivo para que somente eu possa lê-lo, conhecendo minha senha de chave privada SSH. Estou compartilhando um repositório no qual desejo criptografar ou ocultar informações confidenciais. Com isso, quero dizer que o repositório conterá as informações, mas eu as abrirei apenas em casos especiais.

  1. Suponha que eu esteja usando o agente SSH, existe alguma maneira fácil de criptografar o arquivo para que eu o abra mais tarde?

  2. Não vejo por que devo usar o GPG para essa pergunta aqui ; basicamente, eu sei a senha e quero apenas descriptografar o arquivo com a mesma senha da minha chave SSH. Isso é possível?

Comunidade
fonte

Respostas:

27

Acho que seu requisito é válido, mas, por outro lado, também é difícil, porque você está misturando criptografia simétrica e assimétrica. Por favor me corrija se eu estiver errado.

Raciocínio:

  1. A senha da sua chave privada é para protegê-la e nada mais.
  2. Isso leva à seguinte situação: Você deseja usar sua chave privada para criptografar algo que somente você pode descriptografar. Sua chave privada não se destina a isso, sua chave pública está lá para fazer isso. Tudo o que você criptografa com sua chave privada pode ser descriptografado por sua chave pública (assinatura), certamente não é o que você deseja. (O que for criptografado por sua chave pública só pode ser descriptografado por sua chave privada.)
  3. Portanto, você precisa usar sua chave pública para criptografar seus dados, mas para isso, não precisa da sua senha de chave privada para isso. Somente se você quiser descriptografá-lo, precisará da sua chave privada e da senha.

Conclusão: Basicamente, você deseja reutilizar sua senha para criptografia simétrica. O único programa que você deseja fornecer à sua senha é ssh-agent e esse programa não executa criptografia / descriptografia apenas com a senha. A senha está lá apenas para desbloquear sua chave privada e depois esquecida.

Recomendação: Use openssl encou gpg -e --symmetriccom arquivos de chave protegidos por senha para criptografia. Se você precisar compartilhar as informações, poderá usar a infra-estrutura de chave pública de ambos os programas para criar uma PKI / Web of Trust.

Com o openssl, algo como isto:

$ openssl enc -aes-256-ctr -in my.pdf -out mydata.enc 

e descriptografia algo como

$ openssl enc -aes-256-ctr -d -in mydata.enc -out mydecrypted.pdf

Atualização: É importante observar que os comandos openssl acima NÃO impedem que os dados sejam violados. Um simples toque no arquivo enc resultará em dados descriptografados corrompidos também. Os comandos acima não podem ser detectados, é necessário verificar isso, por exemplo, com uma boa soma de verificação como SHA-256. Existem maneiras criptográficas de fazer isso de forma integrada, isso é chamado de HMAC (Código de autenticação de mensagens baseado em Hash).

vasquez
fonte
5
Você está certo de que uma chave SSH é uma chave assimétrica, não adequada para criptografar um arquivo. E, como consequência, os comandos que você fornecer no final não funcionarão. Você está tentando criptografar um arquivo com o RSA, mas só pode criptografar uma carga útil muito pequena com o RSA (o tamanho do módulo menos o preenchimento). O método normal é gerar uma chave simétrica de uso único, criptografar com o RSA e criptografar os dados reais com a chave simétrica. Pode ser possível importar a chave ssh no gpg, que seria a maneira correta de implementar os requisitos do hhh - mas usar o gpg com uma chave gpg é a coisa certa a fazer.
Gilles 'SO- stop be evil'
1
Por que você sugere gpg com a bandeira simétrica? Também funciona com "gpg -e something"casos diferentes?
1
@hhh Presumi que você não compartilharia seus arquivos, portanto, usar apenas simétrica é mais seguro do que usar criptografia de chave pública. Não há necessidade de público / privado par de chaves etc. De pgp.net/pgpnet/pgp-faq/... : "ainda se acredita que RSA é o elo mais fraco da cadeia PGP." Isso também se aplica a outros mecanismos pubkey, como x509.
vasquez
1
Como seria o openssl -one-liner? Algo equivalente a $ gpg -e --symmetric?
1
Use isso para criptografar openssl enc -aes-256-cbc -in my.pdf -out mydata.enc:, descriptografar com: openssl enc -aes-256-cbc -d -in mydata.enc -out mydecrypted.pdfambos os comandos solicitam a senha. Veja man enc(em rh / fedora / centos) todas as opções como arquivos-chave, codificação base64 etc.
vasquez
21

Eu preferiria usar o opensslutilitário, pois parece bastante onipresente.

Converta a chave pública e a chave RSA no formato PEM:

$ openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
$ openssl rsa -in ~/.ssh/id_rsa -pubout -outform pem > id_rsa.pub.pem

Criptografando um arquivo com sua chave pública:

$ openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem -in file.txt -out file.enc

Descriptografando o arquivo com sua chave privada:

$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc -out file.txt

Mas, como Gilles comentou acima, isso é adequado apenas para criptografar arquivos menores que sua chave pública, então você pode fazer algo assim:

Gere uma senha, criptografar o arquivo simetricamente e criptografar a senha com o seu público, salvando a chave em arquivo:

$ openssl rand 64 | 
tee >(openssl enc -aes-256-cbc -pass stdin -in file.txt -out file.enc) |
openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem  -out file.enc.key

Descriptografe a senha com sua chave privada e use-a para descriptografar o arquivo:

$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc.key | 
openssl enc -aes-256-cbc -pass stdin -d -in file.enc -out file.txt

Você terminará com dois arquivos, seu arquivo criptografado e sua senha criptografada, mas, em um script, ele funcionará bem.

Você pode até adicionar um tar cvf file file.enc file.enc.keypara arrumar.

Idealmente, você maximizaria o tamanho da sua senha e mudaria rand 64para o tamanho da sua chave pública.

kwarrick
fonte
Muito bem feito, considerando os requisitos peculiares do OP.
rsaw
2
só encontrei isso, bom post. Descobri que a chave simétrica de tamanho máximo que você pode gerar a partir da chave ssh é 12 bytes menor que a própria chave ssh, caso contrário, o rsautl falhará com "dados muito grandes para o tamanho da chave". Então, isso funcionou em um script: KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')para gerar automaticamente um tamanho de chave. Dado que o ssh-keygen tem um comprimento de chave mínimo de 768 bits, isso ainda leva a uma chave simétrica mínima de 672 bits, ou 84 bytes.
markf
6

Veja luks / dm-crypt . Você pode usar sua chave ssh-private-key como chave de criptografia, usando a opção apropriada.

Atualização: Exemplo de criptografia usando LUKS com um dispositivo de bloco LV (teste LV no sistema VG):

KEY=/home/youraccount/.ssh/id_dsa
DEVICE=/dev/system/test
cryptsetup luksFormat $DEVICE $KEY
cryptsetup luksOpen $DEVICE test_crypt --key-file $KEY

Isso deve gerar um dispositivo de bloco / dev / mapper / test_crypt no qual você pode armazenar seus dados (após formatá-los com um sistema de arquivos de sua escolha).

Para se livrar dele, desmonte e use cryptsetup luksClose test_crypt.

Nils
fonte
Você poderia pedir ao MVO para que seja fácil reutilizá-lo? "$ sudo apt-get install cryptmount crypt-setup; cat '...' > bin/myEncrypt.sh; chmod +x bin/myEncrypt.sh; ./bin/myEncrypt.sh; ...; ..."Se eu entendi direito, esse método é uma criptografia no nível do sistema de arquivos. Ele criptografa o fs que você precisa montar / montar ou estou interpretando mal isso?
2
Eu não acho que isso faz o que você pensa que faz. A --key-fileopção cryptsetup usa o conteúdo real do arquivo como uma senha grande. Ele não lê a chave openssl do arquivo e apenas a usa. Você pode usar um arquivo de bytes aleatórios para o --key-fileque desejar.
Patrick
@hhh Sim, essa é uma criptografia no nível FS.
Nils
4
@ Nils, mas o que acontece quando ele altera a senha em sua chave privada, ele agora não consegue descriptografar seus arquivos à medida que os dados no arquivo de chaves são alterados. --key-fileé realmente um nome mal escolhido para a opção, deve ser--password-file
Patrick
1
@ Patrick Isso é verdade - alterar a senha passará a alterar o arquivo e, portanto, a chave (da perspectiva do luks). Mas, mesmo da perspectiva do ssh, eu não o nomearia como um arquivo de senha. Sei que minha resposta não atinge o alvo - mas acho que fornecerá algumas idéias.
Nils