LoginSignup
6
3

【AWS】Systems Manager でセッション暗号化 & セッションログ保存しようとしたらどハマりした話

Last updated at Posted at 2022-02-21

はじめに

Systems Manager は色々なことができますが、中でも Session Manager は踏み台なくして EC2 に接続できる便利機能です。
踏み台が廃止できるうえ、セッション暗号化がサポートされて更なるセキュリティ向上ができる!と思い、セッション暗号化とセッションログ保存をしようとしたところ結構ハマったので、やり方とハマりポイントを共有します。
SystemsManager.jpg

ちなみに、Session Manager 絡みの話は巷に溢れていますが、断片的なものが多いと感じたので本記事では以下を網羅的にまとめることを意識しています。

  • Session Manager で EC2 に接続するための基本設定
  • セッション暗号化に必要な設定
  • セッションログ保存に必要な設定

Session Manager で暗号化が必要な理由

Session Manager はマネジメントコンソールや AWS CLI から EC2 に接続できる機能です。
セッションを暗号化することで以下メリットがあります。

  • セキュリティ強化できるので機密情報のやり取りも安心
  • Fleet Manager でパフォーマンスカウンターやプロセスが表示できる ※超便利!

AWS Systems Manager Session Manager で、カスタムキーを使用したセッションの暗号化が可能に
Fleet Manager を KMS 暗号化を有効化して使う

セキュリティ考えたらセッションログの保存も必須、と考えたのが沼への入り口でした。。。

まずは結論から

以下設定を行います(沢山あります)。

(1) Session Manager で EC2 に接続するための基本設定

  • SSM Agent のインストール -> Systems Manager の 高速セットアップ が便利
  • Session Manager を使うための IAM ポリシー付与(EC2)
    • AmazonSSMManagedInstanceCore を付与すれば OK
  • Session Manager を使うための IAM ポリシー付与(ユーザー): AdministratorAccess が付与されているなら OK、個別設定する場合は以下を付与
    • ssm:StartSession
    • ssm:TerminateSession
    • ssm:ResumeSession
  • VPC エンドポイントの作成(プライベートサブネットに配置した EC2 の場合)
    • ec2messages.region.amazonaws.com
    • ssm.region.amazonaws.com
    • ssmmessages.region.amazonaws.com

(2) セッション暗号化に必要な設定

  • KMS キーの作成
  • 暗号化のための IAM ポリシー付与(EC2)
    • kms:Decrypt
  • 暗号化のための IAM ポリシー付与(ユーザー)
    • kms:GenerateDataKey
  • VPC エンドポイントの追加(プライベートサブネットに配置した EC2 の場合)
    • kms.region.amazonaws.com

(3) セッションログ保存に必要な設定

  • 保存先 CloudWatch ロググループ、S3 バケットの作成
  • CloudWatch へログ保存するための IAM ポリシー付与(EC2): CloudWatchAgentServerPolicy が付与されているなら追加不要、個別設定する場合は以下を付与
    • logs:CreateLogStream
    • logs:PutLogEvents
    • logs:DescribeLogGroups
    • logs:DescribeLogStreams
  • S3 へログ保存するための IAM ポリシー付与(EC2)
    • s3:PutObject
    • s3:GetEncryptionConfiguration (S3 バケットの暗号化が有効になっている場合)
  • VPC エンドポイントの追加(プライベートサブネットに配置した EC2 の場合)
    • s3.region.amazonaws.com
    • logs.region.amazonaws.com

解説

順を追って解説します。

0. 前提環境

  • VPC

    • 最低 1 つの VPC
    • サブネット: プライベートサブネット x1, パブリックサブネット x2 (実際はプライベートサブネット 1 つだけあれば良いです)
      0.1_VPC.png
      0.2_Subnets.png
  • EC2

    • セキュリティグループ: すべてのアウトバウンドを許可
    • EC2: Amazon Linux 2 (何でも良い)
      0.3_SG.png
      0.4_EC2.png

1. 基本設定

まずは暗号化しない通常の Session Manager の設定をします。

1.1 Session Manager の設定

高速セットアップの「Host Management」が便利です。
Quick Setup ホスト管理

1 から設定したい場合は、以下ドキュメントに従って設定します。
Session Manager のセットアップ

1.2 VPC エンドポイントの作成

プライベートサブネットの EC2 にアクセスできるよう VPC エンドポイントを作成します。
VPC エンドポイントは、必要な 3 つのサービス以外にパッチ適用などのために S3 へのエンドポイントも作成しておきます(この後の手順でも必要になります)。
エンドポイントは AZ ごとに作る点に注意してください。
セキュリティグループでは、VPC 内からの HTTPS(443) インバウンド を許可します。
1.1_VEP.png

人によってはまずここでハマると思います。
以下を参考にさせていただきましょう。

プライベートサブネットにある EC2 インスタンスを Systems Manager で管理する

1.3 接続確認

問題なく設定できていれば、セッションマネージャーでの接続ができるようになります。
1.2_SessionManager.png
1.3_Session.png

