Skip to content

Python SDK & CLI

Onderhouden door: Aether365 Team Doelgroep: Developers en DevOps-engineers Scope: Installatie en gebruik van de officiële aether365 Python SDK en command line interface

Het pakket aether365 is de officiële Python SDK en command line interface voor de Aether365 API. Het wikkelt https://api.aether365.io in, regelt de authenticatie, pakt de response-envelope uit en probeert tijdelijke fouten automatisch opnieuw. Alles wat met curl kan, kan ook met de SDK of de CLI.

De SDK en CLI gebruiken een API key (ak_live_...) en richten zich op het unified endpoint - verzoeken worden automatisch naar de thuisregio van je tenant gerouteerd. Zie Authenticatie voor hoe keys werken.

Installatie

Het pakket wordt intern gedistribueerd (niet via PyPI). Installeer het rechtstreeks vanuit de repository of een lokale checkout.

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

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

Python 3.12 of nieuwer is vereist. Bij installatie komt ook het commando aether365 op je PATH te staan.

Configuratie

Zowel de SDK als de CLI lezen dezelfde omgevingsvariabelen:

VariabeleDoelStandaard
AETHER365_API_KEYJe API key (ak_live_...). Verplicht.-
AETHER365_API_URLOverschrijft de basis-URL (bijvoorbeeld het dev-endpoint).https://api.aether365.io
AETHER365_OUTPUTUitvoerformaat van de CLI: table of json.table
bash
export AETHER365_API_KEY="ak_live_..."

De regio gaat vanzelf: de API leidt je tenant af uit de key en stuurt door naar de juiste regio, dus je hoeft nooit een regio te configureren of mee te geven.

Snelstart: 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")

Snelstart: 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

Wat een API key wel en niet kan

Een API key is beperkt tot een veilig, lezend en operationeel oppervlak. Hij kan je gegevens lezen, scans starten en beheren, rapporten genereren en attack-surface-targets beheren. Hij kan geen acties uitvoeren die het account besturen of de directory kunnen buitensluiten - API key-beheer, facturering, teamlidmaatschap, het aan- en afkoppelen van verbindingen, SSO, het toepassen van een remediation-plan of de conditional-access-/break-glass-writes van AI Pilot. Die blijven alleen beschikbaar voor een ingelogde sessie in het dashboard. Een verzoek naar een niet-toegestane route geeft 403 AUTH_INSUFFICIENT_SCOPE.

Commando- en methodereferentie

Elke rij toont dezelfde operatie op drie manieren: als kale curl, als SDK-methode en als CLI-commando.

Tenant en account

OperatiecurlSDKCLI
Tenantprofiel opvragenGET /tenants/meclient.tenants.me()aether365 tenant me
Verbindingen weergevenGET /tenants/me/connectionsclient.connections.list()aether365 tenant connections
NotificatievoorkeurenGET /tenants/me/notificationsclient.notifications.get()aether365 tenant notifications
Geplande scansGET /tenants/me/scheduled-scansclient.scheduled_scans.list()aether365 tenant scheduled-scans

Scans

OperatiecurlSDKCLI
Scans weergevenGET /tenants/me/scansclient.scans.list()aether365 scan list
Scan startenPOST /tenants/me/scansclient.scans.create("compliance")aether365 scan run --type compliance
Scan opvragenGET /scans/{id}client.scans.get(id)aether365 scan get <id>
Resultaten lezenGET /scans/{id}/resultsclient.scans.results(id)aether365 scan results <id>
Scan annulerenPOST /scans/{id}/cancelclient.scans.cancel(id)aether365 scan cancel <id>
Scan verbergenPATCH /scans/{id}/hideclient.scans.hide(id)aether365 scan hide <id>
Scan weer tonenPATCH /scans/{id}/unhideclient.scans.unhide(id)aether365 scan unhide <id>
Scan verwijderenDELETE /scans/{id}client.scans.delete(id)aether365 scan delete <id>

De curl om een scan te starten:

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"}'

Rapporten

