Automatyzacja z Boto3 (Python)
Boto3 to oficjalny SDK AWS dla Pythona — narzędzie, którym ZEUS odczytuje AWS pod spodem. Ta lekcja pokazuje wzorce, których używamy do bezpiecznej, skalowalnej inwentaryzacji środowiska klienta.
Sesje, klienci i zasoby
Boto3 ma dwa interfejsy:
- client — niski poziom, mapuje 1:1 na API AWS (wszystkie operacje),
- resource — wyższy poziom, obiektowy (dostępny dla części usług).
import boto3
# Sesja czytająca credentiale z roli/profilu
session = boto3.Session(region_name="eu-central-1")
ec2 = session.client("ec2")
resp = ec2.describe_instances()
for r in resp["Reservations"]:
for inst in r["Instances"]:
print(inst["InstanceId"], inst.get("PublicIpAddress", "—"))
Credentiale — nigdy w kodzie
Boto3 szuka credentiali w kolejności: zmienne środowiskowe → profil → rola IAM instancji/zadania. W produkcji zawsze używaj ról, nie kluczy w plikach.
# Przyjęcie roli cross-account (wzorzec ZEUS)
sts = boto3.client("sts")
creds = sts.assume_role(
RoleArn="arn:aws:iam::111122223333:role/zeus-readonly",
RoleSessionName="zeus-scan",
)["Credentials"]
scoped = boto3.client(
"s3",
aws_access_key_id=creds["AccessKeyId"],
aws_secret_access_key=creds["SecretAccessKey"],
aws_session_token=creds["SessionToken"],
)
Wskazówka:
assume_rolezwraca tymczasowe credentiale (domyślnie 1h). To bezpieczniejsze niż długoterminowe access keys — i dokładnie ten mechanizm stosuje konektor ZEUS do AWS.
Paginatory — bo wyniki bywają duże
API AWS zwraca wyniki stronami. Ręczne pętlowanie po NextToken jest
błędogenne; używaj paginatorów:
s3 = session.client("s3")
paginator = s3.get_paginator("list_objects_v2")
for page in paginator.paginate(Bucket="zeus-data"):
for obj in page.get("Contents", []):
print(obj["Key"], obj["Size"])
Przykład: audyt publicznych bucketów
s3 = session.client("s3")
for b in s3.list_buckets()["Buckets"]:
name = b["Name"]
try:
pab = s3.get_public_access_block(Bucket=name)
cfg = pab["PublicAccessBlockConfiguration"]
if not all(cfg.values()):
print(f"[UWAGA] {name}: Block Public Access niepełny")
except s3.exceptions.ClientError:
print(f"[UWAGA] {name}: brak konfiguracji Block Public Access")
Dobre praktyki
| Zasada | Dlaczego |
|---|---|
| Role zamiast access keys | brak długoterminowych sekretów |
| Paginatory | kompletne wyniki bez błędów |
Obsługa ClientError | API rzuca wyjątki, nie kody błędów |
| Throttling / retry | AWS limituje zapytania (exponential backoff) |
Jak to widzi ZEUS
Konektor ZEUS do AWS jest zbudowany właśnie na Boto3. Przyjmuje rolę read-only
przez assume_role, używa paginatorów do pełnej inwentaryzacji i równolegle
odpytuje usługi (EC2, S3, RDS, IAM, GuardDuty). Tymczasowe credentiale
i wyłącznie operacje Describe/List/Get gwarantują, że skan nigdy nie
zmodyfikuje środowiska klienta.
W następnej lekcji: bezpieczeństwo — GuardDuty, Security Hub i IAM Access Analyzer.