AWS Systems Manager Session Manager - セキュアなリモートアクセスの実現

Session Managerは、EC2インスタンスやオンプレミスサーバーへのセキュアなリモートアクセスを提供するAWS Systems Managerの機能です。従来のSSH接続やRDP接続に代わる次世代のアクセス手段として、より高いセキュリティと運用効率を実現します。

Session Managerの概要

従来のリモートアクセスの課題

従来のSSH接続やRDP接続には、セキュリティと運用の両面で多くの課題がありました:

セキュリティ面の課題:

  • SSH鍵やパスワードの管理負荷
  • セキュリティグループでのポート開放の必要性
  • アクセスログの取得が困難
  • 踏み台サーバーの管理・維持

運用面の課題:

  • 鍵の配布・更新・削除の手作業
  • アクセス権限の管理が複雑
  • セッション内容の監査が困難
  • ネットワーク設定の複雑さ

Session Managerによる解決

Session Managerは、これらの課題を根本的に解決する新しいアプローチを提供します:

セキュリティ上の利点

IAMベースの認証・認可

Session Managerは、AWS IAMを使用した認証・認可システムを採用しています。これにより、従来のSSH鍵管理が不要になります。

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:StartSession"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:instance/*"
      ],
      "Condition": {
        "StringEquals": {
          "ssm:resourceTag/Environment": "Production"
        },
        "IpAddress": {
          "aws:SourceIp": ["203.0.113.0/24", "198.51.100.0/24"]
        },
        "DateGreaterThan": {
          "aws:CurrentTime": "2025-01-01T00:00:00Z"
        },
        "DateLessThan": {
          "aws:CurrentTime": "2025-12-31T23:59:59Z"
        }
      }
    }
  ]
}

ネットワークセキュリティの向上

従来のSSH接続とSession Managerの比較:

セキュリティ要素SSH接続Session Manager
必要ポート22(SSH) / 3389(RDP)なし(アウトバウンド443のみ)
鍵管理SSH鍵ペアの配布・管理IAM認証(鍵管理不要)
踏み台サーバープライベート環境で必要不要
セキュリティグループインバウンドルール必要インバウンドルール不要
VPC設定複雑なルーティングシンプルな設定
監査ログ別途設定が必要自動記録・暗号化

セッションログと監査

Session Managerは、すべてのセッション活動を自動的に記録し、暗号化して保存します:

json
{
  "schemaVersion": "1.0",
  "description": "Session Manager設定",
  "sessionType": "Standard_Stream",
  "inputs": {
    "cloudWatchLogGroupName": "/aws/sessionmanager/sessions",
    "cloudWatchEncryptionEnabled": true,
    "cloudWatchStreamingEnabled": true,
    "s3BucketName": "my-session-logs-bucket",
    "s3KeyPrefix": "session-logs/",
    "s3EncryptionEnabled": true,
    "kmsKeyId": "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012",
    "runAsEnabled": false,
    "runAsDefaultUser": "",
    "idleSessionTimeout": "20",
    "maxSessionDuration": "60",
    "shellProfile": {
      "windows": "date",
      "linux": "pwd;ls"
    }
  }
}

実装と設定

前提条件の確認

Session Managerを使用するための前提条件:

  1. SSM Agent: 対象インスタンスにSSM Agentがインストール・起動されている
  2. IAMロール: インスタンスに適切なIAMロールが付与されている
  3. ネットワーク: アウトバウンドHTTPS(443)通信が可能

EC2インスタンスの設定

1. IAMロールの作成と割り当て

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

管理ポリシー AmazonSSMManagedInstanceCore をアタッチ:

bash
aws iam attach-role-policy \
  --role-name EC2-SSM-Role \
  --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

2. インスタンスプロファイルの作成

bash
aws iam create-instance-profile --instance-profile-name EC2-SSM-InstanceProfile
aws iam add-role-to-instance-profile \
  --instance-profile-name EC2-SSM-InstanceProfile \
  --role-name EC2-SSM-Role

3. EC2インスタンスへの割り当て

bash
aws ec2 associate-iam-instance-profile \
  --instance-id i-1234567890abcdef0 \
  --iam-instance-profile Name=EC2-SSM-InstanceProfile

セッション開始方法

AWS Management Consoleからの接続

  1. EC2コンソール → インスタンス選択
  2. 「接続」ボタン → 「Session Manager」タブ
  3. 「接続」をクリック

AWS CLIからの接続

bash
# 基本的な接続
aws ssm start-session --target i-1234567890abcdef0

# 特定のユーザーとして接続(Linux)
aws ssm start-session \
  --target i-1234567890abcdef0 \
  --document-name AWS-StartInteractiveCommand \
  --parameters 'command=["sudo su - ec2-user"]'

# ポートフォワーディング
aws ssm start-session \
  --target i-1234567890abcdef0 \
  --document-name AWS-StartPortForwardingSession \
  --parameters '{"portNumber":["3306"],"localPortNumber":["3306"]}'

高度な設定とカスタマイズ

セッション設定のカスタマイズ

Session Managerでは、組織の要件に応じて詳細な設定が可能です:

