moduleidentity

package
v0.7.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 27, 2026 License: AGPL-3.0 Imports: 10 Imported by: 0

Documentation

Overview

Package moduleidentity — ЛИЧНОСТЬ МОДУЛЯ установки и ЕДИНСТВЕННОЕ её признание по клиентскому сертификату (kaname#984).

Предмет: модулем признаётся только объявленная пара

Личность модуля — пара (пространство имён, служебная учётка), которую объявила установка kaname. Прежде модулем признавался любой проверенный лист нашего домена доверия, чья учётка несла приставку модулей, — в ЛЮБОМ пространстве. Пространство, которого установка не заводила, давало ту же личность, что и настоящее: владелец любого пространства кластера, получивший лист внутреннего центра на учётку нужного имени, становился модулем.

Теперь признание — поиск пары в перечне (Roster). Пара вне перечня не модуль ни на одном пути: ни на ярусах вызывающего обоих слушателей, ни у посредника записи отношений, ни у пола системного читателя, ни у допуска пира без переданной личности.

У каждой личности — профиль

Профиль (Profile) называет закрытый перечень методов внутреннего слушателя, которые личности позволено звать. Перечни методов живут у стража (`authzguard`), здесь — только словарь имён профилей: его спрашивает страж старта, чтобы отвергнуть запись с неизвестным профилем до подъёма.

Почему разбор один и живёт здесь

Признание спрашивают шесть читателей. Разбор, написанный у каждого свой, расходится молча: правка одного не доезжает до другого, и второй продолжает признавать то, что первый уже отвергает. Здесь он один (ParseSAN), и перечень спрашивает ТОТ ЖЕ разбор, которым его записи проверены на старте.

Index

Constants

View Source
const AccountPrefix = "kacho-"

AccountPrefix — приставка учётки модуля: `<приставка><служба>`. Из учётки, а не из отдельной величины, выводится короткое имя службы — по нему решают домен записи отношений и идентификатор служебной учётки модуля.

View Source
const EntryShape = "<namespace>/<service-account>=<profile>[@<issuer>]"

EntryShape — форма записи перечня для текстов отказа и справки.

Variables

This section is empty.

Functions

func ParseSAN

func ParseSAN(d grpcsrv.TrustDomain, san string) (namespace, account string, ok bool)

ParseSAN — ЕДИНСТВЕННЫЙ разбор SPIFFE-идентификатора рабочей нагрузки: `spiffe://<домен>/ns/<пространство>/sa/<учётка>`.

Домен — АРГУМЕНТ: разбор спрашивает тот домен, который впустил эту личность. Необъявленный домен не узнаёт никого. Пространство и учётка — по одному сегменту пути: идентификатор с лишними сегментами формы не имеет, и принять его значило бы признать хвост чужого пути.

func ServiceFromAccount

func ServiceFromAccount(account string) (string, bool)

ServiceFromAccount — короткое имя службы, которое несёт учётка модуля. Ложь — учётка приставки модулей не несёт либо имя службы в ней пусто.

Types

type Gate

type Gate struct {
	Knob string
}

Gate — вход стража перечня: имя ручки для текста отказа.

type Identity

type Identity struct {
	// Namespace — пространство имён, как его назвал сертификат.
	Namespace string
	// Account — служебная учётка целиком.
	Account string
	// Service — короткое имя службы, выведенное из учётки (`vpc`, `api-gateway`).
	Service string
	// Profile — профиль, объявленный установкой для этой пары.
	Profile Profile
	// Issuer — имя доверенного удостоверяющего центра, который ВПРАВЕ выпускать
	// лист этой личности (kaname#988). Пусто — привязки нет: такая запись
	// законна только вне боевого режима ([Roster.RequireIssuerBinding]).
	Issuer string
}

Identity — признанная личность модуля.

type IssuerSet

type IssuerSet map[string][]*x509.Certificate

IssuerSet — доверенные удостоверяющие центры установки: имя → якоря. Лист признаётся личностью с привязкой, только если его проверенная цепочка оканчивается якорем именно её центра.

type Profile

type Profile string

Profile — имя закрытого перечня методов внутреннего слушателя.

const (
	// ProfileEdge — край платформы: фронтируемые им глаголы администрирования и
	// горячие пути, которые он спрашивает на каждом запросе.
	ProfileEdge Profile = "edge"
	// ProfileModuleWriter — модуль-владелец ресурсов: регистрирует свои объекты
	// и спрашивает решения о доступе.
	ProfileModuleWriter Profile = "module-writer"
	// ProfileDataPlane — плоскость данных: только вопрос о доступе.
	ProfileDataPlane Profile = "data-plane"
)

Профили. Словарь ЗАКРЫТ: запись с иным именем страж старта отвергает.

func Profiles

func Profiles() []Profile

Profiles — словарь профилей в порядке объявления.

type Roster

type Roster struct {
	// contains filtered or unexported fields
}

Roster — перечень личностей модулей, объявленный установкой.

Значение неизменяемо после сборки. Нулевое значение — «не объявлен»: по нему не признаётся никто.

func Parse

func Parse(entries []string) (Roster, error)

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

func ParseDeclared

func ParseDeclared(entries []string, issuerNames []string) (Roster, error)

ParseDeclared — суд записей БЕЗ чтения центров: форма каждой записи, единство пары и то, что названный записью центр объявлен по имени (issuerNames).

Это суд стража настройки: он не читает файлов и потому судит профиль посадки на любой машине. Перечень, собранный им, якорей не несёт, и личность с привязкой по нему не признаётся — признаёт перечень ParseWithIssuers, собранный из прочитанных центров.

func ParseWithIssuers

func ParseWithIssuers(entries []string, issuers IssuerSet) (Roster, error)

ParseWithIssuers собирает перечень из записей установки и её прочитанных доверенных центров.

Запись — EntryShape. Пробелы по краям срезаются, пустые записи отбрасываются: случайно пустая величина (`""` в переменной окружения) не должна становиться записью. Всякая иная неисправность — ошибка с названной записью: страж старта отвергает установку, а не признаёт меньше, чем она объявила. Центр, названный записью, обязан быть объявлен и нести хотя бы один якорь.

func (Roster) FromContext

func (r Roster) FromContext(ctx context.Context) (Identity, bool)

FromContext — признание вызывающего gRPC-слушателя: идентификатор ПРОВЕРЕННОГО клиентского листа, разобранный доменом, который его впустил, и — у личности с привязкой — проверенная цепочка, оканчивающаяся якорем её центра (kaname#988).

Непроверенный пир, пустой идентификатор, пара вне перечня и лист чужого доверенного центра — не модуль.

func (Roster) FromTLSState

func (r Roster) FromTLSState(d grpcsrv.TrustDomain, st *tls.ConnectionState) (Identity, bool)

FromTLSState — признание пира HTTP-слушателя: URI SAN нашего домена с проверенного листа и — у личности с привязкой — цепочка до якоря её центра. Тот же суд, что Roster.FromContext, на состоянии рукопожатия.

func (Roster) Identities

func (r Roster) Identities() []Identity

Identities — объявленные личности в порядке пары: для самоотчёта и проб.

func (Roster) IsDeclared

func (r Roster) IsDeclared() bool

IsDeclared — объявила ли установка хотя бы одну личность.

func (Roster) Lookup

func (r Roster) Lookup(d grpcsrv.TrustDomain, san string) (Identity, bool)

Lookup — признание идентификатора san, впущенного доменом d, когда цепочки листа под рукой нет.

Личность с привязкой к центру (kaname#988) здесь НЕ признаётся: без проверенной цепочки нечем доказать, что лист выпустил её центр, а признать её по одному имени значило бы снять привязку на этом пути. Ложь — идентификатор формы не имеет, его пары нет в перечне либо личность привязана к центру.

func (Roster) Require

func (r Roster) Require(g Gate) error

Require — страж перечня боевой посадки: отказ старта, когда установка не объявила ни одной личности.

По пустому перечню не признаётся никто: каждый вызов модуля, край в том числе, отвергается отказом, неотличимым от вызова без личности. Поднявшийся в таком состоянии процесс выглядел бы исправным и не обслуживал бы никого.

func (Roster) RequireIssuerBinding

func (r Roster) RequireIssuerBinding(g Gate) error

RequireIssuerBinding — страж привязки боевой посадки (kaname#988): каждая объявленная личность называет центр, который вправе выпускать её лист.

Без привязки доверие ко всем объявленным центрам общее: лист с допустимым SAN признаётся, какой бы из доверенных центров его ни выпустил, и разделение «лист края — только от центра края» держится на порядке выпуска, а не на проверке. Отказ называет каждую непривязанную личность.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL