Método seguro para cópia automatizada de arquivos em uma conexão SSH raiz

Método seguro para cópia automatizada de arquivos em uma conexão SSH raiz

Atualmente, tenho alguns serviços diferentes em execução no meu servidor doméstico e, para simplificar, tenho uma única VM que gerencia os certificados via certbot e apenas os copio pela rede usando SCP.

As conexões ssh são protegidas por chave, mas como estou executando-as de forma automatizada, as chaves em si não exigem uma senha, o que obviamente não é o ideal.

As chaves são armazenadas apenas na conta root da VM que gerencia o certbot, mas eu ainda gostaria de uma opção em que o script pudesse copiar os arquivos sem que eu tivesse que essencialmente ter um método inseguro para acesso root a outros sistemas na minha rede se alguém obteve acesso a um deles.

Existe uma maneira de permitir que apenas certos comandos sejam passados ​​​​por uma conexão ssh sem permitir que ele abra uma sessão de shell, ou alguém pode pensar em outra maneira de copiar os arquivos em meu cron job semanal que não deixaria uma opção para alguém para fazer ssh em minhas outras máquinas?

Meu roteador só habilita o usuário para o certbot em uma noite de sábado, o que permite que minha VM faça ssh e execute um script que desativa a regra de firewall que bloqueia a porta 80, executa o comando certbot promote, habilita as regras de firewall novamente e desabilita o usuário do certbot . Estou confortável o suficiente com isso, pois há apenas uma janela máxima de 15 minutos por semana em que o usuário do roteador está habilitado.

O problema é a cópia dos certificados, tão obviamente sendo feita como root, as contas ficam ativas o tempo todo.

#!/bin/bash
ssh [email protected] "/system script run certbotenable"
#ufw allow 80
certbot renew
#ufw delete allow 80
systemctl restart apache2
ssh [email protected] "/system script run certbotdisable"
scp /etc/letsencrypt/live/sazed.mydomain.com/cert.pem root@sazed:/etc/pve/local/pveproxy-ssl.pem
scp /etc/letsencrypt/live/sazed.mydomain.com/privkey.pem root@sazed:/etc/pve/local/pveproxy-ssl.key
scp /etc/letsencrypt/live/rashek.mydomain.com/cert.pem root@rashek:/root/ssl/fullchain.pem
scp /etc/letsencrypt/live/rashek.mydomain.com/privkey.pem root@rashek:/root/ssl//privkey.key
ssh root@sazed "service pveproxy restart"

Responder1

Você pode gerar vários pares de chaves SSH.

No servidor remoto você pode usar as opções avançadas do authorized_keysarquivo e adicionar limites a cada chave pública. Isso permite adicionar restrições à quantidade de logins de acesso concedidos com um determinado par de chaves.

Consulte a descrição do formato do arquivo autorizado_keys emhttps://www.freebsd.org/cgi/man.cgi?sshd(8)para as opções e seu significado.

Opções úteis são, por exemplo command=, que limitam o acesso a apenas um único comando/executável/script

Bastante típico é forçar internal-sftp ; então apenas transferências de arquivos com sftp serão permitidas.

Ou from=aquele limite de IP de origem a partir do qual as conexões são aceitas

Da mesma forma, /etc/ssh/sshd_configvocê pode definir requisitos adicionais para logins de root com uma Matchdiretiva, ou seja, quando você ainda precisa permitir logins com senha para todos os usuários regulares, você pode usar isso para definir que apenas logins baseados em chave pública sejam aceitos para root

# /etc/ssh/sshd_config
#here go defaults for all connections/users
PasswordAuthentication yes
PubkeyAuthentication yes
...
# Use Match directives to override default settings and specify specific settings
# for users, groups, hosts 
# https://man.openbsd.org/sshd_config#Match
Match User root
    PasswordAuthentication no
   

E é claro que você pode evitar todo o problema de conta root/privilegiada configurando uma abordagem pull em vez de push.

informação relacionada