json
{
  "schemaVersion": "1.0",
  "description": "企業標準Session Manager設定",
  "sessionType": "Standard_Stream",
  "inputs": {
    "cloudWatchLogGroupName": "/company/sessionmanager/logs",
    "cloudWatchEncryptionEnabled": true,
    "cloudWatchStreamingEnabled": true,
    "s3BucketName": "company-session-audit-logs",
    "s3KeyPrefix": "sessions/",
    "s3EncryptionEnabled": true,
    "kmsKeyId": "arn:aws:kms:us-east-1:123456789012:key/company-ssm-key",
    "runAsEnabled": true,
    "runAsDefaultUser": "ssm-user",
    "idleSessionTimeout": "10",
    "maxSessionDuration": "30",
    "shellProfile": {
      "windows": "echo 'Windows Session Started' && date",
      "linux": "echo 'Linux Session Started - Company Policy Applied' && whoami && pwd"
    }
  }
}

VPCエンドポイントによるプライベートアクセス

プライベートサブネット内のインスタンスの場合、VPCエンドポイントを設定:

json
{
  "VpcEndpointType": "Interface",
  "ServiceName": "com.amazonaws.us-east-1.ssm",
  "VpcId": "vpc-12345678",
  "SubnetIds": ["subnet-12345678", "subnet-87654321"],
  "SecurityGroupIds": ["sg-12345678"],
  "PolicyDocument": {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
          "ssm:UpdateInstanceInformation",
          "ssm:SendCommand",
          "ssm:GetCommandInvocation"
        ],
        "Resource": "*"
      }
    ]
  }
}

必要なVPCエンドポイント:

  • com.amazonaws.region.ssm
  • com.amazonaws.region.ssmmessages
  • com.amazonaws.region.ec2messages

アクセス制御の詳細設定

時間ベースのアクセス制御

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ssm:StartSession",
      "Resource": "*",
      "Condition": {
        "DateGreaterThan": {
          "aws:RequestedRegion": "us-east-1"
        },
        "ForAllValues:StringEquals": {
          "aws:RequestedHour": ["09", "10", "11", "12", "13", "14", "15", "16", "17"]
        },
        "ForAnyValue:StringEquals": {
          "aws:RequestedDayOfWeek": ["1", "2", "3", "4", "5"]
        }
      }
    }
  ]
}

IP制限とMFA要求

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ssm:StartSession",
      "Resource": "*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": ["203.0.113.0/24"]
        },
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        },
        "NumericLessThan": {
          "aws:MultiFactorAuthAge": "3600"
        }
      }
    }
  ]
}

監視とアラート

CloudWatchメトリクス

Session Managerの重要なメトリクス:

メトリクス名説明単位推奨閾値
SessionsStarted開始されたセッション数Count-
SessionsTerminated終了されたセッション数Count-
SessionDurationセッション継続時間Seconds3600(警告)
FailedSessions失敗したセッション数Count1(警告)

アラート設定例

json
{
  "AlarmName": "SessionManager-LongRunningSession",
  "AlarmDescription": "Session running longer than 1 hour",
  "MetricName": "SessionDuration",
  "Namespace": "AWS/SSM-SessionManager",
  "Statistic": "Maximum",
  "Period": 300,
  "EvaluationPeriods": 1,
  "Threshold": 3600,
  "ComparisonOperator": "GreaterThanThreshold",
  "AlarmActions": [
    "arn:aws:sns:us-east-1:123456789012:session-alerts"
  ]
}

セッションログの分析

CloudWatch Logsでのセッション活動分析:

bash
# 特定ユーザーのセッション検索
aws logs filter-log-events \
  --log-group-name /aws/sessionmanager/sessions \
  --filter-pattern '{ $.userIdentity.principalId = "AIDACKCEVSQ6C2EXAMPLE" }' \
  --start-time 1609459200000

# 長時間セッションの検索
aws logs filter-log-events \
  --log-group-name /aws/sessionmanager/sessions \
  --filter-pattern '{ $.sessionDuration > 3600 }'

ベストプラクティス

セキュリティベストプラクティス

  1. 最小権限の原則: 必要最小限のリソースへのアクセスのみ許可
  2. MFA要求: 重要な環境へのアクセスにはMFAを必須化
  3. 時間制限: セッション時間とアイドル時間の適切な制限
  4. ログ監視: セッションログの継続的な監視と分析
  5. 定期的な権限見直し: アクセス権限の定期的なレビューと更新

運用ベストプラクティス

  1. 自動化: セッション設定の自動デプロイとコード管理
  2. 標準化: 組織全体での統一されたセッション設定
  3. 教育: 管理者向けのSession Manager活用トレーニング
  4. 文書化: アクセス手順とトラブルシューティングの文書化
  5. バックアップ: 重要なセッション設定のバックアップと復旧手順

トラブルシューティング

よくある問題と解決方法

問題: セッションが開始できない

bash
# SSM Agentの状態確認
sudo systemctl status amazon-ssm-agent

# IAMロールの確認
aws sts get-caller-identity
aws iam get-role --role-name EC2-SSM-Role

# インスタンスの登録状況確認
aws ssm describe-instance-information \
  --filters "Key=InstanceIds,Values=i-1234567890abcdef0"

問題: ネットワーク接続エラー

bash
# VPCエンドポイントの確認
aws ec2 describe-vpc-endpoints \
  --filters "Name=service-name,Values=com.amazonaws.us-east-1.ssm"

# セキュリティグループの確認
aws ec2 describe-security-groups --group-ids sg-12345678

まとめ

Session Managerは、従来のSSH接続に代わる次世代のリモートアクセスソリューションです。IAMベースの認証、包括的なログ記録、ネットワークセキュリティの向上により、より安全で効率的なインフラストラクチャ管理を実現できます。

適切な設定と運用により、セキュリティリスクを大幅に軽減しながら、管理者の生産性を向上させることが可能です。