SSH: shell aberto no namespace IP

2

Estou tentando forçar os usuários a efetuar login através do SSH para ter um shell dentro do namespace IP.

Eu tentei substituir o shell em /etc/passwd por algo como ip netns exec sshns /bin/bash , mas não funcionou.

Alguma outra ideia? É possível de alguma forma? Seria seguro ou não?

    
por Marcin Krupowicz 24.10.2015 / 21:31

2 respostas

4

O problema de lidar com isso alterando o shell de login, como no seu exemplo, é que quando o usuário se conecta a sshd no namespace da rede principal, mesmo que você receba o shell dentro de outro namespace, mas o encaminhamento de porta no namespace de rede padrão de qualquer maneira.

Minha solução proposta também endereça o encaminhamento de portas ao namespace e ao shell. É provavelmente limitado ao uso de contas locais, já que a autenticação contra o sistema remoto pela rede (NIS, SMB, etc.) provavelmente não funcionará porque o estágio de autenticação será executado a partir do namespace da rede.

Eu precisava do shell e do encaminhamento de porta para operar no namespace de destino sem criar rede / roteamento entre namespaces padrão e contidos .

Aqui estão alguns métodos / ferramentas para conseguir isso:

xinetd - Obrigado Stéphane Chazelas por apontar. Para um número único ou estático de namespaces e encaminhamento para eles xinetd parece uma opção melhor. por exemplo. arquivo /etc/xinetd.d/sshd-netns-foo

service sshdnetns
{
    type            = UNLISTED
    socket_type     = stream
    protocol        = tcp
    port            = 222
    wait            = no
    user            = root
    server          = /sbin/ip
    server_args     = netns exec NameSpaceName /usr/sbin/sshd -i
}

socat - para vários namespaces em que o encaminhamento para eles precisa ser iniciado / interrompido de forma independente socat é um bom ajuste. Execute isso no namespace padrão:

socat tcp-listen:222,fork,reuseaddr \
      exec:'ip netns exec NameSpaceName /usr/sbin/sshd -i',nofork

ncat - se socat não estiver disponível, então ncat (na minha caixa RHEL como nc ) pode fazer o trabalho. Desvantagem com ncat é o sshd conectado a ncat através de um canal em vez de diretamente ao soquete, portanto sshd não pode ver o IP do cliente com todas as conseqüências seguintes. Você também acaba executando no processo intermediário extra ncat .

ncat --keep-open --sh-exec "exec ip netns exec NameSpaceName /usr/sbin/sshd -i" -l 222

e provavelmente outras ferramentas.

Isso aceita conexões SSH no namespace padrão em uma porta personalizada 222 e para cada conexão começa uma vez sshd -i dentro do namespace de destino.

Isso resolveu isso para mim, mas você também tem a exigência de limitar os usuários que podem fazer login em cada namespace. Crie uma configuração específica do namespace sshd:

mkdir -pv /etc/netns/NameSpaceName/
cp -Rp /etc/ssh /etc/netns/NameSpaceName/

Adicione controles de acesso a cada arquivo sshd_config , por exemplo no padrão /etc/ssh/sshd_config :

AllowUsers user1 user2

... e em /etc/netns/NameSpaceName/ssh/sshd_config

AllowUsers restrictedUser1 restrictedUser2

... veja também AllowGroups diretivas

agora recrie o namespace para que o diretório se torne efetivo

Meus breves testes mostram que o controle de acesso do usuário funciona conforme o esperado, mas eu realmente não o usei tanto assim que é para você validar.

Eu tentei colocar arquivos /etc/passwd , /etc/shadow e /etc/group separados em /etc/netns/NameSpaceName/ para ter uma lista separada de usuários, mas no meu teste rápido que não funcionou: useradd test dentro do namespace falha.

Notas:

Se você não gosta de uma porta personalizada, você pode usar duas portas, por exemplo, macvlan ou apenas adicionar outro endereço IP e ouvir na porta padrão em um IP dedicado.

Toda a autenticação, shell, subsistema, encaminhamento de portas, etc., é tratada pelo sshd , portanto, não é necessário hackear mais nada.

Ele tem a desvantagem de executar sshd -i dessa forma, leia man sshd procurando a opção -i . Você poderia resolvê-lo facilmente executando um sshd em tempo integral dentro do namespace e alterando o daemon de encaminhamento para algo como isto:

nc --keep-open --sh-exec "exec ip netns exec NameSpaceName nc localhost 22" -l 222

Gostaria de saber se os namespaces de montagem e / ou usuário (além dos namespaces de rede) poderiam ser usados para resolvê-lo de maneira mais precisa. Eu não tenho experiência com isso.

Provavelmente existem maneiras melhores de conseguir isso, eu estaria muito interessado no que os outros criam.

    
por 15.07.2016 / 09:32
1

Você só pode definir o shell de um usuário para o nome completo do caminho de um único comando, sem argumentos.

Se você quiser executar vários comandos ou comandos com args, escreva um script de shell, torne-o executável e defina o shell do usuário para o script.

por exemplo,

printf '#!/bin/sh\n%s\n' 'exec ip netns exec sshns /bin/bash "$@"' > /usr/local/bin/myshell.sh
chmod a+rx /usr/local/bin/myshell.sh
chsh -u user -s /usr/local/bin/myshell.sh

Não tenho ideia se ip netns exec sshns /bin/bash funcionará ou não. Eu não testei isso - não parece ser um comando válido para mim, mas assumindo que é um comando válido ou você pode criar um que seja, usando um shell script como o shell de um usuário funcionará, eu testei com apenas exec /usr/bin/zsh no script.

    
por 25.10.2015 / 00:11