OperatiecurlSDKCLI
RapportstatusGET /scans/{id}/reportclient.reports.status(id)aether365 report status <id>
Rapport genererenPOST /scans/{id}/report/generateclient.reports.generate(id)aether365 report generate <id>
Rapporten weergevenGET /tenants/me/reportsclient.reports.list()aether365 report list
Rapport downloadenGET /scans/{id}/report (presigned)client.reports.download(id, path)aether365 report download <id> -o out.pdf

De rapportstatus is een van ready, rendering, orgNameRequired of locked. Het genereren van een rapport kan een rapportcredit kosten (een eenmalige betaling wanneer geen tegoed is inbegrepen) - de eigenaar van de key kiest daar zelf voor door generate aan te roepen.

De rapportlijst is offset-gepagineerd: geef meta["nextCursor"] (een integer rij-offset, of None op de laatste pagina) terug als cursor. client.reports.iter_all() volgt de cursor voor je.

Attack surface

OperatiecurlSDKCLI
OverzichtGET /tenants/me/attack-surfaceclient.attack_surface.summary()aether365 eas summary
GeschiedenisGET /tenants/me/attack-surface/historyclient.attack_surface.history()aether365 eas history
Targets weergevenGET /tenants/me/attack-surface/targetsclient.attack_surface.targets()aether365 eas targets list
Target toevoegenPOST /tenants/me/attack-surface/targetsclient.attack_surface.add_target(host)aether365 eas targets add <host>
Target bijwerkenPATCH /tenants/me/attack-surface/targets/{id}client.attack_surface.update_target(id, ...)aether365 eas targets update <id> --label ...
Target verwijderenDELETE /tenants/me/attack-surface/targets/{id}client.attack_surface.remove_target(id)aether365 eas targets remove <id>
Target verifiërenPOST /tenants/me/attack-surface/targets/{id}/verifyclient.attack_surface.verify_target(id)aether365 eas targets verify <id>
EAS-scan uitvoerenPOST /tenants/me/attack-surface/scanclient.attack_surface.scan()aether365 eas scan

Posture, remediation en AI Pilot

OperatiecurlSDKCLI
Dreigings-/risicoweergaveGET /tenants/me/threatsclient.threats.list()aether365 threats
Policy-postureGET /tenants/me/policiesclient.policies.list()aether365 policies
Remediation-mogelijkhedenGET /tenants/me/remediation/capabilitiesclient.remediation.capabilities()aether365 remediation capabilities
Remediation-plannen weergevenGET /tenants/me/remediation-plansclient.remediation.plans()aether365 remediation plans
Remediation-plan opvragenGET /tenants/me/remediation-plans/{id}client.remediation.plan(id)aether365 remediation plan <id>
AI Pilot remediableGET /tenants/me/ai-pilot/remediableclient.ai_pilot.remediable()aether365 ai-pilot remediable
AI Pilot break-glassGET /tenants/me/ai-pilot/break-glassclient.ai_pilot.break_glass()aether365 ai-pilot break-glass
AI Pilot CA-policiesGET /tenants/me/ai-pilot/conditional-accessclient.ai_pilot.conditional_access()aether365 ai-pilot conditional-access

Remediation is voor API keys alleen-lezen. Het toepassen van een plan is niet beschikbaar: de action-registry-items van een plan kunnen conditional-access-/authorization-policy-patches bevatten die een tenant uit zijn eigen directory zouden buitensluiten (AADSTS50097), dus toepassen blijft in het dashboard met een operator in de loop. AI Pilot conditional-access en break-glass zijn om dezelfde reden eveneens alleen-lezen.

Foutafhandeling en retries

Elke API-fout wordt afgebeeld op een getypeerde exception-subklasse van 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.")

De client probeert 429 RATE_LIMITED en 503 SERVICE_STARTING (het opwarmen van de koude dev-database) automatisch opnieuw met exponentiële backoff en respecteert daarbij de Retry-After-header. Quotafouten zoals SCAN_PLAN_LIMIT_REACHED worden direct opgegooid - die worden niet opnieuw geprobeerd.

De CLI gebruiken in CI

aether365 scan results <id> --fail-on-findings stopt met exitcode 2 zodra er ook maar één gefaalde bevinding is, zodat een pipeline de scanresultaten als gate kan gebruiken:

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

De CLI schrijft fouten naar stderr en stopt met 1 bij elke API-fout en met 2 bij de findings-gate.

Was deze pagina nuttig?