Skip to content

Python SDK и CLI

Пакетът aether365 е официалният Python SDK и интерфейс за команден ред за Aether365 API. Той обвива https://api.aether365.io, поема удостоверяването, разопакова обвивката на отговора и автоматично повтаря заявките при преходни грешки. Всичко, което можете да направите с curl, можете да направите и със SDK или CLI.

SDK и CLI използват API ключ (ak_live_...) и се насочват към унифицирания endpoint - заявките автоматично се маршрутизират към домашния регион на вашия tenant. Как работят ключовете е описано в Удостоверяване.

Инсталация

Пакетът се разпространява вътрешно (не е в PyPI). Инсталирайте го директно от репозитория или от локално копие.

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 или по-нов. Инсталирането на пакета добавя и командата aether365 към PATH.

Конфигурация

SDK и CLI четат едни и същи променливи на средата:

ПроменливаПредназначениеПо подразбиране
AETHER365_API_KEYВашият API ключ (ak_live_...). Задължително.-
AETHER365_API_URLЗамяна на базовия URL (например dev endpoint-а).https://api.aether365.io
AETHER365_OUTPUTИзходен формат на CLI: table или json.table
bash
export AETHER365_API_KEY="ak_live_..."

Регионът е автоматичен: API определя вашия tenant по ключа и препраща заявката към правилния регион, така че никога не конфигурирате и не подавате регион.

Бърз старт: 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")

Бърз старт: 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

Какво може и какво не може един API ключ

API ключът е ограничен до безопасна повърхност: четене плюс оперативни действия. Той може да чете вашите данни, да стартира и управлява сканирания, да генерира отчети и да управлява цели за attack surface. Той не може да извършва действия за контрол на акаунта или действия, които биха заключили директорията - управление на API ключове, фактуриране, членство в екипа, включване и изключване на връзки, SSO, прилагане на план за отстраняване или записите на AI Pilot за conditional access / break-glass. Те остават достъпни само за влязла сесия в таблото. Заявка към непозволен маршрут връща 403 AUTH_INSUFFICIENT_SCOPE.

Справочник на командите и методите

Всеки ред показва една и съща операция по три начина: чист curl, метод от SDK и команда на CLI.

Tenant и акаунт

ОперацияcurlSDKCLI
Профил на tenant-аGET /tenants/meclient.tenants.me()aether365 tenant me
Списък на връзкитеGET /tenants/me/connectionsclient.connections.list()aether365 tenant connections
Настройки за известияGET /tenants/me/notificationsclient.notifications.get()aether365 tenant notifications
Планирани сканиранияGET /tenants/me/scheduled-scansclient.scheduled_scans.list()aether365 tenant scheduled-scans

Сканирания

ОперацияcurlSDKCLI
Списък на сканираниятаGET /tenants/me/scansclient.scans.list()aether365 scan list
Стартиране на сканиранеPOST /tenants/me/scansclient.scans.create("compliance")aether365 scan run --type compliance
Извличане на сканиранеGET /scans/{id}client.scans.get(id)aether365 scan get <id>
Четене на резултатиGET /scans/{id}/resultsclient.scans.results(id)aether365 scan results <id>
Отказ на сканиранеPOST /scans/{id}/cancelclient.scans.cancel(id)aether365 scan cancel <id>
Скриване на сканиранеPATCH /scans/{id}/hideclient.scans.hide(id)aether365 scan hide <id>
Показване на сканиранеPATCH /scans/{id}/unhideclient.scans.unhide(id)aether365 scan unhide <id>
Изтриване на сканиранеDELETE /scans/{id}client.scans.delete(id)aether365 scan delete <id>

curl за стартиране на сканиране:

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

Отчети

ОперацияcurlSDKCLI
Статус на отчетGET /scans/{id}/reportclient.reports.status(id)aether365 report status <id>
Генериране на отчетPOST /scans/{id}/report/generateclient.reports.generate(id)aether365 report generate <id>
Списък на отчетитеGET /tenants/me/reportsclient.reports.list()aether365 report list
Изтегляне на отчетGET /scans/{id}/report (presigned)client.reports.download(id, path)aether365 report download <id> -o out.pdf

