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.