Skip to content

Commit 4b9a56e

Browse files
committed
Aprimorando o script
1 parent 35b21b6 commit 4b9a56e

File tree

2 files changed

+108
-7
lines changed

2 files changed

+108
-7
lines changed

scripts/README.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Auditoria de Recursos GCP com Terraform
2+
3+
Este diretório contém utilitários para auditoria da infraestrutura GCP e validação de consistência com o que está sob gerenciamento do Terraform.
4+
5+
---
6+
7+
## 📜 Script principal
8+
9+
### `verificar_orfaos.sh`
10+
11+
Realiza as seguintes auditorias automatizadas:
12+
13+
1. **Recursos órfãos** (via Cloud Asset Inventory)
14+
2. **Service Accounts (SAs)** sem `labels.provisioned_by`
15+
3. **IAM bindings** com Service Accounts
16+
17+
Gera arquivos de saída JSON e CSV para análise detalhada ou integração com CI.
18+
19+
---
20+
21+
## 🚀 Como usar
22+
23+
### Execução padrão:
24+
25+
```bash
26+
./verificar_orfaos.sh
27+
```
28+
## 📦 Uso avançado
29+
30+
### 🔀 Com projeto diferente:
31+
32+
```bash
33+
PROJECT_ID=meu-outro-projeto ./verificar_orfaos.sh
34+
```
35+
### ⚡ Modo rápido para CI/CD:
36+
```bash
37+
./verificar_orfaos.sh --summary
38+
```
39+
40+
### 📁 Estrutura dos arquivos gerados (`output/`)
41+
42+
| Arquivo | Conteúdo |
43+
|----------------------------------------|--------------------------------------------------------|
44+
| all-assets.json | Todos os recursos do projeto via `gcloud asset` |
45+
| possible-orphans.json | Recursos sem `labels.provisioned_by` esperadas |
46+
| possible-orphans.csv | Versão CSV resumida dos órfãos |
47+
| iam-service-accounts.json | Todas as Service Accounts do projeto |
48+
| iam-service-account-orphans.json | SAs sem `provisioned_by` definido |
49+
| iam-bindings.json | IAM policy completa do projeto |
50+
| iam-bindings-service-accounts.json | Apenas bindings com `serviceAccount:` como membro |
51+
52+
53+
### 🧠 Como interpretar os resultados
54+
55+
- Recursos ou SAs sem `labels.provisioned_by` são considerados **potencialmente órfãos**
56+
- Bindings IAM com service accounts são listados para conferência com o código Terraform
57+
- Use os arquivos `.csv` para relatórios ou automações
58+
59+
60+
### 📌 Requisitos
61+
gcloud autenticado com permissão de leitura no projeto
62+
63+
jq instalado (sudo apt install jq ou brew install jq)
64+
65+
### ✅ Sugestão de .gitignore
66+
<pre><code> output/ </code></pre>
67+
68+
### ✨ Próximos passos (opcional)
69+
Validar se os bindings IAM estão todos sob controle do Terraform
70+
71+
Usar terraform state list para cruzar com os recursos GCP
72+
73+
Automatizar alertas em CI se órfãos forem detectados

scripts/verificar_orfaos.sh

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ else
1515
fi
1616

1717
PROJECT_ID="${PROJECT_ID:-${1:-observatudo-infra}}"
18-
1918
EXPECTED_LABELS=(${EXPECTED_LABELS[@]:-infra-base dns-zones-observatudo observatudo-www-app})
2019

2120
# === 📂 Diretório de saída ===
@@ -27,34 +26,63 @@ ALL_ASSETS_FILE="$OUTPUT_DIR/all-assets.json"
2726
ORPHANS_FILE="$OUTPUT_DIR/possible-orphans.json"
2827
CSV_FILE="$OUTPUT_DIR/possible-orphans.csv"
2928

30-
# === 🛰️ Coleta de dados ===
29+
# === 🛰️ Coleta de dados gerais (Asset Inventory) ===
3130
echo -e "${YELLOW}📦 Coletando todos os recursos do projeto: $PROJECT_ID...${NC}"
3231
gcloud asset search-all-resources --project="$PROJECT_ID" --format=json > "$ALL_ASSETS_FILE"
3332