Статусът на отчета е една от стойностите ready, rendering, orgNameRequired или locked. Генерирането на отчет може да изразходва отчетен кредит (еднократна такса, когато планът не включва квота) - собственикът на ключа се съгласява с това, като извика generate.

Списъкът с отчети е странициран с отместване: подайте обратно meta["nextCursor"] (целочислено отместване на ред или None на последната страница) като cursor. client.reports.iter_all() следва курсора вместо вас.

Attack surface

ОперацияcurlSDKCLI
ОбзорGET /tenants/me/attack-surfaceclient.attack_surface.summary()aether365 eas summary
ИсторияGET /tenants/me/attack-surface/historyclient.attack_surface.history()aether365 eas history
Списък на целитеGET /tenants/me/attack-surface/targetsclient.attack_surface.targets()aether365 eas targets list
Добавяне на целPOST /tenants/me/attack-surface/targetsclient.attack_surface.add_target(host)aether365 eas targets add <host>
Актуализиране на целPATCH /tenants/me/attack-surface/targets/{id}client.attack_surface.update_target(id, ...)aether365 eas targets update <id> --label ...
Изтриване на целDELETE /tenants/me/attack-surface/targets/{id}client.attack_surface.remove_target(id)aether365 eas targets remove <id>
Потвърждаване на целPOST /tenants/me/attack-surface/targets/{id}/verifyclient.attack_surface.verify_target(id)aether365 eas targets verify <id>
Стартиране на EAS сканиранеPOST /tenants/me/attack-surface/scanclient.attack_surface.scan()aether365 eas scan

Състояние на сигурността, отстраняване и AI Pilot

ОперацияcurlSDKCLI
Изглед на заплахи и рисковеGET /tenants/me/threatsclient.threats.list()aether365 threats
Състояние на политикитеGET /tenants/me/policiesclient.policies.list()aether365 policies
Възможности за отстраняванеGET /tenants/me/remediation/capabilitiesclient.remediation.capabilities()aether365 remediation capabilities
Списък на плановете за отстраняванеGET /tenants/me/remediation-plansclient.remediation.plans()aether365 remediation plans
Извличане на план за отстраняванеGET /tenants/me/remediation-plans/{id}client.remediation.plan(id)aether365 remediation plan <id>
AI Pilot: подлежащи на отстраняванеGET /tenants/me/ai-pilot/remediableclient.ai_pilot.remediable()aether365 ai-pilot remediable
AI Pilot: break-glass акаунтиGET /tenants/me/ai-pilot/break-glassclient.ai_pilot.break_glass()aether365 ai-pilot break-glass
AI Pilot: CA политикиGET /tenants/me/ai-pilot/conditional-accessclient.ai_pilot.conditional_access()aether365 ai-pilot conditional-access

Отстраняването е само за четене за API ключове. Прилагането на план не е достъпно през API: елементите на плана от регистъра с действия могат да включват промени по Conditional Access / authorization policy, които биха заключили tenant-а извън собствената му директория (AADSTS50097), затова apply остава в таблото с оператор в процеса. По същата причина conditional-access и break-glass на AI Pilot също са достъпни само за четене.

Обработка на грешки и повторни опити

Всяка грешка на API се съпоставя с типизирано изключение, наследяващо 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.")

Клиентът автоматично повтаря 429 RATE_LIMITED и 503 SERVICE_STARTING (загряването на студената база данни в dev) с експоненциален backoff, като спазва хедъра Retry-After. Грешки за квоти като SCAN_PLAN_LIMIT_REACHED се хвърлят веднага - те не се повтарят.

Използване на CLI в CI

aether365 scan results <id> --fail-on-findings завършва с код 2, когато има поне една неуспешна находка, така че pipeline може да използва резултатите от сканирането като gate:

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

CLI записва грешките в stderr и завършва с код 1 при всяка грешка на API и с код 2 при gate-а за находки.

Беше ли полезна тази страница?