Para o desenvolvimento desse grupo de atividades, eu decidi montar um script em Bash baseado no original, só que com algumas funcionalidades extras para tornar o código mais limpo e adicionar algumas outras funcionalidades para filtragem. Acredito que isso simule a experiência real de utilização do Bash.
Para novas funcionalidades:
- Transformar os comandos e grupos de comandos em funções
- Ocultar endereço IP
- Remover as linhas de aviso de exposição nos logs, já que filtrei esses dados.
Eu sei que, na prática, para administradores, essas linhas de endereço não precisariam ser filtradas, mas para fins de estudo, eu farei isso.
Segue o código em "bourne again shell" reestruturado:
Bash
#!/bin/bash
LOG_DIRECTORY="../log-app/logs"
echo "Verificando logs no diretório $LOG_DIRECTORY"
salvar-erros() {
grep "ERROR:" $arquivo > "${arquivo}.filtrado"
}
salvar-dados-sensiveis() {
grep "SENSITIVE_DATA:" $arquivo >> "${arquivo}.filtrado"
}
filtrar-dados-sensiveis() {
sed -i 's/User password is .*/User password is REDACTED/g' "${arquivo}.filtrado"
sed -i 's/User password reset request with token .*/User password reset request with token REDACTED/g' "${arquivo}.filtrado"
sed -i 's/API key leaked: .*/API key leaked REDACTED/g' "${arquivo}.filtrado"
sed -i 's/User credit card last four digits: .*/User credit card last four digits: REDACTED/g' "${arquivo}.filtrado"
sed -i 's/User session initiated with token: .*/User session initiated with token: REDACTED/g' "${arquivo}.filtrado"
sed -i 's/User IP .*/User IP REDACTED/g' "${arquivo}.filtrado"
sed -i 's/Unauthorized access attempt from IP .*/Unauthorized access attempt from IP REDACTED/g' "${arquivo}.filtrado"
sed -i '/SENSITIVE_DATA: Credit card information exposed in logs\./d' "${arquivo}.filtrado"
sed -i '/SENSITIVE_DATA: Credit card information exposed\./d' "${arquivo}.filtrado"
}
find $LOG_DIRECTORY -name "*.log" -print0 | while IFS= read -r -d '' arquivo; do
salvar-erros
salvar-dados-sensiveis
filtrar-dados-sensiveis
done
Falando um pouco sobre as mudanças realizadas, a declaração de funções é simples a ponto de eu até ter me impressionado quando pesquisava, mas funciona como em qualquer outra linguagem e, para chamar, é só escrever o seu nome.
Sobre a exclusão de linhas, eu tive que usar um outro modo do sed, que é com /d e definindo um delimitador \.. Esse delimitador seria basicamente o último caractere do texto pesquisado.