コンテンツにスキップ

SageMaker.1

検証日: 2026-04-30 / リージョン: ap-northeast-1

コントロールの説明

SageMaker ノートブックインスタンスの DirectInternetAccess が無効になっているかをチェックする。DirectInternetAccess が Enabled の場合に FAILED となる。

ノートブックインスタンスには DirectInternetAccess パラメータがあり、Enabled(デフォルト)または Disabled を指定できる。Disabled に設定するには SubnetId(VPC 配置)の指定が必須である。SubnetId を指定しない場合は SageMaker が管理する VPC 経由でインターネットアクセスが提供され、DirectInternetAccess は必ず Enabled になる。

本コントロールは DirectInternetAccess の設定値のみを評価しており、サブネットのルートテーブル(IGW の有無)は評価しない。以下の 4 パターンで検証した結果、finding は DirectInternetAccess の値だけで決まることを確認した。

ステップVPC 配置サブネット種別DirectInternetAccessfinding
2なしEnabledFAILED
3ありパブリック(IGW ルートあり)EnabledFAILED
4ありプライベート(IGW ルートなし)EnabledFAILED
5ありパブリック(IGW ルートあり)DisabledPASSED

これは 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"
    }
  ]
}
EOF
aws 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>"
    }
]
Security Hub への反映には Config 評価後さらに数分かかる場合がある。また、前のステップで削除済みのインスタンスの FAILED finding が一時的に残存することがある。

削除

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

Amazonアソシエイトリンク