Skip to content

feat: add aiml-sagemaker-security-assessment skill - #98

Open
aditya-vikram-parakala wants to merge 1 commit into
aws:mainfrom
aditya-vikram-parakala:feature/aiml-sagemaker-security-assessment
Open

aditya-vikram-parakala wants to merge 1 commit into
aws:mainfrom
aditya-vikram-parakala:feature/aiml-sagemaker-security-assessment

Conversation

@aditya-vikram-parakala

Copy link
Copy Markdown

Summary

Adds the aiml-sagemaker-security-assessment skill: a read-only Amazon SageMaker AI security posture assessment that runs 25 checks (SM-01..SM-25) across an account, regions, and associated accounts, and produces severity-rated findings plus a consolidated report. The DevOps Agent runs the read-only checks directly; no infrastructure is deployed.

This is the SageMaker domain of a per-domain AI/ML security posture family (the Bedrock domain is in PR #78). Coverage: notebook/domain direct-internet exposure and VPC-only deployment, notebook privileged-access settings, KMS encryption at rest (notebooks, models, Feature Store offline store, processing/transform/HPT/compilation/AutoML volumes and output), model network isolation, container-repository (ECR) access mode, endpoint high-availability, Model Monitor / drift detection, GuardDuty coverage, and MLOps governance (Model Registry, approval workflow, lineage).

Owns vs. defers

  • Owns — proactive, point-in-time security misconfiguration posture of SageMaker resources.
  • Defers to aiml-access-diagnostics — reactive diagnosis of a specific access denial (authorization-chain tracing). This skill reports static IAM posture only.
  • Cross-references, does not call — AWS Security Hub control IDs (SageMaker.1–5) are cited for convenience; no securityhub:* calls.
  • Out of scope — Amazon Bedrock and Amazon Bedrock AgentCore (separate skills), Responsible AI GRC, OWASP Top 10 for LLM.

Verify vs. prescribe (determinism contract)

Every check carries a Verifiability classification so the report never marks an unread control as Passed:

  • Verifiable (18) — a read-only call returns the exact config.
  • Heuristic (7) — readable but inferred (MLOps maturity, IAM least-privilege); the verdict cites evidence, and ambiguous/denied reads become N/A, never Passed.
  • SM-02 mixed — AmazonSageMakerFullAccess detection is Heuristic; its stale-access aspect (needs iam:GenerateServiceLastAccessedDetails, a Generate* verb blocked by the read-only guardrail) and IAM Identity Center aspect (not control-plane readable) are Prescribe-only and are never marked Passed.

Testing

  • Agent Skill Eval — Audit: 100/100, Grade A, 0 critical / 0 warning / 0 info, passed: true.
  • Agent Skill Eval — Functional: overall 0.976 (--runs 3), passed: true (outcome 1.0, process 0.90, style 1.0, efficiency 1.0; classified PARETO_BETTER — the skill improves quality while reducing cost).
  • Agent Skill Eval — Trigger: should_trigger:false negatives (Bedrock, AgentCore, reactive access-denial, off-topic) do not trigger. should_trigger:true activation is implied by the functional pass per CONTRIBUTING; it registers via the Skill tool when the skill is installed in the evaluation environment.
  • cfn-lint on cloudformation/devops-agent-skill-policies.yaml: 0 errors (only pre-existing warnings unrelated to this change).
  • mkdocs build --strict with the skill staged, on the pinned mkdocs-material==9.6.14: EXIT 0, 0 warnings; README uses only absolute GitHub URLs.

IAM / CloudFormation

Added a gated read-only inline policy EnableAIMLSageMakerSecurityAssessment (default true, Condition-gated, SkillPolicySummary updated) to cloudformation/devops-agent-skill-policies.yaml. It grants only the reads not covered by AIDevOpsAgentAccessPolicy: sagemaker:List*/Describe* control-plane reads and guardduty:ListDetectors. IAM, EC2, KMS, and S3 reads ride AIDevOpsAgentAccessPolicy. All actions are read-only. SM-02's stale-access and IAM Identity Center aspects are prescribe-only and intentionally not granted (no Generate*).

Taskei

V2372308608 — https://taskei.amazon.dev/tasks/V2372308608

Checklist

  • SKILL.md has version and author in metadata
  • name in frontmatter matches directory name
  • description clearly states what/when to activate (≤1024 chars)
  • README.md includes non-production disclaimer
  • CHANGELOG.md present (## 1.0.0, version-synced)
  • Agent Skill Eval audit passed (100/A) and functional passed (0.976, runs=3)
  • Registered in llms.txt
  • .skilleval.yaml present (canonical STR-016 ignore)
  • README reference links are absolute GitHub URLs (mkdocs --strict safe)
  • Gated read-only CFN inline policy added, SkillPolicySummary updated
  • No internal Amazon tool names in submitted content
  • No customer data, account IDs, or credentials
  • Working against latest main

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache License 2.0.

Add a read-only Amazon SageMaker AI security posture assessment skill that runs
25 checks (SM-01..SM-25) across notebook/domain internet exposure and VPC
deployment, KMS encryption at rest, model network isolation, container-repository
access mode, endpoint high-availability, Model Monitor / drift detection,
GuardDuty coverage, and MLOps governance, producing severity-rated findings and a
consolidated report.

This is the SageMaker domain of a per-domain AI/ML security posture family. It
defers reactive access-denial diagnosis to aiml-access-diagnostics and cites
Security Hub control IDs (SageMaker.1-5) as cross-references without calling
securityhub. Every check carries a Verifiability classification (Verifiable /
Heuristic) so the report never marks an unread or access-denied control as
Passed; SM-02's stale-access and IAM Identity Center aspects are prescribe-only
and always N/A (no Generate* calls).

Register the skill in llms.txt and add a gated read-only inline policy
(EnableAIMLSageMakerSecurityAssessment, default true) to the CloudFormation
skill policies for the sagemaker List/Describe and guardduty:ListDetectors reads
not covered by AIDevOpsAgentAccessPolicy.

sim: https://taskei.amazon.dev/tasks/V2372308608
udid-aws added a commit that referenced this pull request Sep 21, 2026
Adds #97, #98 and #99, which were opened after the last refresh and all touch a
skill directory.

The documented one-liner used `gh pr diff --name-only`, which fails with
HTTP 406 on a diff over 20,000 lines and still exits 0. A pull request that large
was therefore dropped from the derivation with no error shown, which is the worst
shape for this to fail in: a missing entry means the pull request is enforced when
it should be exempt. #97 has 256 files and was missed exactly this way. The
command now reads the files endpoint, which has no such limit.

Also records that entries are chosen on the factual test -- open, and touches a
skill directory -- rather than on whether being listed changes that pull request's
outcome. #97 already ships the new layout, so `now_migrated` keeps it enforced and
its entry does nothing today; it starts mattering only if that pull request is
restructured before merge. Judging entries by outcome is what nearly lost #97
here, so the rule is deliberately the simpler one.
@udid-aws udid-aws added ci-sweep Temporary: force a validate-skill-evals run and removed ci-sweep Temporary: force a validate-skill-evals run labels Sep 21, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants