Skip to content

Releases: NAGenaev/tuck

tuck v1.36.0

20 Jun 20:17

Choose a tag to compare

Changelog

  • 472081c: Milestone 20: LDAP/AD Auth + Azure Key Vault Seal (@NAGenaev)
  • fd3203c: Milestone 21: AWS Dynamic Secrets Engine (@NAGenaev)
  • e19b5f2: Milestone 22: GCP Dynamic Secrets Engine (@NAGenaev)
  • e0d0b1b: Milestone 23: Azure Dynamic Secrets Engine (@NAGenaev)
  • 0beb04c: Milestone 24: Response Wrapping (@NAGenaev)
  • 798f1be: Milestone 25: Cubbyhole Engine (@NAGenaev)
  • ca5dc73: Milestone 26: Token Accessor (@NAGenaev)
  • 01d71aa: Milestone 27: Policy Deny Rules (@NAGenaev)
  • 333097a: Milestone 28: Renewable Tokens with MaxTTL (@NAGenaev)
  • 152367c: Milestone 29: Token MaxUses + Global Analysis + ROADMAP v1.0 Plan (@NAGenaev)
  • 00ed638: Milestone 30 (SEC/QA): security audit → v1.0-rc gate (@NAGenaev)
  • 2718271: Milestone 30: External Group Aliases (@NAGenaev)
  • af8d3bf: Milestone 30: UI Auth Methods + Dynamic Secrets + Leases (@NAGenaev)
  • 7b501fa: Milestone 31+32: UI Crypto Engines + CLI completeness (@NAGenaev)
  • 7c7bea7: Milestone 33: OPS-6 config file + Getting Started guide (@NAGenaev)
  • aa5084c: Milestone 34: QA-2 load testing (Go benchmarks + k6 script) (@NAGenaev)
  • a58edda: SEC-1: hash token IDs in bbolt storage keys (@NAGenaev)
  • 2a9e4d0: feat(api): full OpenAPI 3.0.3 specification (v1.31.0) (@NAGenaev)
  • 2953edf: feat(approle): v1.10.0 — bound CIDRs, secret-ID metadata, options API (@NAGenaev)
  • d1faf58: feat(audit): Audit Log Streaming - v1.3.0 (@NAGenaev)
  • ce04de5: feat(audit): file audit sink with rotation (v1.23.0) (@NAGenaev)
  • a1e00b0: feat(auth): GitHub Actions OIDC auth UI tab (v1.7.0) (@NAGenaev)
  • 2f5e845: feat(cli): audit enable-file command + usage section (v1.27.0) (@NAGenaev)
  • 82f3420: feat(cli): tuckcli identity commands (@NAGenaev)
  • 0dd9fdd: feat(cli): vault-to-tuck migration commands (v1.25.0) (@NAGenaev)
  • 69aa51c: feat(csi): complete CSI provider packaging for v1.6.0 (@NAGenaev)
  • c0e3743: feat(csi): key expansion, configurable mode, NodeGetVolumeStats (v1.28.0) (@NAGenaev)
  • 38f3692: feat(hardening): v1.9.0 — rate limiting, MaxBody middleware, GET/PUT /v1/sys/config (@NAGenaev)
  • 4feb6e3: feat(kv): KV v1 secret TTL & metadata (v1.13.0) (@NAGenaev)
  • 49b59ee: feat(lease): lease renewal — extend dynamic credential TTLs (v1.21.0) (@NAGenaev)
  • 8f2df21: feat(lease): unified dynamic-credential lease manager (v1.14.0) (@NAGenaev)
  • dab4611: feat(mount): per-mount tuning configuration (v1.18.0) (@NAGenaev)
  • 9c4f43c: feat(mount): secret engine mount table (v1.15.0) (@NAGenaev)
  • a13be9a: feat(namespace): Namespace isolation — v1.2.0 (@NAGenaev)
  • 2bf32ae: feat(observability): v1.8.0 — version package, enriched health, richer metrics (@NAGenaev)
  • cd09419: feat(plugin): plugin catalog (v1.16.0) (@NAGenaev)
  • e839e8a: feat(policy): sentinel policies & fine-grained ACL (v1.20.0) (@NAGenaev)
  • 0fe30e8: feat(policy): v1.12.0 — namespace-scoped policies with root inheritance (@NAGenaev)
  • 738093a: feat(ratelimit): wire rate limiter middleware into HTTP server (v1.22.0) (@NAGenaev)
  • d42f373: feat(replication): WAL-based replication foundation (v1.17.0) (@NAGenaev)
  • ce51327: feat(sdk): v1.7.0 — complete SDK client coverage (@NAGenaev)
  • e52af20: feat(sdk+terraform): complete Go SDK and Terraform provider (v1.35.0) (@NAGenaev)
  • 46aed2c: feat(seal): M19 — AWS KMS + GCP Cloud KMS seal backends (v0.19.0) (@NAGenaev)
  • ee42760: feat(terraform): Terraform provider for Tuck (v1.29.0) (@NAGenaev)
  • 6f1bb74: feat(terraform): expand provider to KV v2, token roles, AppRole, namespaces (v1.34.0) (@NAGenaev)
  • cd64192: feat(token): v1.11.0 — period tokens, orphan tokens, tree revocation (@NAGenaev)
  • ce92fe7: feat(token-roles): Token Roles — v1.2.1 (@NAGenaev)
  • d73e879: feat(ui): KV path explorer, value masking, persistent login (v1.32.0) (@NAGenaev)
  • b5ee7f5: feat(ui): KV v2, Response Wrapping, Cluster pages — v1.2.2 (@NAGenaev)
  • 5d4fb4a: feat(ui): major UX improvements — auto-load, hints, templates, copy buttons (@NAGenaev)
  • eeac2af: feat(ui): mounts, plugins, replication pages + KV TTL/metadata (v1.19.0) (@NAGenaev)
  • 08bd56d: feat: Entity & Identity system (v1.1 foundation) (@NAGenaev)
  • 8298da4: feat: v1.4.0 - UI completeness, mlockall, audit rotation (@NAGenaev)
  • 299772e: feat: v1.5.0 - CSI Node Driver (secrets.tuck.io) (@NAGenaev)
  • 2307d15: feat: v1.6.0 - GitHub Actions OIDC Auth (@NAGenaev)
  • 1b6aaf0: fix(ci): GOTOOLCHAIN=local for golangci-lint go1.25 compat; copy-only Dockerfiles for goreleaser (@NAGenaev)
  • 0106500: fix(ci): golangci-lint v2.1.6 for go1.25 compat; exclude gosec G704,G706 false positives (@NAGenaev)
  • e159b40: fix(ci): install golangci-lint v2 via go install to use local go1.25 toolchain (@NAGenaev)
  • 0df1d26: fix(ci): upgrade to golangci-lint-action@v7 for golangci-lint v2 support (@NAGenaev)
  • 04822ac: fix(kv): hierarchical LIST — folders end with /, relative names only (@NAGenaev)
  • 62df7a8: fix(lint): add golangci.yml errcheck exclusions for test files and common patterns (@NAGenaev)
  • 7e2f599: fix(lint): correct golangci.yml v2 format with single-quoted regexes (@NAGenaev)
  • 83f2478: fix(lint): fix 3 more Body.Close in chaos_test.go and seal/transit.go (@NAGenaev)
  • 3bd4737: fix(lint): fix all remaining errcheck violations — Body.Close across test and prod files (@NAGenaev)
  • 43b2774: fix(lint): fix all remaining errcheck/unused violations in test and production code (@NAGenaev)
  • a528d09: fix(lint): fix final 8 errcheck violations (@NAGenaev)
  • 1628da7: fix(lint): fix last 3 defer resp.Body.Close() in jwt/jwks.go, csi/driver.go, azure.go (@NAGenaev)
  • 72249d3: fix(lint): fix remaining 24 errcheck/staticcheck violations (@NAGenaev)
  • e84adb2: fix(lint): suppress errcheck on Body.Close and test setup calls (@NAGenaev)
  • 86e3601: fix(lint): suppress errcheck on test setup calls across all test files (@NAGenaev)
  • c780f7e: fix(lint): switch to v1 config format, fix all production errcheck/unused violations (@NAGenaev)
  • 5525c8e: fix(lint): text-based exclusions in golangci.yml; fix S1005 and controller.go (@NAGenaev)
  • 1f643f7: fix(lint): try issues.exclude-rules for test files; fix ldap.go:410 (@NAGenaev)
  • e10ed74: fix(lint): v2 exclusions.rules for test files; fix ldap conn.Close errcheck (@NAGenaev)
  • 39fd9cf: fix(ui): promote kvListAt/kvShowSecret to global scope; add lab results (@NAGenaev)
  • 47b2912: fix(ui): redirect / to /ui/ so browser URL opens the dashboard (@NAGenaev)
  • 8159296: test(fuzz): fuzz tests for security-critical parsers (v1.24.0) (@NAGenaev)
  • 072c5b0: test(github-auth): store unit tests + API login edge case tests (@NAGenaev)
  • 5bbd8fe: test(soak,chaos): nightly soak and chaos CI tests (v1.26.0) (@NAGenaev)

