Skip to main content

HIPAA S3 Control Mapping

This reference maps HIPAA Security Rule sections (45 CFR §§ 164.3xx) to Stave S3 controls, the AWS CLI command that produces the evidence, and the pass/fail observation shapes each control evaluates.

See also: HIPAA per-control CLI evidence for the control-by-control CLI output schemas, and the HIPAA Compliance how-to for running the HIPAA pack.

S3 HIPAA pack control spec

Control IDHIPAA sectionWhat to check in AWSAWS CLI evidencePass conditionFail conditionBucket-only?
HIPAA.ENCRYPT.00145 CFR § 164.312(a)(2)(iv)Default bucket encryption is enabledaws s3api get-bucket-encryption --bucket <bucket>ServerSideEncryptionConfiguration.Rules existsencryption config missingYes
HIPAA.ENCRYPT.00245 CFR § 164.312(a)(2)(iv)Prefer SSE-KMS for stronger key controlaws s3api get-bucket-encryption --bucket <bucket>SSEAlgorithm = aws:kmsSSEAlgorithm != aws:kmsYes
HIPAA.PUBLIC.00145 CFR § 164.312(a)(1)Bucket public access block is fully enabledaws s3api get-public-access-block --bucket <bucket>all four flags are trueany flag is falseYes, but account-level settings also matter
HIPAA.TRANSPORT.00145 CFR § 164.312(e)(1)Bucket policy denies non-TLS requestsaws s3api get-bucket-policy --bucket <bucket>policy has Deny with aws:SecureTransport = falseno matching deny statementYes
HIPAA.AUDIT.00145 CFR § 164.312(b)Server access logging is enabledaws s3api get-bucket-logging --bucket <bucket>LoggingEnabled.TargetBucket existsLoggingEnabled absentYes
HIPAA.AUDIT.00245 CFR § 164.312(b)CloudTrail object-level data events are enabledaws cloudtrail get-event-selectors --trail-name <trail>selector includes AWS::S3::Object for target bucket or all bucketsno S3 object data selectorNo
HIPAA.INTEGRITY.00145 CFR § 164.312(c)(1)Bucket versioning is enabledaws s3api get-bucket-versioning --bucket <bucket>Status = EnabledStatus absent or SuspendedYes
HIPAA.INTEGRITY.00245 CFR § 164.312(c)(1)Object Lock is enabledaws s3api get-object-lock-configuration --bucket <bucket>ObjectLockEnabled = Enabledobject lock config absent or disabledYes
HIPAA.ACCESS.00145 CFR § 164.312(a)(1)No public bucket policy or ACL path to databucket policy + public access block + ACL evidenceno public read/list/write pathany public path existsPartly
HIPAA.ACCESS.00245 CFR § 164.312(a)(1), § 164.502(b)Least privilege and minimum necessary scopeIAM role policies, bucket policy scope, prefixesaccess limited to exact principals and prefixes neededbroad bucket or object access beyond needNo
HIPAA.REVIEW.00145 CFR § 164.308(a)(1)(ii)(D)Logs are regularly reviewedprocess evidence, alerts, review workflowdocumented and operating review processlogs exist but no review evidenceNo
HIPAA.MALWARE.00145 CFR § 164.308(a)(5)(ii)(B)Uploaded files are scanned for malwareGuardDuty/Lambda/AV pipeline evidencescanning pipeline exists and is activeno malware-scanning evidenceNo
HIPAA.BREACHSUPPORT.00145 CFR §§ 164.400–414Misconfigurations and suspicious access can be detectedGuardDuty, Config, CloudTrail, access logsevidence exists for incident investigationno detection/investigation evidenceNo
HIPAA.REPLICATION.00145 CFR § 164.308(a)(7)Compliance-tagged buckets have replication enabledaws s3api get-bucket-replication --bucket <bucket>ReplicationConfiguration.Rules exists and is Enabledreplication config absent or disabledYes
HIPAA.REPLICATION.00245 CFR § 164.308(a)(7)(ii)(A)PHI bucket replication is cross-regionaws s3api get-bucket-replication --bucket <bucket>destination bucket ARN is in a different region than sourcedestination in same region as sourceYes
HIPAA.REPLICATION.00345 CFR § 164.312(a)(2)(iv)Replication destination bucket is encrypteddestination bucket encryption configdestination has SSE-S3 or SSE-KMS default encryptiondestination encryption absentNo
HIPAA.MACIE.00145 CFR § 164.312(b)Macie enabled for sensitive data bucketsaws macie2 get-bucket-statisticsMacie classification job active for bucketMacie not enabled or no active jobYes
HIPAA.MACIE.00245 CFR § 164.308(a)(1)(ii)(D)Macie automated discovery is runningaws macie2 get-automated-discovery-configurationstatus = ENABLEDautomated discovery disabledNo
HIPAA.OWNERSHIP.00145 CFR § 164.312(a)(1)Object Ownership is BucketOwnerEnforcedaws s3api get-bucket-ownership-controls --bucket <bucket>OwnershipControls.Rules[0].ObjectOwnership = BucketOwnerEnforcedObjectOwnership is not BucketOwnerEnforcedYes
HIPAA.OBJECTACL.00145 CFR § 164.312(a)(1)No objects individually public via ACLbucket public access status + object ACL auditno objects with public ACL grantsobjects can be public via ACLPartly
HIPAA.ACCOUNTPAB.00145 CFR § 164.312(a)(1)Account-level Block Public Access is enabledaws s3control get-public-access-block --account-id <id>all four account-level PAB flags are trueany account-level flag is falseNo
HIPAA.INVENTORY.00145 CFR § 164.312(b)S3 Inventory enabled for bucket content visibilityaws s3api list-bucket-inventory-configurations --bucket <b>at least one inventory configuration existsno inventory configurationYes
HIPAA.MFA.HWKEY.00145 CFR § 164.312(d)Privileged accounts use hardware MFAaws iam list-mfa-devices + device type checkadmin users have hardware MFA deviceadmin user has virtual/SMS MFANo
HIPAA.INACTIVE.00145 CFR § 164.312(a)(2)(i)IAM accounts inactive 90+ days are flaggedaws iam generate-credential-report + last activity checkno accounts inactive > 90 daysaccounts inactive > 90 days existNo
HIPAA.ACCESS.PHI.00145 CFR § 164.502(b)PHI bucket access scoped to specific principalsbucket policy + IAM role policies + prefix scopingaccess limited to exact principals and prefixes neededbroad access beyond minimum necessaryNo
HIPAA.MALWARE.00145 CFR § 164.308(a)(5)(ii)(B)PHI bucket has malware scanning enabledaws guardduty get-detector + S3 protection statusGuardDuty S3 malware protection or Lambda AV activeno malware scanning configuredPartly
HIPAA.BREACHSUPPORT.00145 CFR §§ 164.400–414PHI bucket has all detection infrastructure activeaccess logs + CloudTrail + GuardDuty + Config evidenceall four detection components presentany component missingNo