34-
# === 🧠 Filtro de órfãos ===
33+
# === 🧠 Filtro de órfãos (sem labels ou labels inválidos) ===
3534
echo -e "${YELLOW}🔍 Filtrando recursos órfãos (sem label 'provisioned_by' ou valor inesperado)...${NC}"
36-
3735
jq --argjson expected_labels "$(printf '%s\n' "${EXPECTED_LABELS[@]}" | jq -R . | jq -s .)" '
3836
map(select(
3937
(.labels.provisioned_by == null) or
4038
(.labels.provisioned_by != null and (.labels.provisioned_by as $val | $expected_labels | index($val) | not))
4139
))
4240
' "$ALL_ASSETS_FILE" > "$ORPHANS_FILE"
4341

44-
# === 📊 Resumo ===
4542
COUNT=$(jq length "$ORPHANS_FILE")
4643
echo -e "${GREEN}✅ Resultado salvo em: $ORPHANS_FILE${NC}"
4744
echo -e "${YELLOW}⚠️ Recursos órfãos encontrados: $COUNT${NC}"
4845

4946
echo -e "${YELLOW}📊 Tipos de recursos órfãos:${NC}"
5047
jq '.[].assetType' "$ORPHANS_FILE" | sort | uniq -c
5148

52-
# === 📄 Geração de CSV ===
5349
jq -r '.[] | [.assetType, .name] | @csv' "$ORPHANS_FILE" > "$CSV_FILE"
5450
echo -e "${GREEN}📄 CSV gerado em: $CSV_FILE${NC}"
5551

56-
# === ✅ Modo resumo para CI ou pipelines ===
52+
# === ✅ Modo resumo termina aqui ===
5753
if [[ "$SUMMARY_MODE" == true ]]; then
5854
exit 0
5955
fi
6056

57+
# === 🔐 Auditoria de Service Accounts ===
58+
SA_FILE="$OUTPUT_DIR/iam-service-accounts.json"
59+
SA_ORPHANS_FILE="$OUTPUT_DIR/iam-service-account-orphans.json"
60+
61+
echo -e "${YELLOW}🔍 Coletando todas as Service Accounts...${NC}"
62+
gcloud iam service-accounts list --project="$PROJECT_ID" --format=json > "$SA_FILE"
63+
64+
jq '
65+
map(select(
66+
(.labels == null) or (.labels.provisioned_by == null)
67+
))
68+
' "$SA_FILE" > "$SA_ORPHANS_FILE"
69+
70+
SA_ORPHANS_COUNT=$(jq length "$SA_ORPHANS_FILE")
71+
echo -e "${YELLOW}⚠️ Service Accounts sem 'provisioned_by': $SA_ORPHANS_COUNT${NC}"
72+
echo -e "${GREEN}📄 Detalhes salvos em: $SA_ORPHANS_FILE${NC}"
73+
74+
# === 🔐 Auditoria de IAM bindings com Service Accounts ===
75+
IAM_BINDINGS_FILE="$OUTPUT_DIR/iam-bindings.json"
76+
IAM_SA_BINDINGS_FILE="$OUTPUT_DIR/iam-bindings-service-accounts.json"
77+
78+
echo -e "${YELLOW}🔍 Coletando todos os IAM bindings do projeto...${NC}"
79+
gcloud projects get-iam-policy "$PROJECT_ID" --format=json > "$IAM_BINDINGS_FILE"
80+
81+
jq '
82+
.bindings
83+
| map(select(.members[]? | startswith("serviceAccount:")))
84+
' "$IAM_BINDINGS_FILE" > "$IAM_SA_BINDINGS_FILE"
85+
86+
IAM_SA_BINDINGS_COUNT=$(jq length "$IAM_SA_BINDINGS_FILE")
87+
echo -e "${YELLOW}⚠️ Total de papéis atribuídos a service accounts: $IAM_SA_BINDINGS_COUNT${NC}"
88+
echo -e "${GREEN}📄 Bindings com SAs salvos em: $IAM_SA_BINDINGS_FILE${NC}"

0 commit comments

Comments
 (0)