CCM-01 · Daily
SSO enforced
Is every in-scope vendor app behind SSO, with password login off?
A local login skips MFA and is missed when someone leaves. Vendors say they support SSO in their SOC 2; this checks that we actually turned it on.
- Reads
- Vendor inventory, Identity provider apps
- When it fails
- Password login switched back on for an SSO app is reverted automatically. Anything else opens a ticket for the app owner.
- Maps to
- SOC 2 CC6.1ISO 27001 A.8.5NIST CSF PR.AA-03
See the check sso.py
"""CCM-01 SSO enforced on vendor apps.
Every active vendor in tier 1 or 2 must sit behind the identity provider with
SSO enforced and local password login turned off. Local logins skip MFA and
survive offboarding, so this is the control that keeps the others honest.
"""
from datetime import date
CONTROL = {
"id": "CCM-01",
"name": "SSO enforced",
"question": "Is every in-scope vendor app behind SSO, with password login off?",
"why": "A local login skips MFA and is missed when someone leaves. Vendors say they support SSO in their SOC 2; this checks that we actually turned it on.",
"sources": ["Vendor inventory", "Identity provider apps"],
"frequency": "Daily",
"response": "Password login switched back on for an SSO app is reverted automatically. Anything else opens a ticket for the app owner.",
"frameworks": ["SOC 2 CC6.1", "ISO 27001 A.8.5", "NIST CSF PR.AA-03"],
}
IN_SCOPE_TIERS = (1, 2)
def check(state, today):
findings = []
tested = 0
for vid, v in sorted(state["vendors"].items()):
if v["status"] != "active" or v["tier"] not in IN_SCOPE_TIERS:
continue
if date.fromisoformat(v["contract_end"]) < today:
continue # ended vendors belong to CCM-04
tested += 1
app = state["idp_apps"].get(v.get("app") or "")
if app is None or not app["active"]:
findings.append({
"key": f"CCM-01:{vid}:no-idp",
"title": f"{v['name']} is not connected to the identity provider",
"severity": "High",
"evidence": {"vendor": v["name"], "tier": v["tier"], "data": v["data"], "idp_app": None},
"fix": f"Create the SSO app for {v['name']}, move users over, then turn off password login.",
})
continue
if not app["sso_enforced"]:
findings.append({
"key": f"CCM-01:{vid}:not-enforced",
"title": f"{v['name']} allows sign in without SSO",
"severity": "High",
"evidence": {"vendor": v["name"], "idp_app": v["app"], "sso_enforced": False, "password_login": app["password_login"]},
"fix": f"Turn on SSO enforcement for {v['name']} and remove local accounts.",
})
elif app["password_login"]:
findings.append({
"key": f"CCM-01:{vid}:password-login",
"title": f"Password login was switched back on for {v['name']}",
"severity": "Critical",
"evidence": {"vendor": v["name"], "idp_app": v["app"], "sso_enforced": True, "password_login": True},
"fix": "Reverted automatically. Ask the admin who changed it whether a break glass account is needed.",
# Safe to undo on our own: SSO already works for everyone.
"auto_fix": [{"op": "set", "path": ["idp_apps", v["app"], "password_login"], "value": False}],
})
return tested, findings