Administração de Servidores e Telefonia IP
Apresentar o ambiente de servidores Linux, explicar por que ele é a base para sistemas como o Asterisk e realizar o primeiro acesso remoto seguro via SSH. Compreender os fundamentos da arquitetura cliente-servidor e os benefícios do Linux em ambientes corporativos.
Uma introdução conceitual ao que é um servidor, o que é o Linux e suas distribuições. O foco é desmistificar o ambiente de linha de comando e estabelecer a conexão inicial com o servidor. Abordaremos também os conceitos de virtualização, containers e a importância da estabilidade em sistemas de produção.
ssh root@192.168.1.100 (substituindo pelo IP e usuário corretos)[root@servidor ~]#ssh meuservidorPermitRootLogin no (desabilitar login root direto)PasswordAuthentication no (forçar uso de chaves)Port 2222 (mudar porta padrão)AllowUsers usuario1 usuario2 (limitar usuários)
systemctl status sshdfirewall-cmd --list-portstraceroute 192.168.1.100nslookup servidor.exemplo.comman ssh e man ssh_configNa próxima aula, exploraremos a estrutura de diretórios do Linux e comandos essenciais de manipulação de arquivos. Certifique-se de que consegue se conectar consistentemente ao seu servidor via SSH.
Capacitar o aluno a navegar pela estrutura de diretórios do Linux e a manipular arquivos e pastas usando os comandos mais essenciais. Compreender o sistema de permissões, links simbólicos e técnicas avançadas de busca e manipulação de texto.
Exploraremos o Filesystem Hierarchy Standard (FHS) para entender onde as coisas ficam guardadas. A prática se concentrará em criar, mover, copiar, visualizar e deletar arquivos e diretórios. Também abordaremos conceitos avançados como permissões, propriedade de arquivos, links e redirecionamento de entrada/saída.
pwdls -lhacd /ls -lcd /etcls | head -20cd ~df -hcd /tmpmkdir -p projeto/{src,docs,tests}/{linux,asterisk}tree projeto (ou find projeto -type d)find projeto -type fln -s exemplo.txt link_exemplo.txtls -l *exemplo*ls -l meu_script.sh./meu_script.sh (deve dar erro)chmod +x meu_script.sh./meu_script.shchmod 754 meu_script.shls -l meu_script.shls -l arquivostat arquivowhoamisudo nano arquivochmod 644 arquivosudo chown $USER arquivopwdls -lafind / -name "arquivo" 2>/dev/nullConfigurar aspectos avançados de rede, implementar gerenciamento completo de usuários e grupos, dominar o controle de serviços com systemd, e estabelecer políticas de segurança robustas. Preparar o ambiente de forma profissional para a instalação e operação segura do Asterisk.
Abordaremos configuração avançada de rede (IP estático, roteamento, DNS), implementação de firewall com zonas e regras específicas, criação e gerenciamento completo de usuários e grupos com políticas de segurança, controle avançado de serviços com systemd, monitoramento de logs, e configuração de SSH seguro. Estes são pré-requisitos fundamentais para uma instalação profissional e segura do Asterisk.
ip link showip addr shownmcli con shownmcli con up "System eth0"ping -c 4 8.8.8.8nslookup google.comip route showfirewall-cmd --get-active-zonesfirewall-cmd --list-allfirewall-cmd --reloadfirewall-cmd --list-allss -tuln | grep -E "(5060|5038)"sudo groupadd pbx-usersid asterisk && id pbxadminjournalctl -u network-monitor -fsystemctl --failedip link showip addr showping 127.0.0.1ping $(ip route | grep default | awk '{print $3}')cat /etc/resolv.confnslookup 8.8.8.8journalctl -u NetworkManager --since "10 minutes ago"sudo systemctl restart NetworkManagernmcli con down eth0 && nmcli con up eth0firewall-cmd --add-port=5060/udpdmesg | grep -i "dropped"Dominar o processo completo de instalação do Asterisk desde a preparação do sistema até a configuração inicial profissional. Incluindo múltiplos métodos de instalação (repositórios, compilação, containers), configuração de dependências avançadas, otimização de performance, e implementação de monitoramento robusto.
Implementaremos uma instalação enterprise-grade do Asterisk, cobrindo preparação completa do sistema, múltiplas opções de instalação, configuração de segurança avançada, otimização de performance, monitoramento proativo, e procedimentos de backup/recovery. O sistema resultante será robusto, seguro e pronto para produção.
sudo systemctl status asterisk -lsudo journalctl -u asterisk --since "5 minutes ago"sudo tail -50 /var/log/asterisk/messagessudo asterisk -T -C /etc/asterisk/asterisk.confsudo ls -la /var/run/asterisk/id asterisksudo chown -R asterisk:asterisk /var/lib/asterisk /var/log/asterisksudo asterisk -rx "dialplan reload"sudo mkdir -p /var/run/asterisk && sudo chown asterisk:asterisk /var/run/asterisksudo renice -10 $(pgrep asterisk)sudo asterisk -rx "core show codecs"Objetivo Principal: Dominar completamente a estrutura de diretórios e arquivos do Asterisk, compreendendo a função de cada componente, implementando práticas de backup e versionamento de configurações, e estabelecendo procedimentos de manutenção profissional.
Objetivos Específicos: Navegar com confiança pela hierarquia de diretórios do Asterisk, identificar e configurar arquivos críticos, implementar estratégias de backup automatizado, estabelecer controle de versão para configurações, configurar rotação de logs avançada, e dominar técnicas de troubleshooting baseadas em análise de arquivos.
Visão Geral: Esta aula oferece um tour completo e profissional pela arquitetura de arquivos do Asterisk, desde a compreensão básica da estrutura até a implementação de práticas enterprise de gerenciamento de configurações. Abordaremos não apenas onde os arquivos estão localizados, mas como gerenciá-los de forma profissional, incluindo backup automatizado, controle de versão, monitoramento de mudanças, e estratégias de recovery. O foco está em preparar o aluno para ambientes de produção onde a gestão adequada de configurações é crítica para a operação confiável do sistema.
sudo git checkout HEAD~1 arquivo.confsudo chown asterisk:asterisk /etc/asterisk/*.confEnsinar o aluno a configurar dois ramais SIP básicos e a criar um plano de discagem (Dialplan) simples que permita que um ramal ligue para o outro.
Esta é a aula mais importante. Vamos editar o sip.conf para criar as "contas" dos telefones e o extensions.conf para criar a lógica de chamada, o coração de qualquer sistema de telefonia.
Na CLI do Asterisk: Executar sip reload e dialplan reload.
Objetivo Principal: Dominar completamente os testes de chamadas em ambientes profissionais, implementar troubleshooting avançado com ferramentas especializadas, configurar monitoramento em tempo real de qualidade de chamadas, e estabelecer procedimentos de diagnóstico sistemático para resolução rápida de problemas em sistemas de telefonia IP.
Objetivos Específicos: Configurar e usar softphones profissionais com parâmetros otimizados, implementar testes automatizados de qualidade de chamadas, dominar ferramentas de debug avançado do Asterisk, configurar monitoramento de RTP e qualidade de áudio, estabelecer procedimentos de troubleshooting sistemático, e implementar alertas proativos para problemas de telefonia.
Visão Geral: Esta aula representa a transição de um ambiente de laboratório para operação profissional. Abordaremos testes rigorosos de qualidade, troubleshooting sistemático, e monitoramento proativo. O foco está em garantir que o sistema não apenas funcione, mas opere com qualidade enterprise, detectando e resolvendo problemas antes que afetem os usuários. Exploraremos ferramentas avançadas de diagnóstico, análise de tráfego SIP/RTP, e implementação de métricas de qualidade de serviço.
Last Update:
Objetivo Principal: Implementar práticas avançadas de segurança para proteger sistemas Asterisk em produção, configurar monitoramento proativo com alertas inteligentes, e otimizar performance para ambientes de alta demanda.
Em ambientes de produção, a segurança, monitoramento e otimização são críticos para garantir disponibilidade, performance e proteção contra ameaças. Esta aula aborda implementação de segurança em camadas, monitoramento proativo com métricas avançadas, otimização de sistema operacional e Asterisk, e estabelecimento de procedimentos operacionais para ambientes empresariais.
Cenário: Configurar proteção completa para servidor Asterisk em produção
#!/bin/bash # advanced-firewall-setup.sh echo "Configurando firewall avançado para Asterisk..." # Limpar regras existentes iptables -F iptables -X # Políticas padrão iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # Permitir loopback iptables -A INPUT -i lo -j ACCEPT # Permitir conexões estabelecidas iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SSH com rate limiting iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH_ATTEMPTS iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --name SSH_ATTEMPTS -j DROP iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SIP com proteção contra scanning iptables -A INPUT -p udp --dport 5060 -m string --string "friendly-scanner" --algo bm -j DROP iptables -A INPUT -p udp --dport 5060 -m string --string "sipcli" --algo bm -j DROP iptables -A INPUT -p udp --dport 5060 -m recent --set --name SIP_ATTEMPTS iptables -A INPUT -p udp --dport 5060 -m recent --update --seconds 60 --hitcount 10 --name SIP_ATTEMPTS -j DROP iptables -A INPUT -p udp --dport 5060:5061 -j ACCEPT # RTP range iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT # Salvar regras iptables-save > /etc/iptables/rules.v4 echo "Firewall configurado com sucesso!"
# /etc/fail2ban/filter.d/asterisk-security.conf
[Definition]
failregex = SECURITY.* .*: failed to authenticate as '.*'@.*
SECURITY.* .*: Registration from '.*' failed for '.*' - Wrong password
SECURITY.* .*: Host .* failed to authenticate as .*
SECURITY.* .*: No matching peer found
ignoreregex =
# /etc/fail2ban/jail.d/asterisk-custom.conf
[asterisk-security]
enabled = true
filter = asterisk-security
action = iptables-allports[name=ASTERISK-SEC]
sendmail-whois[name=ASTERISK, dest=admin@empresa.com]
logpath = /var/log/asterisk/security
maxretry = 3
bantime = 7200
findtime = 600
# Configuração de extensão segura em pjsip.conf [1001] type=endpoint context=internal disallow=all allow=alaw,ulaw,g722 auth=1001 aors=1001 direct_media=no ice_support=yes media_encryption=sdes rtp_symmetric=yes [1001] type=auth auth_type=userpass password=Str0ng!P@ssw0rd#2024 username=1001 [1001] type=aor max_contacts=2 qualify_frequency=30 remove_existing=yes
# Gerar certificados SSL openssl req -new -x509 -days 365 -nodes -out /etc/asterisk/keys/asterisk.pem -keyout /etc/asterisk/keys/asterisk.key # Configuração TLS em pjsip.conf [transport-tls] type=transport protocol=tls bind=0.0.0.0:5061 cert_file=/etc/asterisk/keys/asterisk.pem priv_key_file=/etc/asterisk/keys/asterisk.key method=tlsv1_2
Cenário: Implementar monitoramento proativo com alertas automáticos
#!/bin/bash
# advanced-metrics-collector.sh
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
METRICS_DIR="/var/log/asterisk/metrics"
mkdir -p $METRICS_DIR
# Métricas de sistema
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
MEM_USAGE=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')
DISK_USAGE=$(df -h / | awk 'NR==2{print $5}' | cut -d'%' -f1)
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f1 | xargs)
# Métricas do Asterisk
ACTIVE_CALLS=$(asterisk -rx "core show calls" | grep "active call" | awk '{print $1}')
SIP_PEERS=$(asterisk -rx "pjsip show endpoints" | grep -c "Endpoint:")
REGISTERED_PEERS=$(asterisk -rx "pjsip show endpoints" | grep -c "Available")
UPTIME=$(asterisk -rx "core show uptime" | grep "System uptime" | awk '{print $3,$4}')
# Métricas de qualidade RTP
RTP_STATS=$(asterisk -rx "rtp show stats" 2>/dev/null || echo "0 0 0")
PACKET_LOSS=$(echo $RTP_STATS | awk '{print $1}')
JITTER=$(echo $RTP_STATS | awk '{print $2}')
# Salvar em CSV
echo "$TIMESTAMP,$CPU_USAGE,$MEM_USAGE,$DISK_USAGE,$LOAD_AVG,$ACTIVE_CALLS,$SIP_PEERS,$REGISTERED_PEERS,$PACKET_LOSS,$JITTER" >> $METRICS_DIR/system_metrics.csv
# Salvar em JSON para APIs
cat > $METRICS_DIR/current_metrics.json << EOF
{
"timestamp": "$TIMESTAMP",
"system": {
"cpu_usage": $CPU_USAGE,
"memory_usage": $MEM_USAGE,
"disk_usage": $DISK_USAGE,
"load_average": $LOAD_AVG
},
"asterisk": {
"active_calls": ${ACTIVE_CALLS:-0},
"sip_peers": ${SIP_PEERS:-0},
"registered_peers": ${REGISTERED_PEERS:-0},
"uptime": "$UPTIME"
},
"rtp_quality": {
"packet_loss": ${PACKET_LOSS:-0},
"jitter": ${JITTER:-0}
}
}
EOF
echo "Métricas coletadas: $TIMESTAMP"
#!/bin/bash
# intelligent-alerts.sh
source /etc/asterisk/scripts/config.conf
# Thresholds configuráveis
CPU_THRESHOLD=${CPU_THRESHOLD:-80}
MEM_THRESHOLD=${MEM_THRESHOLD:-85}
DISK_THRESHOLD=${DISK_THRESHOLD:-90}
CALLS_THRESHOLD=${CALLS_THRESHOLD:-100}
PEERS_DOWN_THRESHOLD=${PEERS_DOWN_THRESHOLD:-5}
# Função para enviar alertas
send_alert() {
local severity=$1
local message=$2
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# Log local
echo "[$timestamp] $severity: $message" >> /var/log/asterisk/alerts.log
# Email (se configurado)
if [[ -n "$ALERT_EMAIL" ]]; then
echo "$message" | mail -s "Asterisk Alert [$severity]" $ALERT_EMAIL
fi
# Webhook (se configurado)
if [[ -n "$WEBHOOK_URL" ]]; then
curl -X POST -H "Content-Type: application/json" \
-d "{\"severity\":\"$severity\",\"message\":\"$message\",\"timestamp\":\"$timestamp\"}" \
$WEBHOOK_URL
fi
}
# Verificar métricas atuais
CURRENT_METRICS="/var/log/asterisk/metrics/current_metrics.json"
if [[ -f $CURRENT_METRICS ]]; then
CPU_USAGE=$(jq -r '.system.cpu_usage' $CURRENT_METRICS)
MEM_USAGE=$(jq -r '.system.memory_usage' $CURRENT_METRICS)
DISK_USAGE=$(jq -r '.system.disk_usage' $CURRENT_METRICS)
ACTIVE_CALLS=$(jq -r '.asterisk.active_calls' $CURRENT_METRICS)
REGISTERED_PEERS=$(jq -r '.asterisk.registered_peers' $CURRENT_METRICS)
SIP_PEERS=$(jq -r '.asterisk.sip_peers' $CURRENT_METRICS)
# Verificar alertas
if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
send_alert "CRITICAL" "CPU usage is ${CPU_USAGE}% (threshold: ${CPU_THRESHOLD}%)"
fi
if (( $(echo "$MEM_USAGE > $MEM_THRESHOLD" | bc -l) )); then
send_alert "CRITICAL" "Memory usage is ${MEM_USAGE}% (threshold: ${MEM_THRESHOLD}%)"
fi
if (( DISK_USAGE > DISK_THRESHOLD )); then
send_alert "CRITICAL" "Disk usage is ${DISK_USAGE}% (threshold: ${DISK_THRESHOLD}%)"
fi
if (( ACTIVE_CALLS > CALLS_THRESHOLD )); then
send_alert "WARNING" "High call volume: ${ACTIVE_CALLS} active calls (threshold: ${CALLS_THRESHOLD})"
fi
PEERS_DOWN=$((SIP_PEERS - REGISTERED_PEERS))
if (( PEERS_DOWN > PEERS_DOWN_THRESHOLD )); then
send_alert "WARNING" "${PEERS_DOWN} SIP peers are down (threshold: ${PEERS_DOWN_THRESHOLD})"
fi
fi
#!/bin/bash
# generate-dashboard.sh
DASHBOARD_FILE="/var/www/html/asterisk-dashboard.html"
METRICS_FILE="/var/log/asterisk/metrics/current_metrics.json"
if [[ -f $METRICS_FILE ]]; then
# Extrair dados do JSON
TIMESTAMP=$(jq -r '.timestamp' $METRICS_FILE)
CPU_USAGE=$(jq -r '.system.cpu_usage' $METRICS_FILE)
MEM_USAGE=$(jq -r '.system.memory_usage' $METRICS_FILE)
DISK_USAGE=$(jq -r '.system.disk_usage' $METRICS_FILE)
ACTIVE_CALLS=$(jq -r '.asterisk.active_calls' $METRICS_FILE)
REGISTERED_PEERS=$(jq -r '.asterisk.registered_peers' $METRICS_FILE)
# Gerar HTML
cat > $DASHBOARD_FILE << EOF
Asterisk Dashboard
Asterisk System Dashboard
Last Update: $TIMESTAMP
CPU Usage
${CPU_USAGE}%
Memory Usage
${MEM_USAGE}%
Disk Usage
${DISK_USAGE}%
Active Calls
$ACTIVE_CALLS
Registered Peers
$REGISTERED_PEERS
EOF
echo "Dashboard atualizado: $DASHBOARD_FILE"
fi
Cenário: Otimizar sistema para suportar 500+ chamadas simultâneas
#!/bin/bash
# performance-optimization.sh
echo "Iniciando otimização de performance para Asterisk..."
# Backup das configurações atuais
cp /etc/sysctl.conf /etc/sysctl.conf.backup
cp /etc/security/limits.conf /etc/security/limits.conf.backup
# Otimizações de kernel
cat >> /etc/sysctl.conf << 'EOF'
# === Asterisk Performance Optimizations ===
# Network buffer sizes
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 5000
net.core.netdev_budget = 600
# UDP optimizations
net.ipv4.udp_mem = 102400 873800 16777216
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
# TCP optimizations
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_congestion_control = bbr
# Connection tracking
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 7200
# File system
fs.file-max = 2097152
fs.nr_open = 2097152
# Virtual memory
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# Process scheduling
kernel.sched_migration_cost_ns = 5000000
kernel.sched_autogroup_enabled = 0
EOF
# Aplicar otimizações
sysctl -p
# Limites de processo para Asterisk
cat >> /etc/security/limits.conf << 'EOF'
# Asterisk limits
asterisk soft nofile 65536
asterisk hard nofile 65536
asterisk soft nproc 32768
asterisk hard nproc 32768
asterisk soft memlock unlimited
asterisk hard memlock unlimited
EOF
# Configuração de CPU affinity
echo "Configurando CPU affinity para Asterisk..."
ASTERISK_PID=$(pgrep asterisk)
if [[ -n $ASTERISK_PID ]]; then
taskset -cp 1-3 $ASTERISK_PID
echo "CPU affinity configurada para CPUs 1-3"
fi
# Otimizações específicas do Asterisk
cat > /etc/asterisk/asterisk.conf << 'EOF'
[options]
verbose = 3
debug = 1
maxcalls = 1000
maxload = 0.9
runuser = asterisk
rungroup = asterisk
cache_record_files = yes
record_cache_dir = /tmp
transmit_silence = yes
silence_threshold = 128
maxfiles = 65536
[compat]
pbx_realtime=1.6
res_agi=1.6
app_set=1.6
EOF
echo "Otimização concluída! Reinicie o sistema para aplicar todas as mudanças."
#!/bin/bash
# load-test-advanced.sh
CONCURRENT_CALLS=${1:-100}
TEST_DURATION=${2:-300}
RESULTS_DIR="/var/log/asterisk/load-tests"
mkdir -p $RESULTS_DIR
echo "Iniciando teste de carga: $CONCURRENT_CALLS chamadas por ${TEST_DURATION}s"
# Função para monitorar recursos
monitor_resources() {
local test_id=$1
local output_file="$RESULTS_DIR/resources_${test_id}.csv"
echo "timestamp,cpu_usage,memory_usage,active_calls,rtp_packets" > $output_file
while [[ -f "/tmp/load_test_running" ]]; do
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
memory_usage=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')
active_calls=$(asterisk -rx "core show calls" | grep "active call" | awk '{print $1}')
rtp_packets=$(netstat -su | grep "packets received" | awk '{print $1}')
echo "$timestamp,$cpu_usage,$memory_usage,$active_calls,$rtp_packets" >> $output_file
sleep 5
done
}
# Iniciar monitoramento em background
TEST_ID=$(date +%Y%m%d_%H%M%S)
touch /tmp/load_test_running
monitor_resources $TEST_ID &
MONITOR_PID=$!
# Executar teste com SIPp
sipp -sn uac -d 30000 -s 1001 -r $CONCURRENT_CALLS -m $((CONCURRENT_CALLS * 10)) \
-trace_msg -trace_stat -stf $RESULTS_DIR/sipp_stats_${TEST_ID}.csv \
127.0.0.1:5060 &
SIPP_PID=$!
# Aguardar conclusão do teste
sleep $TEST_DURATION
# Finalizar processos
kill $SIPP_PID 2>/dev/null
rm -f /tmp/load_test_running
kill $MONITOR_PID 2>/dev/null
# Gerar relatório
cat > $RESULTS_DIR/report_${TEST_ID}.html << EOF
Load Test Report - $TEST_ID
Load Test Report
Test ID: $TEST_ID
Concurrent Calls: $CONCURRENT_CALLS
Duration: ${TEST_DURATION}s
Results: Check CSV files for detailed metrics
EOF
echo "Teste concluído! Resultados em: $RESULTS_DIR"
Cenário: Implementar backup completo e procedimentos de recuperação
#!/bin/bash
# enterprise-backup.sh
BACKUP_BASE="/backup/asterisk"
RETENTION_DAYS=30
REMOTE_BACKUP="user@backup-server:/backups/asterisk"
NOTIFICATION_EMAIL="admin@empresa.com"
# Criar estrutura de backup
mkdir -p $BACKUP_BASE/{daily,weekly,monthly}
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="$BACKUP_BASE/daily/backup_$TIMESTAMP"
mkdir -p $BACKUP_DIR
echo "Iniciando backup completo do Asterisk - $TIMESTAMP"
# Função para log
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $BACKUP_DIR/backup.log
}
# Backup de configurações
log_message "Fazendo backup das configurações..."
tar -czf $BACKUP_DIR/configs.tar.gz /etc/asterisk/ 2>/dev/null
if [[ $? -eq 0 ]]; then
log_message "✓ Configurações salvas"
else
log_message "✗ Erro no backup de configurações"
fi
# Backup de dados do sistema
log_message "Fazendo backup dos dados do sistema..."
tar -czf $BACKUP_DIR/system_data.tar.gz \
/var/lib/asterisk/ \
/var/spool/asterisk/ \
/var/log/asterisk/ 2>/dev/null
# Backup do banco de dados (se usando)
if command -v mysql &> /dev/null; then
log_message "Fazendo backup do banco de dados MySQL..."
mysqldump --all-databases --single-transaction --routines --triggers > $BACKUP_DIR/mysql_dump.sql
fi
# Backup de certificados e chaves
log_message "Fazendo backup de certificados..."
if [[ -d /etc/asterisk/keys ]]; then
tar -czf $BACKUP_DIR/certificates.tar.gz /etc/asterisk/keys/
fi
# Informações do sistema
log_message "Coletando informações do sistema..."
cat > $BACKUP_DIR/system_info.txt << EOF
Backup Date: $(date)
Hostname: $(hostname)
OS Version: $(cat /etc/os-release | grep PRETTY_NAME)
Asterisk Version: $(asterisk -V)
Kernel Version: $(uname -r)
Uptime: $(uptime)
Disk Usage: $(df -h)
Memory Info: $(free -h)
Network Interfaces: $(ip addr show)
EOF
# Verificar integridade dos backups
log_message "Verificando integridade dos backups..."
cd $BACKUP_DIR
for file in *.tar.gz; do
if tar -tzf "$file" >/dev/null 2>&1; then
log_message "✓ $file - OK"
else
log_message "✗ $file - CORRUPTED"
fi
done
# Calcular checksums
find $BACKUP_DIR -type f -exec sha256sum {} \; > $BACKUP_DIR/checksums.sha256
# Sincronizar com backup remoto
if [[ -n "$REMOTE_BACKUP" ]]; then
log_message "Sincronizando com backup remoto..."
rsync -avz --progress $BACKUP_DIR/ $REMOTE_BACKUP/backup_$TIMESTAMP/
if [[ $? -eq 0 ]]; then
log_message "✓ Backup remoto concluído"
else
log_message "✗ Erro no backup remoto"
fi
fi
# Limpeza de backups antigos
log_message "Limpando backups antigos (>$RETENTION_DAYS dias)..."
find $BACKUP_BASE/daily -type d -name "backup_*" -mtime +$RETENTION_DAYS -exec rm -rf {} \;
# Relatório final
BACKUP_SIZE=$(du -sh $BACKUP_DIR | cut -f1)
log_message "Backup concluído! Tamanho: $BACKUP_SIZE"
# Enviar notificação
if [[ -n "$NOTIFICATION_EMAIL" ]]; then
mail -s "Asterisk Backup Completed - $TIMESTAMP" $NOTIFICATION_EMAIL < $BACKUP_DIR/backup.log
fi
#!/bin/bash
# disaster-recovery.sh
BACKUP_DIR=${1:-"/backup/asterisk/daily"}
RECOVERY_MODE=${2:-"full"} # full, config-only, data-only
if [[ ! -d "$BACKUP_DIR" ]]; then
echo "Erro: Diretório de backup não encontrado: $BACKUP_DIR"
exit 1
fi
echo "=== ASTERISK DISASTER RECOVERY ==="
echo "Backup Source: $BACKUP_DIR"
echo "Recovery Mode: $RECOVERY_MODE"
echo "=================================="
# Função de confirmação
confirm_action() {
read -p "Esta operação irá sobrescrever dados existentes. Continuar? (yes/no): " confirm
if [[ $confirm != "yes" ]]; then
echo "Operação cancelada."
exit 0
fi
}
# Parar serviços
echo "Parando serviços do Asterisk..."
systemctl stop asterisk
systemctl stop fail2ban
# Backup dos dados atuais (segurança)
CURRENT_BACKUP="/tmp/current_asterisk_$(date +%Y%m%d_%H%M%S)"
mkdir -p $CURRENT_BACKUP
echo "Fazendo backup dos dados atuais em: $CURRENT_BACKUP"
cp -r /etc/asterisk $CURRENT_BACKUP/
cp -r /var/lib/asterisk $CURRENT_BACKUP/
confirm_action
# Recuperação baseada no modo
case $RECOVERY_MODE in
"full")
echo "Executando recuperação completa..."
# Restaurar configurações
if [[ -f "$BACKUP_DIR/configs.tar.gz" ]]; then
echo "Restaurando configurações..."
tar -xzf $BACKUP_DIR/configs.tar.gz -C /
fi
# Restaurar dados do sistema
if [[ -f "$BACKUP_DIR/system_data.tar.gz" ]]; then
echo "Restaurando dados do sistema..."
tar -xzf $BACKUP_DIR/system_data.tar.gz -C /
fi
# Restaurar certificados
if [[ -f "$BACKUP_DIR/certificates.tar.gz" ]]; then
echo "Restaurando certificados..."
tar -xzf $BACKUP_DIR/certificates.tar.gz -C /
fi
# Restaurar banco de dados
if [[ -f "$BACKUP_DIR/mysql_dump.sql" ]]; then
echo "Restaurando banco de dados..."
mysql < $BACKUP_DIR/mysql_dump.sql
fi
;;
"config-only")
echo "Restaurando apenas configurações..."
if [[ -f "$BACKUP_DIR/configs.tar.gz" ]]; then
tar -xzf $BACKUP_DIR/configs.tar.gz -C /
fi
;;
"data-only")
echo "Restaurando apenas dados..."
if [[ -f "$BACKUP_DIR/system_data.tar.gz" ]]; then
tar -xzf $BACKUP_DIR/system_data.tar.gz -C /
fi
;;
esac
# Verificar integridade dos arquivos restaurados
echo "Verificando integridade dos arquivos..."
if [[ -f "$BACKUP_DIR/checksums.sha256" ]]; then
cd /
sha256sum -c $BACKUP_DIR/checksums.sha256 --quiet
if [[ $? -eq 0 ]]; then
echo "✓ Integridade verificada"
else
echo "⚠ Alguns arquivos podem estar corrompidos"
fi
fi
# Ajustar permissões
echo "Ajustando permissões..."
chown -R asterisk:asterisk /etc/asterisk/
chown -R asterisk:asterisk /var/lib/asterisk/
chown -R asterisk:asterisk /var/spool/asterisk/
chown -R asterisk:asterisk /var/log/asterisk/
# Reiniciar serviços
echo "Reiniciando serviços..."
systemctl start asterisk
systemctl start fail2ban
# Verificar status
sleep 5
if systemctl is-active --quiet asterisk; then
echo "✓ Asterisk iniciado com sucesso"
asterisk -rx "core show version"
else
echo "✗ Erro ao iniciar Asterisk"
echo "Logs de erro:"
tail -20 /var/log/asterisk/messages
fi
echo "Recuperação concluída!"
echo "Backup dos dados anteriores: $CURRENT_BACKUP"
Problema: Detecção de tentativas de invasão ou uso não autorizado
Diagnóstico Avançado:
grep -E "(SECURITY|failed|unauthorized)" /var/log/asterisk/securitynetstat -an | grep :5060 | grep -v ESTABLISHEDtcpdump -i any -n port 5060 | grep -E "(REGISTER|INVITE)" | head -20fail2ban-client status asterisk-iptablesSoluções: Implementar rate limiting mais agressivo, configurar geoblocking, ativar logs de auditoria detalhados
Problema: Sistema lento ou instável com muitas chamadas simultâneas
Diagnóstico Avançado:
mpstat -P ALL 1 5iostat -x 1 5cat /proc/meminfo | grep -E "(MemFree|Buffers|Cached)"ss -tuln | grep :5060asterisk -rx "core show threads"Soluções: Ajustar parâmetros de kernel, otimizar configuração do Asterisk, implementar load balancing
Problema: Backups corrompidos ou falhas na recuperação
Diagnóstico Avançado:
tar -tzf backup.tar.gz >/dev/null && echo "OK" || echo "CORRUPTED"sha256sum -c checksums.sha256df -i /backup (verificar inodes)tail -50 /var/log/backup.logSoluções: Implementar verificação automática de integridade, configurar múltiplos destinos de backup, testar recuperação regularmente
Validação: Teste tentativas de brute force e verifique se são bloqueadas automaticamente
Validação: Simule condições de alta carga e verifique se os alertas são disparados corretamente
Validação: Execute teste de disaster recovery completo e verifique tempo de recuperação
Teste de Segurança:
Teste de Monitoramento:
Teste de Performance:
Teste de Disaster Recovery: