193 lines
8.3 KiB
Bash
Executable File
193 lines
8.3 KiB
Bash
Executable File
#!/bin/bash
|
|
# ==============================================================================
|
|
# 🚀 SCRIPT DE INSTALAÇÃO UNIFICADA: ALERTAS SSH (GCAL + TELEGRAM + PAM)
|
|
# ==============================================================================
|
|
# Este script automatiza o deploy completo da arquitetura de monitoramento em
|
|
# qualquer VPS da rede. Ele configura o PAM, Python, Telegram e Banners.
|
|
# ==============================================================================
|
|
|
|
# Cores para formatação de saída
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # Sem Cor
|
|
|
|
echo -e "${YELLOW}========================================================================${NC}"
|
|
echo -e "${YELLOW} 🛡️ MONITORAMENTO SSH AUTOMÁTICO - INSTALADOR DE DEPLOY ${NC}"
|
|
echo -e "${YELLOW}========================================================================${NC}"
|
|
|
|
# 1. Verificar se é root
|
|
if [ "$EUID" -ne 0 ]; then
|
|
echo -e "${RED}Erro: Este script precisa ser executado como root (sudo ./install.sh).${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# 2. Captura de Parâmetro de VPS (IP ou Nome)
|
|
VPS_PREFIX=""
|
|
while [[ "$#" -gt 0 ]]; do
|
|
case $1 in
|
|
--vps) VPS_PREFIX="$2"; shift ;;
|
|
*) echo "Parâmetro desconhecido: $1"; exit 1 ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# Se não foi passado --vps, tenta auto-detectar o IP da interface wg0 (VPN) ou eth0
|
|
if [ -z "$VPS_PREFIX" ]; then
|
|
echo -e "${YELLOW}Auto-detectando o IP da VPS...${NC}"
|
|
# Tenta pegar o IP da interface wg0 primeiro
|
|
VPS_PREFIX=$(ip -o -4 addr show dev wg0 2>/dev/null | awk '{split($4,a,"/"); print a[1]}')
|
|
|
|
if [ -z "$VPS_PREFIX" ]; then
|
|
# Tenta pegar o IP da interface eth0
|
|
VPS_PREFIX=$(ip -o -4 addr show dev eth0 2>/dev/null | awk '{split($4,a,"/"); print a[1]}')
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$VPS_PREFIX" ]; then
|
|
VPS_PREFIX="127.0.0.1"
|
|
fi
|
|
|
|
echo -e "${GREEN}✅ Prefixo/IP Identificado para esta VPS: ${YELLOW}$VPS_PREFIX${NC}"
|
|
|
|
# 3. Instalação de Dependências
|
|
echo -e "\n${YELLOW}[Passo 1/6] Instalando pacotes e dependências (Apt)...${NC}"
|
|
apt-get update -qq
|
|
apt-get install -y -qq python3-googleapi curl
|
|
echo -e "${GREEN}✅ Pacotes instalados com sucesso.${NC}"
|
|
|
|
# 4. Criar Chave de Conta de Serviço se não existir
|
|
echo -e "\n${YELLOW}[Passo 2/6] Verificando chave da Conta de Serviço Google Cloud...${NC}"
|
|
if [ ! -f "/etc/ssh/gcal_key.json" ]; then
|
|
echo -e "${YELLOW}⚠️ Aviso: O arquivo /etc/ssh/gcal_key.json não foi encontrado.${NC}"
|
|
echo -e "${YELLOW}Por favor, certifique-se de salvar a chave JSON da conta de serviço em /etc/ssh/gcal_key.json e aplicar as permissões corretas.${NC}"
|
|
else
|
|
echo -e "${GREEN}✅ Chave da Conta de Serviço detectada em /etc/ssh/gcal_key.json.${NC}"
|
|
chown root:deploy /etc/ssh/gcal_key.json 2>/dev/null || chown root:root /etc/ssh/gcal_key.json
|
|
chmod 640 /etc/ssh/gcal_key.json
|
|
fi
|
|
|
|
# 5. Criar arquivo de configurações se não existir
|
|
echo -e "\n${YELLOW}[Passo 3/6] Criando arquivo de configurações centralizadas (/etc/ssh/ssh_alerts_config.json)...${NC}"
|
|
if [ ! -f "/etc/ssh/ssh_alerts_config.json" ]; then
|
|
cat <<EOF > /etc/ssh/ssh_alerts_config.json
|
|
{
|
|
"telegram_token": "8641435108:AAGL3rOiVj1GpYAyUi4D-pdeDJ9K_JUdlgM",
|
|
"telegram_chat_id": "",
|
|
"calendar_id": "385857c79ef3aed0f4923b29007637a8b7764d6f8359959500bce27611833f5d@group.calendar.google.com"
|
|
}
|
|
EOF
|
|
echo -e "${GREEN}✅ Arquivo de configurações criado.${NC}"
|
|
else
|
|
echo -e "${GREEN}✅ Arquivo de configurações já existe. Mantendo configurações atuais.${NC}"
|
|
fi
|
|
chown root:deploy /etc/ssh/ssh_alerts_config.json 2>/dev/null || chown root:root /etc/ssh/ssh_alerts_config.json
|
|
chmod 640 /etc/ssh/ssh_alerts_config.json
|
|
|
|
# 6. Criar Scripts Integradores no Servidor
|
|
echo -e "\n${YELLOW}[Passo 4/6] Configurando scripts integradores em /usr/local/bin/...${NC}"
|
|
|
|
# Copia ou escreve o script principal Python
|
|
if [ -f "ssh_gcal_alert.py" ]; then
|
|
cp ssh_gcal_alert.py /usr/local/bin/ssh_gcal_alert.py
|
|
else
|
|
# Escreve o arquivo diretamente se rodando solto
|
|
curl -s https://raw.githubusercontent.com/sua-uri-ou-copia-local/ssh_gcal_alert.py -o /usr/local/bin/ssh_gcal_alert.py 2>/dev/null
|
|
fi
|
|
chown root:root /usr/local/bin/ssh_gcal_alert.py
|
|
chmod 755 /usr/local/bin/ssh_gcal_alert.py
|
|
|
|
# Copia ou escreve o script do instalador Telegram
|
|
if [ -f "ssh_alert_setup_telegram.py" ]; then
|
|
cp ssh_alert_setup_telegram.py /usr/local/bin/ssh_alert_setup_telegram.py
|
|
else
|
|
curl -s https://raw.githubusercontent.com/sua-uri-ou-copia-local/ssh_alert_setup_telegram.py -o /usr/local/bin/ssh_alert_setup_telegram.py 2>/dev/null
|
|
fi
|
|
chown root:root /usr/local/bin/ssh_alert_setup_telegram.py
|
|
chmod 755 /usr/local/bin/ssh_alert_setup_telegram.py
|
|
|
|
# Criar o gatilho do PAM dinamicamente com o VPS_PREFIX correto
|
|
cat <<EOF > /usr/local/bin/ssh_pam_trigger.sh
|
|
#!/bin/bash
|
|
# Executa apenas se o estágio do PAM for 'open_session' e o serviço for o 'sshd'
|
|
if [ "\$PAM_TYPE" = "open_session" ] && [ "\$PAM_SERVICE" = "sshd" ]; then
|
|
USER_LOGIN="\$PAM_USER"
|
|
IP_LOGIN="\$PAM_RHOST"
|
|
DATE_LOGIN=\$(date "+%Y-%m-%d %H:%M:%S")
|
|
|
|
# Se o IP vier vazio (comum em alguns túneis locais), assume localhost
|
|
if [ -z "\$IP_LOGIN" ]; then
|
|
IP_LOGIN="127.0.0.1"
|
|
fi
|
|
|
|
# Validação de IP seguro da VPN
|
|
if [[ ! "\$IP_LOGIN" =~ ^10\.99\.0\. ]]; then
|
|
AVISO_INDEVIDO="🚨 ALERTA: Acesso fora da rede VPN segura detectado!"
|
|
else
|
|
AVISO_INDEVIDO="✅ Acesso autorizado através da rede VPN segura."
|
|
fi
|
|
|
|
# Dispara o script Python de calendário e Telegram em segundo plano
|
|
/usr/local/bin/ssh_gcal_alert.py --vps "$VPS_PREFIX" --user "\$USER_LOGIN" --ip "\$IP_LOGIN" --status "\$AVISO_INDEVIDO" > /dev/null 2>&1 &
|
|
fi
|
|
EOF
|
|
chown root:root /usr/local/bin/ssh_pam_trigger.sh
|
|
chmod 755 /usr/local/bin/ssh_pam_trigger.sh
|
|
echo -e "${GREEN}✅ Scripts integradores configurados e autorizados.${NC}"
|
|
|
|
# 7. Configurar o PAM
|
|
echo -e "\n${YELLOW}[Passo 5/6] Configurando o subsistema PAM para SSH (/etc/pam.d/sshd)...${NC}"
|
|
PAM_LINE="session optional pam_exec.so type=open_session /usr/local/bin/ssh_pam_trigger.sh"
|
|
|
|
if grep -q "ssh_pam_trigger.sh" /etc/pam.d/sshd; then
|
|
echo -e "${GREEN}✅ PAM para SSH já está devidamente configurado (ignorado para evitar duplicidade).${NC}"
|
|
else
|
|
echo "$PAM_LINE" >> /etc/pam.d/sshd
|
|
echo -e "${GREEN}✅ Gatilho do PAM anexado com sucesso ao fim do arquivo /etc/pam.d/sshd.${NC}"
|
|
fi
|
|
|
|
# 8. Configurar o Banner Visual do Terminal (profile.d)
|
|
echo -e "\n${YELLOW}[Passo 6/6] Configurando banner visual de auditoria no terminal (/etc/profile.d/ssh_alert.sh)...${NC}"
|
|
cat <<EOF > /etc/profile.d/ssh_alert.sh
|
|
#!/bin/bash
|
|
# Script de Banner de Auditoria SSH
|
|
|
|
USER_LOGIN=\$USER
|
|
IP_LOGIN=\$(echo \$SSH_CONNECTION | awk '{print \$1}')
|
|
DATE_LOGIN=\$(date "+%Y-%m-%d %H:%M:%S")
|
|
|
|
# Validação de IP seguro da VPN (10.99.0.X)
|
|
if [[ ! "\$IP_LOGIN" =~ ^10\.99\.0\. ]]; then
|
|
AVISO_INDEVIDO="🚨 ALERTA: Acesso fora da rede VPN segura detectado!"
|
|
else
|
|
AVISO_INDEVIDO="✅ Acesso autorizado através da rede VPN segura."
|
|
fi
|
|
|
|
# Exibição do Banner de Auditoria ao Usuário no Terminal
|
|
echo -e "\033[1;33m"
|
|
echo "========================================================================="
|
|
echo " 🖥️ AUDITORIA DE ACESSO SISTÊMICO "
|
|
echo "========================================================================="
|
|
echo -e "\033[0m"
|
|
echo " Usuário Conectado: \$USER_LOGIN"
|
|
echo " IP de Origem: \$IP_LOGIN"
|
|
echo " Data do Login: \$DATE_LOGIN"
|
|
echo " Status do Canal: \$AVISO_INDEVIDO"
|
|
echo ""
|
|
echo " * Todas as operações estão sendo monitoradas e auditadas."
|
|
echo "========================================================================="
|
|
echo ""
|
|
EOF
|
|
chmod 755 /etc/profile.d/ssh_alert.sh
|
|
echo -e "${GREEN}✅ Banner visual de terminal ativado.${NC}"
|
|
|
|
# Finalização e Próximos Passos
|
|
echo -e "\n${GREEN}========================================================================${NC}"
|
|
echo -e "${GREEN}🎉 INSTALAÇÃO CONCLUÍDA COM SUCESSO!${NC}"
|
|
echo -e "${GREEN}========================================================================${NC}"
|
|
echo -e "\n${YELLOW}👉 PRÓXIMO PASSO (VINCULAR TELEGRAM):${NC}"
|
|
echo -e "Para receber notificações instantâneas no seu Telegram, execute o comando abaixo"
|
|
echo -e "como administrador e envie uma mensagem para o seu bot:"
|
|
echo -e "\n ${GREEN}sudo /usr/local/bin/ssh_alert_setup_telegram.py${NC}\n"
|
|
echo -e "========================================================================"
|