restringe o repositório privado do apt com o rssh - por que o apt-get tenta / bin / sh?

5

Estou tentando configurar um repositório privado via ssh. Meu sources.list.d/ contém a entrada

deb ssh://user@host:/repo ./ 

o usuário é uma conta somente de certificado no host. apt-get update funciona bem.

No entanto, gostaria de restringir o acesso ao download do repositório, ou seja, desativar o acesso ao shell. Se eu definir o shell do usuário para rssh, permitindo apenas scp e sftp, a atualização será interrompida.

De /var/log/syslog :

user user attempted to execute forbidden commands
command: /bin/sh

Por que o apt precisa de acesso ao shell na máquina do repositório, e existe uma maneira de evitar isso?

Eu notei que há um repositório do github para o apt-transport-sftp que eu poderia dar uma olhada, mas eu prefiro ficar com pacotes mais comuns para conveniência do usuário.

    
por relet 18.08.2015 / 09:55

2 respostas

1

Você não tem como evitar isso.

Com o método ssh padrão, apt precisa fazer o login no servidor remoto, chamar /bin/sh para obter acesso ao shell e fazer algum trabalho com alguns utilitários GNU como find , dd .

O código-fonte apt confirmou:

 157       Args[i++] = "/bin/sh";
 158       Args[i] = 0;
 159       execvp(Args[0],(char **)Args);
 160       exit(100);

(É surpreendente que apt ainda use a opção find with -follow , que ficou obsoleta)

    
por 14.09.2015 / 14:41
1

O que o APT faz remotamente

Eu configurei uma conta de teste e registrei todos os comandos apt executados no servidor remoto usando um script simples como um substituto para o Repo shell do proprietário. Aparentemente, apt está gerando um shell remoto em Para encontrar o caminho completo para arquivos conhecidos:

2015-09-14: Executing 'sh -c /bin/sh'; input and output follows:
find /tmp/repo/./InRelease -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Release.gpg -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Release -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Packages.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./it_CH.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./it.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./en.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Packages.xz -follow -printf '%s\n' 2> /dev/null || echo

...

Portanto, acho que você não pode restringir ações do usuário do repositório via rssh , como: (1) os comandos a serem executados estão sendo passados para o shell remoto via STDIN (em oposição ao recurso de execução remota do SSH), e (2) comandos são pipelines de shell.

Soluções alternativas?

Se você ainda quiser restringir ações executadas pelo usuário do repositório remotamente, vejo dois caminhos a seguir:

  • Defina o shell do usuário do repositório como rbash em vez disso, e forneça uma configuração $PATH personalizada apenas com o comandos que precisam ser executados. (Certifique-se de definir $PATH e não configurado outras variáveis de shell de um arquivo de inicialização que não pode ser escrito do usuário repo.) Isso ainda deixa a possibilidade para qualquer um ter as credenciais de acesso para ler qualquer arquivo no sistema.

  • Crie uma jaula chroot apenas com os arquivos repo e qualquer comando necessário pelo APT, e defina o shell do usuário do repositório para um script ou programa que executa chroot /jail "$@" em vez disso.

Registrando apt-get update actions

Aqui está o script que usei para registrar ações executadas remotamente ::

#!/bin/sh

echo "$(date -I): executing 'sh $@'; input and output follows" >> /tmp/sh.log
tee -a /tmp/sh.log | /bin/sh "$@" | tee -a /tmp/sh.log
    
por 14.09.2015 / 15:27