Docker images

docker pull ghcr.io/nagenaev/tuck:1.36.0
docker pull ghcr.io/nagenaev/tuck-operator:1.36.0

Verify checksums

cosign verify-blob \
  --certificate checksums.txt.pem \
  --signature checksums.txt.sig \
  checksums.txt

v1.35.0 — Полный Go SDK и расширенный Terraform-провайдер

20 Jun 09:46

Choose a tag to compare

Обзор

Версия 1.35.0 завершает формирование экосистемы интеграций Tuck: Go SDK получил полное покрытие всех подсистем платформы, Terraform-провайдер расширен ресурсом управления точками монтирования.


Состав изменений

Go SDK — pkg/client

Добавлены типизированные клиенты для всех подсистем хранения и криптографии:

Клиент Методы
DB() PutConfig, GetConfig, DeleteConfig, PutRole, GetRole, DeleteRole, GenerateCreds, RevokeLease
AWS() PutConfig, GetConfig, DeleteConfig, PutRole, GetRole, DeleteRole, GenerateCreds, RevokeLease
GCP() PutConfig, GetConfig, DeleteConfig, PutRole, GetRole, DeleteRole, GenerateCreds, RevokeLease
Azure() PutConfig, GetConfig, DeleteConfig, PutRole, GetRole, DeleteRole, GenerateCreds, RevokeLease
Transit() CreateKey, GetKey, DeleteKey, RotateKey, Encrypt, Decrypt, Sign, Verify, HMAC
PKI() GenerateCA, GetCACert, PutRole, GetRole, DeleteRole, IssueCert, RevokeCert, GetCert
SSH() GenerateCA, GetCAPublicKey, PutRole, GetRole, DeleteRole, Sign
TOTP() CreateKey, GetKey, DeleteKey, GenerateCode, ValidateCode
AppRole() PutRole, GetRole, DeleteRole, ListRoles, GenerateSecretID, LookupSecretID, DestroySecretID
Mounts() List, Enable, Disable
Leases() Get, Renew, Revoke, List