CLI output and pass/fail JSON

HIPAA.ENCRYPT.001 / HIPAA.ENCRYPT.002

Source: AWS GetBucketEncryption says S3 returns the default encryption configuration, and by default buckets have SSE-S3 unless configured otherwise. (AWS Documentation)

CLI:

aws s3api get-bucket-encryption --bucket <bucket>

Representative output:

{
"ServerSideEncryptionConfiguration": {
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "arn:aws:kms:us-east-1:123456789012:key/11111111-2222-3333-4444-555555555555"
},
"BucketKeyEnabled": true
}
]
}
}

Pass:

{
"encryption": {
"enabled": true,
"mode": "aws:kms",
"kms_key_id": "arn:aws:kms:us-east-1:123456789012:key/11111111-2222-3333-4444-555555555555",
"bucket_key_enabled": true
}
}

Fail:

{
"encryption": {
"enabled": false,
"mode": null,
"kms_key_id": null,
"bucket_key_enabled": false,
"reason": "No compliant default bucket encryption configuration found"
}
}

HIPAA.PUBLIC.001

Source: AWS GetPublicAccessBlock returns the bucket-level public access block config only, and AWS says effective behavior also depends on account-level settings. (AWS Documentation)

CLI:

aws s3api get-public-access-block --bucket <bucket>

Representative output:

{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
}

Pass:

{
"public_access": {
"block_public_acls": true,
"ignore_public_acls": true,
"block_public_policy": true,
"restrict_public_buckets": true,
"compliant": true
}
}

Fail:

{
"public_access": {
"block_public_acls": true,
"ignore_public_acls": false,
"block_public_policy": true,
"restrict_public_buckets": false,
"compliant": false,
"reason": "One or more PublicAccessBlock settings are not enabled"
}
}

HIPAA.TRANSPORT.001

HIPAA transmission security requires protection against unauthorized access during transmission. (eCFR) AWS supports this with bucket policy conditions, including TLS-related conditions. (AWS Documentation)

CLI:

aws s3api get-bucket-policy --bucket <bucket>

Representative output:

