ændrük sugeriu uma conexão reversa para obter uma conexão SSH fácil com outra pessoa (para ajuda remota). Para que isso funcione, é necessário um usuário adicional para aceitar a conexão. Esse usuário precisa poder encaminhar sua porta através do servidor (o servidor atua como proxy).
Como crio um usuário restrito que não pode fazer nada além do descrito acima?
O novo usuário não deve ser capaz de:
- executar comandos shell
- acessar arquivos ou fazer upload de arquivos para o servidor
- use o servidor como proxy (por exemplo, webproxy)
- acessar serviços locais que, de outra forma, não estavam acessíveis ao público devido a um firewall
- mate o servidor
Resumindo, como crio um usuário SSH restrito que só pode se conectar ao servidor SSH sem privilégios, para que eu possa conectar-me através dessa conexão ao computador dele?
ssh
security
port-forwarding
Lekensteyn
fonte
fonte
Respostas:
TL; DR - vá para o final da resposta, "Aplicando as restrições"
A adição de um usuário restrito consiste em duas partes: 1. Criando o usuário 2. Configurando o daemon SSH (sshd)
Configurando o sshd
O melhor lugar para conhecer as possibilidades do SSH é lendo as páginas de manual relacionadas:
Onde o cliente SSH pode executar ações?
Antes de restringir algo, você precisa conhecer os recursos do SSH. Cuspir nas páginas do manual produz:
Na seção Autenticação da página de manual do sshd (8) :
Opções para restringir recursos SSH
Os arquivos e suas opções que alteram o comportamento são:
~/.ssh/authorized_keys
- contém chaves que podem se conectar e que podem receber opções:command="command"
- O comando fornecido pelo usuário (se houver) é ignorado. Observe que o cliente pode especificar o encaminhamento de TCP e / ou X11, a menos que seja explicitamente proibido . Observe que esta opção se aplica à execução de shell, comando ou subsistema.no-agent-forwarding
- Proíbe o encaminhamento do agente de autenticação quando essa chave é usada para autenticação.no-port-forwarding
- Proíbe o encaminhamento de TCP quando essa chave é usada para autenticaçãono-X11-forwarding
- "Proíbe o encaminhamento do X11 quando essa chave é usada para autenticação."permitopen="host:port"
- Limite o encaminhamento de porta 'ssh -L' local para que ele possa se conectar apenas ao host e à porta especificados.~/.ssh/environment
- Este arquivo é lido no ambiente no login (se existir). O processamento do ambiente é desativado por padrão e é controlado pela opção PermitUserEnvironment~/.ssh/rc
- Contém rotinas de inicialização a serem executadas antes que o diretório inicial do usuário se torne acessível./etc/ssh/sshd_config
- o arquivo de configuração em todo o sistemaAllowAgentForwarding
- Especifica se o encaminhamento ssh-agent (1) é permitido.AllowTcpForwarding
ForceCommand
- "Força a execução do comando especificado pelo ForceCommand, ignorando qualquer comando fornecido pelo cliente e ~ / .ssh / rc, se presente. O comando é chamado usando o shell de login do usuário com a opção -c."GatewayPorts
- "Especifica se os hosts remotos têm permissão para se conectar às portas encaminhadas para o cliente. Por padrão, o sshd (8) vincula os encaminhamentos de portas remotas ao endereço de loopback. Isso impede que outros hosts remotos se conectem às portas encaminhadas. GatewayPorts pode ser usado para especificar esse sshd deve permitir o encaminhamento de portas remotas para se vincular a endereços sem loopback, permitindo que outros hosts se conectem. "PermitOpen
:PermitTunnel
- Especifica se o encaminhamento do dispositivo tun (4) é permitido. O padrão é 'não'X11Forwarding
- Especifica se o encaminhamento X11 é permitido. O padrão é 'não'Aplicando as restrições
A modificação do arquivo de configuração em todo o sistema
/etc/ssh/sshd_config
permite que a configuração seja aplicada mesmo se a autenticação baseada em senha for aplicada ou se as restrições~/.ssh/authorized_keys
forem removidas acidentalmente. Se você modificou os padrões globais, descomente as opções adequadamente.Agora adicione um usuário:
A opção
ForceCommand
pode ser omitida se o shell estiver definido como um não-shell como/bin/false
(ou/bin/true
), pois/bin/false -c [command]
não fará nada.Agora, o cliente pode conectar-se apenas à porta 62222 no endereço de loopback do servidor pelo SSH (ele não escutará no endereço IP público)
Desabilitar
AllowTcpForwarding
também proibiria o uso de-R
, derrotando assim o uso de uma conta restrita para encaminhar uma única porta.PermitOpen localhost:62222
pressupõe que a porta 62222 no servidor nunca esteja em uso porque o cliente pode se conectar e ouvir com satisfação também.Se o encaminhamento de TCP for permitido na configuração do sistema e a autenticação baseada em senha desabilitada, você também poderá usar as configurações por chave. Edite
~/.ssh/authorized_keys
e adicione as próximas opções antes dessh-
(com um espaço entre as opções essh-
):Verificar
Para garantir que funcione conforme o esperado, alguns casos de teste precisam ser executados. Nos comandos abaixo,
host
deve ser substituído pelo login real, se não estiver definido~/.ssh/config
. Por trás do comando, é mostrado um comando que deve ser executado no cliente ou no servidor (conforme especificado).Conclusão
Lista de verificação: O usuário SSH não deve:
fonte
useradd
deve ser desbloqueada. Isso pode ser feito substituindo a senha/etc/shadow
por asteric (*
) ou definindo uma senha usandosudo passwd limited-user
.sftp-server
comando. ComForceCommand
, este comando não será mais executado.from=
opçãoauthorized_keys
. Permite limitar o uso da chave a fontes com um endereço IP ou nome de host específico. Exemplofrom="1.1.1.1"
oufrom="10.0.0.?,*.example.com"
. Consulte a seção "AUTHORIZED_KEYS FILE FORMAT" na página de manual ( linux.die.net/man/8/sshd ) para obter todas as opções de chaves autorizadas.Host * ControlMaster auto
no seu~/.ssh/config
arquivo ao se conectarssh -N
. Se você precisar, usessh -N -o ControlMaster=no
Tenho certeza de que existem muitas soluções para isso e muito mais robustas do que a que estou propondo. No entanto, isso pode ser suficiente para suas necessidades. Para fazer isso, suponho que o usuário tenha a capacidade de fazer autenticação baseada em chave ssh (putty ou qualquer ssh unix deve suportar isso).
Adicione um usuário como faria normalmente ('adduser' ou qualquer outra ferramenta)
Crie os usuários .ssh dir e .ssh / allowed_keys
Agora, a única maneira de o usuário entrar no seu sistema é através do acesso à chave ssh adequada, e o ssh executará "/ bin / bash -c 'leia a'" para eles, não importa o que eles tentem executar. 'read a' simplesmente lerá até uma nova linha e, em seguida, o shell será encerrado, portanto, o usuário precisará pressionar 'enter' para interromper a conexão.
Existem muitas outras coisas que você pode fazer em 'command ='. Veja
man authorized_keys
e procure por 'comando' para mais informações.Se você não gostar do fato de que pressionar Enter mata a conexão, use algo como o seguinte para a entrada 'command =':
Isso apenas cria um fifo temporário no diretório inicial dos usuários e tenta ler a partir dele. Nada será gravado nesse arquivo; portanto, isso será interrompido indefinidamente. Além disso, se você deseja encerrar forçosamente essa conexão, poderá fazer algo como:
Isso deve usar pouquíssimos recursos e nada deve dar errado nesse script que não terminaria com o encerramento do shell.
Eu não vi fora da mão como você pode permitir que o usuário para a frente remoto (
ssh -R
), mas limit (ssh -L
). Talvez o 'openopen' possa ser usado. O Google não foi muito útil. Parece que algo como 'no-port-forwarding, allowremoteopen = 10001' seria útil para permitirssh -R 6901:localhost:6901
.Esta é uma solução. Definitivamente, ele pode ser aprimorado e qualquer abertura de portas remotas deve ser examinada. Se meu objetivo fosse permitir que minha avó se conectasse à minha LAN, para que eu pudesse usar o vnc para visualizar sua tela, e o acesso a essas chaves fosse limitado a ela, eu me sentiria razoavelmente seguro. Se fosse para uma empresa, seria necessária uma investigação mais aprofundada. Uma coisa a ter em atenção é
ssh -N
não solicitar um shell, portanto o código 'command =' não é executado.Outros mecanismos possivelmente mais seguros podem incluir a criação de um shell personalizado para o usuário e até o bloqueio com aparência.
fonte
ssh
para a-N
opção. Deve haver uma maneira mais limpa de fazer isso.ssh -N
não executa um comando, não há problema emcommand="something"
fechar a sessão.chsh ssh_forwarder -s /bin/false
é tudo o que preciso.