Como alterar a permissão do pipe anônimo?

3

Eu tenho o script que carrega a chave SSH da variável (como parte do script no ambiente de IC) para não manter o arquivo privado no repositório público, no entanto ssh-add reclama das permissões erradas (e < href="https://unix.stackexchange.com/a/61008/21471"> parece que não é possível ignorá-lo ). Então, minha abordagem é encontrar o método de alterar a permissão do pipe anônimo criado instantaneamente.

Por exemplo:

$ stat <(:)
  File: ‘/dev/fd/63’
  Size: 0           Blocks: 0          IO Block: 512    fifo
Device: 397f3928h/964639016d    Inode: 818277067   Links: 0
Access: (0660/prw-rw----)  Uid: (  501/  kenorb)   Gid: (   20/   staff)
Access: 2015-10-10 22:33:30.498640000 +0100
Modify: 2015-10-10 22:33:30.498640000 +0100
Change: 2015-10-10 22:33:30.498640000 +0100
 Birth: 2015-10-10 22:33:30.498640000 +0100

mostra a permissão 0660 . Eu verifiquei meu umask e parece que não tem nada a ver com isso.

Aqui está um teste simples (no OS X, que por padrão tem 0660):

$ ssh-add <(cat ~/.ssh/id_rsa)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0660 for '/dev/fd/63' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.

No Linux, parece funcionar, porque é 0500 por padrão. De onde esta permissão é controlada?

Para esclarecer, não estou tentando alterar a permissão de nenhum arquivo, pois gostaria de usar um canal anônimo.

A questão é:

Como faço para alterar temporariamente a permissão de um pipe?

    
por kenorb 11.10.2015 / 00:07

2 respostas

3

Até agora, encontrei a seguinte solução usando o FIFO nomeado:

$ mkfifo -m=600 fifo
$ cat ~/.ssh/id_rsa >fifo | ssh-add fifo
Identity added: fifo (fifo)

onde -m define a permissão FIFO.

    
por 11.10.2015 / 01:14
1

Você pode envolver ssh-add em um programa que executa chmod no caminho /dev/fd/N ou fchmod no descritor de arquivo.

Por exemplo, em uma máquina Linux em que não recebo nenhuma reclamação de ssh-add usando as permissões padrão, posso reproduzir o erro fazendo isso:

perl -e 'chmod 0777, $ARGV[0];exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)

Se isso reproduzir o problema, isso deverá resolvê-lo:

perl -e 'chmod 0600, $ARGV[0];exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)

O chmod é fornecido com um nome de caminho como /proc/self/fd/11 , mas altera as permissões no inode do canal real (já que o chmod não funciona em links simbólicos). Isso deve ter o mesmo efeito, mas usando fchmod:

perl -e 'open P, "<", $ARGV[0]; chmod 0600, \*P;close P;exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)

Este deve ter o mesmo efeito, usando fchmod e aproveitando o fato de que o nome do caminho está em um formato previsível para evitar o extra aberto:

perl -e '$ARGV[0] =~ m,^(?:/proc/self|/dev)/fd/(\d+)\z, and $^F=$1 and open P, "<&=$1" and chmod 0600, \*P;exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)

Esses scripts perl pareceriam menos feios como programas em C; convertê-los é simples quando você identifica um que funciona no seu ambiente de destino.

    
por 12.10.2015 / 01:44