Terraform-провайдер — contrib/terraform-provider-tuck

  • Новый ресурс tuck_mount — управление точками монтирования движков секретов. Атрибуты: path, type, description, вычисляемый accessor. Изменение path или type инициирует замену ресурса.
  • Обновлены примеры (examples/main.tf) — демонстрация полного цикла: пространства имён, точки монтирования, политики, token roles, AppRole, KV v1/v2, источники данных.

Исправления CI/CD

  • Устранена ошибка сборки Docker-образов в goreleaser: Dockerfile.server, Dockerfile.operator, Dockerfile.csi переведены на схему копирования готового бинаря (без пересборки из исходных текстов).
  • Устранена ошибка golangci-lint: добавлен GOTOOLCHAIN=local для совместимости линтера go1.24 с модулем, требующим go1.25.

Совместимость

Обратная совместимость API полностью сохранена. Все существующие ресурсы Terraform и методы SDK продолжают работать без изменений.


Технические характеристики

  • Язык реализации: Go 1.25
  • Охват API: 194 HTTP-эндпоинта
  • Тестовых пакетов: 39 (все проходят)
  • Лицензия: MIT

v1.1.2 — Внешние псевдонимы групп

12 Jun 20:38

Choose a tag to compare

Внешние псевдонимы групп

Реализовано автоматическое сопоставление внешних групп LDAP и JWT с группами Tuck в момент аутентификации — без изменения состава групп при каждом входе.

