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:
- Execução de comandos do shell
- Upload de arquivo através do sftp
- Encaminhamento de porta
- O cliente encaminha uma porta (des) usada para o servidor
- O servidor encaminha sua porta para o cliente
- O servidor encaminha uma porta de outro host para o cliente (proxy-ish)
- Encaminhamento X11 (encaminhamento de exibição)
- Encaminhamento de agente de autenticação
- Encaminhamento de um dispositivo de túnel
Na seção Autenticação da página de manual do sshd (8) :
Se o cliente se autenticar com êxito, será exibida uma caixa de diálogo para preparar a sessão. Nesse momento, o cliente pode solicitar coisas como
alocar uma pseudo-tty, encaminhar conexões X11, encaminhar conexões TCP ou encaminhar a conexão do agente de autenticação pelo canal seguro.
Depois disso, o cliente solicita um shell ou a execução de um comando . Os lados entram no modo de sessão. Nesse modo, qualquer um dos lados pode enviar dados a qualquer momento, e esses dados são encaminhados de / para o shell ou comando no lado do servidor e o terminal do usuário no lado do cliente.
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ção
no-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 sistema
AllowAgentForwarding
- 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
:
Especifica os destinos para os quais o encaminhamento de porta TCP é permitido. A especificação de encaminhamento deve ser uma das seguintes formas:
PermitOpen host:port
PermitOpen IPv4_addr:port
PermitOpen [IPv6_addr]:port
Vários encaminhamentos podem ser especificados, separando-os com espaço em branco. Um argumento de 'any' pode ser usado para remover todas as restrições e permitir solicitações de encaminhamento. Por padrão, todas as solicitações de encaminhamento de porta são permitidas.
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.
Match User limited-user
#AllowTcpForwarding yes
#X11Forwarding no
#PermitTunnel no
#GatewayPorts no
AllowAgentForwarding no
PermitOpen localhost:62222
ForceCommand echo 'This account can only be used for [reason]'
Agora adicione um usuário:
sudo useradd -m limited-user
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 de ssh-
(com um espaço entre as opções e ssh-
):
command="echo 'This account can only be used for [reason]'",no-agent-forwarding,no-X11-forwarding,permitopen="localhost:62222"
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).
# connection closed:
ssh host
# connection closed (/bin/date is not executed):
ssh host /bin/date
# administratively prohibited (2x):
ssh host -N -D 62222 # client: curl -I --socks5 localhost:62222 example.com
ssh host -N -L 8080:example.com:80 # client: curl -I localhost:8080
sftp host
# should be possible because the client should forward his SSH server
ssh host -N -R 8080:example.com:80 # server: curl -I localhost:8080
# This works, it forwards the client SSH to the server
ssh host -N -R 62222:localhost:22
# unfortunately, the client can listen on that port too. Not a big issue
ssh host -N -L 1234:localhost:62222
Conclusão
Lista de verificação: O usuário SSH não deve:
- executar comandos shell - concluídos
- acessar arquivos ou fazer upload de arquivos para o servidor - pronto
- use o servidor como proxy (por exemplo, webproxy) - pronto
- acessar serviços locais que, de outra forma, não estavam acessíveis ao público devido a um firewall - parcialmente , o cliente não pode acessar outras portas além da 62222, mas pode ouvir e conectar-se à porta 62222 no servidor
- matar o servidor - concluído
(observe que essas verificações são limitadas ao servidor SSH. Se você tiver outro serviço vulnerável na máquina, isso poderá permitir que um possível invasor execute comandos, mate o servidor etc.)