Amazon SageMaker ノートブックインスタンスのルートアクセスの無効化手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、Security Hubで検出された「[SageMaker.3] ユーザーは SageMaker ノートブックインスタンスのルートアクセス権を付与されてはなりません」というセキュリティ課題の修正方法について解説します。

ポリシーの説明
[SageMaker.3] ユーザーは SageMaker ノートブックインスタンスのルートアクセス権を付与されてはなりません
SageMaker AI の Security Hub コントロール – AWS Security Hub
このコントロールは、Amazon SageMaker AI ノートブックインスタンスのルートアクセスが有効になっているかどうかを確認します。SageMaker AI ノートブックインスタンスのルートアクセスが有効になっている場合、コントロールは失敗します。
SageMakerノートブックインスタンスは、データサイエンスや機械学習のワークフローを開発・実行するための環境です。ルートアクセス権限をユーザーに付与すると、ユーザーはインスタンスのOSレベルで任意の操作を実行できるようになり、セキュリティ設定の変更、不要なソフトウェアのインストール、機密データの不正なアクセスなど、セキュリティリスクが高まります。
修復方法
AWSコンソールでの修正手順
新規ノートブックインスタンス作成時:
- AWSマネジメントコンソールにログインします。
- Amazon SageMaker AIを開き、「ノートブックインスタンス」を選択します。

- ノートブックインスタンス設定で「編集」をクリックします。
- アクセス許可と暗号化の設定で、ルートアクセス「無効化」を選択します。

- 設定後、「ノートブックインスタンスの更新」をクリックします。
Terraformでの修復手順
SageMakerノートブックインスタンスのセキュアな設定のためのTerraformコードと、重要な修正ポイントを説明します。
# KMS key for encryption
resource "aws_kms_key" "sagemaker" {
description = "KMS key for SageMaker encryption"
deletion_window_in_days = 7
enable_key_rotation = true
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Sid = "Enable IAM User Permissions"
Effect = "Allow"
Principal = {
AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"
}
Action = "kms:*"
Resource = "*"
},
{
Sid = "Allow SageMaker to use the key"
Effect = "Allow"
Principal = {
Service = "sagemaker.amazonaws.com"
}
Action = [
"kms:Decrypt",
"kms:DescribeKey",
"kms:GenerateDataKey*",
"kms:CreateGrant"
]
Resource = "*"
}
]
})
tags = var.tags
}
# ★重要: SageMakerノートブックインスタンスのIAMロール
resource "aws_iam_role" "sagemaker_notebook" {
name = "sagemaker-notebook-${var.environment}"
# ★重要: 最小権限の信頼ポリシー
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = {
Service = "sagemaker.amazonaws.com"
}
Action = "sts:AssumeRole"
}
]
})
tags = var.tags
}
# ★重要: 最小権限のIAMポリシー
resource "aws_iam_role_policy" "sagemaker_notebook" {
name = "sagemaker-notebook-policy"
role = aws_iam_role.sagemaker_notebook.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"sagemaker:CreatePresignedNotebookInstanceUrl",
"sagemaker:DescribeNotebookInstance"
]
Resource = aws_sagemaker_notebook_instance.main.arn
},
{
Effect = "Allow"
Action = [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"
]
Resource = [
"${var.s3_bucket_arn}/*",
var.s3_bucket_arn
]
}
]
})
}
# Security group for notebook instance
resource "aws_security_group" "sagemaker" {
name = "sagemaker-${var.environment}"
description = "Security group for SageMaker notebook instance"
vpc_id = var.vpc_id
# 必要最小限のアウトバウンドルールのみ
egress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = var.allowed_egress_cidrs
}
tags = merge(var.tags, {
Name = "sagemaker-${var.environment}"
})
}
# ★重要: SageMakerノートブックインスタンス
resource "aws_sagemaker_notebook_instance" "main" {
name = "sagemaker-${var.environment}"
instance_type = var.instance_type
role_arn = aws_iam_role.sagemaker_notebook.arn
# ★重要: ルートアクセスを無効化
root_access = "Disabled"
# セキュリティ設定
subnet_id = var.subnet_id
security_groups = [aws_security_group.sagemaker.id]
kms_key_id = aws_kms_key.sagemaker.id
# ★重要: 直接インターネットアクセスを無効化
direct_internet_access = false
# ライフサイクル設定
lifecycle_config_name = aws_sagemaker_notebook_instance_lifecycle_configuration.main.name
tags = var.tags
}
# ライフサイクル設定
resource "aws_sagemaker_notebook_instance_lifecycle_configuration" "main" {
name = "lifecycle-config-${var.environment}"
# 起動時の設定
on_start = base64encode(<<-EOF
#!/bin/bash
set -e
# セキュリティ更新プログラムのインストール
sudo yum update -y
# 不要なサービスの無効化
sudo systemctl disable docker
# 監査ログの有効化
sudo auditctl -e 1
EOF
)
# 作成時の設定
on_create = base64encode(<<-EOF
#!/bin/bash
set -e
# セキュリティ設定の適用
echo "Defaults requiretty" >> /etc/sudoers
echo "Defaults secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" >> /etc/sudoers
EOF
)
}
# CloudWatch Logs
resource "aws_cloudwatch_log_group" "sagemaker" {
name = "/aws/sagemaker/notebooks/${var.environment}"
retention_in_days = var.log_retention_days
tags = var.tags
}
# CloudWatch メトリクスアラーム
resource "aws_cloudwatch_metric_alarm" "notebook_status" {
alarm_name = "sagemaker-notebook-status-${var.environment}"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = "1"
metric_name = "NotebookStatusCode"
namespace = "AWS/SageMaker"
period = "300"
statistic = "Maximum"
threshold = "1"
alarm_description = "Monitor notebook instance status"
alarm_actions = var.alarm_sns_topic_arns
dimensions = {
NotebookInstanceName = aws_sagemaker_notebook_instance.main.name
}
tags = var.tags
}
# Variables
variable "environment" {
description = "Environment name"
type = string
}
variable "vpc_id" {
description = "VPC ID"
type = string
}
variable "subnet_id" {
description = "Subnet ID for notebook instance"
type = string
}
variable "instance_type" {
description = "Notebook instance type"
type = string
default = "ml.t3.medium"
}
variable "s3_bucket_arn" {
description = "ARN of S3 bucket for notebook storage"
type = string
}
variable "allowed_egress_cidrs" {
description = "List of CIDRs allowed for egress traffic"
type = list(string)
}
variable "log_retention_days" {
description = "CloudWatch logs retention days"
type = number
default = 30
}
variable "alarm_sns_topic_arns" {
description = "List of SNS topic ARNs for alarms"
type = list(string)
default = []
}
variable "tags" {
description = "Tags for resources"
type = map(string)
default = {}
}
# Data sources
data "aws_caller_identity" "current" {}
主要な修正ポイントは以下の通りです:
- ルートアクセスの無効化(最重要):
resource "aws_sagemaker_notebook_instance" "main" {
# この設定が最も重要
root_access = "Disabled"
# 直接インターネットアクセスも無効化
direct_internet_access = false
}
注意点は以下です。
- 既存のインスタンスの設定変更には再起動が必要
- アプリケーションの互換性確認が必要
- ネットワークアクセス要件の確認が必要
最後に
今回は、SageMakerノートブックインスタンスのルートアクセスを無効にする方法についてご紹介しました。ルートアクセスを許可することは、セキュリティリスクを高めるため、常に無効化しておくことが推奨されます。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。