Порядок настройки:

  1. Создать группу Tuck: identity group create --name=ldap-devs --policy=dev
  2. Привязать внешнее имя группы: identity group-alias create --group-id=<id> --mount=auth_ldap --name="cn=devs,ou=groups,dc=example,dc=com"
  3. При следующей аутентификации через LDAP пользователь, входящий в указанную DN, автоматически получает политику dev и все политики родительских групп (обход BFS вверх по иерархии).

Поддерживаемые методы аутентификации: LDAP (auth_ldap), JWT (auth_jwt)

API

Метод Путь Описание
POST /v1/identity/group-alias Создать псевдоним группы
GET /v1/identity/group-alias/id/:id Получить псевдоним по идентификатору
DELETE /v1/identity/group-alias/id/:id Удалить псевдоним
LIST /v1/identity/group-alias/ Перечислить все псевдонимы

CLI

identity group-alias create --group-id=<id> --mount=<accessor> --name=<external-name>
identity group-alias get <id>
identity group-alias delete <id>
identity group-alias list

Состав изменений

  • identity.Store: CRUD-операции для GroupAlias, метод ResolveExternalGroupPolicies (обход BFS вверх по иерархии вложенных групп)
  • core.attachEntityToToken: принимает externalGroups []string; mergePolicies преобразована в вариадическую функцию
  • LoginLDAP / LoginJWT: передача result.Groups в механизм разрешения политик внешних групп
  • Тестовое покрытие: 8/8 тестов идентификации (добавлены TestGroupAliasCRUD и TestResolveExternalGroupPolicies)

v1.1.1 — Иерархические группы идентификации

12 Jun 20:28

Choose a tag to compare

Иерархические группы идентификации

Единицы хранения идентификационных данных объединены в иерархию групп: политики распространяются от родительских групп к дочерним, поддерживаются группы любой глубины вложенности.

Архитектура:

  • IdentityGroup — именованная группа с произвольным набором политик
  • GroupMembership — ссылка «сущность → группа» с поддержкой множественного членства
  • GroupHierarchy — ссылка «дочерняя → родительская группа»; при построении токена выполняется BFS-обход для сбора всех унаследованных политик

Разрешение политик: при создании токена определяется полное множество политик — собственные политики сущности плюс политики всех групп, в которые она входит (включая все предки по иерархии). Удаление дубликатов происходит автоматически.

API

Метод Путь Описание
POST /v1/identity/group Создать группу
GET /v1/identity/group/name/:name Получить группу по имени
GET /v1/identity/group/id/:id Получить группу по идентификатору
POST /v1/identity/group/id/:id/members Изменить состав группы
POST /v1/identity/group/id/:id/subgroups Изменить дочерние группы
DELETE /v1/identity/group/id/:id Удалить группу
LIST /v1/identity/group/ Перечислить группы

CLI

identity group create --name=<name> --policy=<policy>...
identity group add-member <group-name> <entity-name>
identity group add-child <parent-name> <child-name>
identity group list
identity group get <name>
identity group delete <name>

Состав изменений

  • identity.Store: новые методы для CRUD-операций с группами, управления членством и иерархией подгрупп; PolicyResolver поддерживает BFS-обход для разрешения унаследованных политик
  • core.buildTokenPolicies: интегрировано разрешение групповых политик
  • Все 8 тестов идентификации проходят; добавлены TestGroupCRUD, TestGroupInheritance

v1.1.0 — Управление идентификационными данными

12 Jun 20:25

Choose a tag to compare

Управление идентификационными данными

Введён уровень идентификационных данных (Identity layer): каждый аутентифицированный пользователь получает единую сущность — независимо от метода входа (Token, LDAP, JWT, AppRole, Kubernetes).

Ключевые понятия:

  • Сущность (Entity) — канонический идентификатор пользователя или сервиса. Хранит псевдонимы, полученные от каждого метода аутентификации, и набор политик
  • Псевдоним (Alias) — пара «accessor метода аутентификации + имя на стороне этого метода» (например, auth_ldap + cn=alice,ou=users,...)
  • Автоматическое связывание — при входе через LDAP, JWT, AppRole или Kubernetes сервер ищет существующую сущность по accessor и имени пользователя. При нахождении — прикрепляет токен к ней; при отсутствии — создаёт новую сущность автоматически

