AWS EC2 Instance Connect を使ってログ機能を付与してみよう

AWSにサインアップしてマネージメントコンソールにログインすれば、すぐに様々な作業を始めることができます。Webブラウザを通じて、インフラ管理も含め、幅広い操作が可能です。

例えば、インフラ管理者がOSを選択してインスタンスを構成し、Web開発者や外部スタッフにOS操作を任せる場合に、Amazon LinuxなどのOSに簡単にSSHアクセスできると、管理の負担が軽減されます。そのためには、AWS EC2 Instance Connect (EIC) の利用が便利です。

今回は、EICの機能や設定手順、似た機能を持つAWS Systems Manager Session Manager(Session Manager)との違いや、実際のログ機能の付与の方法を説明します。

AWS EC2 Instance Connectとは

AWS EC2 Instance Connect(EIC)は、無料で利用できるAWSのサービスで、SSHを使ってEC2インスタンスへ、セキュアに接続できます。 機能は以下の通りです。

メリット

  • 簡単な接続:AWSマネジメントコンソールから直接接続可能です。パブリックIPとプライベートIPの各環境でも利用可能ですが、プライベートIPはVPN経由で行う必要があります。
  • セキュリティ:一時的なSSHキーを使用し使用後はキーが削除されるので、セキュリティリスクが低減されます。
  • アクセス管理:IAMポリシーを使ってどのユーザがどのインスタンスにアクセスできるか制御できます。
  • 利便性:アクセス後に削除されるSSHキーを使用するため、長期間SSHキーを管理する必要はありません。踏み台サーバを経由せずにアクセスするので、手順が簡略化でき、管理がシンプルになります。

利用シーン

EICは迅速にインスタンスへアクセスすることが求められる時の利用が向いています。例えばスピードが求められる開発者がデバックやテストを行う際に最適です。

設定手順

EICを使ってEC2インスタンスに接続するための手順を説明します。手順は以下の通りです。

1. IAMロールの設定
2. EC2インスタンスの起動
3. セキュリティグループの設定
4. EC2 Instance Connectの使用

EICの説明図

IAMロールの設定

最初に、EC2インスタンスに適切なIAMロールをアタッチする必要があります。アタッチの手順は以下の通りです。

  1. IAMコンソールにアクセス:AWSマネジメントコンソールからIAMサービスにアクセスします。
  2. ロールの作成:新しいロールを作成し、「EC2」を選択します。
  3. ポリシーのアタッチ:デフォルトで準備されているAmazonEC2RoleforSSMポリシーをアタッチします。このポリシーはEC2インスタンスに必要な権限を付与します。
  4. ロールのアタッチ:作成したロールをEC2インスタンスにアタッチします。

EC2インスタンスの起動

IAMロールの設定が終わったら、EC2インスタンスを起動します。

  1. EC2コンソールにアクセス:AWSマネジメントコンソールからEC2サービスにアクセスします。
  2. インスタンスの起動:「インスタンスの起動」ボタンをクリックし、必要な設定を行います。
  3. IAMロールの選択:インスタンスの設定中に、先ほど作成したIAMロールを選択します。

セキュリティグループの設定

EC2インスタンスの起動を終えたら、セキュリティグループを設定して、SSHアクセスを許可します。

  1. セキュリティグループの作成:新しいセキュリティグループを作成し、インバウンドルールでポート22(SSH)を許可します。
  2. セキュリティグループのアタッチ:作成したセキュリティグループをEC2インスタンスにアタッチします。

EICの使用

上記の準備を終えたら、EICを使ってインスタンスに接続します。

以下の手順で接続してください。  

  1. EC2コンソールにアクセス:AWSマネジメントコンソールからEC2サービスにアクセスします。
  2. インスタンスの選択:接続したいインスタンスを選択します。
  3. 接続ボタンをクリック:「接続」ボタンをクリックし、「EC2 Instance Connect」を選択します。
  4. 接続:「接続」ボタンをクリックすると、ブラウザ上でSSHセッションが開始されます。
  1. 「インスタンスに接続」に遷移するので、画面中部の「接続タイプ」の項目にて、EIC(パブリックIP経由)を選びます。

  1. 「接続」ボタンをクリックすると、ブラウザ上でSSHセッションが開始されます。「接続タイプ」で選択した「EC2 Instance Connectを使用して接続する」の項目の下にIPアドレスが表示されます。

