Skip to content

Python SDK a CLI

Balíček aether365 je oficiální Python SDK a rozhraní příkazové řádky pro Aether365 API. Obaluje https://api.aether365.io, stará se o autentizaci, rozbaluje obálku odpovědi a přechodné chyby automaticky opakuje. Cokoli zvládnete přes curl, zvládnete i přes SDK nebo CLI.

SDK i CLI používají API klíč (ak_live_...) a míří na sjednocený endpoint - požadavky se automaticky směrují do domovského regionu vašeho tenanta. Jak klíče fungují, popisuje stránka Autentizace.

Instalace

Balíček je distribuován interně (není na PyPI). Nainstalujte jej přímo z repozitáře nebo z lokálního checkoutu.

bash
# From a local checkout of the monorepo
pip install ./packages/cli

# Or with Poetry, from a path
poetry add ./packages/cli

Vyžadován je Python 3.12 nebo novější. Instalace balíčku zároveň přidá příkaz aether365 do PATH.

Konfigurace

SDK i CLI čtou stejné proměnné prostředí:

ProměnnáÚčelVýchozí
AETHER365_API_KEYVáš API klíč (ak_live_...). Povinné.-
AETHER365_API_URLPřepsání základní URL (například dev endpoint).https://api.aether365.io
AETHER365_OUTPUTVýstupní formát CLI: table nebo json.table
bash
export AETHER365_API_KEY="ak_live_..."

Region je automatický: API podle klíče určí vašeho tenanta a požadavek předá do správného regionu, takže region nikdy nekonfigurujete ani nepředáváte.

Rychlý start: SDK

python
from aether365 import Aether365Client

with Aether365Client() as client:          # reads AETHER365_API_KEY
    tenant = client.tenants.me()
    print(tenant["name"])

    # Trigger a scan and wait for it to finish
    scan = client.scans.create("compliance")
    for snapshot in client.scans.wait(scan["id"]):
        print(snapshot["status"])

    # Read the findings
    findings = client.scans.results(scan["id"], result="Failed")
    print(f"{len(findings)} failed checks")

Rychlý start: CLI

bash
# Show the authenticated tenant
aether365 tenant me

# Trigger a scan and follow progress until it finishes
aether365 scan run --type compliance --watch

# List scans as JSON
aether365 --output json scan list

# Fail a CI job when a scan has failed findings (exit code 2)
aether365 scan results <SCAN_ID> --fail-on-findings

Co API klíč smí a co nesmí

API klíč je omezen na bezpečnou plochu: čtení plus provozní operace. Může číst vaše data, spouštět a spravovat skeny, generovat reporty a spravovat cíle attack surface. Nemůže provádět akce ovládající účet ani akce, které by mohly zamknout adresář - správu API klíčů, fakturaci, členství v týmu, připojování a odpojování connectionů, SSO, aplikaci remediačního plánu ani zápisy AI Pilotu do conditional access / break-glass. Ty zůstávají dostupné jen přihlášené relaci v dashboardu. Požadavek na nepovolenou cestu vrací 403 AUTH_INSUFFICIENT_SCOPE.

Přehled příkazů a metod

Každý řádek ukazuje stejnou operaci třemi způsoby: čistý curl, metoda SDK a příkaz CLI.

Tenant a účet

OperacecurlSDKCLI
Profil tenantaGET /tenants/meclient.tenants.me()aether365 tenant me
Seznam připojeníGET /tenants/me/connectionsclient.connections.list()aether365 tenant connections
Předvolby notifikacíGET /tenants/me/notificationsclient.notifications.get()aether365 tenant notifications
Naplánované skenyGET /tenants/me/scheduled-scansclient.scheduled_scans.list()aether365 tenant scheduled-scans

Skeny

OperacecurlSDKCLI
Seznam skenůGET /tenants/me/scansclient.scans.list()aether365 scan list
Spuštění skenuPOST /tenants/me/scansclient.scans.create("compliance")aether365 scan run --type compliance
Načtení skenuGET /scans/{id}client.scans.get(id)aether365 scan get <id>
Čtení výsledkůGET /scans/{id}/resultsclient.scans.results(id)aether365 scan results <id>
Zrušení skenuPOST /scans/{id}/cancelclient.scans.cancel(id)aether365 scan cancel <id>
Skrytí skenuPATCH /scans/{id}/hideclient.scans.hide(id)aether365 scan hide <id>
Zrušení skrytí skenuPATCH /scans/{id}/unhideclient.scans.unhide(id)aether365 scan unhide <id>
Smazání skenuDELETE /scans/{id}client.scans.delete(id)aether365 scan delete <id>

curl pro spuštění skenu:

bash
curl -X POST https://api.aether365.io/tenants/me/scans \
  -H "Authorization: Bearer $AETHER365_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scanType": "compliance"}'

Reporty