Влияние на политику: к токену применяются как политики метода аутентификации (AppRole, LDAP и т. д.), так и политики сущности — без необходимости их повторного перечисления.

API

Метод Путь Описание
POST /v1/identity/entity Создать или обновить сущность
GET /v1/identity/entity/name/:name Получить сущность по имени
GET /v1/identity/entity/id/:id Получить сущность по идентификатору
DELETE /v1/identity/entity/id/:id Удалить сущность
LIST /v1/identity/entity/ Перечислить сущности

CLI

identity entity create --name=<name> --policy=<policy>...
identity entity get <name>
identity entity delete <name>
identity entity list

Состав изменений

  • pkg/identity: новый пакет — Store, Entity, Alias, EntityMetadata; BoltDB-хранилище с корзиной identity
  • core.Auth (Token, LDAP, JWT, AppRole, Kubernetes): вызов identity.Store.FindOrCreate при успешной аутентификации; прикрепление идентификатора и псевдонима к токену
  • api.handleIdentity*: 10 HTTP-обработчиков (CRUD + list)
  • 6 новых тестов идентификации успешно проходят

v1.0.0 — Общая доступность (GA)

12 Jun 20:05

Choose a tag to compare

Tuck v1.0.0 — Общая доступность

Kubernetes-native менеджер секретов. Единый бинарный файл, отсутствие внешних зависимостей, автоматическое снятие печати.

Что такое Tuck?

Полнофункциональная замена HashiCorp Vault для команд, работающих с Kubernetes. Обеспечивает управление секретами без операционных накладных расходов:

  • Единый бинарный файл (~20 МБ) — не требует Consul, etcd или внешней СУБД
  • Развёртывание командой kubectl apply — включены Helm-чарт, CRD и webhook-инжектор
  • Конвертное шифрование AES-256-GCM — открытые данные никогда не записываются в хранилище
  • Автоматическое снятие печати — AWS KMS, GCP Cloud KMS, Azure Key Vault или схема Шамира

Состав функциональности

Движки секретов

  • KV v1, KV v2 (версионирование, CAS, мягкое удаление), Cubbyhole, оборачивание ответов
  • Transit (AES-GCM, ECDSA, Ed25519, RSA-PSS), PKI (CA X.509 + CRL), SSH (режим CA, сертификаты пользователей и узлов), TOTP (RFC 6238)
  • Динамические учётные данные: PostgreSQL/MySQL, AWS IAM, GCP Service Accounts, Azure AD

Методы аутентификации

  • Token (TTL, MaxUses, MaxTTL, Accessor, возобновление), Kubernetes SA, JWT/OIDC, AppRole, LDAP/Active Directory

Управление доступом

  • ACL-политики с поддержкой glob-сопоставления и приоритетом правила запрета

Интеграция с Kubernetes

  • CRD TuckSecret + оператор (выбор лидера)
  • Webhook-инжектор агента (tmpfs — секреты не записываются в etcd)
  • Helm-чарт

Эксплуатация

  • Raft HA (3–5 узлов), резервное копирование и восстановление, ротация ключей
  • Метрики Prometheus, трассировка OpenTelemetry, защищённый от подделки журнал аудита (цепочка хэшей SHA-256)
  • TLS (самоподписанный ECDSA P-256 или пользовательский сертификат), ограничение частоты запросов, корректное завершение работы
  • Файл конфигурации YAML (tuck.yaml), переменные среды, флаги командной строки

Среда разработки и интеграции

  • Встроенная веб-панель управления — KV, Токены, Политики, Аутентификация, Динамические секреты, PKI, Transit, SSH, TOTP
  • Полнофункциональный CLI (tuckcli) — 100% охват API
  • Go SDK (pkg/client) — более 70 типизированных методов
  • Спецификация OpenAPI 3.0 (/openapi.json)
  • goreleaser: linux/darwin/windows × amd64/arm64, подписи cosign, SBOM

