Como dar acesso ssh a alguém para enviar arquivos remotamente?

2

Eu quero dar a alguém permissão para hospedar alguns arquivos simples no meu servidor web do Ubuntu. Isto é para um bot de registro de IRC. Eu gostaria de dar-lhes acesso ssh / scp / rsync / sftp sem senha. No entanto, eu quero ser capaz de restringir o que eles podem fazer, eu não quero dar a eles um shell ssh completo em outras palavras. Eu também gostaria de poder limitar a quantidade de espaço em disco que eles podem ocupar, então eles não podem usar mais do que (digamos) 200MB de meu disco no total.

Opções de bônus que não são necessárias, mas podem ser interessantes: limite o tipo de arquivos que eles podem enviar por upload? (Mime tipo talvez?) Log quando eles carregam um arquivo? Limitar sua largura de banda?

Quais são minhas opções?

    
por Rory 21.07.2009 / 22:28

4 respostas

7

No Ubuntu / Debian, você pode instalar o shell scponly para restringi-los somente ao scp / sftp. Basta instalar o pacote e alterar seu shell para /usr/bin/scponly :

sudo aptitude install scponly
sudo usermod -s /usr/bin/scponly USERNAME

O problema de espaço em disco provavelmente é melhor resolvido com cotas de sistema de arquivos. Infelizmente, tenho pouca experiência com eles.

Se você quiser se tornar mais chique (restringindo tipos de arquivos e tal), você provavelmente precisará escrever seu próprio script para validar os comandos que estão sendo passados do cliente. O script mais simples seria um script de shell que realiza um teste semelhante a este:

if [[ $SSH_ORIGINAL_COMMAND = "scp -f *txt" ]]
then
   exec $SSH_ORIGINAL_COMMAND
fi

Isso permitiria o download de arquivos .txt. Testes rápidos indicam que o nome do arquivo não é passado como parte do comando scp durante o envio. Por isso, pode não ser possível nesse caso.

O script seria definido como o comando forçado para a chave do usuário. (O campo '' command="blah" '' em authorized_keys.) Ele também pode ser configurado como a opção "ForceCommand" para um grupo Match em sshd_config, assim:

Corresponder grupo scponly     ForceCommand / usr / local / sbin / scpwrapper

Em seguida, adicione os usuários para ficarem restritos ao grupo "scponly".

EDITAR: Por solicitação, aqui está o script que eu uso para impor o acesso apenas ao rsync:

#!/bin/bash
# 
# Verify that rsync command appears to be a legitimate rsnapshot command.
# Requires >= bash 3.x
#
# Ben Beuchler
# 6/4/07

# rsync needs to be operating in "server" mode.
re_server='rsync --server'

# Match both -x and --word options
re_options=' +-{1,2}[[:alpha:]-]+'

# Match legal paths
re_paths=' +[-[:alnum:]_./]+'

# Build the full regex
r="^${re_server}(${re_options})+(${re_paths}){2}$"

echo $SSH_ORIGINAL_COMMAND >> ssh_log

if [[ $SSH_ORIGINAL_COMMAND =~ $r ]]
then
        exec $SSH_ORIGINAL_COMMAND
else
        echo "Invalid rsync command."
fi

Use esse script como um comando forçado (por "command=" em ~ / .ssh / authorized_keys ou usando um bloco "Match" em sshd_config como mencionado acima) e ele rejeitará tudo, exceto os comandos rsync. Com um pequeno ajuste, pode ser feito apenas aceitar comandos rsync específicos.

    
por 21.07.2009 / 23:02
2

Uma solução possível é fazer o chroot-jail, usando uma shell fictícia ssh.

link

link

Eu já vi isso implementado com sucesso antes neste contexto, embora eu não tenha feito isso sozinho.

    
por 21.07.2009 / 22:33
1

O SSH fornece um mecanismo para criar pares de chaves que podem ser limitados a um único comando ou conjunto de comandos. Consulte este artigo no site linuxjournal por um bom artigo que explica como criar chaves ssh dedicadas para uso em scripts e para trabalhos agendados, por exemplo. Isso também pode ser aplicado para dar ao usuário a capacidade de acessar um servidor sem senha e executar um comando específico remotamente.

Esta pergunta do stackoverflow também tem alguns bons exemplos de como fazer a mesma coisa que é discutida no artigo lj. Especificamente, você está usando o arquivo authorized_keys para adicionar chaves que têm permissão para acessar, mas restringindo essas chaves, inclusive meus comandos em um dos campos no arquivo authorized_keys.

    
por 27.12.2012 / 19:51
0

Eu não consegui fazer o script funcionar e limpar uma entrada rsync corretamente, talvez eu tenha perdido algo, em vez disso eu descobri um programa em perl chamado authprogs

Isso faz o mesmo de uma maneira mais complexa, mas vai muito além e permite que você também endureça contra IP.

    
por 27.12.2012 / 19:15

Tags