Releases: NAGenaev/tuck
tuck v1.36.0
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.0Verify checksums
cosign verify-blob \
--certificate checksums.txt.pem \
--signature checksums.txt.sig \
checksums.txtv1.35.0 — Полный Go SDK и расширенный Terraform-провайдер
Обзор
Версия 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 — Внешние псевдонимы групп
Внешние псевдонимы групп
Реализовано автоматическое сопоставление внешних групп LDAP и JWT с группами Tuck в момент аутентификации — без изменения состава групп при каждом входе.
Порядок настройки:
- Создать группу Tuck:
identity group create --name=ldap-devs --policy=dev - Привязать внешнее имя группы:
identity group-alias create --group-id=<id> --mount=auth_ldap --name="cn=devs,ou=groups,dc=example,dc=com" - При следующей аутентификации через 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 — Иерархические группы идентификации
Иерархические группы идентификации
Единицы хранения идентификационных данных объединены в иерархию групп: политики распространяются от родительских групп к дочерним, поддерживаются группы любой глубины вложенности.
Архитектура:
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 — Управление идентификационными данными
Управление идентификационными данными
Введён уровень идентификационных данных (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-хранилище с корзинойidentitycore.Auth(Token, LDAP, JWT, AppRole, Kubernetes): вызовidentity.Store.FindOrCreateпри успешной аутентификации; прикрепление идентификатора и псевдонима к токенуapi.handleIdentity*: 10 HTTP-обработчиков (CRUD + list)- 6 новых тестов идентификации успешно проходят
v1.0.0 — Общая доступность (GA)
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 — Кандидат на выпуск
Кандидат на выпуск 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, управление арендами
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=123456AppRole 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:TOTPClient—CreateKey,GetKey,DeleteKey,Validate,ListKeyspkg/client/approle.go:AppRoleClient—CreateOrUpdate,Read,Delete,GetRoleID,GenerateSecretID,Listpkg/client/leases.go:LeaseClient—List,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
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,SignResultinternal/transit: добавлены типы ключейecdsa-p256иrsa-2048/rsa-4096pkg/client/ssh.go:SSHClient—CreateRole,GetRole,DeleteRole,Sign,GetPublicKey,ListRolespkg/client/pki.go:PKIClient—SetupCA,CreateRole,Issue,Revoke,GetCRLpkg/client/transit.go:TransitClient—Sign,Verify; обновлено шифрование с base64- Новые тесты: SSH — 6/6, PKI — расширен до 8 тестов
v0.32.0 — Динамические секреты AWS, GCP, Azure
Динамические секреты 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:AWSEngine—Configure,CreateRole,GenerateCreds,RevokeCredsinternal/dynamic/gcp.go:GCPEngine—Configure,CreateRole,GenerateToken,GenerateKeyinternal/dynamic/azure.go:AzureEngine—Configure,CreateRole,GenerateCreds,RevokeCredspkg/client/dynamic_aws.go,dynamic_gcp.go,dynamic_azure.go: клиентские обёртки SDK- HTTP-маршруты:
/v1/dynamic/aws/...,/v1/dynamic/gcp/...,/v1/dynamic/azure/...