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-ключ обмежений безпечною поверхнею читання та операційних дій. Він може читати ваші дані, запускати сканування й керувати ними, генерувати звіти та керувати цілями поверхні атаки. Він не може виконувати дії з керування обліковим записом чи блокування каталогу - керування API-ключами, білінг, склад команди, підключення та відключення з'єднань, SSO, застосування плану виправлення або записи AI Pilot для умовного доступу чи 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() проходить курсор за вас.

Поверхня атаки

Операція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-glassGET /tenants/me/ai-pilot/break-glassclient.ai_pilot.break_glass()aether365 ai-pilot break-glass
Політики CA в AI PilotGET /tenants/me/ai-pilot/conditional-accessclient.ai_pilot.conditional_access()aether365 ai-pilot conditional-access

Виправлення для API-ключів доступне лише для читання. Застосування плану не відкрито: елементи реєстру дій плану можуть містити патчі Conditional-Access / політики авторизації, які здатні заблокувати tenant'у доступ до власного каталогу (AADSTS50097), тому застосування залишається в панелі керування, де в процесі бере участь оператор. З тієї ж причини AI Pilot conditional-access та break-glass також доступні лише для читання.

Обробка помилок і повторні спроби

Кожна помилка 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) з експоненційною затримкою, враховуючи заголовок Retry-After. Помилки квот, як-от SCAN_PLAN_LIMIT_REACHED, викидаються одразу - вони не повторюються.

Використання CLI в CI

aether365 scan results <id> --fail-on-findings завершується з кодом 2, коли присутня хоча б одна невдала знахідка, тож pipeline може використовувати результати сканування як шлюз:

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

CLI пише помилки в stderr і завершується з кодом 1 за будь-якої помилки API та з кодом 2, коли спрацьовує шлюз знахідок.

Ця сторінка була корисною?