Files
Anthropic-Cybersecurity-Skills/skills/implementing-mobile-application-management/scripts/process.py
T

120 lines
3.7 KiB
Python

#!/usr/bin/env python3
"""
MAM Policy Compliance Checker
Validates Intune App Protection Policy configurations against security baselines.
Usage:
python process.py --policy policy.json [--baseline tier2] [--output report.json]
"""
import argparse
import json
import sys
from datetime import datetime
from pathlib import Path
BASELINE_TIER2 = {
"pin_required": True,
"min_pin_length": 6,
"biometric_enabled": True,
"encrypt_app_data": True,
"screen_capture_blocked": True,
"backup_blocked": True,
"clipboard_restriction": "managedApps",
"jailbreak_blocked": True,
"offline_grace_period_max_minutes": 1440,
"max_pin_retries": 5,
}
BASELINE_TIER3 = {
**BASELINE_TIER2,
"min_pin_length": 8,
"clipboard_restriction": "blocked",
"offline_grace_period_max_minutes": 720,
"save_as_blocked": True,
"printing_blocked": True,
"max_pin_retries": 3,
}
def check_compliance(policy: dict, baseline: dict) -> list:
"""Check policy against baseline requirements."""
findings = []
data = policy.get("dataProtectionSettings", {})
access = policy.get("accessSettings", {})
conditional = policy.get("conditionalLaunchSettings", {})
checks = {
"pin_required": access.get("pinRequired"),
"min_pin_length": access.get("minimumPinLength", 0),
"biometric_enabled": access.get("biometricEnabled"),
"encrypt_app_data": data.get("encryptAppData"),
"screen_capture_blocked": data.get("screenCaptureBlocked"),
"backup_blocked": data.get("backupBlocked"),
"jailbreak_blocked": conditional.get("jailbreakBlocked"),
}
for control, expected in baseline.items():
actual = checks.get(control)
if actual is None:
findings.append({
"control": control,
"status": "MISSING",
"expected": expected,
"actual": None,
"severity": "HIGH",
})
elif isinstance(expected, bool) and actual != expected:
findings.append({
"control": control,
"status": "NON_COMPLIANT",
"expected": expected,
"actual": actual,
"severity": "HIGH",
})
elif isinstance(expected, int) and isinstance(actual, int) and actual < expected:
findings.append({
"control": control,
"status": "BELOW_MINIMUM",
"expected": f">= {expected}",
"actual": actual,
"severity": "MEDIUM",
})
return findings
def main():
parser = argparse.ArgumentParser(description="MAM Policy Compliance Checker")
parser.add_argument("--policy", required=True, help="Policy JSON file")
parser.add_argument("--baseline", choices=["tier2", "tier3"], default="tier2")
parser.add_argument("--output", default="mam_compliance.json")
args = parser.parse_args()
with open(args.policy) as f:
policy = json.load(f)
baseline = BASELINE_TIER3 if args.baseline == "tier3" else BASELINE_TIER2
findings = check_compliance(policy, baseline)
compliant_count = len(baseline) - len(findings)
report = {
"check": {"policy": args.policy, "baseline": args.baseline, "date": datetime.now().isoformat()},
"summary": {
"total_controls": len(baseline),
"compliant": compliant_count,
"non_compliant": len(findings),
},
"findings": findings,
}
with open(args.output, "w") as f:
json.dump(report, f, indent=2)
print(f"[+] Compliance: {compliant_count}/{len(baseline)} controls pass")
print(f"[+] Report saved: {args.output}")
if __name__ == "__main__":
main()