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_role zwraca 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

ZasadaDlaczego
Role zamiast access keysbrak długoterminowych sekretów
Paginatorykompletne wyniki bez błędów
Obsługa ClientErrorAPI rzuca wyjątki, nie kody błędów
Throttling / retryAWS 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.