Documentation
¶
Overview ¶
Package registrytokenwire — composition-root adapters binding the registry `/iam/token` shim use-case to iam infrastructure:
LocalMintAdapter (local_minter.go) — НАШ подписант, единственный издатель полосы.
SAClientLookupAdapter — обратный резолв ключа служебной учётки по client_id. Живёт ТОЛЬКО ради окна перехода kacho#1143: полоса предъявленного удостоверения принимает базовый токен доступа, а ключевой материал — лишь пока оператор держит окно открытым. Предикат снятия — снятие ручки `api-server.registry-token.key-material-window-until`.
These are thin adapters over already-tested primitives; they carry no policy.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Build ¶
Build assembles the registry `/iam/token` shim from a pgx pool: the authority on the presented BASIC ACCESS TOKEN (the only credential kind this lane accepts, задача kacho#1143) and OUR signer, the lane's only issuer. The caller mounts the returned mux on an EXTERNAL-reachable HTTP listener.
Composition root only — this is the single wire-up call for serve.go. The shim mints the registry token itself through NewLocalMinter, and the data-plane verifies it against OUR key set published by the cluster-internal key-set listener (internal/handler/jwksproxyhttp, record keyed by our issuer). The shim decrypts no at-rest signing key: key material lives in the signer's keystore, not here.
Без нашего подписанта — отказ в старте (kaname#494) ¶
Прежде пустой подписант выбирал другую дорогу — обмен подписанного утверждения у внешнего поставщика. Дорога снята, и пустой подписант выбирать больше нечего: собранная без него полоса поднималась бы Ready и не выдавала бы ни одного токена. Поэтому это ПЕРВЫЙ отказ сборки, до всякого другого её входа, и он называет оба выхода оператора. Режима посадки сборка не читает — отказ один на любую посадку.
Types ¶
type BuildConfig ¶
type BuildConfig struct {
// Logger — журнал причин отказа выдачи. Наружу тело фиксировано; без этого
// поля причина не уходила никуда, и разные по природе отказы выглядели
// одинаково. nil допустим — тогда журналирования нет.
Logger *slog.Logger
// Realm — the WWW-Authenticate realm URL advertised to docker clients
// (e.g. https://api.kacho.local/iam/token). Must match the data-plane's
// advertised Bearer realm.
Realm string
// Service — the default registry service name (→ requested token audience +
// WWW-Authenticate service, e.g. registry.kacho.local).
Service string
// Scope — объём, который полоса кладёт в выпускаемый токен (пусто — не
// кладёт).
Scope string
// AnonymousClientID — объявленный публичный принципал анонимного чтения
// (RG-1 D-7): субъект токена, который приёмная сторона резолвит в
// подстановочного `user:*`. Пусто (умолчание) — анонимный поток ВЫКЛЮЧЕН, и
// вход без удостоверения получает 401-вызов (secure-by-default).
AnonymousClientID string
// AnonymousPerSourcePerSec — темп анонимной выдачи: входов без
// удостоверения в секунду на источник, на процесс (kaname#928).
AnonymousPerSourcePerSec int
// Source — адрес источника запроса по правилу поверхности выдачи
// (`internal/issuingsource`, Р7): ключ темпа анонимной выдачи.
Source func(*http.Request) string
// Signer — НАШ подписант, ЕДИНСТВЕННЫЙ издатель полосы. Обязателен: без него
// сборка отказывает (kaname#494), другого издателя у полосы нет.
Signer *tokensigner.Signer
// TokenTTL — срок выпускаемого токена контура. Слагаемое арифметики
// отсрочки снятия ключа, поэтому объявлено числом, а не выведено.
TokenTTL time.Duration
// KeyMaterialWindowUntil — ОКНО ПЕРЕХОДА ЛОМАЮЩЕГО ИЗМЕНЕНИЯ kacho#1143:
// мгновение, до которого полоса ПРОДОЛЖАЕТ принимать ключевой материал в
// поле пароля наряду с базовым токеном доступа. Нулевое — окна нет
// (умолчание, fail-closed).
//
// Приезжает РАЗОБРАННЫМ из настройки: разбор живёт у стража старта, а не
// здесь, иначе неразборчивое значение доживало бы до первого входа клиента.
// Разбор нормы, цена обоих умолчаний и предикат снятия —
// registry_token/key_material_window.go.
KeyMaterialWindowUntil time.Time
// CredentialKindObserver — счётчик исходов полос по виду предъявленного
// удостоверения. nil → счёта нет; решения полосы это не меняет.
//
// Единственное НАБЛЮДАЕМОЕ различие между закрытым и открытым окном: наружу
// оба отвечают одинаково (различимость снаружи была бы оракулом посадки).
// Без него оператор не знает ни скольких ломает закрытое окно, ни когда
// открытое можно закрыть.
CredentialKindObserver registrytokenuc.CredentialKindObserver
// BasicCredentialTimeout — предел ОДНОГО обращения авторитета о базовом
// секрете к базе (kaname#379). Обязателен: без него сборка отказывает.
//
// Предел подаётся авторитету, а не ставится этой полосой у своего вызова:
// у авторитета вызывающих больше одного, и оператор у них один. Величину
// объявляет композиционный корень — ту же, что у полос выдачи токена:
// для строки удостоверения человека оператор читает и отсечку
// отзыва-всех.
BasicCredentialTimeout time.Duration
}
BuildConfig — the composition inputs for the registry `/iam/token` shim.
type LocalMintAdapter ¶
type LocalMintAdapter struct {
// contains filtered or unexported fields
}
LocalMintAdapter — НАШ подписант с точки зрения контура выдачи докер-токена.
Тонкий переходник без политики: срок берётся настройкой контура, субъект и адресат приходят от use-case, а всё, что делает токен токеном — обязательные `kid`, срок, тип, издатель, — проставляет подписант.
func NewLocalMinter ¶
func NewLocalMinter(s *tokensigner.Signer, ttl time.Duration) *LocalMintAdapter
NewLocalMinter — построитель.
func (*LocalMintAdapter) MintToken ¶
func (a *LocalMintAdapter) MintToken(ctx context.Context, in registrytokenuc.MintInput) (registrytokenuc.MintOutput, error)
MintToken выпускает токен контура.
type SAClientLookupAdapter ¶
type SAClientLookupAdapter struct {
// contains filtered or unexported fields
}
SAClientLookupAdapter — resolves the registered SA-key for a client id.
func NewSAClientLookup ¶
func NewSAClientLookup(repo saClientByIDReader) *SAClientLookupAdapter
NewSAClientLookup — builder.
func (*SAClientLookupAdapter) KeyByClientID ¶
func (a *SAClientLookupAdapter) KeyByClientID(ctx context.Context, clientID string) (registrytokenuc.RegisteredKey, error)
KeyByClientID returns the registered key material for a client id, together with whether the owning ServiceAccount may authenticate.
The owner's state is resolved here, on the lookup, because the validator decides on it: a lookup that returned only key material would hand back a zero value for the state, and every docker login in the platform would be refused by a check that never saw a row.