SageMaker.1
コントロールの説明
SageMaker ノートブックインスタンスの DirectInternetAccess が無効になっているかをチェックする。DirectInternetAccess が Enabled の場合に FAILED となる。
ノートブックインスタンスには DirectInternetAccess パラメータがあり、Enabled(デフォルト)または Disabled を指定できる。Disabled に設定するには SubnetId(VPC 配置)の指定が必須である。SubnetId を指定しない場合は SageMaker が管理する VPC 経由でインターネットアクセスが提供され、DirectInternetAccess は必ず Enabled になる。
本コントロールは DirectInternetAccess の設定値のみを評価しており、サブネットのルートテーブル(IGW の有無)は評価しない。以下の 4 パターンで検証した結果、finding は DirectInternetAccess の値だけで決まることを確認した。
| ステップ | VPC 配置 | サブネット種別 | DirectInternetAccess | finding |
|---|---|---|---|---|
| 2 | なし | — | Enabled | FAILED |
| 3 | あり | パブリック(IGW ルートあり) | Enabled | FAILED |
| 4 | あり | プライベート(IGW ルートなし) | Enabled | FAILED |
| 5 | あり | パブリック(IGW ルートあり) | Disabled | PASSED |
これは RDS.46(サブネットのルートテーブルを評価する)とは対照的である。
対応する Config ルール: SAGEMAKER_NOTEBOOK_NO_DIRECT_INTERNET_ACCESS(評価頻度: Periodic)
検証環境
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
結果
- ノートブックインスタンスが存在しない場合は PASSED
- DirectInternetAccess=Enabled で起動すると FAILED(VPC 配置の有無、サブネット種別に関係なく)
- DirectInternetAccess=Disabled(VPC 配置必須)で起動すると PASSED(パブリックサブネットでも PASSED)
- インスタンスを削除すると PASSED に復帰
- デフォルトでは保護されていない(DirectInternetAccess のデフォルトは Enabled)
- 本コントロールは DirectInternetAccess の設定値のみを評価しており、サブネットのルートテーブル(IGW の有無)は評価しない
検証の流れ
flowchart LR
A[1. 事前準備] --> B[2. VPC なし<br>Enabled / FAILED]
B --> C[3. パブリックサブネット<br>Enabled / FAILED]
C --> D[4. プライベートサブネット<br>Enabled / FAILED]
D --> E[5. パブリックサブネット<br>Disabled / PASSED]
E --> F[6. PASSED 復帰確認]
F --> G[7. クリーンアップ]
1. 事前準備
Security Hub finding の確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SageMaker.1"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "AWS::::Account:<アカウント ID>"
},
{
"Status": "PASSED",
"ResourceId": "AWS::::Account:<アカウント ID>"
}
]ノートブックインスタンスが存在しないため PASSED。2 件返るのは、東京リージョンの finding と集約リージョンから転送された finding がそれぞれ存在するためである。
IAM ロール作成
SageMaker ノートブックインスタンスには実行ロールが必要である。
cat > /tmp/sagemaker-trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "sagemaker.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOFaws iam create-role \
--role-name sagemaker1-test-role \
--assume-role-policy-document file:///tmp/sagemaker-trust-policy.json \
--query 'Role.{RoleName:RoleName,Arn:Arn}'{
"RoleName": "sagemaker1-test-role",
"Arn": "arn:aws:iam::<アカウント ID>:role/sagemaker1-test-role"
}サブネットとセキュリティグループの確認
VPC 配置のテストに使用する。VPC 配置時はセキュリティグループの指定が必須である。
aws ec2 describe-subnets \
--filters Name=vpc-id,Values=<デフォルト VPC ID> \
--query 'Subnets[0].{SubnetId:SubnetId,AZ:AvailabilityZone}' \
--region ap-northeast-1{
"SubnetId": "<パブリックサブネット ID>",
"AZ": "<AZ>"
}aws ec2 describe-security-groups \
--filters Name=vpc-id,Values=<デフォルト VPC ID> Name=group-name,Values=default \
--query 'SecurityGroups[].GroupId' \
--region ap-northeast-1[
"<セキュリティグループ ID>"
]プライベートサブネットの作成
ステップ 4 で使用するプライベートサブネット(IGW へのルートがないサブネット)を作成する。デフォルト VPC のメインルートテーブルには IGW ルートが含まれるため、IGW ルートを持たないルートテーブルを別途作成してサブネットに関連付ける。
aws ec2 create-subnet \
--vpc-id <デフォルト VPC ID> \
--cidr-block 172.31.128.0/24 \
--availability-zone <AZ> \
--query 'Subnet.{SubnetId:SubnetId,CidrBlock:CidrBlock}' \
--region ap-northeast-1{
"SubnetId": "<プライベートサブネット ID>",
"CidrBlock": "172.31.128.0/24"
}aws ec2 create-route-table \
--vpc-id <デフォルト VPC ID> \
--query 'RouteTable.{RouteTableId:RouteTableId}' \
--region ap-northeast-1{
"RouteTableId": "<プライベート用ルートテーブル ID>"
}aws ec2 associate-route-table \
--subnet-id <プライベートサブネット ID> \
--route-table-id <プライベート用ルートテーブル ID> \
--query '{AssociationId:AssociationId}' \
--region ap-northeast-1{
"AssociationId": "<関連付け ID>"
}IGW へのルートがないことを確認する。
aws ec2 describe-route-tables \
--route-table-ids <プライベート用ルートテーブル ID> \
--query 'RouteTables[].Routes[].{Dest:DestinationCidrBlock,GatewayId:GatewayId}' \
--region ap-northeast-1[
{
"Dest": "172.31.0.0/16",
"GatewayId": "local"
}
]local ルートのみで、IGW へのルートがないことを確認できた。
2. VPC なしで起動(DirectInternetAccess=Enabled)
SubnetId を指定せずに起動する。SageMaker が管理する VPC 経由でインターネットアクセスが提供される。
aws sagemaker create-notebook-instance \
--notebook-instance-name sagemaker1-test-no-vpc \
--instance-type ml.t3.medium \
--role-arn arn:aws:iam::<アカウント ID>:role/sagemaker1-test-role \
--direct-internet-access Enabled \
--query '{NotebookInstanceArn:NotebookInstanceArn}' \
--region ap-northeast-1{
"NotebookInstanceArn": "arn:aws:sagemaker:ap-northeast-1:<アカウント ID>:notebook-instance/sagemaker1-test-no-vpc"
}InService 確認
ノートブックインスタンスの起動には数分かかる。
aws sagemaker describe-notebook-instance \
--notebook-instance-name sagemaker1-test-no-vpc \
--query '{NotebookInstanceName:NotebookInstanceName,NotebookInstanceStatus:NotebookInstanceStatus,DirectInternetAccess:DirectInternetAccess,SubnetId:SubnetId}' \
--region ap-northeast-1{
"NotebookInstanceName": "sagemaker1-test-no-vpc",
"NotebookInstanceStatus": "InService",
"DirectInternetAccess": "Enabled",
"SubnetId": null
}FAILED 確認
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-sagemaker-notebook-no-direct-internet-access-<サフィックス> \
--region ap-northeast-1
(出力なし)aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-sagemaker-notebook-no-direct-internet-access-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`sagemaker1-test-no-vpc`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "sagemaker1-test-no-vpc",
"ComplianceType": "NON_COMPLIANT"
}
]aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SageMaker.1"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "FAILED",
"ResourceId": "arn:aws:sagemaker:ap-northeast-1:<アカウント ID>:notebook-instance/sagemaker1-test-no-vpc"
},
{
"Status": "PASSED",
"ResourceId": "AWS::::Account:<アカウント ID>"
}
]削除
aws sagemaker stop-notebook-instance \
--notebook-instance-name sagemaker1-test-no-vpc \
--region ap-northeast-1
(出力なし)aws sagemaker describe-notebook-instance \
--notebook-instance-name sagemaker1-test-no-vpc \
--query '{NotebookInstanceStatus:NotebookInstanceStatus}' \
--region ap-northeast-1{
"NotebookInstanceStatus": "Stopped"
}aws sagemaker delete-notebook-instance \
--notebook-instance-name sagemaker1-test-no-vpc \
--region ap-northeast-1
(出力なし)3. パブリックサブネットで起動(DirectInternetAccess=Enabled)
パブリックサブネット(IGW へのルートあり)に配置し、DirectInternetAccess=Enabled を指定する。
aws sagemaker create-notebook-instance \
--notebook-instance-name sagemaker1-test-pub-enabled \
--instance-type ml.t3.medium \
--role-arn arn:aws:iam::<アカウント ID>:role/sagemaker1-test-role \
--direct-internet-access Enabled \
--subnet-id <パブリックサブネット ID> \
--security-group-ids <セキュリティグループ ID> \
--query '{NotebookInstanceArn:NotebookInstanceArn}' \
--region ap-northeast-1{
"NotebookInstanceArn": "arn:aws:sagemaker:ap-northeast-1:<アカウント ID>:notebook-instance/sagemaker1-test-pub-enabled"
}InService 確認
aws sagemaker describe-notebook-instance \
--notebook-instance-name sagemaker1-test-pub-enabled \
--query '{NotebookInstanceName:NotebookInstanceName,NotebookInstanceStatus:NotebookInstanceStatus,DirectInternetAccess:DirectInternetAccess,SubnetId:SubnetId}' \
--region ap-northeast-1{
"NotebookInstanceName": "sagemaker1-test-pub-enabled",
"NotebookInstanceStatus": "InService",
"DirectInternetAccess": "Enabled",
"SubnetId": "<パブリックサブネット ID>"
}FAILED 確認
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-sagemaker-notebook-no-direct-internet-access-<サフィックス> \
--region ap-northeast-1
(出力なし)aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-sagemaker-notebook-no-direct-internet-access-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`sagemaker1-test-pub-enabled`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "sagemaker1-test-pub-enabled",
"ComplianceType": "NON_COMPLIANT"
}
]aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SageMaker.1"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "FAILED",
"ResourceId": "arn:aws:sagemaker:ap-northeast-1:<アカウント ID>:notebook-instance/sagemaker1-test-pub-enabled"
},
{
"Status": "PASSED",
"ResourceId": "AWS::::Account:<アカウント ID>"
}
]削除
aws sagemaker stop-notebook-instance \
--notebook-instance-name sagemaker1-test-pub-enabled \
--region ap-northeast-1
(出力なし)aws sagemaker describe-notebook-instance \
--notebook-instance-name sagemaker1-test-pub-enabled \
--query '{NotebookInstanceStatus:NotebookInstanceStatus}' \
--region ap-northeast-1{
"NotebookInstanceStatus": "Stopped"
}aws sagemaker delete-notebook-instance \
--notebook-instance-name sagemaker1-test-pub-enabled \
--region ap-northeast-1
(出力なし)4. プライベートサブネットで起動(DirectInternetAccess=Enabled)
プライベートサブネット(IGW へのルートなし)に配置し、DirectInternetAccess=Enabled を指定する。サブネットのルートテーブルに関係なく FAILED になるかを確認する。
aws sagemaker create-notebook-instance \
--notebook-instance-name sagemaker1-test-priv-enabled \
--instance-type ml.t3.medium \
--role-arn arn:aws:iam::<アカウント ID>:role/sagemaker1-test-role \
--direct-internet-access Enabled \
--subnet-id <プライベートサブネット ID> \
--security-group-ids <セキュリティグループ ID> \
--query '{NotebookInstanceArn:NotebookInstanceArn}' \
--region ap-northeast-1{
"NotebookInstanceArn": "arn:aws:sagemaker:ap-northeast-1:<アカウント ID>:notebook-instance/sagemaker1-test-priv-enabled"
}InService 確認
aws sagemaker describe-notebook-instance \
--notebook-instance-name sagemaker1-test-priv-enabled \
--query '{NotebookInstanceName:NotebookInstanceName,NotebookInstanceStatus:NotebookInstanceStatus,DirectInternetAccess:DirectInternetAccess,SubnetId:SubnetId}' \
--region ap-northeast-1{
"NotebookInstanceName": "sagemaker1-test-priv-enabled",
"NotebookInstanceStatus": "InService",
"DirectInternetAccess": "Enabled",
"SubnetId": "<プライベートサブネット ID>"
}FAILED 確認
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-sagemaker-notebook-no-direct-internet-access-<サフィックス> \
--region ap-northeast-1
(出力なし)aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-sagemaker-notebook-no-direct-internet-access-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`sagemaker1-test-priv-enabled`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "sagemaker1-test-priv-enabled",
"ComplianceType": "NON_COMPLIANT"
}
]プライベートサブネット(IGW へのルートなし)に配置しても、DirectInternetAccess=Enabled であれば NON_COMPLIANT。サブネットのルートテーブルは評価に影響しない。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SageMaker.1"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "FAILED",
"ResourceId": "arn:aws:sagemaker:ap-northeast-1:<アカウント ID>:notebook-instance/sagemaker1-test-priv-enabled"
},
{
"Status": "PASSED",
"ResourceId": "AWS::::Account:<アカウント ID>"
}
]削除
aws sagemaker stop-notebook-instance \
--notebook-instance-name sagemaker1-test-priv-enabled \
--region ap-northeast-1
(出力なし)aws sagemaker describe-notebook-instance \
--notebook-instance-name sagemaker1-test-priv-enabled \
--query '{NotebookInstanceStatus:NotebookInstanceStatus}' \
--region ap-northeast-1{
"NotebookInstanceStatus": "Stopped"
}aws sagemaker delete-notebook-instance \
--notebook-instance-name sagemaker1-test-priv-enabled \
--region ap-northeast-1
(出力なし)5. パブリックサブネットで起動(DirectInternetAccess=Disabled)
パブリックサブネット(IGW へのルートあり)に配置し、DirectInternetAccess=Disabled を指定する。
aws sagemaker create-notebook-instance \
--notebook-instance-name sagemaker1-test-pub-disabled \
--instance-type ml.t3.medium \
--role-arn arn:aws:iam::<アカウント ID>:role/sagemaker1-test-role \
--direct-internet-access Disabled \
--subnet-id <パブリックサブネット ID> \
--security-group-ids <セキュリティグループ ID> \
--query '{NotebookInstanceArn:NotebookInstanceArn}' \
--region ap-northeast-1{
"NotebookInstanceArn": "arn:aws:sagemaker:ap-northeast-1:<アカウント ID>:notebook-instance/sagemaker1-test-pub-disabled"
}InService 確認
aws sagemaker describe-notebook-instance \
--notebook-instance-name sagemaker1-test-pub-disabled \
--query '{NotebookInstanceName:NotebookInstanceName,NotebookInstanceStatus:NotebookInstanceStatus,DirectInternetAccess:DirectInternetAccess,SubnetId:SubnetId}' \
--region ap-northeast-1{
"NotebookInstanceName": "sagemaker1-test-pub-disabled",
"NotebookInstanceStatus": "InService",
"DirectInternetAccess": "Disabled",
"SubnetId": "<パブリックサブネット ID>"
}PASSED 確認
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-sagemaker-notebook-no-direct-internet-access-<サフィックス> \
--region ap-northeast-1
(出力なし)aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-sagemaker-notebook-no-direct-internet-access-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`sagemaker1-test-pub-disabled`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "sagemaker1-test-pub-disabled",
"ComplianceType": "COMPLIANT"
}
]aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SageMaker.1"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "arn:aws:sagemaker:ap-northeast-1:<アカウント ID>:notebook-instance/sagemaker1-test-pub-disabled"
},
{
"Status": "PASSED",
"ResourceId": "AWS::::Account:<アカウント ID>"
}
]パブリックサブネットに配置しても DirectInternetAccess=Disabled であれば PASSED。
削除
aws sagemaker stop-notebook-instance \
--notebook-instance-name sagemaker1-test-pub-disabled \
--region ap-northeast-1
(出力なし)aws sagemaker describe-notebook-instance \
--notebook-instance-name sagemaker1-test-pub-disabled \
--query '{NotebookInstanceStatus:NotebookInstanceStatus}' \
--region ap-northeast-1{
"NotebookInstanceStatus": "Stopped"
}aws sagemaker delete-notebook-instance \
--notebook-instance-name sagemaker1-test-pub-disabled \
--region ap-northeast-1
(出力なし)6. PASSED 復帰確認
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-sagemaker-notebook-no-direct-internet-access-<サフィックス> \
--region ap-northeast-1
(出力なし)aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SageMaker.1"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "AWS::::Account:<アカウント ID>"
}
]7. クリーンアップ
プライベートサブネットの削除
aws ec2 delete-subnet \
--subnet-id <プライベートサブネット ID> \
--region ap-northeast-1
(出力なし)プライベート用ルートテーブルの削除
関連付けを解除してからルートテーブルを削除する。
aws ec2 disassociate-route-table \
--association-id <関連付け ID> \
--region ap-northeast-1
(出力なし)aws ec2 delete-route-table \
--route-table-id <プライベート用ルートテーブル ID> \
--region ap-northeast-1
(出力なし)IAM ロール削除
aws iam delete-role \
--role-name sagemaker1-test-role
(出力なし)補足:Config ルール名の確認方法
aws configservice describe-config-rules \
--query 'ConfigRules[?contains(Source.SourceIdentifier,`SAGEMAKER_NOTEBOOK_NO_DIRECT_INTERNET_ACCESS`)].ConfigRuleName' \
--region ap-northeast-1