opencode-skills-collection 4.0.67 → 4.0.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled-skills/.antigravity-install-manifest.json +281 -1
- package/bundled-skills/access-review/SKILL.md +394 -0
- package/bundled-skills/access-review/references/details.md +121 -0
- package/bundled-skills/agent-evals/SKILL.md +420 -0
- package/bundled-skills/agent-observability/SKILL.md +346 -0
- package/bundled-skills/agent-observability/references/details.md +786 -0
- package/bundled-skills/ai-agent-security/SKILL.md +393 -0
- package/bundled-skills/ai-agent-security/references/details.md +912 -0
- package/bundled-skills/ai-coding-agent-guardrails/SKILL.md +442 -0
- package/bundled-skills/ai-coding-agent-guardrails/references/details.md +753 -0
- package/bundled-skills/ai-inference-service-mesh/SKILL.md +449 -0
- package/bundled-skills/ai-pipeline-orchestration/SKILL.md +287 -0
- package/bundled-skills/ai-red-teaming/SKILL.md +409 -0
- package/bundled-skills/ai-security-hardening/SKILL.md +343 -0
- package/bundled-skills/ai-sre-incident-response/SKILL.md +336 -0
- package/bundled-skills/alerting-oncall/SKILL.md +458 -0
- package/bundled-skills/alerting-oncall/references/details.md +84 -0
- package/bundled-skills/anti-slop-design/SKILL.md +393 -0
- package/bundled-skills/antigravity-maintainer-batch-release/SKILL.md +1 -0
- package/bundled-skills/apk-redteam-pipeline/SKILL.md +446 -0
- package/bundled-skills/argocd-gitops/SKILL.md +469 -0
- package/bundled-skills/arm-templates/SKILL.md +438 -0
- package/bundled-skills/arm-templates/references/details.md +64 -0
- package/bundled-skills/artifact-yylo/SKILL.md +122 -0
- package/bundled-skills/asset-inventory/SKILL.md +412 -0
- package/bundled-skills/asset-inventory/references/details.md +127 -0
- package/bundled-skills/audit-logging/SKILL.md +476 -0
- package/bundled-skills/aws-cloudtrail/SKILL.md +486 -0
- package/bundled-skills/aws-cost-optimization/SKILL.md +331 -0
- package/bundled-skills/aws-ec2/SKILL.md +426 -0
- package/bundled-skills/aws-ecs-fargate/SKILL.md +388 -0
- package/bundled-skills/aws-iam/SKILL.md +463 -0
- package/bundled-skills/aws-lambda/SKILL.md +428 -0
- package/bundled-skills/aws-rds/SKILL.md +380 -0
- package/bundled-skills/aws-s3/SKILL.md +434 -0
- package/bundled-skills/aws-secrets-manager/SKILL.md +486 -0
- package/bundled-skills/aws-vpc/SKILL.md +436 -0
- package/bundled-skills/azure-ai-document-intelligence-ts/SKILL.md +1 -1
- package/bundled-skills/azure-aks/SKILL.md +423 -0
- package/bundled-skills/azure-devops/SKILL.md +457 -0
- package/bundled-skills/azure-functions-devsec/SKILL.md +436 -0
- package/bundled-skills/azure-keyvault/SKILL.md +455 -0
- package/bundled-skills/azure-keyvault/references/details.md +83 -0
- package/bundled-skills/azure-monitor-audit/SKILL.md +379 -0
- package/bundled-skills/azure-networking/SKILL.md +448 -0
- package/bundled-skills/azure-networking/references/details.md +135 -0
- package/bundled-skills/azure-sql/SKILL.md +413 -0
- package/bundled-skills/azure-sql/references/details.md +113 -0
- package/bundled-skills/azure-vms/SKILL.md +402 -0
- package/bundled-skills/azure-vms/references/details.md +134 -0
- package/bundled-skills/backup-recovery/SKILL.md +388 -0
- package/bundled-skills/bb-methodology/SKILL.md +451 -0
- package/bundled-skills/bb-methodology/references/details.md +120 -0
- package/bundled-skills/block-storage/SKILL.md +371 -0
- package/bundled-skills/blue-green-deploy/SKILL.md +453 -0
- package/bundled-skills/blue-green-deploy/references/details.md +90 -0
- package/bundled-skills/bug-bounty/SKILL.md +447 -0
- package/bundled-skills/bug-bounty/references/details.md +1316 -0
- package/bundled-skills/bugcrowd-reporting/SKILL.md +351 -0
- package/bundled-skills/business-continuity/SKILL.md +463 -0
- package/bundled-skills/career-ops/SKILL.md +186 -0
- package/bundled-skills/cdn-setup/SKILL.md +374 -0
- package/bundled-skills/change-management/SKILL.md +438 -0
- package/bundled-skills/change-management/references/details.md +105 -0
- package/bundled-skills/circleci/SKILL.md +475 -0
- package/bundled-skills/cis-benchmarks/SKILL.md +150 -0
- package/bundled-skills/cloudflare-pages/SKILL.md +318 -0
- package/bundled-skills/cloudflare-r2/SKILL.md +353 -0
- package/bundled-skills/cloudflare-workers/SKILL.md +415 -0
- package/bundled-skills/cloudflare-zero-trust/SKILL.md +361 -0
- package/bundled-skills/cloudformation/SKILL.md +461 -0
- package/bundled-skills/constraint-driven-development/SKILL.md +335 -0
- package/bundled-skills/constraint-driven-development/references/floor-guard.md +99 -0
- package/bundled-skills/container-hardening/SKILL.md +126 -0
- package/bundled-skills/container-registries/SKILL.md +435 -0
- package/bundled-skills/container-scanning/SKILL.md +416 -0
- package/bundled-skills/convex-backend/SKILL.md +338 -0
- package/bundled-skills/dast-scanning/SKILL.md +437 -0
- package/bundled-skills/database-backups/SKILL.md +425 -0
- package/bundled-skills/datadog/SKILL.md +487 -0
- package/bundled-skills/dependency-scanning/SKILL.md +457 -0
- package/bundled-skills/devcontainers-nix/SKILL.md +416 -0
- package/bundled-skills/disaster-recovery/SKILL.md +374 -0
- package/bundled-skills/disaster-recovery/references/details.md +219 -0
- package/bundled-skills/dns-management/SKILL.md +375 -0
- package/bundled-skills/docker-compose/SKILL.md +482 -0
- package/bundled-skills/docker-management/SKILL.md +426 -0
- package/bundled-skills/ebpf-observability/SKILL.md +436 -0
- package/bundled-skills/ebpf-observability/references/details.md +542 -0
- package/bundled-skills/elk-stack/SKILL.md +487 -0
- package/bundled-skills/enterprise-vpn-attack/SKILL.md +395 -0
- package/bundled-skills/evidence-hygiene/SKILL.md +404 -0
- package/bundled-skills/feature-flags/SKILL.md +426 -0
- package/bundled-skills/feature-flags/references/details.md +86 -0
- package/bundled-skills/fedramp-compliance/SKILL.md +453 -0
- package/bundled-skills/firebase-app-platform/SKILL.md +381 -0
- package/bundled-skills/firewall-config/SKILL.md +479 -0
- package/bundled-skills/gcp-audit-logs/SKILL.md +452 -0
- package/bundled-skills/gcp-audit-logs/references/details.md +56 -0
- package/bundled-skills/gcp-cloud-functions/SKILL.md +284 -0
- package/bundled-skills/gcp-cloud-sql/SKILL.md +277 -0
- package/bundled-skills/gcp-compute/SKILL.md +319 -0
- package/bundled-skills/gcp-gke/SKILL.md +307 -0
- package/bundled-skills/gcp-networking/SKILL.md +293 -0
- package/bundled-skills/gcp-secret-manager/SKILL.md +421 -0
- package/bundled-skills/gcp-secret-manager/references/details.md +131 -0
- package/bundled-skills/gdpr-compliance/SKILL.md +451 -0
- package/bundled-skills/gdpr-compliance/references/details.md +145 -0
- package/bundled-skills/geo-audit/SKILL.md +368 -0
- package/bundled-skills/geo-brand-mentions/SKILL.md +68 -0
- package/bundled-skills/geo-brand-mentions/references/details.md +471 -0
- package/bundled-skills/geo-citability/SKILL.md +350 -0
- package/bundled-skills/geo-compare/SKILL.md +340 -0
- package/bundled-skills/geo-content/SKILL.md +383 -0
- package/bundled-skills/geo-crawlers/SKILL.md +408 -0
- package/bundled-skills/geo-llmstxt/SKILL.md +464 -0
- package/bundled-skills/geo-platform-optimizer/SKILL.md +314 -0
- package/bundled-skills/geo-proposal/SKILL.md +378 -0
- package/bundled-skills/geo-prospect/SKILL.md +225 -0
- package/bundled-skills/geo-report/SKILL.md +436 -0
- package/bundled-skills/geo-report-pdf/SKILL.md +157 -0
- package/bundled-skills/geo-schema/SKILL.md +408 -0
- package/bundled-skills/geo-technical/SKILL.md +78 -0
- package/bundled-skills/geo-technical/references/details.md +543 -0
- package/bundled-skills/git-workflow/SKILL.md +460 -0
- package/bundled-skills/github-actions/SKILL.md +368 -0
- package/bundled-skills/gitlab-ci/SKILL.md +340 -0
- package/bundled-skills/google-no-code/SKILL.md +136 -0
- package/bundled-skills/gpu-kubernetes-operations/SKILL.md +468 -0
- package/bundled-skills/gpu-server-management/SKILL.md +236 -0
- package/bundled-skills/hashicorp-vault/SKILL.md +408 -0
- package/bundled-skills/helm-charts/SKILL.md +469 -0
- package/bundled-skills/hipaa-compliance/SKILL.md +451 -0
- package/bundled-skills/hunt-aspnet/SKILL.md +321 -0
- package/bundled-skills/hunt-ato/SKILL.md +184 -0
- package/bundled-skills/hunt-auth-bypass/SKILL.md +426 -0
- package/bundled-skills/hunt-auth-bypass/references/details.md +80 -0
- package/bundled-skills/hunt-brute-force/SKILL.md +341 -0
- package/bundled-skills/hunt-business-logic/SKILL.md +281 -0
- package/bundled-skills/hunt-cache-poison/SKILL.md +382 -0
- package/bundled-skills/hunt-captcha-bypass/SKILL.md +136 -0
- package/bundled-skills/hunt-cicd/SKILL.md +311 -0
- package/bundled-skills/hunt-clickjacking/SKILL.md +110 -0
- package/bundled-skills/hunt-cors/SKILL.md +335 -0
- package/bundled-skills/hunt-dom/SKILL.md +323 -0
- package/bundled-skills/hunt-exceptional-conditions/SKILL.md +111 -0
- package/bundled-skills/hunt-file-upload/SKILL.md +202 -0
- package/bundled-skills/hunt-fintech-graphql/SKILL.md +289 -0
- package/bundled-skills/hunt-forgot-password/SKILL.md +114 -0
- package/bundled-skills/hunt-grpc/SKILL.md +317 -0
- package/bundled-skills/hunt-host-header/SKILL.md +309 -0
- package/bundled-skills/hunt-html-injection/SKILL.md +106 -0
- package/bundled-skills/hunt-http-smuggling/SKILL.md +129 -0
- package/bundled-skills/hunt-http-smuggling/references/phase2h-smuggling-cachepoison.md +177 -0
- package/bundled-skills/hunt-idor/SKILL.md +434 -0
- package/bundled-skills/hunt-jwt-crypto/SKILL.md +221 -0
- package/bundled-skills/hunt-k8s/SKILL.md +337 -0
- package/bundled-skills/hunt-laravel/SKILL.md +255 -0
- package/bundled-skills/hunt-ldap/SKILL.md +351 -0
- package/bundled-skills/hunt-lfi/SKILL.md +311 -0
- package/bundled-skills/hunt-llm-ai/SKILL.md +289 -0
- package/bundled-skills/hunt-mfa-bypass/SKILL.md +177 -0
- package/bundled-skills/hunt-misc/SKILL.md +378 -0
- package/bundled-skills/hunt-nextjs/SKILL.md +299 -0
- package/bundled-skills/hunt-nodejs/SKILL.md +263 -0
- package/bundled-skills/hunt-nosqli/SKILL.md +210 -0
- package/bundled-skills/hunt-ntlm-info/SKILL.md +314 -0
- package/bundled-skills/hunt-oauth/SKILL.md +459 -0
- package/bundled-skills/hunt-open-redirect/SKILL.md +223 -0
- package/bundled-skills/hunt-race-condition/SKILL.md +381 -0
- package/bundled-skills/hunt-race-condition/references/details.md +159 -0
- package/bundled-skills/hunt-rag-vector/SKILL.md +212 -0
- package/bundled-skills/hunt-rce/SKILL.md +444 -0
- package/bundled-skills/hunt-rce/references/details.md +110 -0
- package/bundled-skills/hunt-saml/SKILL.md +156 -0
- package/bundled-skills/hunt-session/SKILL.md +342 -0
- package/bundled-skills/hunt-shadow-api/SKILL.md +198 -0
- package/bundled-skills/hunt-source-leak/SKILL.md +345 -0
- package/bundled-skills/hunt-spa-api/SKILL.md +163 -0
- package/bundled-skills/hunt-springboot/SKILL.md +285 -0
- package/bundled-skills/hunt-sqli/SKILL.md +466 -0
- package/bundled-skills/hunt-ssrf/SKILL.md +396 -0
- package/bundled-skills/hunt-ssrf/references/details.md +179 -0
- package/bundled-skills/hunt-ssti/SKILL.md +163 -0
- package/bundled-skills/hunt-subdomain/SKILL.md +379 -0
- package/bundled-skills/hunt-tls-network/SKILL.md +399 -0
- package/bundled-skills/hunt-xxe/SKILL.md +466 -0
- package/bundled-skills/i-have-adhd/SKILL.md +170 -0
- package/bundled-skills/idea-evaluator/SKILL.md +75 -0
- package/bundled-skills/idea-evaluator/idea-evaluator-con/SKILL.md +64 -0
- package/bundled-skills/idea-evaluator/idea-evaluator-pro/SKILL.md +64 -0
- package/bundled-skills/identity-access-management/SKILL.md +382 -0
- package/bundled-skills/identity-access-management/references/details.md +524 -0
- package/bundled-skills/incident-management/SKILL.md +484 -0
- package/bundled-skills/incident-response/SKILL.md +448 -0
- package/bundled-skills/incident-response/references/details.md +113 -0
- package/bundled-skills/interview-me/SKILL.md +248 -0
- package/bundled-skills/iso27001-compliance/SKILL.md +460 -0
- package/bundled-skills/jenkins/SKILL.md +462 -0
- package/bundled-skills/jev-use/SKILL.md +158 -0
- package/bundled-skills/kubernetes-hardening/SKILL.md +154 -0
- package/bundled-skills/kubernetes-ops/SKILL.md +449 -0
- package/bundled-skills/kubernetes-ops/references/details.md +108 -0
- package/bundled-skills/kustomize/SKILL.md +478 -0
- package/bundled-skills/ledger-tasks-yylo/SKILL.md +219 -0
- package/bundled-skills/linux-administration/SKILL.md +367 -0
- package/bundled-skills/linux-hardening/SKILL.md +154 -0
- package/bundled-skills/llm-app-security/SKILL.md +389 -0
- package/bundled-skills/llm-app-security/references/details.md +674 -0
- package/bundled-skills/llm-caching/SKILL.md +334 -0
- package/bundled-skills/llm-cost-optimization/SKILL.md +311 -0
- package/bundled-skills/llm-fine-tuning/SKILL.md +329 -0
- package/bundled-skills/llm-gateway/SKILL.md +282 -0
- package/bundled-skills/llm-inference-scaling/SKILL.md +286 -0
- package/bundled-skills/llmops-platform-engineering/SKILL.md +472 -0
- package/bundled-skills/load-balancing/SKILL.md +403 -0
- package/bundled-skills/loki-logging/SKILL.md +479 -0
- package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package-lock.json +4 -4
- package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package.json +1 -1
- package/bundled-skills/m365-entra-attack/SKILL.md +423 -0
- package/bundled-skills/mac-mini-llm-lab/SKILL.md +350 -0
- package/bundled-skills/mcp-server-security/SKILL.md +356 -0
- package/bundled-skills/mcp-server-security/references/details.md +745 -0
- package/bundled-skills/mdm-device-management/SKILL.md +404 -0
- package/bundled-skills/mdm-device-management/references/details.md +410 -0
- package/bundled-skills/meme-coin-audit/SKILL.md +402 -0
- package/bundled-skills/mid-engagement-ir-detection/SKILL.md +377 -0
- package/bundled-skills/model-registry-governance/SKILL.md +452 -0
- package/bundled-skills/model-serving-kubernetes/SKILL.md +339 -0
- package/bundled-skills/model-supply-chain-security/SKILL.md +427 -0
- package/bundled-skills/mongodb/SKILL.md +436 -0
- package/bundled-skills/multi-tenant-llm-hosting/SKILL.md +435 -0
- package/bundled-skills/multi-tenant-llm-hosting/references/details.md +211 -0
- package/bundled-skills/mysql/SKILL.md +390 -0
- package/bundled-skills/new-relic/SKILL.md +472 -0
- package/bundled-skills/nfs-storage/SKILL.md +356 -0
- package/bundled-skills/object-storage/SKILL.md +378 -0
- package/bundled-skills/offensive-osint/SKILL.md +443 -0
- package/bundled-skills/okta-attack/SKILL.md +436 -0
- package/bundled-skills/ollama-stack/SKILL.md +379 -0
- package/bundled-skills/openclaw-deployment-hardening/SKILL.md +135 -0
- package/bundled-skills/openclaw-local-mac-mini/SKILL.md +426 -0
- package/bundled-skills/openclaw-local-mac-mini/references/details.md +221 -0
- package/bundled-skills/openclaw-security-hardening/SKILL.md +135 -0
- package/bundled-skills/openshift/SKILL.md +485 -0
- package/bundled-skills/opentelemetry/SKILL.md +438 -0
- package/bundled-skills/opentelemetry/references/details.md +78 -0
- package/bundled-skills/opentofu-migration/SKILL.md +349 -0
- package/bundled-skills/osint-methodology/SKILL.md +460 -0
- package/bundled-skills/osint-methodology/references/details.md +1350 -0
- package/bundled-skills/pci-dss-compliance/SKILL.md +446 -0
- package/bundled-skills/penetration-testing/SKILL.md +152 -0
- package/bundled-skills/performance-tuning/SKILL.md +381 -0
- package/bundled-skills/plan-ledger-tasks-yylo/SKILL.md +52 -0
- package/bundled-skills/planetscale/SKILL.md +297 -0
- package/bundled-skills/platform-engineering/SKILL.md +348 -0
- package/bundled-skills/platform-engineering/references/details.md +944 -0
- package/bundled-skills/podman/SKILL.md +405 -0
- package/bundled-skills/policy-as-code/SKILL.md +434 -0
- package/bundled-skills/policy-as-code/references/details.md +204 -0
- package/bundled-skills/postgresql-devsec/SKILL.md +378 -0
- package/bundled-skills/prometheus-grafana/SKILL.md +469 -0
- package/bundled-skills/prompt-injection-defense/SKILL.md +483 -0
- package/bundled-skills/rag-infrastructure/SKILL.md +269 -0
- package/bundled-skills/rag-observability-evals/SKILL.md +444 -0
- package/bundled-skills/rag-observability-evals/references/details.md +92 -0
- package/bundled-skills/ralph-loop-yylo/SKILL.md +55 -0
- package/bundled-skills/ralph-loop-yylo/references/first_check.md +18 -0
- package/bundled-skills/ralph-loop-yylo/references/implement.md +60 -0
- package/bundled-skills/recon-scope-triage/SKILL.md +128 -0
- package/bundled-skills/redis/SKILL.md +421 -0
- package/bundled-skills/redteam-report-template/SKILL.md +370 -0
- package/bundled-skills/report-writing/SKILL.md +426 -0
- package/bundled-skills/report-writing/references/details.md +187 -0
- package/bundled-skills/resumable-implementation-contracts/SKILL.md +254 -0
- package/bundled-skills/reverse-proxy/SKILL.md +420 -0
- package/bundled-skills/runbook-creation/SKILL.md +438 -0
- package/bundled-skills/runbook-creation/references/details.md +71 -0
- package/bundled-skills/saas-security-posture/SKILL.md +415 -0
- package/bundled-skills/sast-scanning/SKILL.md +444 -0
- package/bundled-skills/sbom-supply-chain/SKILL.md +433 -0
- package/bundled-skills/security-arsenal/SKILL.md +446 -0
- package/bundled-skills/security-arsenal/references/details.md +540 -0
- package/bundled-skills/security-automation/SKILL.md +146 -0
- package/bundled-skills/semantic-versioning/SKILL.md +434 -0
- package/bundled-skills/semantic-versioning/references/details.md +83 -0
- package/bundled-skills/service-mesh/SKILL.md +422 -0
- package/bundled-skills/soc2-compliance/SKILL.md +409 -0
- package/bundled-skills/sops-encryption/SKILL.md +124 -0
- package/bundled-skills/sre-dashboards/SKILL.md +143 -0
- package/bundled-skills/ssh-configuration/SKILL.md +324 -0
- package/bundled-skills/ssl-tls-management/SKILL.md +428 -0
- package/bundled-skills/ssl-tls-management/references/details.md +99 -0
- package/bundled-skills/startup-it-troubleshooting/SKILL.md +415 -0
- package/bundled-skills/supply-chain-attack-recon/SKILL.md +453 -0
- package/bundled-skills/supply-chain-attack-recon/references/details.md +258 -0
- package/bundled-skills/systemd-services/SKILL.md +379 -0
- package/bundled-skills/terraform-aws/SKILL.md +125 -0
- package/bundled-skills/terraform-azure/SKILL.md +415 -0
- package/bundled-skills/terraform-azure/references/details.md +231 -0
- package/bundled-skills/terraform-gcp/SKILL.md +369 -0
- package/bundled-skills/threat-modeling/SKILL.md +487 -0
- package/bundled-skills/understand-project-yylo/SKILL.md +62 -0
- package/bundled-skills/user-management/SKILL.md +383 -0
- package/bundled-skills/using-agent-skills/SKILL.md +220 -0
- package/bundled-skills/vector-database-ops/SKILL.md +300 -0
- package/bundled-skills/vendor-management/SKILL.md +439 -0
- package/bundled-skills/vendor-management/references/details.md +109 -0
- package/bundled-skills/vercel-deployments/SKILL.md +296 -0
- package/bundled-skills/vllm-server/SKILL.md +236 -0
- package/bundled-skills/vmware-vcenter-attack/SKILL.md +412 -0
- package/bundled-skills/vpn-setup/SKILL.md +452 -0
- package/bundled-skills/vulnerability-scanning/SKILL.md +448 -0
- package/bundled-skills/waf-setup/SKILL.md +354 -0
- package/bundled-skills/waf-setup/references/details.md +211 -0
- package/bundled-skills/weather-model-data-fetching/SKILL.md +277 -0
- package/bundled-skills/weather-observation-fetching/SKILL.md +246 -0
- package/bundled-skills/web2-recon/SKILL.md +440 -0
- package/bundled-skills/web2-recon/references/details.md +319 -0
- package/bundled-skills/web3-audit/SKILL.md +445 -0
- package/bundled-skills/web3-audit/references/details.md +224 -0
- package/bundled-skills/wiki-yylo/SKILL.md +114 -0
- package/bundled-skills/windows-hardening/SKILL.md +454 -0
- package/bundled-skills/windows-hardening/references/details.md +204 -0
- package/bundled-skills/windows-server/SKILL.md +318 -0
- package/bundled-skills/workflow-yylo/SKILL.md +107 -0
- package/bundled-skills/zero-trust/SKILL.md +461 -0
- package/package.json +1 -1
- package/skills_index.json +6924 -0
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
# Details (moved from SKILL.md)
|
|
2
|
+
|
|
3
|
+
> Extended reference content for `identity-access-management`, kept under `references/` so the entrypoint stays within the audit budget.
|
|
4
|
+
|
|
5
|
+
## 5. SSO Integration Patterns
|
|
6
|
+
|
|
7
|
+
### SAML vs OIDC Decision Guide
|
|
8
|
+
|
|
9
|
+
| Factor | SAML 2.0 | OIDC / OAuth 2.0 |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Best for | Enterprise SaaS apps | SPAs, mobile apps, APIs |
|
|
12
|
+
| Token format | XML assertions | JWT tokens |
|
|
13
|
+
| Setup complexity | Higher (certificates, metadata XML) | Lower (client ID + secret) |
|
|
14
|
+
| Logout | Inconsistent (SLO is poorly supported) | Token expiry + revocation |
|
|
15
|
+
| Use when | App only supports SAML | You have a choice, or need API auth |
|
|
16
|
+
|
|
17
|
+
**Rule of thumb**: If the SaaS vendor supports OIDC, prefer it. If they only support SAML, use SAML. Never use LDAP-over-internet.
|
|
18
|
+
|
|
19
|
+
### Integrating Common SaaS Apps
|
|
20
|
+
|
|
21
|
+
#### Slack Enterprise SSO
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Okta OIDC integration for Slack
|
|
25
|
+
# 1. In Okta: Applications > Browse App Catalog > Slack
|
|
26
|
+
# 2. Configure with your Slack workspace URL
|
|
27
|
+
# 3. Enable SCIM provisioning
|
|
28
|
+
|
|
29
|
+
# Verify Slack SCIM connection
|
|
30
|
+
curl -s -H "Authorization: Bearer ${SLACK_SCIM_TOKEN}" \
|
|
31
|
+
"https://api.slack.com/scim/v2/Users?count=5" | jq '.Resources[].userName'
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
#### GitHub Organization SSO
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Configure SAML for GitHub Org (requires GitHub Enterprise Cloud)
|
|
38
|
+
# 1. GitHub Org Settings > Authentication security > Enable SAML
|
|
39
|
+
# 2. Provide IdP SSO URL, IdP issuer, public certificate from your IdP
|
|
40
|
+
|
|
41
|
+
# Use GitHub CLI to verify SSO status
|
|
42
|
+
gh api orgs/company/credential-authorizations --paginate \
|
|
43
|
+
| jq '.[] | {login: .login, credential_type: .credential_type, authorized_at: .authorized_credential_note}'
|
|
44
|
+
|
|
45
|
+
# Require SAML SSO for all org members
|
|
46
|
+
gh api -X PATCH orgs/company \
|
|
47
|
+
-f saml_enforced=true
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
#### AWS SSO (IAM Identity Center)
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Configure AWS IAM Identity Center with external IdP
|
|
54
|
+
aws sso-admin list-instances --query 'Instances[0].InstanceArn' --output text
|
|
55
|
+
|
|
56
|
+
INSTANCE_ARN="arn:aws:sso:::instance/ssoins-1234567890"
|
|
57
|
+
IDENTITY_STORE_ID="d-1234567890"
|
|
58
|
+
|
|
59
|
+
# Create a permission set
|
|
60
|
+
aws sso-admin create-permission-set \
|
|
61
|
+
--instance-arn "$INSTANCE_ARN" \
|
|
62
|
+
--name "DeveloperAccess" \
|
|
63
|
+
--description "Read-only + deploy access for engineers" \
|
|
64
|
+
--session-duration "PT8H"
|
|
65
|
+
|
|
66
|
+
# Attach AWS managed policy to permission set
|
|
67
|
+
PERMISSION_SET_ARN="arn:aws:sso:::permissionSet/ssoins-1234567890/ps-abc123"
|
|
68
|
+
aws sso-admin attach-managed-policy-to-permission-set \
|
|
69
|
+
--instance-arn "$INSTANCE_ARN" \
|
|
70
|
+
--permission-set-arn "$PERMISSION_SET_ARN" \
|
|
71
|
+
--managed-policy-arn "arn:aws:iam::aws:policy/ReadOnlyAccess"
|
|
72
|
+
|
|
73
|
+
# Assign group to AWS account with permission set
|
|
74
|
+
aws sso-admin create-account-assignment \
|
|
75
|
+
--instance-arn "$INSTANCE_ARN" \
|
|
76
|
+
--target-id "123456789012" \
|
|
77
|
+
--target-type AWS_ACCOUNT \
|
|
78
|
+
--permission-set-arn "$PERMISSION_SET_ARN" \
|
|
79
|
+
--principal-type GROUP \
|
|
80
|
+
--principal-id "a1b2c3d4-5678-90ab-cdef-GROUP001"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
## 6. SCIM Provisioning
|
|
87
|
+
|
|
88
|
+
SCIM (System for Cross-domain Identity Management) automates user lifecycle across SaaS apps.
|
|
89
|
+
|
|
90
|
+
### SCIM API Examples
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# Standard SCIM 2.0 endpoints (most IdPs and SaaS apps follow this)
|
|
94
|
+
SCIM_BASE="https://app.example.com/scim/v2"
|
|
95
|
+
SCIM_TOKEN="your-scim-bearer-token"
|
|
96
|
+
|
|
97
|
+
# List users
|
|
98
|
+
curl -s -H "Authorization: Bearer ${SCIM_TOKEN}" \
|
|
99
|
+
"${SCIM_BASE}/Users?count=10&startIndex=1" | jq '.Resources[] | {id, userName, active}'
|
|
100
|
+
|
|
101
|
+
# Create a user via SCIM
|
|
102
|
+
curl -s -X POST \
|
|
103
|
+
-H "Authorization: Bearer ${SCIM_TOKEN}" \
|
|
104
|
+
-H "Content-Type: application/scim+json" \
|
|
105
|
+
"${SCIM_BASE}/Users" \
|
|
106
|
+
-d '{
|
|
107
|
+
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
|
|
108
|
+
"userName": "alice@company.com",
|
|
109
|
+
"name": { "givenName": "Alice", "familyName": "Engineer" },
|
|
110
|
+
"emails": [{ "primary": true, "value": "alice@company.com", "type": "work" }],
|
|
111
|
+
"active": true,
|
|
112
|
+
"groups": []
|
|
113
|
+
}' | jq '{id, userName, active}'
|
|
114
|
+
|
|
115
|
+
# Deactivate a user via SCIM (PATCH is the standard for partial updates)
|
|
116
|
+
USER_SCIM_ID="abc-123-def"
|
|
117
|
+
curl -s -X PATCH \
|
|
118
|
+
-H "Authorization: Bearer ${SCIM_TOKEN}" \
|
|
119
|
+
-H "Content-Type: application/scim+json" \
|
|
120
|
+
"${SCIM_BASE}/Users/${USER_SCIM_ID}" \
|
|
121
|
+
-d '{
|
|
122
|
+
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
|
|
123
|
+
"Operations": [{ "op": "replace", "value": { "active": false } }]
|
|
124
|
+
}' | jq '{id, userName, active}'
|
|
125
|
+
|
|
126
|
+
# Delete a user permanently via SCIM
|
|
127
|
+
curl -s -X DELETE \
|
|
128
|
+
-H "Authorization: Bearer ${SCIM_TOKEN}" \
|
|
129
|
+
"${SCIM_BASE}/Users/${USER_SCIM_ID}"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### SCIM Group Management
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Create a group via SCIM
|
|
136
|
+
curl -s -X POST \
|
|
137
|
+
-H "Authorization: Bearer ${SCIM_TOKEN}" \
|
|
138
|
+
-H "Content-Type: application/scim+json" \
|
|
139
|
+
"${SCIM_BASE}/Groups" \
|
|
140
|
+
-d '{
|
|
141
|
+
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
|
|
142
|
+
"displayName": "Engineering",
|
|
143
|
+
"members": [
|
|
144
|
+
{ "value": "user-id-001", "display": "alice@company.com" },
|
|
145
|
+
{ "value": "user-id-002", "display": "bob@company.com" }
|
|
146
|
+
]
|
|
147
|
+
}' | jq '{id, displayName}'
|
|
148
|
+
|
|
149
|
+
# Add a member to an existing group
|
|
150
|
+
GROUP_SCIM_ID="grp-456"
|
|
151
|
+
curl -s -X PATCH \
|
|
152
|
+
-H "Authorization: Bearer ${SCIM_TOKEN}" \
|
|
153
|
+
-H "Content-Type: application/scim+json" \
|
|
154
|
+
"${SCIM_BASE}/Groups/${GROUP_SCIM_ID}" \
|
|
155
|
+
-d '{
|
|
156
|
+
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
|
|
157
|
+
"Operations": [{
|
|
158
|
+
"op": "add",
|
|
159
|
+
"path": "members",
|
|
160
|
+
"value": [{ "value": "user-id-003" }]
|
|
161
|
+
}]
|
|
162
|
+
}'
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
## 7. MFA Enforcement
|
|
169
|
+
|
|
170
|
+
### WebAuthn / Passkeys (Strongest)
|
|
171
|
+
|
|
172
|
+
WebAuthn (FIDO2) hardware keys and passkeys are phishing-resistant and should be the primary MFA factor.
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# Okta: Enforce WebAuthn as primary factor
|
|
176
|
+
curl -s -X PUT \
|
|
177
|
+
-H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
178
|
+
-H "Content-Type: application/json" \
|
|
179
|
+
"${OKTA_ORG_URL}/api/v1/org/factors/webauthn" \
|
|
180
|
+
-d '{ "status": "ACTIVE" }'
|
|
181
|
+
|
|
182
|
+
# Google Workspace: Enforce security keys only (disable SMS/voice)
|
|
183
|
+
gam update org "/" 2sv enforced allowedmethods security_key
|
|
184
|
+
|
|
185
|
+
# Azure AD: Require phishing-resistant MFA via conditional access
|
|
186
|
+
# (use the Graph API conditional access endpoint with authenticationStrengths)
|
|
187
|
+
curl -s -X POST \
|
|
188
|
+
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
|
|
189
|
+
-H "Content-Type: application/json" \
|
|
190
|
+
"https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies" \
|
|
191
|
+
-d '{
|
|
192
|
+
"displayName": "Require phishing-resistant MFA for admins",
|
|
193
|
+
"state": "enabled",
|
|
194
|
+
"conditions": {
|
|
195
|
+
"users": { "includeRoles": ["62e90394-69f5-4237-9190-012177145e10"] },
|
|
196
|
+
"applications": { "includeApplications": ["All"] }
|
|
197
|
+
},
|
|
198
|
+
"grantControls": {
|
|
199
|
+
"operator": "OR",
|
|
200
|
+
"authenticationStrength": {
|
|
201
|
+
"id": "00000000-0000-0000-0000-000000000004"
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}'
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### TOTP Backup Configuration
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# Generate backup codes for users (Okta)
|
|
211
|
+
USER_ID="00u1abc123"
|
|
212
|
+
curl -s -X POST \
|
|
213
|
+
-H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
214
|
+
"${OKTA_ORG_URL}/api/v1/users/${USER_ID}/factors" \
|
|
215
|
+
-d '{
|
|
216
|
+
"factorType": "token:software:totp",
|
|
217
|
+
"provider": "GOOGLE"
|
|
218
|
+
}' | jq '{id: .id, status: .status}'
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### MFA Bypass Procedure (Emergency)
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
# Okta: Reset MFA for a locked-out user
|
|
225
|
+
USER_ID="00u1abc123"
|
|
226
|
+
# List enrolled factors
|
|
227
|
+
curl -s -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
228
|
+
"${OKTA_ORG_URL}/api/v1/users/${USER_ID}/factors" | jq '.[].factorType'
|
|
229
|
+
|
|
230
|
+
# Delete a specific factor to allow re-enrollment
|
|
231
|
+
FACTOR_ID="fct1abc123"
|
|
232
|
+
curl -s -X DELETE \
|
|
233
|
+
-H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
234
|
+
"${OKTA_ORG_URL}/api/v1/users/${USER_ID}/factors/${FACTOR_ID}"
|
|
235
|
+
|
|
236
|
+
# Google Workspace: Generate backup verification codes
|
|
237
|
+
gam user alice@company.com update backupcodes
|
|
238
|
+
|
|
239
|
+
# Azure AD: Require re-registration of MFA methods
|
|
240
|
+
az rest --method DELETE \
|
|
241
|
+
--url "https://graph.microsoft.com/v1.0/users/${USER_OID}/authentication/phoneMethods/3179e48a-750b-4051-897c-87b9720928f7"
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
## 8. Role-Based Access Control
|
|
248
|
+
|
|
249
|
+
### Group-Based Access Patterns
|
|
250
|
+
|
|
251
|
+
Map every application permission to a group, never to an individual user.
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# Naming convention: APP-ROLE
|
|
255
|
+
# Examples:
|
|
256
|
+
# aws-developer -> AWS ReadOnly + deploy
|
|
257
|
+
# aws-admin -> AWS AdministratorAccess
|
|
258
|
+
# github-engineer -> GitHub write access
|
|
259
|
+
# github-admin -> GitHub admin access
|
|
260
|
+
# slack-member -> Slack standard member
|
|
261
|
+
# pagerduty-oncall -> PagerDuty responder role
|
|
262
|
+
|
|
263
|
+
# Okta: Create group rules for automatic assignment based on department
|
|
264
|
+
curl -s -X POST \
|
|
265
|
+
-H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
266
|
+
-H "Content-Type: application/json" \
|
|
267
|
+
"${OKTA_ORG_URL}/api/v1/groups/rules" \
|
|
268
|
+
-d '{
|
|
269
|
+
"type": "group_rule",
|
|
270
|
+
"name": "Auto-assign engineers to GitHub",
|
|
271
|
+
"conditions": {
|
|
272
|
+
"expression": {
|
|
273
|
+
"value": "user.department == \"Engineering\"",
|
|
274
|
+
"type": "urn:okta:expression:1.0"
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
"actions": {
|
|
278
|
+
"assignUserToGroups": { "groupIds": ["GITHUB_ENGINEERS_GROUP_ID"] }
|
|
279
|
+
}
|
|
280
|
+
}'
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Just-in-Time (JIT) Access
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
# AWS: Grant temporary elevated access using STS assume-role
|
|
287
|
+
# The user assumes a role that expires after a set duration
|
|
288
|
+
aws sts assume-role \
|
|
289
|
+
--role-arn "arn:aws:iam::123456789012:role/EmergencyAdmin" \
|
|
290
|
+
--role-session-name "alice-incident-2026-03-24" \
|
|
291
|
+
--duration-seconds 3600 \
|
|
292
|
+
| jq '{AccessKeyId: .Credentials.AccessKeyId, Expiration: .Credentials.Expiration}'
|
|
293
|
+
|
|
294
|
+
# Okta: Create a time-limited group membership (via API scheduled task)
|
|
295
|
+
# Add user to admin group
|
|
296
|
+
curl -s -X PUT \
|
|
297
|
+
-H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
298
|
+
"${OKTA_ORG_URL}/api/v1/groups/${ADMIN_GROUP_ID}/users/${USER_ID}"
|
|
299
|
+
|
|
300
|
+
# Schedule removal after 4 hours (use a cron job or automation tool)
|
|
301
|
+
echo "0 */4 * * * curl -s -X DELETE -H 'Authorization: SSWS ${OKTA_API_TOKEN}' \
|
|
302
|
+
'${OKTA_ORG_URL}/api/v1/groups/${ADMIN_GROUP_ID}/users/${USER_ID}'" | crontab -
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Break-Glass Accounts
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
# Create break-glass accounts that bypass SSO/MFA for emergency access
|
|
309
|
+
# These accounts must be:
|
|
310
|
+
# 1. Excluded from conditional access / MFA policies
|
|
311
|
+
# 2. Protected with extremely long passwords stored in a physical safe
|
|
312
|
+
# 3. Monitored with alerts on any usage
|
|
313
|
+
|
|
314
|
+
# Azure AD: Create break-glass account
|
|
315
|
+
az ad user create \
|
|
316
|
+
--display-name "Break Glass 1" \
|
|
317
|
+
--user-principal-name "breakglass1@company.onmicrosoft.com" \
|
|
318
|
+
--password "$(openssl rand -base64 48)" \
|
|
319
|
+
--force-change-password-next-sign-in false
|
|
320
|
+
|
|
321
|
+
# Assign Global Administrator role
|
|
322
|
+
az ad group member add --group "SG-BreakGlass" --member-id "$BREAKGLASS_OID"
|
|
323
|
+
|
|
324
|
+
# Set up alert on break-glass sign-in (Azure Monitor)
|
|
325
|
+
az monitor activity-log alert create \
|
|
326
|
+
--name "BreakGlass-SignIn-Alert" \
|
|
327
|
+
--resource-group "security-rg" \
|
|
328
|
+
--condition category=Administrative and caller=breakglass1@company.onmicrosoft.com \
|
|
329
|
+
--action-group "/subscriptions/SUB_ID/resourceGroups/security-rg/providers/microsoft.insights/actionGroups/SecurityTeam"
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
## 9. Audit & Compliance
|
|
336
|
+
|
|
337
|
+
### Login Audit Logs
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
# Google Workspace: Pull login audit logs
|
|
341
|
+
gam report login user all start "2026-03-01" end "2026-03-24" \
|
|
342
|
+
fields "actorEmail,ipAddress,loginType,isSecondFactor,isSuspicious"
|
|
343
|
+
|
|
344
|
+
# Okta: Query system log for authentication events
|
|
345
|
+
curl -s -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
346
|
+
"${OKTA_ORG_URL}/api/v1/logs?filter=eventType+eq+\"user.session.start\"&since=2026-03-01T00:00:00Z&limit=100" \
|
|
347
|
+
| jq '.[] | {actor: .actor.displayName, time: .published, outcome: .outcome.result, ip: .client.ipAddress}'
|
|
348
|
+
|
|
349
|
+
# Azure AD: Pull sign-in logs via Graph API
|
|
350
|
+
curl -s -H "Authorization: Bearer ${ACCESS_TOKEN}" \
|
|
351
|
+
"https://graph.microsoft.com/v1.0/auditLogs/signIns?\$filter=createdDateTime ge 2026-03-01T00:00:00Z&\$top=50" \
|
|
352
|
+
| jq '.value[] | {user: .userDisplayName, app: .appDisplayName, status: .status.errorCode, ip: .ipAddress, mfa: .mfaDetail}'
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### Access Reviews
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
# List all users and their group memberships for quarterly access review
|
|
359
|
+
# Google Workspace
|
|
360
|
+
gam print group-members fields email,role > /tmp/access-review-groups.csv
|
|
361
|
+
|
|
362
|
+
# Okta: Export all users with their app assignments
|
|
363
|
+
curl -s -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
364
|
+
"${OKTA_ORG_URL}/api/v1/users?limit=200" \
|
|
365
|
+
| jq -r '.[] | [.profile.email, .status, .lastLogin] | @csv' > /tmp/okta-users.csv
|
|
366
|
+
|
|
367
|
+
# For each user, list their app assignments
|
|
368
|
+
while IFS= read -r user_id; do
|
|
369
|
+
curl -s -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
370
|
+
"${OKTA_ORG_URL}/api/v1/users/${user_id}/appLinks" \
|
|
371
|
+
| jq -r '.[] | [.label, .linkUrl] | @csv'
|
|
372
|
+
done < /tmp/okta-user-ids.txt > /tmp/okta-access-review.csv
|
|
373
|
+
|
|
374
|
+
# Azure AD: List role assignments
|
|
375
|
+
az role assignment list --all --query '[].{principal:principalName, role:roleDefinitionName, scope:scope}' -o table
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### Compliance Reporting
|
|
379
|
+
|
|
380
|
+
```bash
|
|
381
|
+
# Count of users with/without MFA enrolled
|
|
382
|
+
# Google Workspace
|
|
383
|
+
echo "=== MFA Enrollment Report ==="
|
|
384
|
+
echo "Enrolled:"
|
|
385
|
+
gam print users fields isEnrolledIn2Sv | grep -c True
|
|
386
|
+
echo "Not enrolled:"
|
|
387
|
+
gam print users fields isEnrolledIn2Sv | grep -c False
|
|
388
|
+
|
|
389
|
+
# Okta: Users without any MFA factor
|
|
390
|
+
curl -s -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
391
|
+
"${OKTA_ORG_URL}/api/v1/users?filter=status+eq+\"ACTIVE\"&limit=200" \
|
|
392
|
+
| jq '[.[] | select(.credentials.provider.type != "SOCIAL") | .id] | length'
|
|
393
|
+
|
|
394
|
+
# Check for stale accounts (no login in 90 days)
|
|
395
|
+
NINETY_DAYS_AGO=$(date -d "-90 days" +%Y-%m-%dT00:00:00Z 2>/dev/null || date -v-90d +%Y-%m-%dT00:00:00Z)
|
|
396
|
+
curl -s -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
397
|
+
"${OKTA_ORG_URL}/api/v1/users?filter=lastLogin+lt+\"${NINETY_DAYS_AGO}\"&limit=200" \
|
|
398
|
+
| jq '.[] | {email: .profile.email, lastLogin: .lastLogin}'
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
## 10. Offboarding
|
|
405
|
+
|
|
406
|
+
### Account Deactivation Checklist
|
|
407
|
+
|
|
408
|
+
Run this sequence when an employee departs. Order matters -- revoke sessions first, then deactivate.
|
|
409
|
+
|
|
410
|
+
```bash
|
|
411
|
+
DEPARTING_USER="alice@company.com"
|
|
412
|
+
|
|
413
|
+
# Step 1: Revoke all active sessions immediately
|
|
414
|
+
# Okta
|
|
415
|
+
USER_ID=$(curl -s -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
416
|
+
"${OKTA_ORG_URL}/api/v1/users/${DEPARTING_USER}" | jq -r '.id')
|
|
417
|
+
|
|
418
|
+
curl -s -X DELETE \
|
|
419
|
+
-H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
420
|
+
"${OKTA_ORG_URL}/api/v1/users/${USER_ID}/sessions"
|
|
421
|
+
|
|
422
|
+
# Google Workspace: Revoke tokens and sign out
|
|
423
|
+
gam user "${DEPARTING_USER}" signout
|
|
424
|
+
gam user "${DEPARTING_USER}" deprovision
|
|
425
|
+
|
|
426
|
+
# Azure AD: Revoke all refresh tokens
|
|
427
|
+
az ad user update --id "${DEPARTING_USER}" --account-enabled false
|
|
428
|
+
az rest --method POST \
|
|
429
|
+
--url "https://graph.microsoft.com/v1.0/users/${DEPARTING_USER}/revokeSignInSessions"
|
|
430
|
+
|
|
431
|
+
# Step 2: Deactivate the user account
|
|
432
|
+
# Okta
|
|
433
|
+
curl -s -X POST \
|
|
434
|
+
-H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
435
|
+
"${OKTA_ORG_URL}/api/v1/users/${USER_ID}/lifecycle/deactivate"
|
|
436
|
+
|
|
437
|
+
# Google Workspace
|
|
438
|
+
gam update user "${DEPARTING_USER}" suspended on
|
|
439
|
+
|
|
440
|
+
# Step 3: Transfer data ownership
|
|
441
|
+
# Google Workspace: Transfer Drive files
|
|
442
|
+
gam user "${DEPARTING_USER}" transfer drive manager@company.com
|
|
443
|
+
|
|
444
|
+
# Google Workspace: Transfer Calendar ownership
|
|
445
|
+
gam user "${DEPARTING_USER}" transfer calendar manager@company.com
|
|
446
|
+
|
|
447
|
+
# Step 4: Remove from all groups (prevents future provisioning)
|
|
448
|
+
# Okta
|
|
449
|
+
curl -s -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
450
|
+
"${OKTA_ORG_URL}/api/v1/users/${USER_ID}/groups" \
|
|
451
|
+
| jq -r '.[].id' | while read gid; do
|
|
452
|
+
curl -s -X DELETE \
|
|
453
|
+
-H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
454
|
+
"${OKTA_ORG_URL}/api/v1/groups/${gid}/users/${USER_ID}"
|
|
455
|
+
done
|
|
456
|
+
|
|
457
|
+
# Step 5: Revoke app-specific tokens
|
|
458
|
+
# GitHub: Remove from org
|
|
459
|
+
gh api -X DELETE "orgs/company/members/${DEPARTING_USER}"
|
|
460
|
+
|
|
461
|
+
# Slack: Deactivate via SCIM
|
|
462
|
+
SLACK_USER_ID=$(curl -s -H "Authorization: Bearer ${SLACK_SCIM_TOKEN}" \
|
|
463
|
+
"https://api.slack.com/scim/v2/Users?filter=userName+eq+\"${DEPARTING_USER}\"" \
|
|
464
|
+
| jq -r '.Resources[0].id')
|
|
465
|
+
|
|
466
|
+
curl -s -X PATCH \
|
|
467
|
+
-H "Authorization: Bearer ${SLACK_SCIM_TOKEN}" \
|
|
468
|
+
-H "Content-Type: application/scim+json" \
|
|
469
|
+
"https://api.slack.com/scim/v2/Users/${SLACK_USER_ID}" \
|
|
470
|
+
-d '{"schemas":["urn:ietf:params:scim:api:messages:2.0:PatchOp"],"Operations":[{"op":"replace","value":{"active":false}}]}'
|
|
471
|
+
|
|
472
|
+
# AWS: Remove SSO access
|
|
473
|
+
aws sso-admin delete-account-assignment \
|
|
474
|
+
--instance-arn "$INSTANCE_ARN" \
|
|
475
|
+
--target-id "123456789012" \
|
|
476
|
+
--target-type AWS_ACCOUNT \
|
|
477
|
+
--permission-set-arn "$PERMISSION_SET_ARN" \
|
|
478
|
+
--principal-type USER \
|
|
479
|
+
--principal-id "$AWS_SSO_USER_ID"
|
|
480
|
+
|
|
481
|
+
# Step 6: Document and log
|
|
482
|
+
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) | OFFBOARD | ${DEPARTING_USER} | all sessions revoked, account suspended, data transferred to manager@company.com" >> /var/log/offboarding-audit.log
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
### Post-Offboarding Verification
|
|
486
|
+
|
|
487
|
+
```bash
|
|
488
|
+
DEPARTING_USER="alice@company.com"
|
|
489
|
+
|
|
490
|
+
# Verify account is suspended/deactivated
|
|
491
|
+
echo "=== Offboarding Verification ==="
|
|
492
|
+
|
|
493
|
+
# Google Workspace
|
|
494
|
+
gam info user "${DEPARTING_USER}" fields suspended | grep -i "suspended: true" && echo "[OK] Google suspended" || echo "[FAIL] Google still active"
|
|
495
|
+
|
|
496
|
+
# Okta
|
|
497
|
+
curl -s -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
498
|
+
"${OKTA_ORG_URL}/api/v1/users/${DEPARTING_USER}" \
|
|
499
|
+
| jq -r '.status' | grep -q "DEPROVISIONED" && echo "[OK] Okta deprovisioned" || echo "[FAIL] Okta still active"
|
|
500
|
+
|
|
501
|
+
# GitHub
|
|
502
|
+
gh api "orgs/company/members/${DEPARTING_USER}" 2>&1 | grep -q "404" && echo "[OK] GitHub removed" || echo "[FAIL] GitHub still member"
|
|
503
|
+
|
|
504
|
+
# Check for any remaining active sessions in audit logs
|
|
505
|
+
echo "=== Checking for post-offboard activity ==="
|
|
506
|
+
curl -s -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
|
|
507
|
+
"${OKTA_ORG_URL}/api/v1/logs?filter=actor.alternateId+eq+\"${DEPARTING_USER}\"&since=$(date -u +%Y-%m-%dT%H:%M:%SZ)&limit=10" \
|
|
508
|
+
| jq '.[] | {time: .published, event: .eventType, outcome: .outcome.result}'
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
## Quick Reference
|
|
515
|
+
|
|
516
|
+
| Task | Google Workspace | Okta | Azure AD |
|
|
517
|
+
|---|---|---|---|
|
|
518
|
+
| Create user | `gam create user` | `POST /api/v1/users` | `az ad user create` |
|
|
519
|
+
| Suspend user | `gam update user suspended on` | `POST /lifecycle/deactivate` | `az ad user update --account-enabled false` |
|
|
520
|
+
| Enforce MFA | `gam update org 2sv enforced` | MFA enrollment policy | Conditional access policy |
|
|
521
|
+
| Revoke sessions | `gam user signout` | `DELETE /users/{id}/sessions` | `revokeSignInSessions` |
|
|
522
|
+
| Audit logins | `gam report login` | `GET /api/v1/logs` | `GET /auditLogs/signIns` |
|
|
523
|
+
| SCIM provision | Built-in for supported apps | App integration SCIM tab | Enterprise app provisioning |
|
|
524
|
+
|