ProficientNowTechRFCs

4. Components

RFC-PAM-0002                                                    Section 4
Category: Standards Track                                      Components

4. Components

← Previous: 3. Architecture | Index | Next: 5. Identity and Login →


4.1 Component Overview

ComponentPlaneExists today?Owner
Entra groups pn-host-*AzureNo — created by TerraformPlatform Lead
PIM policy on pn-host-adminAzureNoSecurity owner
Arc RBAC map (class → group → role)AzurePartial (arc-config, dataservers-rbac.tf) — extendedPlatform Lead
AADSSHLoginForLinux + Arc SSH endpointHostYes on 13 hosts; 3 pendingPlatform Lead
Arc managed identity + Graph permissionAzureIdentity exists on every Arc host; permission newPlatform Lead
pn-access synchronisation agentHostNewPlatform Lead
Host access policy (sudo allow-list, pam_wheel, sshd)HostNew Ansible rolePlatform Lead
pn-deploy action + dc aliasHostNewPlatform Lead
Break-glass key per host in Key VaultAzureYes (model exists); alerting newSecurity owner
Sentinel DCRs, tables, analytics rules, workbooksEvidencePartial; extendedSecurity owner

4.2 Entra Groups and PIM

AspectDescription
ResponsibilityHold the answer to "who is in which tier on which class"
InputsMembership edits by the Platform Lead / Security owner; PIM activation requests
OutputsGroup membership (read by Arc RBAC and by pn-access); PIM activation events
DependenciesEntra ID P2 for PIM (present via M365 E5; 5 of the 7 developers hold it, 2 seats spare)
Failure ModeEntra outage blocks all new logins (identity is the accepted external SPOF per STD-IDENT-001)
RecoveryBreak-glass root key from Key Vault (Section 5.5)

Group naming follows pn-<scope>-<role> (STD-IDENT-001, sso-and-group-rbac.md); definitions in Section 6.

4.3 Arc RBAC Map (Terraform)

AspectDescription
ResponsibilityDeclare, per machine class, which Entra group holds User Login and which holds the eligible Administrator Login
InputsMachine inventory with pn_class tags; the access matrix (Section 6)
OutputsAzure role assignments scoped to each Arc machine resource
Dependenciesterraform/modules/arc-config and dataservers-rbac.tf patterns in ovh-infra; all 16 Linux hosts present in arc_machines
Failure ModeA host missing from the map has no human login (fail-closed); a rebuilt host loses machine-scoped assignments (cascade delete) until the next apply
Recoveryterraform apply recreates assignments; CI plan on PR catches drift

4.4 AADSSHLoginForLinux and the Arc SSH Endpoint

AspectDescription
ResponsibilityAuthenticate the Arc certificate, evaluate the two Azure roles at connection time, provision the local account, place active admins in aad_admins
InputsArc tunnel connections from az ssh arc
OutputsLocal human accounts named by UPN; sshd auth events
DependenciesArc agent (himds, gcarcservice); HybridConnectivity default endpoint with SSH service configuration (port 22 over the relay)
Failure ModeArc agent down → no Arc logins to that host
RecoveryBreak-glass root key; restart Arc agent (per docs/ssh-access.md)

4.5 Arc Managed Identity and Graph Permission

AspectDescription
ResponsibilityGive each host a way to read Entra group membership without any stored secret
InputsToken requests from pn-access via the Arc local identity endpoint
OutputsShort-lived Graph tokens
DependenciesSystem-assigned identity (present on every Arc machine; e.g. uat 8d477e00-…); an application permission limited to reading group membership, granted per identity by Terraform
Failure ModePermission missing → agent gets no data → makes no changes (Invariant 10)
RecoveryTerraform apply

4.6 pn-access Synchronisation Agent

AspectDescription
ResponsibilityMake the host agree with Entra: tier group membership, account locking/expiry/archival, session termination, drift heartbeat
InputsGraph group membership for the host's class; the root-owned Entra→Linux group map; the retention window
Outputs/etc/group membership changes; account state changes; heartbeat records to Sentinel
DependenciesManaged identity (4.5); Ansible-delivered map; systemd timer
Failure ModeAgent stopped → host may lag Entra (login still denied by Azure); heartbeat absent
RecoverySentinel alert on missing heartbeat; Ansible re-converges

Detailed behaviour: Section 8.

4.7 Host Access Policy (Ansible role)

AspectDescription
ResponsibilityDefine what each Linux tier group may do: the Operator allow-list, the deploy rule, su lock, sshd settings for human accounts
InputsTier definitions (Section 6)
Outputssudoers.d policy files (root-owned), PAM configuration, sshd drop-in, tier groups' existence
Dependenciesovh-infra host-baseline sshd floor (already: no passwords, root prohibit-password)
Failure ModePolicy file syntax error blocks sudo for the tier (sudoers validation prevents install of a broken file)
RecoveryAnsible re-run; break-glass

4.8 pn-deploy Action

AspectDescription
ResponsibilityLet Editors and Deployers operate compose projects without Docker access
InputsProject, verb, optional services/ref from a human via sudo; root-owned project allow-list
OutputsCompose operations executed as the deploy service user; invocation log; #infra note
Dependenciesdeploy service account as sole docker group member; /srv/pnats layout; per-project lock
Failure ModeWrapper or Docker unavailable → deploy fails closed; no fallback for non-admins
RecoveryEditor activates PIM Admin for raw Docker; wrapper fixed by PR

Detailed behaviour: Section 7.

4.9 Break-Glass Key Store (Key Vault)

AspectDescription
ResponsibilityHold exactly one root key per host for use when Entra or Arc is unavailable
InputsKey generation/rotation by the Security owner
OutputsEmergency root SSH login (on PVE nodes via node-local authorized_keys2, because authorized_keys lives in pmxcfs and vanishes when the cluster is down)
DependenciesAzure Key Vault (pn-onprem-boot-kv pattern)
Failure ModeKey used silently — prevented by the alert in Section 10; key leaked — rotated per Invariant 11
RecoveryRotation SOP; retrospective incident

4.10 Sentinel Evidence Pipeline

AspectDescription
ResponsibilityReceive, retain and alert on all evidence streams (Section 10)
InputsAMA/DCR streams: sshd auth, sudo I/O, auditd, pn-deploy log, pn-access heartbeat; Entra sign-in and PIM logs
OutputsAnalytics-rule alerts; access-review and leaver workbooks; 1-year immutable archive
DependenciesExisting Sentinel workspace and DCR/DCE pattern
Failure ModeStream gap — detected by heartbeat/ingestion monitoring
RecoveryAMA/DCR re-apply

Document Navigation


End of Section 4