これで、EICを使ってEC2インスタンスに接続する準備が整いました。実際にパブリックIPの構成で、容易にSSHでOSにアクセスすることができました。

パブリック環境からのアクセスの構成図

AWS Systems Manager Session Managerとの違い

EICと似たサービスである、AWS Systems Manager Session Manager(Session Manager)との違いについて、それぞれの違いは以下の表の通りです。

項目EC2 Instance Connect (EIC)Session Manager
接続方法一時的なSSHキーを使い、 ブラウザから直接SSH接続が可能初期設定が必要だがSSHトンネリング、RDP接続などができる
耐障害性ブラウザベースでの接続に特化し、耐障害性は依存する構成次第である複数サブネットにVPCエンドポイントを作成可能で、AZ障害に対応
セキュリティポート22を開ける必要があり、セキュリティリスクありポート22を開ける必要がなく、セキュリティリスクは低い
ログ管理インスタンス内にSSHのアクセスログが記録されるCloudWatch LogsやS3に操作ログを保存可能
コスト追加コストなしVPCエンドポイントの利用料が発生
必要なIAMポリシーec2-instance-connect:SendSSHPublicKeyなどssm:StartSession, ssm:SendCommand, ssm:DescribeInstanceInformation など
最大Session時間最大1時間最大24時間

どちらを選ぶかは、使用ケースやセキュリティ要件によります。サクッと接続したければEIC、セキュリティ要件が厳しい場合はSession Managerがそれぞれ向いている場合が多いです。しかし、どちらも一長一短があるので、管理や利用要件から具体的なニーズに合わせて選択をしましょう。

Session Managerについては以下の記事で詳しく説明しています。ぜひお読みください。
Session Managerを利用してEC2へセキュアに接続する方法|ベアサポートブログ

EICにログ機能を付与してみよう

EICには操作ログの出力後、証跡ログとして扱い、管理保管する機能がありません。しかし、セキュリティやコンプアイアンスの観点から、操作ログを記録して保管することは重要です。今回は、EICでも操作ログを保管できるように、CloudWatch logsに送信して、S3のストレージに保存する方法を説明します。方法の流れは以下の通りです。

  1. IAMロールの設定
  2. CloudWatchエージェントのインストールと設定
  3. CloudWatch LogsからS3への転送
  4. CloudWatch Logsの設定
  5. S3バケットの設定

IAMロールの設定

まず、EC2インスタンスに適切なIAMロールをアタッチします。このロールには、CloudWatch LogsとS3に書き込むための権限が必要です。具体的には、以下のポリシーをアタッチしたIAMロールを作成した後、EC2インスタンスにアタッチします。


JSON { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "s3:PutObject" ], "Resource": "*" } ] }

CloudWatchエージェントのインストールと設定

EC2インスタンスにCloudWatchエージェントをインストールし、ログをCloudWatch Logsに送信します。以下のコマンドをCloudWatchのマネジメントコンソールに入力してください。

  1. CloudWatchエージェントのインストール:sudo yum install -y amazon-cloudwatch-agent
  2. CloudWatchエージェントの設定:sudo/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

設定ウィザードを使用して、ログファイルのパスやロググループ名を指定します。

CloudWatch LogsからS3への転送

CloudWatch Logsに保存されたログをS3に転送するために、Amazon Data Firehose(旧Amazon Kinesis Data Firehose )を使用します。設定方法は以下の通りです。

デリバリーストリームの作成

Kinesis Data Firehoseコンソールから新しいデリバリーストリームを作成し、宛先をS3に設定します。

CloudWatch Logsとの統合

CloudWatch LogsのロググループからKinesis Data Firehoseにログを転送する設定を行います。

CloudWatch Logsの設定

CloudWatch Logsでロググループを作成し、EC2インスタンスからのログを受信します。CloudWatchコンソールから新しいロググループを作成した後、CloudWatchエージェントの設定で指定したロググループ名と一致させることでログの受信が可能になります。

 S3バケットの設定