OperacecurlSDKCLI
Stav reportuGET /scans/{id}/reportclient.reports.status(id)aether365 report status <id>
Vygenerování reportuPOST /scans/{id}/report/generateclient.reports.generate(id)aether365 report generate <id>
Seznam reportůGET /tenants/me/reportsclient.reports.list()aether365 report list
Stažení reportuGET /scans/{id}/report (presigned)client.reports.download(id, path)aether365 report download <id> -o out.pdf

Stav reportu je jedna z hodnot ready, rendering, orgNameRequired nebo locked. Vygenerování reportu může spotřebovat reportový kredit (jednorázový poplatek, když tarif nezahrnuje žádnou kvótu) - vlastník klíče s tím souhlasí tím, že zavolá generate.

Výpis reportů je stránkován offsetem: hodnotu meta["nextCursor"] (celočíselný offset řádku, nebo None na poslední stránce) předejte zpět jako cursor. client.reports.iter_all() kurzor sleduje za vás.

Attack surface

OperacecurlSDKCLI
PřehledGET /tenants/me/attack-surfaceclient.attack_surface.summary()aether365 eas summary
HistorieGET /tenants/me/attack-surface/historyclient.attack_surface.history()aether365 eas history
Seznam cílůGET /tenants/me/attack-surface/targetsclient.attack_surface.targets()aether365 eas targets list
Přidání cílePOST /tenants/me/attack-surface/targetsclient.attack_surface.add_target(host)aether365 eas targets add <host>
Aktualizace cílePATCH /tenants/me/attack-surface/targets/{id}client.attack_surface.update_target(id, ...)aether365 eas targets update <id> --label ...
Smazání cíleDELETE /tenants/me/attack-surface/targets/{id}client.attack_surface.remove_target(id)aether365 eas targets remove <id>
Ověření cílePOST /tenants/me/attack-surface/targets/{id}/verifyclient.attack_surface.verify_target(id)aether365 eas targets verify <id>
Spuštění EAS skenuPOST /tenants/me/attack-surface/scanclient.attack_surface.scan()aether365 eas scan

Bezpečnostní postoj, remediace a AI Pilot

OperacecurlSDKCLI
Pohled na hrozby a rizikaGET /tenants/me/threatsclient.threats.list()aether365 threats
Stav politikGET /tenants/me/policiesclient.policies.list()aether365 policies
Remediační schopnostiGET /tenants/me/remediation/capabilitiesclient.remediation.capabilities()aether365 remediation capabilities
Seznam remediačních plánůGET /tenants/me/remediation-plansclient.remediation.plans()aether365 remediation plans
Načtení remediačního plánuGET /tenants/me/remediation-plans/{id}client.remediation.plan(id)aether365 remediation plan <id>
AI Pilot: remediovatelné položkyGET /tenants/me/ai-pilot/remediableclient.ai_pilot.remediable()aether365 ai-pilot remediable
AI Pilot: break-glass účtyGET /tenants/me/ai-pilot/break-glassclient.ai_pilot.break_glass()aether365 ai-pilot break-glass
AI Pilot: CA politikyGET /tenants/me/ai-pilot/conditional-accessclient.ai_pilot.conditional_access()aether365 ai-pilot conditional-access

Remediace je pro API klíče pouze pro čtení. Aplikace plánu není zpřístupněna: položky plánu z registru akcí mohou obsahovat úpravy Conditional Access / authorization policy, které by tenanta zamkly mimo jeho vlastní adresář (AADSTS50097), takže apply zůstává v dashboardu s operátorem ve smyčce. Ze stejného důvodu jsou conditional-access a break-glass v AI Pilotu rovněž jen pro čtení.

Zpracování chyb a opakování

Každá chyba API se mapuje na typovanou výjimku odvozenou od Aether365Error:

python
from aether365 import Aether365Client
from aether365.exceptions import PermissionError_, PlanLimitError, NotFoundError

with Aether365Client() as client:
    try:
        client.scans.create("compliance")
    except PlanLimitError:
        print("Scan quota reached for this plan.")
    except PermissionError_:
        print("Route not allowed for this key, or plan lacks API access.")
    except NotFoundError:
        print("Resource not found.")

Klient automaticky opakuje 429 RATE_LIMITED a 503 SERVICE_STARTING (zahřívání studené databáze v dev prostředí) s exponenciálním backoffem a respektuje hlavičku Retry-After. Chyby kvót, jako SCAN_PLAN_LIMIT_REACHED, jsou vyhozeny okamžitě - neopakují se.

Použití CLI v CI

aether365 scan results <id> --fail-on-findings skončí s kódem 2, pokud existuje jakýkoli neúspěšný nález, takže pipeline může výsledky skenu použít jako bránu:

bash
aether365 scan run --type compliance --watch
aether365 scan results "$SCAN_ID" --fail-on-findings

CLI vypisuje chyby na stderr a končí kódem 1 při jakékoli chybě API a kódem 2 na bráně nálezů.

Byla tato stránka užitečná?