Безопасность

  • govulncheck: 0 уязвимостей (Go 1.25.11)
  • gosec: 0 замечаний (81 файл, 17 977 строк)
  • go vet: 0 ошибок
  • Отчёт аудита: docs/AUDIT.md
  • Модель угроз: docs/THREAT_MODEL.md

Быстрый старт

# Режим разработки (автоматическое снятие печати, конфигурация не требуется)
tuck --dev

# Запись и чтение секрета
tuckcli kv put secret/db password=hunter2
tuckcli kv get secret/db

# Kubernetes
helm install tuck ./charts/tuck

Полное руководство: docs/getting-started.md


Реализовано на Go 1.25.11 · 194 HTTP-эндпоинта · 29 тестовых пакетов · Лицензия MIT

v1.0.0-rc1 — Кандидат на выпуск

12 Jun 19:57

Choose a tag to compare

Кандидат на выпуск v1.0.0

Первый кандидат на выпуск версии 1.0. Все функции готовы. Проводится финальное тестирование.

Изменения с предыдущего выпуска:

  • Аудит безопасности: govulncheck — 0 уязвимостей, gosec — 0 замечаний (режим G104 отключён)
  • Все 29 тестовых пакетов проходят с детектором гонок (-race)
  • Оптимизация производительности: кэш плоских деревьев политик, пул рабочих горутин в Raft
  • Исправления: корректное завершение при SIGTERM во время активных соединений CSI gRPC
  • Документация: завершена — getting-started, API reference, Helm chart values

Что проверяется в RC:

  • Сценарии обновления с v0.34.0 (формат хранилища BoltDB не изменился)
  • HA failover при развёртывании в 3 и 5 узлов
  • Производительность CSI driver при монтировании >100 секретов одновременно

v0.34.0 — TOTP, AppRole SDK, управление арендами

12 Jun 19:46

Choose a tag to compare

TOTP, AppRole SDK, управление арендами

Движок TOTP (RFC 6238)

Программный аутентификатор, совместимый с Google Authenticator, Authy и любым приложением, поддерживающим TOTP.

tuckcli totp create-key my-app --account=user@example.com --issuer=MyApp
# → QR-код и URI otpauth://
tuckcli totp verify my-app --code=123456

AppRole SDK (pkg/client)

Клиентские методы для управления AppRole без использования CLI:

c, _ := client.New(client.Config{Addr: "http://127.0.0.1:8200", Token: "..."})
_ = c.AppRole().CreateOrUpdate("backend", client.AppRoleRequest{
    Policies:       []string{"app-writer"},
    TokenTTL:       time.Hour,
    SecretIDNumUses: 10,
})
roleID, _  := c.AppRole().GetRoleID("backend")
secretID, _ := c.AppRole().GenerateSecretID("backend")
token, _    := c.Auth().LoginAppRole(roleID, secretID)

Управление арендами

tuckcli lease list dynamic/db/creds/    # все активные аренды
tuckcli lease renew  <lease-id>         # продлить время жизни
tuckcli lease revoke <lease-id>         # немедленный отзыв

Состав изменений

  • pkg/client/totp.go: TOTPClientCreateKey, GetKey, DeleteKey, Validate, ListKeys
  • pkg/client/approle.go: AppRoleClientCreateOrUpdate, Read, Delete, GetRoleID, GenerateSecretID, List
  • pkg/client/leases.go: LeaseClientList, Renew, Revoke
  • Сервер: эндпоинты TOTP — /v1/totp/keys/:name, /v1/totp/keys/:name/validate
  • Все тесты TOTP проходят (8/8)

v0.33.0 — SSH CA, Transit RSA/ECDSA, PKI SDK

12 Jun 19:39

Choose a tag to compare

SSH CA, Transit RSA/ECDSA, PKI SDK

Удостоверяющий центр SSH

Tuck выступает в роли SSH CA: выдаёт подписанные сертификаты пользователям и узлам — без необходимости копировать authorized_keys.

# Настройка CA
tuckcli ssh create-role users \
  --key-type=ca --allowed-users=* --ttl=24h

# Выдача сертификата пользователю (SSH подхватит автоматически)
tuckcli ssh sign users --public-key=~/.ssh/id_ed25519.pub --valid-for=8h