この時点では、Fleet Manager のパフォーマンスカウンターは見ることができません。
1.4_FleetManager.png

2. セッション暗号化を有効にする

暗号化を有効にします。

2.1 KMS キーの作成

暗号化に必要な KMS キーを作成します。
S3 や EBS などのように AWS マネージドキーがないため、カスタマーマネージドキーを作成します。
2.1_KMS.png

2.2 暗号化のための IAM ポリシー付与

作成した KMS キーを使うための IAM ポリシーを作成して、EC2、IAM ユーザーに付与(追加)します。

EC2用の追加ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "KMSキーのARN"
        }
    ]
}
IAMユーザー用の追加ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kms:GenerateDataKey",
            "Resource": "KMSキーのARN"
        }
    ]
}

2.3 KMS 用 VPC エンドポイントの追加

プライベートサブネットの EC2 が KMS にアクセスできるように KMS へのエンドポイントを作成します。
セキュリティグループは上で作成したものと同じものを設定します。
ここまででエンドポイントは 5 つになっているはずです(S3 エンドポイントを作成していない場合は 4 つ)。
2.2_VEP.png

ハマりポイント その 1 です。
EC2 から KMS に接続する必要があり、プライベートサブネットならさらにエンドポイントが必要という発想がありませんでした。

2.4 Session Manager 暗号化設定

Systems Manager のセッションマネージャー設定で、暗号化を有効にします。
KMS キーには先ほど作成したキーを指定します。
2.3_SSMEncryption.png

2.5 接続確認

設定に問題がなければ、セッションマネージャーで接続した際に「his session is encrypted using AWS KMS.」と表示されます。
(設定に不備があるとエラーが表示されます)
2.4_Session.png

また、Fleet Manager のパフォーマンスカウンターやプロセスが確認できるようになりました。
2.5_Fleetmanager1.png
2.6_FleetManager2.png

3. セッションログを保存する

セッションログの保存設定をします。
保存先には CloudWatchS3 が個別に指定できます。
ここでは、両方設定していきます。

3.1 ログ保存先 CloudWatch ロググループ、S3 バケットの作成

CloudWatch ロググループを作成します。
ここまで読まれた方はセキュリティをガチガチに固めたいはずなので、もちろんロググループも暗号化します。
3.1_CloudWatch.png

先ほど作成した KMS キーを使用する場合は、キーポリシーに CloudWatch への使用許可を追加しましょう。

CloudWatchで使用するためのキーポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::************:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        // 追加分ここから
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.ap-northeast-1.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:ReEncrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "*"
        }
        // ここまで
    ]
}

もう 1 つの保存先である S3 バケットを作成します。
3.2_S3.png

S3 バケットももちろん暗号化しますが、こちらは AWS マネージドキーが使えます(aws/s3)。
3.3_S3-KMS.png

3.2 ログ保存のための IAM ポリシー付与

CloudWatch にログを保存するため、EC2 に必要なポリシーを付与(追加)します。
CloudWatch エージェントを導入する前提で CloudWatchAgentServerPolicy が付与されていれば良いです。

S3 にログを保存するため、EC2 に以下のポリシーを付与(追加)します。

S3保存のためのポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "S3バケットのARN/*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetEncryptionConfiguration",
            "Resource": "*"
        }
    ]
}

ハマりポイント その 2 です。
追加で IAM ポリシーいるんだろうな、というのは何となく分かるのですが、何が必要かズバリの情報に辿り着くのに時間が掛かりました。

3.3 CloudWatch 用 VPC エンドポイントの追加

プライベートサブネットの EC2 が CloudWatch にアクセスできるようにエンドポイントを作成します。
もし S3 へのエンドポイントを作成していない場合はここで作成します。
全部でエンドポイントは 6 つになっているはずです。
3.4_VEP.png

3.4 Session Manager ログ保存設定

Systems Manager のセッションマネージャー設定で、ログ保存を有効にします。
上で作成した CloudWatch ロググループ、S3 バケットを指定します。
セキュリティを考慮して、暗号化された保存先のみ許可する設定もオンにしておきます。
3.5_SSMLoggingCloudWatch.png
3.6_SSMLoggingS3.png

3.5 接続確認

おめでとうございます。
設定に問題がなければ、セッションマネージャーでの接続が引き続きできるようになっているはずです。
(設定に不備があるとエラーが表示されたり、黒い画面のままプロンプトが出てきません)

さいごに

正直、セッション暗号化とログ保存を設定するためだけに、こんなに労力が掛かるとは思っていませんでした・・・
が、おかげで Systems Manager、VPC、IAM にはだいぶ詳しくなれた気がします。

参考

以下記事を参考にさせていただきました。
ありがとうございました。

SSM セッションマネージャーで KMS 暗号化を有効化したらつながらなくなった話
Session Manager のカスタム IAM ロールを作成
Systems Manager の IAM インスタンスプロファイルを作成する
Session Manager の追加サンプル IAM ポリシー
Systems Manager 用の VPC エンドポイントを作成する

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3