No momento, estou tentando configurar um servidor SSH para que o acesso a ele de fora da rede seja permitido SOMENTE usando uma chave SSH e não permita o acesso ao root ou por qualquer outra combinação de nome de usuário/senha.
Ao mesmo tempo, os usuários internos da rede ainda precisam se conectar ao mesmo sistema, mas esperam fazer login no sentido mais tradicional com um nome de usuário e senha.
Os usuários externos e internos acessarão o sistema a partir do Windows usando PuttySSH e o acesso externo entrará no sistema através de um firewall de encaminhamento de porta que abrirá a porta de origem para o mundo externo em alguma porta numerada arbitrariamente escolhida como 55000 (ou o que os administradores decidirem)
O diagrama a seguir tenta mostrar melhor os fluxos de tráfego.
Eu sei como configurar o login real para usar apenas chaves, e sei como negar root, o que não sei é como separar os dois tipos de login.
Eu havia considerado executar duas cópias do SSHD escutando em portas diferentes no mesmo IP e ter duas configurações diferentes para cada porta.
Também considerei configurar uma regra de "correspondência", mas não tenho certeza se posso separar as configurações de todo o servidor usando essas opções.
Finalmente, a pessoa externa que efetua o login será sempre o mesmo usuário, vamos chamá-lo de "Frank" para os propósitos desta pergunta, portanto, "Frank" só poderá fazer login a partir do IP externo e nunca estará sentado na frente de qualquer sistema se conectando internamente, enquanto todos os outros usuários do sistema só se conectarão internamente e nunca se conectarão a partir de um IP externo.
Franks IP do qual ele se conecta é um atribuído dinamicamente, mas o IP público que ele está conectando também é estático e nunca mudará, o IP interno do encaminhador de porta também nunca mudará e nem o endereço IP interno do servidor SSH .
Os clientes internos sempre se conectarão a partir de um IP na faixa de rede privada da qual o IP dos servidores SSH internos faz parte e é uma máscara de 16 bits EG: 192.168.0.0/16
Essa configuração é possível, usando um arquivo de configuração e uma instância do servidor SSH? Se sim, como faço?
ou
Estou muito melhor usando 2 servidores em execução com configuração diferente?
Para ref, o servidor SSH está sendo executado no Ubuntu 18.04.
Então, acontece que a resposta foi realmente muito, muito mais simples do que eu pensava que seria.
No entanto, tenho que agradecer a '@jeff schaller' por seus comentários, se não fosse por ele, eu não teria começado a investigar como funciona a configuração SSH 'Match'.
De qualquer forma
O truque é definir seu arquivo /etc/ssh/sshd_config como padrão para ser a configuração que você gostaria de ter para o acesso vindo da conexão externa à Internet.
No meu caso, isso significava definir o seguinte
Ao fazer isso, estou forçando TODOS os logins, não importa de onde eles venham, a precisarem ser logins baseados em chave usando uma chave SSH.
Em seguida, nas máquinas Windows, usei 'PuttyGen' para gerar um par de chaves pública/privada que salvei no disco e uma entrada ssh apropriada para meu arquivo "authorized_hosts" no diretório inicial de usuários externos.
Colei essa chave ssh no local correto na pasta inicial dos meus usuários e configurei o putty para usar o arquivo privado (ppk) gerado pelo PuttyGen para fazer login e salvei o perfil.
Em seguida, salvei o perfil e enviei isso e o arquivo de chave ppk para o usuário externo usando um método seguro (e-mail criptografado com um arquivo zip protegido por senha anexado)
Depois que o usuário teve o ppk e o perfil em sua cópia do putty e pôde fazer login, adicionei o seguinte como as últimas 2 linhas no meu arquivo sshd_config
Na linha "Match" alterei os nomes dos servidores para proteger os nomes dos meus próprios servidores.
Observe que cada domínio de servidor é separado por uma vírgula e SEM ESPAÇOS, isso é importante. Se você colocar algum espaço nele faz com que o SSHD não carregue a configuração e relate um erro, as 3 correspondências que tenho lá fazem o seguinte:
server1 - corresponde a qualquer pessoa usando apenas 'server1' sem domínio para conectar EG: 'fred@server1'
server1.internalnet.local - corresponde a qualquer pessoa usando o nome de domínio interno totalmente qualificado, por exemplo: '[email protected]' (OBSERVAÇÃO: você precisará de um DNS interno para que isso funcione corretamente)
1.2.3.4 - correspondências no endereço IP específico atribuído ao servidor SSH EG: '[email protected]' isso pode usar curingas, ou ainda melhor formato cidr net/mask EG: 1.2.* ou 192.168.1.0/8 se você usa curingas, no entanto, leia a resposta do fchurca abaixo para algumas notas importantes.
Se algum dos padrões fornecidos corresponder ao host que está sendo acessado, a única alteração a ser feita na configuração em execução é ativar novamente a capacidade de ter um login de senha interativo.
Você também pode colocar outras diretivas de configuração aqui também, e essas diretivas também serão reativadas para hosts internos listados na lista de correspondências.
mas leia isto:
https://man.openbsd.org/OpenBSD-current/man5/ssh_config.5
com cuidado, como nem todas as opções de configuração podem ser usadas dentro de um bloco de correspondência, descobri isso quando tentei "UsePAM yes" para ativar a autenticação PAM novamente, apenas para ser informado diretamente que não era permitido.
Depois de fazer as alterações, digite
seguido de retornar para testá-los antes de tentar reiniciar o servidor, ele relatará quaisquer erros que você tenha.
Além de tudo acima, também recebi muita ajuda dos dois links a seguir:
https://raymii.org/s/tutorials/Limit_access_to_openssh_features_with_the_Match_keyword.html
https://www.cyberciti.biz/faq/match-address-sshd_config-allow-root-loginfrom-one_ip_address-on-linux-unix/
Cuidadoso! A correspondência de padrões em .ssh/config é baseada em globbing de strings, não necessariamente em endereços IP. De acordo com a mesma página de manual que você está lendo:
Se alguém tentar fazer login de um IP que resolva publicamente para
1.2.badguy.com
, isso corresponderá à sua1.2.*
regra.https://man.openbsd.org/OpenBSD-current/man5/ssh_config.5#PATTERNS
[Atualizado para completar]
Como observado em outro lugar, você pode usar
Match Address 1.2.0.0/16
em vez deMatch Host 1.2.*
[/Atualizar]
Eu acho que o que você deveria estar procurando é dividir suas configurações ssh. Por exemplo; configure seu /etc/ssh/ssh_config para ter as variáveis globais que você precisa para todos os usuários por padrão (auth de chave ssh, encaminhamento de porta, etc...).
Então se o seu usuário (vamos chamá-lo de Bob) tem um diretório home local (ou nfs montado), coloque uma configuração só para ele em /home/bob/.ssh/. Esta configuração conterá sua declaração de correspondência, bem como se você precisar que ele se conecte com uma senha em vez de um certificado, bem como seus próprios valores de manutenção, etc ...
Eu fiz isso no passado e atualmente para bloquear certas contas locais para entrar em apenas um endereço IP e permitir apenas autenticação baseada em certificado, enquanto outras contas de usuário podem estar usando autenticação PAM e ter autenticação baseada em senha.
Em suma, construir e manter arquivos de configuração de usuário separados com base na necessidade do usuário é mais fácil de gerenciar do que tentar manter tudo sob o arquivo de configuração padrão para ssh.