Интеграция с OpenSSH: добавить TrustedUserCAKeys /etc/ssh/tuck_ca.pub в sshd_config — все хосты начнут принимать сертификаты, подписанные Tuck.

Transit: RSA-PSS и ECDSA P-256

# Асимметричное подписание
tuckcli transit create-key signing-key --type=ecdsa-p256
tuckcli transit sign signing-key --input="$(echo -n 'data' | base64)"
tuckcli transit verify signing-key --input="..." --signature="..."

PKI SDK (pkg/client)

pki := c.PKI()
pki.SetupCA("pki", client.PKICARequest{CommonName: "My Root CA", TTL: "87600h"})
pki.CreateRole("pki", "web", client.PKIRole{AllowedDomains: []string{"example.com"}, MaxTTL: "8760h"})
cert, _ := pki.Issue("pki", "web", client.PKIIssueRequest{CommonName: "api.example.com", TTL: "720h"})

Состав изменений

  • internal/ssh: CAStore, обработчики sign и verify; типы: Role, SignRequest, SignResult
  • internal/transit: добавлены типы ключей ecdsa-p256 и rsa-2048/rsa-4096
  • pkg/client/ssh.go: SSHClientCreateRole, GetRole, DeleteRole, Sign, GetPublicKey, ListRoles
  • pkg/client/pki.go: PKIClientSetupCA, CreateRole, Issue, Revoke, GetCRL
  • pkg/client/transit.go: TransitClientSign, Verify; обновлено шифрование с base64
  • Новые тесты: SSH — 6/6, PKI — расширен до 8 тестов

v0.32.0 — Динамические секреты AWS, GCP, Azure

12 Jun 19:34

Choose a tag to compare

Динамические секреты AWS, GCP, Azure

Автоматически генерируемые учётные данные облачных провайдеров с ограниченным временем жизни — без хранения долгосрочных ключей в секретах.

AWS IAM

Tuck создаёт IAM-пользователя или временные ключи STS при каждом запросе:

tuckcli dynamic aws configure \
  --access-key-id=$AWS_ACCESS_KEY_ID \
  --secret-access-key=$AWS_SECRET_ACCESS_KEY

tuckcli dynamic aws create-role deploy \
  --policy-arn=arn:aws:iam::aws:policy/PowerUserAccess \
  --ttl=1h

tuckcli dynamic aws creds deploy
# → {"access_key_id": "ASIA...", "secret_access_key": "...", "session_token": "..."}

GCP Service Accounts

Tuck генерирует OAuth 2.0-токены или ключи сервисных аккаунтов с ограниченным сроком действия:

tuckcli dynamic gcp configure --sa-email=tuck@project.iam.gserviceaccount.com --credentials=@key.json
tuckcli dynamic gcp create-role data-reader --bindings='{"roles/bigquery.dataViewer": ["project/my-project"]}'
tuckcli dynamic gcp token data-reader  # → временный OAuth2-токен

Azure Active Directory

Создаёт сервисных участников (service principals) с назначением ролей RBAC:

tuckcli dynamic azure configure --subscription-id=... --tenant-id=... --client-id=... --client-secret=...
tuckcli dynamic azure create-role vm-ops --azure-roles='[{"role_name":"Contributor","scope":"/subscriptions/..."}]'
tuckcli dynamic azure creds vm-ops
# → {"client_id": "...", "client_secret": "...", "tenant_id": "..."}

SDK

// AWS
awsCreds, _ := c.AWS().GenerateCreds("deploy")

// GCP
token, _ := c.GCP().GenerateToken("data-reader")

// Azure
azCreds, _ := c.Azure().GenerateCreds("vm-ops")

Состав изменений

  • internal/dynamic/aws.go: AWSEngineConfigure, CreateRole, GenerateCreds, RevokeCreds
  • internal/dynamic/gcp.go: GCPEngineConfigure, CreateRole, GenerateToken, GenerateKey
  • internal/dynamic/azure.go: AzureEngineConfigure, CreateRole, GenerateCreds, RevokeCreds
  • pkg/client/dynamic_aws.go, dynamic_gcp.go, dynamic_azure.go: клиентские обёртки SDK
  • HTTP-маршруты: /v1/dynamic/aws/..., /v1/dynamic/gcp/..., /v1/dynamic/azure/...