Script useradd_jail.sh
Este documento detalha o funcionamento do script useradd_jail.sh, os pré-requisitos necessários para sua execução e as configurações exigidas para o envio do QR Code de MFA por e-mail.
O script automatiza a criação de um usuário de acesso SSH confinado em chroot, configura chave pública, prepara a estrutura mínima do jail, gera o segredo TOTP com google-authenticator, cria um QR Code com qrencode e envia as informações iniciais de MFA por SMTP usando nc.
O envio do QR Code e da URL
otpauthpor e-mail expõe o segredo inicial do segundo fator. Esse fluxo deve ser tratado como procedimento operacional controlado, não como recomendação genérica de segurança.
Responsabilidade
O useradd_jail.sh executa as seguintes responsabilidades em uma única rotina:
- coleta os dados do usuário;
- valida minimamente nome de usuário, e-mail não vazio e chave pública SSH;
- cria o grupo
jail, se ele ainda não existir; - cria o usuário local com shell
/bin/bash; - instala a chave pública em
authorized_keys; - cria a área do usuário dentro do diretório de chroot;
- copia binários, arquivos de configuração e bibliotecas necessários para o ambiente confinado;
- cria dispositivos básicos em
dev; - gera o arquivo
.google_authenticatorpara o usuário; - extrai a URL
otpauth; - gera uma imagem PNG do QR Code;
- envia a URL, os códigos gerados e o QR Code por e-mail;
- remove o arquivo temporário do QR Code ao final.
O script não substitui a configuração prévia do OpenSSH, PAM, Google Authenticator ou relay SMTP. Ele pressupõe que o servidor já está preparado para autenticação com chave pública, MFA e chroot.
Pré-requisitos do sistema
Antes de executar o script, o servidor deve possuir:
- OpenSSH Server instalado e em operação;
ChrootDirectoryconfigurado em/etc/ssh/sshd_config;- autenticação PAM integrada ao Google Authenticator;
- pacote
libpam-google-authenticator; - comando
google-authenticatordisponível; - comando
qrencodedisponível; - comando
ncdisponível em/usr/bin/nc; - comando
dpkgdisponível, pois o script usadpkg -L libc6; - comandos administrativos
useradd,groupadd,getent,mknod,chmod,chownefind; - acesso de rede ao relay SMTP configurado no script;
- permissão de execução como usuário privilegiado, normalmente
root.
Também é necessário que o servidor tenha os binários e arquivos listados na variável arquivos, porque eles serão copiados para dentro do jail com suas bibliotecas:
/bin/awk
/bin/bash
/bin/grep
/bin/groups
/bin/id
/bin/ls
/bin/ping
/bin/sh
/bin/ssh
/usr/bin/ssh-add
/bin/whoami
/etc/bash.bashrc
/etc/group
/etc/nsswitch.conf
/etc/passwd
/etc/profile
/etc/profile.d/tmout.sh
/etc/profile.d/aliases.sh
/etc/profile.d/history.sh
/etc/resolv.conf
/usr/bin/dircolors
/etc/bash_completion
/etc/profile.d/bash_completion.sh
/usr/share/bash-completion/bash_completion
Se algum desses arquivos não existir no sistema, o script apenas registra a mensagem de erro para aquele item e continua a execução. Isso pode gerar um jail incompleto.
Configuração SSH esperada
O diretório base do jail é descoberto automaticamente a partir de /etc/ssh/sshd_config:
JAIL_DIR=$(grep ChrootDirectory /etc/ssh/sshd_config | grep -v '#' | awk '{gsub("/%u", "" ,$0)}{print $2}')
Por esse motivo, a configuração do OpenSSH deve conter uma diretiva ChrootDirectory compatível com o padrão usado no procedimento:
ChrootDirectory /home/Secure/Jail/%u
O script remove o trecho /%u e usa o diretório restante como base. No exemplo acima, o valor efetivo de JAIL_DIR passa a ser:
/home/Secure/Jail
Se a diretiva não existir, estiver comentada ou tiver formato diferente, a descoberta automática pode falhar ou apontar para um diretório incorreto.
Configurações de e-mail
O envio de e-mail é controlado pelas variáveis definidas no início do script:
EMAIL_FROM="infra@example.net"
EMAIL_FROM_DESC="Backup"
EMAIL_SUBJ="[${EMAIL_FROM_DESC}] - MFA ${EMAIL_FROM_DESC} - Seguranca Jail"
EMAIL_SERVER="relay.example.net"
EMAIL_PORT="25"
NC="/usr/bin/nc"
Esses valores devem ser revisados antes da execução em outro ambiente.
EMAIL_FROM
Define o remetente usado no comando SMTP MAIL FROM e no cabeçalho MIME From.
O valor deve ser um endereço aceito pelo relay SMTP. Exemplo:
EMAIL_FROM="infra@example.net"
Se o relay aplicar validação de remetente, SPF interno, lista de remetentes autorizados ou restrição por domínio, esse endereço precisa estar autorizado.
EMAIL_FROM_DESC
Define o nome descritivo exibido no cabeçalho From e também compõe o assunto.
Exemplo:
EMAIL_FROM_DESC="Equipe de Infraestrutura"
Esse texto não autentica o remetente. Ele apenas melhora a identificação visual da mensagem para o destinatário.
EMAIL_SUBJ
Define o assunto da mensagem. O script codifica o assunto em Base64 no formato MIME:
ESUBJECT='=?utf-8?B?'$(echo "${EMAIL_SUBJ}" | base64 -w 0)'?='
O assunto pode conter texto em português, mas deve evitar dados sensíveis, segredo MFA, nome de host interno crítico ou identificadores de cliente.
EMAIL_SERVER
Define o relay SMTP usado para entrega da mensagem.
Exemplo:
EMAIL_SERVER="relay.example.net"
O servidor informado precisa aceitar conexões SMTP vindas do host que executa o script. O script não faz autenticação SMTP, não usa STARTTLS e não negocia TLS. Portanto, o relay deve permitir entrega direta em rede confiável ou o fluxo deve ser adaptado antes de uso em ambiente que exija autenticação ou criptografia.
EMAIL_PORT
Define a porta TCP usada para conexão com o relay SMTP.
O script está preparado para SMTP simples na porta 25:
EMAIL_PORT="25"
Portas como 465 ou 587 normalmente exigem TLS, STARTTLS ou autenticação, recursos que o script atual não implementa.
NC
Define o caminho do comando Netcat usado para abrir a sessão SMTP:
NC="/usr/bin/nc"
O script usa:
${NC} -w 30 -v ${EMAIL_SERVER} ${EMAIL_PORT}
O binário deve existir nesse caminho. Em distribuições diferentes, pode ser necessário ajustar para outro caminho ou variante de Netcat.
Requisitos para entrega de e-mail
Antes de usar o script em operação, validar:
- resolução DNS do relay SMTP;
- conectividade TCP até
EMAIL_SERVER:EMAIL_PORT; - permissão do host de origem no relay;
- aceitação do remetente configurado em
EMAIL_FROM; - aceitação do destinatário informado na execução;
- ausência de exigência de autenticação SMTP;
- ausência de exigência de TLS ou STARTTLS;
- política de tamanho de mensagem compatível com anexo PNG;
- roteamento de saída e firewall liberados.
Um teste simples de conectividade TCP pode ser feito com:
nc -vz relay.example.net 25
Esse teste confirma apenas a abertura da conexão TCP. Ele não confirma aceitação de remetente, destinatário, conteúdo ou política antispam.
Dados solicitados na execução
Durante a execução, o script solicita:
Usuario: login local a ser criado;Nome completo usuario: descrição usada no cadastro do usuário;Email do usuario: destinatário do QR Code e das informações de MFA;Chave publica SSH: chave pública instalada emauthorized_keys;Usuario acessará o roo via admin? <N|s>: opção para acrescentar a chave pública também ao usuárioadmin, caso exista.
O campo de e-mail é validado apenas contra valor vazio. O script não valida formato, domínio, destinatário permitido ou múltiplos destinatários. O campo deve ser preenchido com um único endereço de e-mail operacionalmente aprovado.
Fluxo de processamento
O processamento geral é:
- identifica o diretório base do jail a partir do
sshd_config; - cria o diretório base, se necessário;
- coleta usuário, nome, e-mail e chave SSH;
- impede criação se o usuário já existir;
- valida o nome do usuário com expressão regular simples;
- valida se a chave contém
ssh-rsa,ssh-ed25519ouecdsa; - opcionalmente adiciona a chave ao usuário
admin; - cria o grupo
jail, se necessário; - cria o usuário local;
- instala a chave pública e ajusta permissões da home;
- cria a árvore de diretórios do jail do usuário;
- cria links simbólicos para
bin,sbin,libelib64; - copia arquivos e bibliotecas para dentro do jail;
- ajusta permissões de diretórios e arquivos copiados;
- cria arquivos mínimos de
hosts,passwdegroupdentro do jail; - cria dispositivos básicos com
mknod; - gera o MFA com
google-authenticator; - converte a URL
otpauthem QR Code PNG; - monta uma mensagem MIME multipart;
- envia a mensagem por SMTP via
nc; - remove o PNG temporário.
Saída esperada
Ao final, espera-se que existam:
- usuário local criado no sistema;
- usuário incluído no grupo
jail; - chave pública instalada em
/home/<usuario>/.ssh/authorized_keys; - área do jail criada em
JAIL_DIR/<usuario>; - arquivos mínimos de shell e bibliotecas copiados para o jail;
- arquivo
.google_authenticatorcriado na home real do usuário; - e-mail enviado ao usuário com URL
otpauth, códigos gerados e QR Code em anexo.
O script não confirma de forma robusta se o servidor SMTP aceitou todas as etapas da transação. A saída do nc deve ser observada pelo operador.
Tratamento de erros e limitações
As principais limitações observáveis são:
- não há rollback automático em caso de falha parcial;
- a validação de e-mail verifica apenas se o campo não está vazio;
- a validação de chave SSH é básica e baseada em substring;
- o SMTP é montado manualmente via
echoenc; - as respostas SMTP não são interpretadas etapa por etapa;
- o envio não usa autenticação nem criptografia;
- o QR Code é gerado em arquivo temporário local antes do envio;
- a criação de
devpode falhar em reexecução se o diretório já existir; - o jail pode ficar incompleto se algum binário, arquivo ou biblioteca não existir;
- a cópia de dependências depende do formato de saída de
ldd; - a descoberta de
ChrootDirectorydepende do formato dosshd_config; - o script deve ser executado com privilégios elevados.
Esses pontos não impedem o uso em ambiente controlado, mas precisam ser considerados antes de tratar o script como automação genérica ou reutilizável fora do contexto original.
Validação operacional
Após executar o script, validar:
- existência do usuário com
getent passwd <usuario>; - participação no grupo
jail; - permissões de
/home/<usuario>e/home/<usuario>/.ssh/authorized_keys; - existência de
JAIL_DIR/<usuario>; - existência de
/home/<usuario>/.google_authenticator; - recebimento do e-mail pelo usuário;
- leitura do QR Code no aplicativo autenticador;
- login SSH com chave pública;
- solicitação do código MFA;
- entrada efetiva no chroot;
- execução de comandos básicos dentro do jail, como
whoami,id,lsessh.
Não registrar em documentação, chamados ou histórico operacional o conteúdo da URL otpauth, QR Code, segredo MFA ou códigos de emergência.
Relação com o procedimento principal
Esta página detalha apenas o script useradd_jail.sh. O procedimento completo de preparação do servidor continua documentado em Arquitetura de acesso seguro com Jump Server, MFA e Chroot.
Para análise de riscos e limitações gerais da solução, consultar Segurança e limitações.