Jump Server Linux com Autenticação Multifator e Ambiente Restrito
Objetivo
Configurar um Jump Server Linux no qual o usuário acessa o ambiente por meio de SSH, autentica-se com chave individual e passa por validação adicional com MFA TOTP. Após o acesso, a sessão fica restrita a um ambiente mínimo baseado em Chroot Jail.
Fluxo do procedimento
1. Preparar pacotes
2. Configurar OpenSSH
3. Configurar PAM com Google Authenticator
4. Criar grupo jail
5. Criar ou associar usuário ao grupo jail
6. Construir o ambiente chroot
7. Copiar binários e bibliotecas
8. Testar o chroot
9. Gerar MFA do usuário
10. Liberar acesso SSH
Para a visão arquitetural completa, consulte Arquitetura.
Premissas usadas nos exemplos
| Item | Valor sanitizado |
|---|---|
| Usuário de exemplo | usuario-exemplo |
| Grupo de confinamento | jail |
| Diretório base do jail | /srv/secure-jail |
| Diretório do usuário no jail | /srv/secure-jail/usuario-exemplo |
| Jump Server | jump.example.net |
| Relay SMTP, se usado | relay.example.net |
No material original existem caminhos, domínios, usuários e IPs específicos do ambiente de produção. Eles foram substituídos por exemplos neutros nesta versão derivada.
Pré-requisitos
O servidor precisa ter:
- sistema Linux instalado;
- rede configurada;
- OpenSSH Server;
- PAM habilitado para SSH;
- pacote
libpam-google-authenticator; - pacote
qrencode, quando houver geração de QR Code; - uma conta administrativa de contingência já testada.
Exemplo de instalação em distribuições compatíveis com apt:
apt-get update
apt-get install openssh-server libpam-google-authenticator qrencode
Configuração
Configuração do OpenSSH
No arquivo de configuração do OpenSSH, validar as diretivas relacionadas à autenticação por chave pública, PAM e autenticação interativa.
Exemplo sanitizado:
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
Também é necessário ChallengeResponseAuthentication yes. Em algumas versões do OpenSSH, a diretiva equivalente pode ser KbdInteractiveAuthentication. Confirme a diretiva correta na versão instalada.
Em seguida, configurar a regra para usuários do grupo jail:
Bloco para usuários confinados
Exemplo sanitizado:
Match Group jail
ChrootDirectory /srv/secure-jail/%u
O grupo seleciona os usuários que receberão a raiz de sistema de arquivos restrita após autenticação.
Bloco para conta administrativa
Exemplo sanitizado:
Match User admin-local
AllowUsers admin-local@localhost admin-local@127.0.0.1 admin-local@::1
O objetivo é ter uma conta de gerenciamento com escopo restrito. O contrato dessa conta deve ser validado fora do chroot, uma vez que ela será usada para acesso ao sistema e para sua administração. É uma conta crítica; a disponibilidade da chave SSH e da senha deve ser controlada e protegida.
Configuração Debian 12
PermitRootLogin no
IgnoreRhosts yes
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication yes
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AuthenticationMethods publickey,password publickey,keyboard-interactive
X11Forwarding yes
PrintMotd no
ClientAliveInterval 1800
ClientAliveCountMax 3
Banner /etc/ssh/ssh_banner
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
Match User admin
AllowUsers admin@localhost admin@127.0.0.1 admin@::1
Match Group jail
ChrootDirectory /home/Secure/Jail/%u
Configuração Ubuntu Server 20
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitEmptyPasswords no
PasswordAuthentication no
ChallengeResponseAuthentication yes
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
ClientAliveInterval 120
ClientAliveCountMax 2
AuthenticationMethods publickey,password publickey,keyboard-interactive
X11Forwarding yes
UseDNS no
ChrootDirectory none
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
Match User admin
AllowUsers admin@localhost admin@127.0.0.1
Match Group jail
ChrootDirectory /home/Secure/Jail/%u
Validação
Antes de recarregar o serviço SSH:
sshd -t
Mantenha uma sessão administrativa aberta antes de testar novo login.
Aprofundamento: Configuração OpenSSH.
PAM para MFA
A complementação da configuração do SSH ocorre no arquivo PAM usado pelo serviço, normalmente /etc/pam.d/sshd. O procedimento consiste em adicionar o módulo do Google Authenticator ao final do arquivo.
Arquivo /etc/pam.d/sshd:
auth required pam_google_authenticator.so nullok
O parâmetro nullok permite login sem MFA para usuários que ainda não possuem .google_authenticator. Isso pode ser útil durante a implantação, mas precisa ser tratado como exceção controlada e, se possível, removido ao final.
No Debian é necessário que estas linhas estejam comentadas, já no Ubuntu estas linhas não comprometeram o funcionamento:
#@include common-auth
#@include common-password
Essa mudança altera o fluxo de autenticação e deve ser validada por distribuição antes de uso.
Aprofundamento: Configuração PAM/MFA.
Configuração do chroot
Criação do grupo e associação do usuário
Garantir que exista o grupo usado pelo bloco Match:
groupadd -r jail
Se o usuário já existir, associar ao grupo:
usermod -a -G jail usuario-exemplo
Se o usuário ainda não existir, ele deve ser criado com home, shell e chave pública antes da liberação do acesso.
Aprofundamento operacional: Operação e diagnóstico.
Construção manual do Chroot Jail
Nota operacional: O ambiente disponibilizado neste procedimento é mínimo e foi pensado para reduzir ao máximo a superfície de um possível ataque. Nele são disponibilizados apenas o shell, comandos mínimos para estabelecimento da sessão,
screenesshpara acesso à próxima máquina. Outros programas foram excluídos propositalmente.
Criar o diretório do usuário dentro do jail:
mkdir -p /srv/secure-jail/usuario-exemplo
cd /srv/secure-jail/usuario-exemplo
mkdir -p etc home sys usr/bin usr/sbin var tmp dev
ln -s usr/bin bin
ln -s usr/sbin sbin
ln -s usr/lib lib
ln -s usr/lib64 lib64
chmod 1777 tmp
Criar dispositivos básicos dentro do jail:
mknod -m 666 /srv/secure-jail/usuario-exemplo/dev/null c 1 3
mknod -m 622 /srv/secure-jail/usuario-exemplo/dev/tty c 5 0
mknod -m 666 /srv/secure-jail/usuario-exemplo/dev/zero c 1 5
mknod -m 444 /srv/secure-jail/usuario-exemplo/dev/random c 1 8
mknod -m 444 /srv/secure-jail/usuario-exemplo/dev/urandom c 1 9
Copiar dados mínimos do usuário e do grupo para dentro do jail:
getent passwd usuario-exemplo > /srv/secure-jail/usuario-exemplo/etc/passwd
getent group jail > /srv/secure-jail/usuario-exemplo/etc/group
getent group usuario-exemplo >> /srv/secure-jail/usuario-exemplo/etc/group || true
Aprofundamento: Construção do chroot.
Cópia de binários e bibliotecas
Copiar os programas mínimos. O procedimento mostra o exemplo com bash e ls; a mesma lógica se aplica aos demais comandos que forem necessários.
cp /bin/bash /bin/ls /srv/secure-jail/usuario-exemplo/bin/
Identificar as bibliotecas usadas por cada binário:
ldd /bin/bash
ldd /bin/ls
Copiar as bibliotecas preservando caminhos:
cp --parents /lib/x86_64-linux-gnu/libtinfo.so.6 /srv/secure-jail/usuario-exemplo/usr
cp --parents /lib/x86_64-linux-gnu/libdl.so.2 /srv/secure-jail/usuario-exemplo/usr
cp --parents /lib/x86_64-linux-gnu/libc.so.6 /srv/secure-jail/usuario-exemplo/usr
cp --parents /lib64/ld-linux-x86-64.so.2 /srv/secure-jail/usuario-exemplo/usr
Copiar também componentes auxiliares quando necessário:
libnss=$(dpkg -L libc6 | egrep "libnss_files.*\.so$")
cp --preserve=all --parents ${libnss} /srv/secure-jail/usuario-exemplo
cp -r --preserve=all --parents /usr/share/locale/en /srv/secure-jail/usuario-exemplo
cp -r --preserve=all --parents /lib/terminfo /srv/secure-jail/usuario-exemplo
cp -r --preserve=all --parents /usr/share/terminfo /srv/secure-jail/usuario-exemplo
Essa é a parte mais sensível do procedimento: copiar somente o binário não basta. Se faltar biblioteca, loader, NSS ou terminfo, o comando pode existir dentro do jail e ainda assim não funcionar.
Aprofundamento: Construção do chroot.
Teste do chroot
Testar o ambiente antes de liberar o login SSH:
chroot /srv/secure-jail/usuario-exemplo
Dentro do jail, testar:
ls /
whoami
id
Se o shell não abrir ou algum comando falhar, consultar Operação e diagnóstico.
Criação manual do MFA
Quando o jail foi criado manualmente, gerar o MFA para o usuário:
su -l usuario-exemplo -c "google-authenticator -t -d -f -r 3 -R 30 -W -C"
O QR Code, a URL otpauth e os códigos de emergência são dados sensíveis. Não registre esses dados em documentação pública.
Aprofundamento: Configuração PAM/MFA e Segurança e limitações.
Procedimento automático
A fim de facilitar a manutenção dos usuários em jail, foi criado um script para automatizar a criação e remoção de usuário, do jail e do MFA.
| Script | Descrição |
|---|---|
| useradd_jail.sh | Automatiza o processo de criação do usuário, home do usuário em chroot e MFA. Detalhamento do script |
| userdel_jail.sh | Automatiza o processo de remoção do usuário e da home do usuário em chroot ( em resumo é userdel com remoção da home ). |
O script exige previamente:
- nome do usuário;
- nome completo;
- e-mail para envio do QR Code;
- chave pública SSH.
Ele executa, em sequência:
- validação básica dos dados;
- criação do usuário;
- instalação da chave pública;
- inclusão no grupo
jail; - criação do chroot;
- cópia de binários e bibliotecas;
- geração do MFA;
- envio do QR Code por e-mail.
A documentação específica do useradd_jail.sh está disponível em Detalhamento do script.
Validação final
Antes de considerar o acesso liberado:
- validar
sshd -t; - manter sessão administrativa paralela;
- testar login com chave pública;
- confirmar solicitação de MFA;
- confirmar entrada no chroot;
- executar comandos básicos dentro do jail;
- registrar usuário, data, chave por fingerprint e responsável;
- não registrar segredo MFA nem QR Code.