S3バケットを作成し、Kinesis Data Firehoseからのログを受信します。バケットの作成方法は以下の通りです。

1.S3コンソールから新しいバケットを作成します。
2.必要に応じてバケットポリシーを設定し、アクセス制御を行います。

まとめ

このように設定することで、EICを使用した操作ログをCloudWatch Logsに保存し、さらにKinesis Data Firehoseを使用してS3に転送することが可能です。これにより、長期的なログの保管と監査が容易になります。S3バケット利用料は課金されますが、ログ排出量によっては微々たる金額です。

参考

DevelopsIO 「EC2インスタンス内のログをCloudWatch LogsとS3バケットに保存してみた」https://dev.classmethod.jp/articles/ec2-to-cwl-s3/(2024/11/6 確認)

Qiita 「【AWS】EC2のログをCloudWatchに送る」
https://qiita.com/flySheep/items/b163b42f48a626b463f7(2024/11/6 確認)

Modern Technologist 「Checking EC2 Instance Logs in CloudWatch: A Comprehensive Guide」
https://moderntechnologist.com/how-to-check-ec2-instance-logs-in-cloudwatch/(2024/11/6確認)

特定のユーザーのみがログを閲覧できるように設定しよう

4の方法だと、操作したユーザがログや証跡を確認することができるので、監査の信頼性が乏しい可能性があります。そこで、ログや証跡を残しつつも実操作したユーザには閲覧権限を与えず、特定のユーザーのみが閲覧可能になるよう、設定方法を説明します。手順は以下の通りです。

1. CloudTrailの設定
2. CloudWatch Logsの設定
3. IAMポリシーの設定
4. S3バケットポリシーの設定

 CloudTrailの設定

CloudTrailを使用して、誰が、いつ、どんな操作をしたかを記録します。最初に有効化を行い、その後設定を行います。作業手順は以下の通りです。

CloudTrailの有効化

  1. AWSマネジメントコンソールからCloudTrailサービスにアクセスし、新しいトレイルを作成します。
  2. S3バケットを指定して、ログを保存します。

CloudTrailの設定

  1. 管理イベントを有効にして、APIコールを記録します。
  2. S3やLambdaなどのデータイベントも記録する場合は、これらを有効にします。

 CloudWatch Logsの設定

CloudWatch Logsを使用して、操作ログを詳細に記録します。作成方法は以下の通りです。

  1. CloudWatchコンソールから新しいロググループを作成します。
  2. CloudWatchエージェントを使用して、EC2インスタンスからのログをこのロググループに送信します。

IAMポリシーの設定

操作ログの閲覧権限を制御するために、IAMポリシーを設定します。ポリシーは以下の通りです。


JSON
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams",
        "logs:GetLogEvents",
        "logs:FilterLogEvents"
      ],
      "Resource": "arn:aws:logs:us-west-2:123456789012:log-group:*"
    },
    {
      "Effect": "Deny",
      "Action": [
        "logs:DeleteLogGroup",
        "logs:DeleteLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:us-west-2:123456789012:log-group:*"
    }
  ]
}

このポリシーを監査スタッフのIAMユーザーまたはグループにアタッチします。

S3バケットポリシーの設定

S3バケットに保存されたログのアクセスを制御します。以下のポリシーをS3パケットに適用させてください。


JSON
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams",
        "logs:GetLogEvents",
        "logs:FilterLogEvents"
      ],
      "Resource": "arn:aws:logs:us-west-2:123456789012:log-group:*"
    },
    {
      "Effect": "Deny",
      "Action": [
        "logs:DeleteLogGroup",
        "logs:DeleteLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:us-west-2:123456789012:log-group:*"
    }
  ]
}

まとめ

これらの設定により、操作ログを詳細に記録し、特定のユーザーがログを閲覧できるようにすることができます。実操作したユーザーはログを閲覧できず、閲覧権限が必要な管理者や監査スタッフのみがアクセス可能です。
EC2のサーバ単位でサクッと使う際に、EICは便利なサービスです。
もし、コストをかける案件で、ISMS認証などが必要な環境を使うなら、Session Managerの使用も検討した方が良いかもしれません。