SPEKTRA Edge Principal Service Access
RoleBinding is not only binding User/ServiceAccount with
a project/organization. It also binds a member with a service. For
example, a devices manager Role in project X would bind a given member
not only with project X but also with the devices.edgelq.com service
(and applications & secrets, since those are related). Each Role has
a populated field metadata.services
, which points to services where
Role is relevant. RoleBinding also has metadata.services
populated,
and it contains combined services from a Role and a parent object
(organization, project, or service).
When RoleBinding is created, IAM internally creates a MemberAssignment instance per each unique combination of member/scope, and this MemberAssignment will have a “scope” field pointing to the project or organization. However, there is something more to it. IAM will also create additional MemberAssignment objects where the “scope” field points to a Service! Those Service-level MemberAssignment instances are used to track in which services the given Member (User or ServiceAccount) is participating.
IAM Controller has a dedicated module
(iam/controller/v1/iam_scope/service_users_updater.go
), which ensures
that the field metadata.services
is in sync (for Users, ServiceAccounts,
and ServiceAccountKeys). It does it by watching MemberAssignment changes
and making “summary” of services in use. If it notices that some
user/service account has inaccurate data, it will issue an update request
to IAM. Each region of IAM is responsible for watching local members,
but they will access all MemberAssignment instances since those are
synced globally.
Making sure the field metadata.services
of all Users/ServiceAccounts is
synced has double functionality:
- It ensures that a given member can access Service-related data.
- It ensures that the given Service can access member data (via GetPrincipal).
If you check the file iam/fixtures/v1/iam_role_bindings.yaml
, you should
notice special RoleBinding roleBindings/services-participant
. It is
a root-level RoleBinding given to all authenticated members, granting
services/iam.edgelq.com/roles/selected-service-user
role. This role is
a multi-service one. If you see its contents in
iam/fixtures/v1/iam_roles.yaml
, you should see it gives many read/attach
permissions to a holder in a specified list of services. In the RoleBinding
yaml definition, note that this list of services comes from a principal
metadata object! This is how principals get automatic access to a Service.
Role services/iam.edgelq.com/roles/selected-service-user
is similar to
services/iam.edgelq.com/roles/selected-user
. The latter one should be
used on the service level to provide access to that single service, to
someone who has no other access there. The former has an internal purpose,
gives access to many services at once, and will only be assigned to
members who already have some access to specified services. It just ensures
they can access service meta-information.