{
"Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Deny\",\"Principal\":\"*\",\"Action\":\"s3:*\",\"Resource\":[\"arn:aws:s3:::example-bucket\",\"arn:aws:s3:::example-bucket/*\"],\"Condition\":{\"Bool\":{\"aws:SecureTransport\":\"false\"}}}]}"
}

Pass:

{
"transport_security": {
"bucket_policy_present": true,
"https_only_enforced": true,
"matching_statement": {
"effect": "Deny",
"condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
}
}

Fail:

{
"transport_security": {
"bucket_policy_present": true,
"https_only_enforced": false,
"reason": "Bucket policy does not deny requests where aws:SecureTransport is false"
}
}

HIPAA.AUDIT.001

HIPAA audit controls require mechanisms that record and examine activity. (eCFR) AWS get-bucket-logging returns server access logging status. (AWS Documentation)

CLI:

aws s3api get-bucket-logging --bucket <bucket>

Representative output:

{
"LoggingEnabled": {
"TargetPrefix": "",
"TargetBucket": "example-bucket-logs"
}
}

Pass:

{
"logging": {
"server_access_logging": {
"enabled": true,
"target_bucket": "example-bucket-logs",
"target_prefix": ""
}
}
}

Fail:

{
"logging": {
"server_access_logging": {
"enabled": false
},
"reason": "Server access logging is not enabled"
}
}

HIPAA.AUDIT.002

CloudTrail supports S3 object data events, and get-event-selectors exposes whether those selectors are configured. (AWS Documentation)

CLI:

aws cloudtrail get-event-selectors --trail-name <trail>

Representative output:

{
"EventSelectors": [
{
"IncludeManagementEvents": true,
"DataResources": [
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::example-bucket/"
]
}
],
"ReadWriteType": "All"
}
],
"TrailARN": "arn:aws:cloudtrail:us-east-1:123456789012:trail/org-trail"
}

Pass:

{
"logging": {
"object_level_logging": {
"enabled": true,
"source": "cloudtrail",
"trail_arn": "arn:aws:cloudtrail:us-east-1:123456789012:trail/org-trail",
"selectors": [
{
"read_write_type": "All",
"data_resources": [
{
"type": "AWS::S3::Object",
"values": [
"arn:aws:s3:::example-bucket/"
]
}
]
}
]
}
}
}

Fail:

{
"logging": {
"object_level_logging": {
"enabled": false,
"reason": "No CloudTrail data event selector for AWS::S3::Object"
}
}
}

HIPAA.INTEGRITY.001

HIPAA integrity requires protection against improper alteration or destruction. (eCFR) AWS says GetBucketVersioning returns the versioning state and MFA Delete status. (AWS Documentation)

CLI:

aws s3api get-bucket-versioning --bucket <bucket>

Representative output:

{
"Status": "Enabled",
"MFADelete": "Enabled"
}

Pass:

{
"integrity": {
"versioning": {
"enabled": true,
"mfa_delete": true
}
}
}

Fail:

{
"integrity": {
"versioning": {
"enabled": false,
"mfa_delete": false
},
"reason": "Bucket versioning is not enabled"
}
}

HIPAA.INTEGRITY.002

AWS says Object Lock uses a write-once-read-many model and prevents deletion or overwrite for a fixed time or indefinitely. It also requires versioning. (AWS Documentation)

CLI:

aws s3api get-object-lock-configuration --bucket <bucket>

Representative output:

{
"ObjectLockConfiguration": {
"ObjectLockEnabled": "Enabled",
"Rule": {
"DefaultRetention": {
"Mode": "COMPLIANCE",
"Days": 30
}
}
}
}

Pass:

{
"integrity": {
"object_lock": {
"enabled": true,
"mode": "COMPLIANCE",
"days": 30
}
}
}

Fail:

{
"integrity": {
"object_lock": {
"enabled": false
},
"reason": "Object lock is not configured"
}
}

Not fully provable from bucket-only data

These are valid HIPAA mappings, but bucket config alone cannot prove them:

Control IDWhy not bucket-only
HIPAA.ACCESS.002Need IAM role policies, caller identity paths, prefix scoping, maybe KMS and VPC evidence
HIPAA.REVIEW.001HIPAA requires regular review procedures, not just log collection (eCFR)
HIPAA.MALWARE.001Need GuardDuty, Lambda, or another malware-scanning pipeline
HIPAA.BREACHSUPPORT.001Need incident detection and response evidence; breach notification is not just S3 config
HIPAA.ACCESS.001Partly bucket-testable, but full proof may require IAM, ACL, policy, account-level public access block