## User - **User:** Howard Enos (howard) - **Machine:** Howard-Home - **Role:** tech ## Session Summary Offboarded **Tamra Matthews** (Move-In Coordinator, Marketing/Sales) from Cascades of Tucson after she left the facility in June 2026. Followed the canonical termination runbook (`docs/security/termination-procedures.md`) and the Alma Montt offboarding (2026-06-25) as the proven pattern. Work spanned the M365 cloud tenant (via the `remediation-tool` skill) and the on-prem AD domain controller CS-SERVER (via the `rmm` skill); both passwords were vaulted. Established live pre-state first: Tamra's M365 object (`tamra.matthews@cascadestucson.com`, id `2d9cf0d1-2b0b-424e-9cd1-91eaac408837`) is **cloud-only** (`onPremisesSyncEnabled=null`) with a single O365 Business Standard license and membership in `Sales`, `All Cascades`, and `SG-SSPR-Eligible`. The on-prem `Tamra.Matthews` is a **separate, non-synced** object in `OU=Marketing,OU=Departments` with no explicit group memberships. All four mailbox-delegate recipients (Crystal Rodriguez, Megan Hiatt, Meredith Kuhn, Ashley Jensen) resolved as UserMailboxes; all three target groups were static (not dynamic), so removable. Before mutating anything, surfaced one genuine compliance fork to Howard: unlike Alma (no PHI), Move-In Coordinator is a resident-intake / PHI-adjacent role, so the runbook's 7-yr Litigation Hold could apply. Howard authorized the **Alma-style posture** — shared-mailbox + zero-deletion, free the seat, **no litigation hold** (revisit if the PHI determination changes; hold remains available since the tenant has Business Premium/Exchange Plan 2). Executed the M365 sequence (revoke sessions, block sign-in, vaulted password reset, convert to SharedMailbox, grant the 4 delegates FullAccess+AutoMapping, hide from GAL, remove license, strip 3 groups), then the on-prem AD lockdown (reset password, Disable-ADAccount, move to `OU=Excluded-From-Sync`). Verified every step against live state. Vaulted both passwords, wrote the offboarding record, reconciled the AD current-state doc + share roster, and synced. Per Howard's direction, AutoMapping was then fixed for all 4 delegates and a `/save` run before proceeding to a breach check on Megan Hiatt. ## Key Decisions - **No litigation hold despite PHI-adjacent role** — Howard explicitly authorized the same preserve-but-no-hold posture as Alma. Documented the deviation in the offboarding record so the PHI-role/no-hold decision is auditable. - **Treated the M365 object as cloud-only and the AD object as separate** — `onPremisesSyncEnabled=null` confirmed the M365 account is cloud-mastered; the domain lockdown was a distinct operation on CS-SERVER (same split as Alma). - **Removed license only AFTER shared-mailbox conversion** — per runbook, so the mailbox is never a licensed-then-unlicensed user mailbox at risk of default-retention deletion. - **Fixed AutoMapping by spaced, one-at-a-time re-grants** rather than leaving Megan/Meredith on manual-add — Howard wanted the box to auto-attach and stay. ## Problems Encountered - **AutoMapping silently rolled back for 2 of 4 delegates.** The first pass added all 4 in a rapid loop with `AutoMapping:$true`; the cmdlet echoed `[FullAccess]` for all 4, but a readback showed only Crystal + Ashley persisted — Megan + Meredith were NONE. Cause: rapid sequential AutoMapping writes contend on the same `msExchDelegateListLink` multivalued attribute on Tamra's mailbox; a failed link-write aborts the whole `Add-MailboxPermission` transaction, so the middle writes lost the race and rolled back entirely. **Resolved** by re-granting one user at a time, spaced ~6-8s, with `Remove-MailboxPermission` → poll-until-NONE → `Add-MailboxPermission -AutoMapping $true` → verify-persists. Both took on the first spaced attempt. Logged to `errorlog.md` (--friction). - **Graph read-replica lag** — immediately after `PATCH accountEnabled=false` (HTTP 204), a verify read still showed `accountEnabled=true`; a re-read seconds later showed false. Not a failure, just eventual consistency. Same lag bit the Meredith remove (still showed FullAccess right after the remove), handled with a poll-until-NONE loop. - **msExchDelegateListLink not readable via REST** — the Exchange Operator REST `Get-Mailbox` schema doesn't expose the attribute, so AutoMapping can't be directly read; persistence of an `AutoMapping:$true` grant (no rollback) is the success signal used instead. ## Configuration Changes - **Created:** `clients/cascades-tucson/docs/security/offboarding-2026-06-30-tamra-matthews.md` (offboarding record). - **Created:** `clients/cascades-tucson/session-logs/2026-06/2026-06-30-howard-tamra-matthews-offboarding.md` (this log). - **Created (vault):** `clients/cascades-tucson/tamra-matthews.sops.yaml` (encrypted; m365_password + ad_password + metadata). Committed + pushed to the vault repo. - **Edited:** `clients/cascades-tucson/docs/servers/active-directory.md` — OU=Marketing Tamra.Matthews row struck + annotated OFFBOARDED/disabled/Excluded-From-Sync. - **Edited:** `clients/cascades-tucson/docs/migration/share-group-roster-proposed-2026-06-25.md` — Tamra `(leaving)` → `(OFFBOARDED 2026-06-30)` (4 lines). - **Appended:** `errorlog.md` — EXO AutoMapping rollback friction entry. ## Credentials & Secrets - **Tamra Matthews offboarding passwords** (emergency/audit only; **DO NOT re-enable without authorization**): vault `clients/cascades-tucson/tamra-matthews` — fields `m365_password`, `ad_password`. Generated random, complexity-guaranteed; not pasted into chat/tickets. Scratchpad plaintext was scrubbed after vaulting. ## Infrastructure & Servers - **M365 tenant:** cascadestucson.com — Tenant ID `207fa277-e9d8-4eb7-ada1-1064d2221498` - **Tamra M365 object id:** `2d9cf0d1-2b0b-424e-9cd1-91eaac408837` (cloud-only) - **Removed license SKU:** `f245ecc8-75af-4f8e-b61f-27d8114de5f3` (O365 Business Standard) — seat freed - **Delegate mailbox GUIDs:** megan.hiatt `448588b1-cb16-41e4-95b3-a496ebf0c7e8`; meredith.kuhn `02ebe159-818e-4814-a72a-3620dea944a0` - **Groups removed from:** `Sales` `757e7628-ff38-477c-a5a1-71b27e94d365` (Unified), `All Cascades` `0344d8ae-bf3c-4b2f-b30b-c9fa93a20aa2` (Unified), `SG-SSPR-Eligible` `d6044864-a0ef-4c30-ba37-cdba7074437e` (security) - **On-prem DC:** CS-SERVER (192.168.2.254), `cascades.local`; GuruRMM agent id (live this session) `c39f1de7-d5b6-45ae-b132-e06977ab1713`. Tamra final DN `CN=Tamra Matthews,OU=Excluded-From-Sync,DC=cascades,DC=local`, Enabled=False. - **Remediation apps used:** Security Investigator (`bfbc12a4`, Graph+EXO read), Exchange Operator (`b43e7342`, EXO write), User Manager (`64fac46b`, Graph user/group/license write), Tenant Admin (`709e6eed`, password reset — no PAA elevation needed for a non-admin target). ## Commands & Outputs - Block sign-in: `PATCH /users/{id}` `{"accountEnabled":false}` → HTTP 204 (verify lagged true→false). - Revoke sessions: `POST /users/{id}/revokeSignInSessions` → HTTP 200. - Password reset: `reset-password.sh … tamra.matthews …` → `[OK] no elevation needed` (non-admin). - Convert shared: EXO `Set-Mailbox -Type Shared` → `RecipientTypeDetails=SharedMailbox`. - Grants (final): all 4 `Get-MailboxPermission -User ` → `["FullAccess"]`. - License remove: `POST /users/{id}/assignLicense` removeLicenses=[f245ecc8…] → 0 licenses. - Group removes: `DELETE /groups/{gid}/members/{id}/$ref` → 204 ×3. - AD lockdown (RMM cmd `a788a445…`, exit 0): `Set-ADAccountPassword -Reset` + `Disable-ADAccount` + `Move-ADObject` → `Enabled=False`, DN in `OU=Excluded-From-Sync`, Groups=0. - AutoMapping fix: per-user `Remove-MailboxPermission` → poll NONE → `Add-MailboxPermission -AutoMapping $true` → persists (Megan + Meredith, first spaced attempt). ## Pending / Incomplete Tasks - **ALIS** — Howard handling; unsure Tamra used ALIS. If she had a staff profile, disable it (M365 SSO tie already severed by the sign-in block). - **Breach check on Megan Hiatt** — NEXT step this session. Megan's account carried a `CREDENTIAL_STUFFING_ACTIVE` marker in the April tenant inventory; Howard recalls an April remediation that should have stopped it — verify it held (`/remediation-tool check megan.hiatt@…`). - **Litigation hold** — not applied (Howard authorized); revisit only if Tamra's PHI-access determination or a legal hold changes. ## Reference Information - Offboarding record: `clients/cascades-tucson/docs/security/offboarding-2026-06-30-tamra-matthews.md` - Termination runbook: `docs/security/termination-procedures.md` - Prior offboarding (pattern): `docs/security/offboarding-2026-06-25-alma-montt.md` - Vault: `clients/cascades-tucson/tamra-matthews` - Cascades wiki: `wiki/clients/cascades-tucson.md`