SSH usando chaves no armazenamento externo - permissões?

5

Eu tenho um conjunto de chaves SSH para acessar contas e servidores. No entanto, desde que eu mudei o meu perfil de trabalho principal para uma unidade USB (para sincronização e facilidade de uso, entre outras razões) eu fui incapaz de diretamente usar as chaves SSH no perfil para autenticação, tendo que crie cópias locais em vez disso.

O fluxo de trabalho normal do SSH costuma ser

ssh-add $HOME/.ssh/id_server_key 
ssh username@domain

Que funciona sem problemas. No entanto, para impedir que cada máquina tenha uma cópia das minhas chaves, eu as movi para uma unidade xexternal, formatada como vfat . Então o fluxo de trabalho deve ser assim:

ssh-add  /run/media/myself/USB/.ssh/id_server_key
ssh username@domain

... O que não funciona. SSH reclama sobre fazer algo para me proteger:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'id_server_key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: id_server_key
Permission denied (publickey).

Que, embora eu possa entender, não é realmente que me protege neste caso.

O drive USB monta automaticamente na minha distro, com um fmask de (eu acho) 022 . Eu poderia desmontar e remontar a unidade USB com um fmask de 077 , mas isso exigiria (1) privilégios de superusuário a cada vez e (2) afetaria cada arquivo no dispositivo, não apenas as chaves SSH.

Eu tentei criar um link simbólico para a chave, mesmo com o uso anterior de umask , como já vi em algumas dicas e truques:

cd .ssh
umask 077
ln -s /run/media/myself/USB/.ssh/id_server_key 

Mas as permissões não podem ser usadas dessa forma para um link simbólico, então eu não recebo nada.

Então, quais opções tenho aqui disponíveis se o objetivo for não ter uma cópia física da chave na máquina? Uma das máquinas é um laptop familiar que vai para vários lugares, por isso tenho interesse em evitar que algumas das chaves sejam descobertas.

Até agora eu considerei o seguinte:

  • Existe, por exemplo, uma opção para forçar o SSH ( ssh-add principalmente) a aceitar as chaves do dispositivo externo? (Presumo que deva existir - a maioria dos programas segue um sinalizador "sei-o-que-estou-fazendo", mas até agora não consigo encontrá-lo na página do manual.
  • Definindo um bindfs sobre o diretório .ssh/ , mas o problema é que o diretório não está vazio (pois contém known_hosts e outros dados).
  • fuse-zip -executar as chaves em /dev/shm também parece ser um caminho possível.

EDITAR : Conforme o comentário de @Gilles, sim, bindfs resolve o problema. Após uma verificação da página de manual, o teste inicial foi bem-sucedido usando a seguinte chamada:

bindfs -n -r -p 0700 -o nonempty /run/media/myself/USB/.ssh/ ~/.ssh 

Que liga a não permissão de acesso de outros usuários (aparentemente mesmo de root !), somente leitura, com permissões 0700 refletidas. Essa reflexão foi a parte que me faltou quando trabalhei com bindfs originalmente. O sinalizador nonempty foi necessário devido a arquivos preexistentes, como known_hosts . Isso preserva o fluxo de trabalho original exatamente, exceto por um messae de aviso extra sobre não ser possível adicionar informações a known_hosts (que no final eu não me importaria).

Claro, eu estou ligando para outro diretório agora (em / dev / shm) como originalmente sugerido para tornar as coisas um pouco mais fáceis.

Eu não sou tão conspiranóide quanto ao encfs do meu pendrive (ainda), então, com relação à privacidade, isso é bom o suficiente para mim.

    
por Luis Machuca 12.01.2013 / 00:54

3 respostas

1

ssh-add não tem uma opção para ignorar a verificação das permissões de chave. Você poderia recompilar o programa e desabilitar a verificação.

Um bindfs deve funcionar. Você não precisa montá-lo em ~/.ssh , montá-lo em um local de propósito especial e escrever um script que use ssh-add ~/.ssh-private-keys-bindfs .

Note que o ssh está certo, pois sua configuração é bastante insegura. Você deve certificar-se de nunca conectar a unidade a um computador em que você não seja o único usuário.

    
por 12.01.2013 / 01:04
2

Você pode carregar a chave externa por meio do canal nomeado , por exemplo

$ mkfifo -m=600 fifo
$ cat /external/media/.ssh/id_server_key >fifo | ssh-add fifo

Usar a substituição do processo também pode funcionar (usando a sintaxe bash / zsh):

$ ssh-add <(cat /external/media/.ssh/id_server_key)

O comando acima é equivalente a: cat /external/media/.ssh/id_server_key | ssh-add - .

assumindo que seu canal anônimo tenha as permissões certas (verifique via: stat <(:) ).

Ou tente carregá-lo a partir da entrada padrão:

$ cat /external/media/.ssh/id_server_key | ssh-add -
    
por 11.10.2015 / 14:32
0

É um problema de permissões, conforme identificado por esta linha:

Permissions 0644 for 'id_server_key' are too open.

Isso acontece porque suas permissões são muito abertas na chave privada, então o ssh não pode garantir a autenticidade da chave e não aceita usá-la.

Portanto, levando em conta o VFATness do thumbdrive (que não suporta a alteração das permissões), você poderia fazer algo como adicionar essa linha em /etc/fstab file:

LABEL=USB none msdos -u=USERID,-m=PERMS

Onde USERID é seu ID de usuário numérico e PERMS é 700. Isso deve dizer ao montador automático para montar sempre a unidade USB como esse usuário, sem direitos para grupo ou outro.

No caso de seu sistema de arquivos oferecer suporte a permissões, seria muito mais fácil corrigi-lo por:

chmod 700 /run/media/myself/USB/.ssh
chmod 400 /run/media/myself/USB/.ssh/id_server_key
    
por 12.01.2013 / 01:03

Tags