sync: auto-sync from GURU-BEAST-ROG at 2026-07-20 10:25:51

Author: Mike Swanson
Machine: GURU-BEAST-ROG
Timestamp: 2026-07-20 10:25:51
This commit is contained in:
2026-07-20 10:26:44 -07:00
parent 11c2ce892c
commit b05333e2e0

View File

@@ -0,0 +1,139 @@
## User
- **User:** Mike Swanson (mike)
- **Machine:** GURU-BEAST-ROG
- **Role:** admin
## Session Summary
Robert Carnal (robert@glaztech.com, cc Steven Eastman) forwarded a request from Glaztech's
Colorado (Denver) office manager Tami Weisbrod: the Colorado location was not receiving email
from `zach@anchordenver.com` (Anchor Glass). Tami reported a specific recent failure — Zach's
mail to Jimmie Hitzke (jhitzke@glaztech.com) was not delivering — and that a prior round of the
same problem hitting Dave Hill (dhill@glaztech.com) had been fixed by someone she couldn't
identify ("I thought this problem was behind us"). Steve Eastman was out of office.
Diagnosis proceeded outside-in. A public DNS check of anchordenver.com showed a Google Workspace
domain (Google MX) with NO SPF record (only a google-site-verification TXT) and NO DMARC record,
sending via an AWS relay (52.0.70.91) — i.e. effectively unauthenticated mail. An M365 message
trace (Get-MessageTraceV2 through the Exchange Operator app via the InvokeCommand REST endpoint)
proved the mail never reached Microsoft 365: zero messages zach->jhitzke in 10 days, while
jhitzke received 90 other inbound messages in ~2 days (mailbox healthy) and a single
zach->dhill message on 2026-07-14 was Delivered. That located the block upstream of Exchange, at
the MailProtector CloudFilter inbound gateway (Glaztech's sole MX).
The mailprotector skill's CloudFilter API confirmed the block at the source: jhitzke's held queue
contained two messages from zach@anchordenver.com, both `quarantine_spam`, score 400, reason
"SPF None". The root cause of the recurrence was found in the CloudFilter allow/block rules —
dhill had a per-user Allow rule (`33590415` = Allow zach@anchordenver.com) added during the prior
incident, while jhitzke had no such rule. The earlier fix was scoped to one user and never
generalized, so it recurred for the next Anchor contact.
Mike chose a domain-wide fix over the per-user precedent. Applied two gated CloudFilter writes:
(1) a domain-level Allow rule for the whole `anchordenver.com` domain on the glaztech.com domain
entity (27635), and (2) release of jhitzke's two held messages. Both verified. The domain rule
supersedes the per-user dhill patch and prevents recurrence for all Glaztech recipients at every
location. Sender-side, the durable fix belongs to Anchor Glass (publish SPF/DKIM/DMARC); flagged
for relay to Robert.
## Key Decisions
- **Domain-wide allow for the entire anchordenver.com domain** (not per-user, not address-scoped).
Rationale: the per-user precedent (dhill) caused the recurrence; Anchor is a known legitimate
vendor emailing multiple Glaztech staff across locations. Mike accepted the tradeoff that a
whole-domain allow on an SPF-less sender also permits spoofed anchordenver.com mail through.
- **Fix at CloudFilter, not Exchange.** An EOP/Exchange transport rule (the usual Glaztech
DMARC-reject workaround) would not help because the mail never reaches Exchange — it is
quarantined at MailProtector first. The only effective lever was a CloudFilter allow rule.
- **Used the mailprotector skill's CloudFilter API** rather than the manual partner-portal login
the Glaztech wiki describes. The API key in the vault (`msp-tools/mailprotector.sops.yaml`)
reaches Glaztech's domain, held mail, and rules — the "manual portal only" wiki note is
superseded for these operations.
## Problems Encountered
- **EOP message trace returned HTTP 401 `invalid_token` on the investigator-exo tier.** In the
Glaztech tenant the Exchange Administrator role / `Exchange.ManageAsApp` is held only by the
Exchange Operator SP (`b43e7342`), not the Security Investigator SP (`bfbc12a4`). Re-acquired the
token on the `exchange-op` tier and the InvokeCommand/Get-MessageTraceV2 call succeeded. This is
already documented in the Glaztech wiki access notes.
- **CloudFilter `logs` endpoint returned empty** for the sender filter (likely time-boxed/index
behavior), and the `messages --sender` filter did not reliably filter server-side. Worked around
by pulling the full held-message queue for the user and identifying the anchordenver entries by
eye.
## Configuration Changes
- **Created** CloudFilter allow rule `33661305`: value `anchordenver.com`, type Allow, on domain
entity `glaztech.com` (27635). Verified present in `rules domains 27635`.
- **Released** two held CloudFilter messages to jhitzke@glaztech.com: `4580147186`, `4583375982`
(both were subject "Test" from zach@anchordenver.com; API returned them in `delivered_messages`).
- No Exchange/M365 changes made. No repo files changed beyond this session log.
- Pre-existing (not changed): per-user Allow rule `33590415` (Allow zach@anchordenver.com) on
dhill — now redundant given the domain rule; left in place (harmless).
## Credentials & Secrets
- No credentials created or newly discovered this session.
- MailProtector CloudFilter API key: vault `msp-tools/mailprotector.sops.yaml`, field
`credentials.api_key` (used by the mailprotector skill; base URL https://emailservice.io/api/v1).
- Exchange Operator app token acquired via
`bash .claude/skills/remediation-tool/scripts/get-token.sh <tenant> exchange-op` (cert auth;
SP `b43e7342-5b4b-492f-890f-bb5a4f7f40e9`, roles full_access_as_app + Exchange.ManageAsApp).
## Infrastructure & Servers
- **Glaztech M365 tenant:** glaztechindustries.onmicrosoft.com, tenant ID
`82931e3c-de7a-4f74-87f7-fe714be1f160`, primary domain glaztech.com.
- **MailProtector CloudFilter (emailservice.io):** glaztech.com domain entity `27635`; account
"GlazTech" id `16175`. Inbound host `glaztech-com.inbound.emailservice.io` (sole MX, priority 5).
- **CloudFilter users:** jhitzke@glaztech.com = user `1347467` (Jimmy Hitzke); dhill@glaztech.com
= user `1837854` (Dave Hill).
- **Sender — Anchor Glass (anchordenver.com):** Google Workspace (MX aspmx.l.google.com et al.);
no SPF record (only `google-site-verification=YGN-6dSjhfxSmRfGxiXm5I_daxlM8go0u0GnR2ZpkCo`); no
DMARC (`_dmarc.anchordenver.com` NXDOMAIN); observed sending IP 52.0.70.91 (AWS).
## Commands & Outputs
- DNS: `Resolve-DnsName -Type TXT/MX anchordenver.com` and `_dmarc.anchordenver.com`
confirmed no SPF, no DMARC, Google MX.
- EOP trace (exchange-op token) via
`POST https://outlook.office365.com/adminapi/beta/<tenant>/InvokeCommand` with
`{"CmdletInput":{"CmdletName":"Get-MessageTraceV2","Parameters":{...}}}`:
- sender zach@anchordenver.com, 2026-07-06..16: 1 result -> dhill, 2026-07-14 15:08Z, Delivered, FromIP 52.0.70.91.
- recipient jhitzke + sender zach: count 0.
- recipient jhitzke, any sender, 2 days: 90 Delivered (mailbox healthy).
- CloudFilter (mailprotector skill, run from `.claude/skills/mailprotector/scripts`,
`CLAUDETOOLS_ROOT=c:/Users/guru/ClaudeTools`):
- `mp.py find-user jhitzke@glaztech.com` -> id 1347467, domain 27635.
- `mp.py messages users 1347467` -> held queue; zach@anchordenver.com x2 (ids 4583375982,
4580147186), decision quarantine_spam, score 400, result title "SPF None".
- `mp.py rules users 1837854` -> included `33590415 Allow zach@anchordenver.com` (prior fix).
- `mp.py add-rule domains 27635 --value anchordenver.com --type allow --confirm` -> rule 33661305.
- `mp.py release-many users 1347467 --ids 4583375982,4580147186 --confirm` -> delivered both.
## Pending / Incomplete Tasks
- **Reply to Robert Carnal** (robert@glaztech.com, cc seastman@glaztech.com) — he asked "let me
know if you can or not." Draft prepared in-session (explains the SPF root cause, the allow rule,
the released mail, and the SPF tip for Anchor). Not yet sent — Mike to choose send-as-him via
/mailbox vs. hand off text.
- **Syncro ticket** — billable work not yet logged. Glaztech Syncro customer ID 143932. Create
via /syncro.
- **Wiki update** — add the CloudFilter-layer pattern (vendor with broken SPF -> CloudFilter
quarantine -> domain allow rule, done via mailprotector API not manual portal) to
wiki/clients/glaztech.md. Run /wiki-compile separately.
- **Sender-side recommendation to relay to Anchor Glass:** publish an SPF record for
anchordenver.com (ideally SPF + DKIM + DMARC) — the real root cause; fixes their deliverability
to all recipients, not just Glaztech.
- Optional cleanup: remove the now-redundant per-user dhill allow rule `33590415` (low priority).
## Reference Information
- Original request thread subject: "FW: Email Delivery- Anchor Glass" (Robert Carnal ->
Mike, 2026-07-14 17:52).
- MailProtector API base: https://emailservice.io/api/v1 ; skill: `.claude/skills/mailprotector/`.
- Remediation tool token flow: `.claude/skills/remediation-tool/scripts/get-token.sh <tenant> exchange-op`.
- Glaztech tenant ID: 82931e3c-de7a-4f74-87f7-fe714be1f160.
- CloudFilter: glaztech domain 27635, account 16175; users jhitzke 1347467, dhill 1837854.
- New CloudFilter allow rule: 33661305 (anchordenver.com, Allow, domain 27635).
- Released message IDs: 4580147186, 4583375982.