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鍵管理が不要になります。
{
"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は、すべてのセッション活動を自動的に記録し、暗号化して保存します:
{
"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を使用するための前提条件:
- SSM Agent: 対象インスタンスにSSM Agentがインストール・起動されている
- IAMロール: インスタンスに適切なIAMロールが付与されている
- ネットワーク: アウトバウンドHTTPS(443)通信が可能
EC2インスタンスの設定
1. IAMロールの作成と割り当て
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
管理ポリシー AmazonSSMManagedInstanceCore
をアタッチ:
aws iam attach-role-policy \
--role-name EC2-SSM-Role \
--policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
2. インスタンスプロファイルの作成
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インスタンスへの割り当て
aws ec2 associate-iam-instance-profile \
--instance-id i-1234567890abcdef0 \
--iam-instance-profile Name=EC2-SSM-InstanceProfile
セッション開始方法
AWS Management Consoleからの接続
- EC2コンソール → インスタンス選択
- 「接続」ボタン → 「Session Manager」タブ
- 「接続」をクリック
AWS CLIからの接続
# 基本的な接続
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では、組織の要件に応じて詳細な設定が可能です:
{
"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エンドポイントを設定:
{
"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
アクセス制御の詳細設定
時間ベースのアクセス制御
{
"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要求
{
"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 | セッション継続時間 | Seconds | 3600(警告) |
FailedSessions | 失敗したセッション数 | Count | 1(警告) |
アラート設定例
{
"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でのセッション活動分析:
# 特定ユーザーのセッション検索
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 }'
ベストプラクティス
セキュリティベストプラクティス
- 最小権限の原則: 必要最小限のリソースへのアクセスのみ許可
- MFA要求: 重要な環境へのアクセスにはMFAを必須化
- 時間制限: セッション時間とアイドル時間の適切な制限
- ログ監視: セッションログの継続的な監視と分析
- 定期的な権限見直し: アクセス権限の定期的なレビューと更新
運用ベストプラクティス
- 自動化: セッション設定の自動デプロイとコード管理
- 標準化: 組織全体での統一されたセッション設定
- 教育: 管理者向けのSession Manager活用トレーニング
- 文書化: アクセス手順とトラブルシューティングの文書化
- バックアップ: 重要なセッション設定のバックアップと復旧手順
トラブルシューティング
よくある問題と解決方法
問題: セッションが開始できない
# 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"
問題: ネットワーク接続エラー
# 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ベースの認証、包括的なログ記録、ネットワークセキュリティの向上により、より安全で効率的なインフラストラクチャ管理を実現できます。
適切な設定と運用により、セキュリティリスクを大幅に軽減しながら、管理者の生産性を向上させることが可能です。