Digamos que eu tenho um conjunto de máquinas (chamado aqui de máquinas dos clientes) em que apenas uma pequena lista de pessoas (chamada equipe de suporte) pode fazer o SSH, usando apenas uma conta por máquina (a conta de acesso ao suporte).
A equipe de suporte deve fazer login apenas nas máquinas dos clientes usando chaves. Além disso, a equipe de suporte pode evoluir; portanto, alguém que sai da equipe de suporte não tem permissão para efetuar login em qualquer máquina do cliente. Portanto, as pessoas da equipe são proibidas de ler as chaves privadas usadas para fazer login nas máquinas dos clientes. Além disso, é proibido modificar o authorized_keys
arquivo nas máquinas dos clientes.
Para realizar essa configuração, tive a ideia de usar um proxy SSH no qual a equipe de suporte efetuará login (com autenticação LDAP, mas esse é outro problema) e que contém as chaves privadas.
A pergunta é: como permito que a equipe de suporte use a chave privada SSH sem poder lê-la?
Acredito que tenho que criar um daemon em execução como root na máquina proxy que aceitará a solicitação de um usuário e abrirá uma sessão SSH para eles, mas não tenho idéia de como fazê-lo. Alguma ideia?
fonte
Respostas:
Eu sugeriria algumas opções.
Proteja a chave ssh e exija o uso de
sudo
sua equipe de suporte. Você pode fazer isso de forma transparente com um invólucro. Chame o wrapper, digamos,/usr/local/bin/ssh-support
e faça com que ele contenha algo como isto (não testado):Isso exigiria uma entrada no
sudoers
arquivo que permitisse aos usuários dosupport
grupo usar a ferramenta. Este comando permite que eles executem assh-support
ferramenta como ossupport
usuário - que você deve criar. Ele não confere qualquer privilégio raiz.Se você estiver satisfeito com o fato de os usuários do suporte não precisarem fornecer sua própria senha para executar a ferramenta (conforme solicitado pela
sudo
chamada no próprio script), você poderá alterar asudoers
definição assim:Supondo
PATH
que/usr/local/bin/
você contenha você chamaria comssh-support clientname
. Supondo também que você tenha criado ossupport
usuário como/home/ssupport
você criaria/home/ssupport/.ssh/id_rsa_clientname
e/home/ssupport/.ssh/id_rsa_clientname.pub
como o par de certificados, e terá uma entrada de host/home/ssupport/.ssh/config
paraclientname
definir o usuário, host, porta etc. para a máquina de destino. Você provavelmente desativaria o encaminhamento X11, encaminhamento de porta etc. explicitamente. Como de costume, o/home/ssupport/.ssh
diretório precisaria ser protegido com permissões0700
.Dê a cada membro do suporte sua própria conta de usuário local e faça com que cada pessoa use sua própria chave ssh privada para acessar os servidores do cliente. Quando uma pessoa sai do grupo de suporte, você remove a chave ssh dos servidores do cliente. Isso significa que você não precisa mais se preocupar em impedir que sua equipe conheça a chave ssh privada.
fonte
sudoers
acesso limites de linha para o comando único-E
para anexar), encaminhar portas privilegiadas (-L,-R,-D
) ou raiz simplesmente ganho (-o PermitLocalCommand=yes -o 'LocalCommand=/bin/bash'
o comentário de galáxia a cerca de abusar sudo está no local correto.!ssh root@somewhere
com chaves, vs.ssh user@somewhere
sudo. Na verdade, é um ponto muito bom. No entanto, a única maneira de ser aplicável a esse casossh keyowner@localhost ssh_to_client client.example.org
é uma alternativasudo -u keyowner ssh_to_client client.example.org
. Semelhante ao sudo, o SSH pode limitar os comandos que um usuário pode executar. Estamos falando de sudo sem senha para não-root, não para o caso de uso do Galaxy.O que você realmente deseja fazer é usar a CA SSH e assinar as chaves usadas por cada pessoa de suporte (elas devem ter suas próprias chaves ssh, como passaportes) e configurar os servidores dos seus clientes para usar
TrustedUserCAKeys /etc/ssh/users_ca.pub
o / etc / ssh / sshd_config. Dessa forma, o servidor aceitará qualquer chave assinada pela chave da CA (à qual você tem acesso) e você poderá revogar as chaves de pessoas que não estão mais no suporte sem sequer tocar nas teclas autorizadas.Uma pesquisa rápida por "ssh ca" apontou para este tutorial: https://www.digitalocean.com/community/tutorials/how-to-create-an-ssh-ca-to-validate-hosts-and-clients-with -ubuntu (role para baixo até "Como configurar as chaves do usuário") - embora o tutorial mencione o Ubuntu como independente de distribuição, mas você precisa de uma nova versão do OpenSSH que suporte SSH CA
Outra boa entrada de blog sobre o assunto é https://ef.gy/hardening-ssh (role para baixo até "Certificados SSH").
Preste atenção especial em que você pode assinar a chave para ser válida por um tempo limitado, para que elas expirem automaticamente!
fonte
Existem algumas respostas diferentes que envolvem um script de wrapper para ssh chamado por meio do sudo ou do setuid-executável (para uma conta não raiz de finalidade especial ). Como diz o nkms , passar todos os argumentos para ssh permite que o usuário faça coisas arbitrárias com as chaves ssh que estamos tentando proteger. O outro extremo que alguns surgiram é permitir apenas um nome de host.
O OP diz que os administradores precisam poder fazer o upload de coisas.
Você pode ter dois wrappers diferentes de args fixos para ssh. Um para um shell de login, outro para scp. Nenhum argumento fornecido pelo usuário que não seja o nome do host (e o nome do arquivo a ser carregado).
Ou um script de wrapper que se utiliza
getopt
para analisar opções muito limitadas e conectar as coisas a um comando ssh na maior parte fixo. Ignorar (ou errar) as opções não reconhecidas seria o caminho a percorrer.Não tente filtrar as opções ssh "perigosas", basta escrever um wrapper que pode fazer duas coisas: login interativo ou fazer upload de um arquivo (nomes de arquivos locais e remotos). Você ainda precisa higienizar lá, eu acho.
Na verdade, ainda é fácil errar. Você precisa encontrar uma maneira de impedir que o usuário forneça o arquivo que contém as teclas ssh como o arquivo local. Então você ainda está tentando pensar em tudo o que precisa ser proibido, em vez de começar a não permitir nada. Seria um começo para garantir que os nomes de arquivos não contenham nenhum
@
ou:
.fonte
Se você configurar um servidor proxy SSH, poderá organizar que o shell (in
/etc/passwd
) dos usuários da sua equipe não seja definido como um shell como o bash, mas com um script simples que não permita o acesso ao shell. Em vez disso, solicitaria um nome de host de destino (read target
), entãoexec ssh "support@$target"
.Observe que o uso de um proxy como esse pode dificultar o uso de ferramentas como
scp
a transferência de arquivos de / para as máquinas do cliente. Isso pode ser um problema ou uma vantagem!fonte
sudo
também funciona. Sua resposta está sugerindo o uso do usuário raiz local, mas um usuário não raiz também funcionaria. Veja meus comentários sobre a resposta dele para discutir isso. (Minhassh keyowner@localhost
idéia é a mesma que a sua ideia.)sudo
.Seu pessoal de suporte sempre se conecta através dessa máquina proxy e somente a partir dela, para que os clientes possam simplesmente autenticar a máquina proxy usando o HostbasedAuthentication .
Digamos que a máquina proxy seja
supporters.pc
e você fornece suporte paracustomer.pc
customer.pc terá HostbasedAuthentication sim em
/etc/ssh/ssd_config
, supporters.pc listado em/etc/ssh/shosts.equiv
e sua chave pública em/etc/ssh/ssh_known_hosts
.Quando sua equipe de suporte efetua login em [email protected] e executa
ssh customer.pc
, ele gera o ssh-keysign (8) (que precisa ser configurado), que manipulará a assinatura da chave com o arquivo que você não pode ler e forneça ao supporters.pc uma prova de que a conexão realmente está vindo do supporters.pc . Como o customer.pc confia no supporters.pc , seu membro da equipe é logado como suporte .fonte
Use um binário de invólucro
Para esse caso de uso específico (consulte a observação importante abaixo), uma possibilidade é criar um usuário (por exemplo
support-ssh
) especificamente para essas conexões SSH de saída e instalar um binário pequeno do wrapper que os executivos executam/usr/bin/ssh
.ssh
próprio binário, porque você não se lembrará de copiá-lo toda vez que aplicar atualizações de segurança.root
como o usuário mais privilegiado, por razões que confio que são óbvias.Essa é uma alternativa funcionalmente equivalente à utilização
sudo
para elevar privilégios àsupport-ssh
conta com as seguintes compensações:sudo
há, há menos risco de um erro de configuração abrir mais do que você pretendia.sudo
(mas quanto mais código você escreve, mais você precisa auditar para segurança).O binário do invólucro deve ser definido
HOME
como osupport-ssh
diretório inicial do usuário, parassh
selecionar assh_config
chave privada e apropriada . Mas o usuário que está chamando não deve ter permissão para ler~support-ssh/.ssh/
ou seu conteúdo.O wrapper pode ser tão simples quanto:
Você pode querer ser mais restritivo e verificar se o argumento
argv[1]
está em um conjunto de nomes de host permitidos. Ou menos restritivo e permita (um subconjunto de) argumentos de opção. Você pode querer substituir completamente variáveis de ambiente (mas manter os importantes, tais comoTERM
,LC_*
, etc); note queLD_LIBRARY_PATH
eLD_PRELOAD
são particularmente perigosos.Um programa de wrapper semelhante pode ser fornecido,
scp
se necessário.Uma nota sobre aplicabilidade
Esta resposta aborda as circunstâncias específicas da pergunta, em que os usuários são contratualmente obrigados a seguir procedimentos e há sanções (por exemplo, demissão) por violá-las. Supõe que você deseja impedir que os funcionários copiem casualmente as chaves privadas, em vez de impedir que um invasor determinado obtenha acesso não autorizado.
Considero que a segurança é alcançada por meio de defesas técnicas e não técnicas e que o equilíbrio alcançado aqui ou pelo uso
sudo
é apropriado para a situação apresentada.fonte