【Terraform】EC2にSession ManagerでSSHできるようにする

AWS Systems Manager

 

EC2にSSHする際の鍵の管理って大変ですよねー

22ポートの穴あけもしなければいけないので管理が面倒。。。

 

そんなお悩みはAWS Systems ManagerのSession Managerを使用すれば解決できます

概要や動作するイメージからTerraformでの設定方法を紹介していきます

 

Session Managerとは

 

鍵不要、22ポートの穴あけ不要でEC2へアクセスできるAWS Systems Managerの機能の1つ。

アクセスするにはAWSコンソールやAWS CLIを使用します

 

操作ログはCloudWatch LogsやS3で保管することができます。

アクセスしたIAMユーザの履歴をCloudTrailに残すこともできます。

 

プライベートサブネットのEC2にもアクセスできるので踏み台サーバがいりません。

また、IAMロールでIAMユーザのアクセス制御を行えます

 

Session Managerに関する公式ドキュメントは↓になります

 

イメージ

 

実装に入る前に

Session ManagerはどのようにしてEC2へアクセスするか気になりませんか?

 

BlackBeltの60Pに答えがありました。

 

 

  1. AWS コンソールやCLIでSession Managerへアクセス
  2. SSM Agent経由でEC2にアクセス
    SSM AgentがSession Managerを見に行くため、EC2側にIAMロールが必要

 

操作ログもEC2にS3やCloudWatch Logsへのアクセス権限(IAMロール)がないとダメです

 

ゴール

 

  1. パブリックサブネットにあるEC2にSession Managerを使用してアクセスする
  2. 操作ログがS3に出力されたことを確認する

 

実装方針

 

Session Manager のセットアップ - AWS Systems Manager
Session Manager をセットアップして、アカウント内のマネージドノードに接続します。

↑を参考に今回は以下のステップで実装していきます

 

  1. EC2インスタンスにSSM Agentをインストールする
  2. 操作ログ用のS3バケットを作成する
  3. Session ManagerおよびS3にアクセスするIAMポリシーを作成する
  4. IAMロールを作成する
  5. インスタンスプロファイルを作成し、EC2にアタッチする
  6. 操作ログをS3に保存するようにSession Managerの設定をする

 

すでにパブリックサブネットにEC2が起動しているものとします

 

やらないこと

 

クライアント(IAMユーザ)ー EC2間で送信されるセッションデータの暗号化はしません。

 

Terraform

EC2インスタンスにSSM Agentをインストールする

 

EC2にSSM AgentがインストールされていないとSession Managerが使えません。

ただ、特定のAMIを使用していればすでにインストールされており、作業はありません。

私が使用しているAmazon Linux 2023はその対象でありすでにインストールされています

 

SSM Agentをインストール済みのAMIは↓をご覧ください

 

インストール済みのAMIではなかった方は↓を参考にしてみてください

 

操作ログ用のS3バケットを作成する

 

操作ログを保存しておくS3バケットを作成します。

パブリックアクセスもブロックしておきます

バケット名は世界で一意のため、各々変えてください

 

 

Session ManagerおよびS3にアクセスするIAMポリシーを作成する

 

公式ドキュメントによると、

Session Managerを使うにはAmazonSSMManagedInstanceCoreというIAMポリシーが必要。

このポリシーはAWSが管理しており新規に作成する必要はありません。

 

操作ログをS3に保存するために必要な権限はこちらを参考に、

  • s3:PutObject
  • s3:GetEncryptionConfiguration
今回、S3の暗号化にはデフォルト設定であるSSE-S3を使用しています。
なので、KMS系の権限は不要です

 

なので、IAMポリシーを作成する流れとしては

  1. AmazonSSMManagedInstanceCoreを参照する
  2. 1.にS3系の権限を追加する
  3. 2.をもとに新しいIAMポリシーを作成する

 

 

IAMロールを作成する

 

ここでやっていることは

  1. aws_iam_roleでIAMロールを作成。
  2. EC2がIAMポリシーを使えるように信頼ポリシーを定義し、IAMロールに紐づけ。
  3. IAMポリシーをIAMロールへ紐づけ。

 

 

インスタンスプロファイルを作成し、EC2にアタッチする

 

先ほど作成したIAMロールをもとにインスタンスプロファイルを作成します

 

これをEC2にアタッチします。すでにあるaws_instanceブロックに1行追加します

 

操作ログをS3に保存するようにSession Managerの設定をする

 

Session Managerの設定はSSMのドキュメントを使用します。

具体的には、↓のリポジトリを参考にコードを書きました

 

バケット名は各々変えてください

 

プロパティ 説明
name ドキュメント名。
document_type ドキュメントのタイプ。
Session Managerで使用するため、「Session」を指定。
document_format ドキュメントのフォーマット。JSONかYAMLか選べる
content ドキュメントの中身。
フォーマットをJSONにしたので、jsonencodeでJsonへ変換
 schemaVersion スキーマのバージョン。
2023/11時点で1.0のみサポートされている。
 description 説明。わかりやすいように入れておけばOK
 sessionType セッションのタイプ。
参考にしたコードから「Standard_Stream」のまま。
 inputs セッションに対する設定。
  s3BucketName ログを保存するS3バケット名。
  s3KeyPrefix S3のどの階層に保存するか。
  s3EncryptionEnabled 操作ログを暗号化するか。
trueにした場合、S3は暗号化されている必要がある。
ただ、フォルトでS3は暗号化されているため設定は必要ない。

 

 

完成したコード

 

 

動作確認

 

コードが完成したら、terraform applyして動作確認をしていきます

 

Session Managerを使ってEC2にSSH接続する

 

AWSコンソールを使用してSSH接続を試してみます。

IAMロールの反映に時間がかかる場合があるので、
うまくいかないときはすこし時間をおいて試してみましょう!

 

CLIでアクセスする方法は下記を参考にしてみてください

 

Systems Manager  > Session Manager にいき、「セッションの開始」をクリック

 

接続したいインスタンスを選択して、「Next」をクリック

 

Terraformで作成したSSM ドキュメントを選択し、「Next」をクリック

 

Start session」をクリックして、EC2にアクセス

 

アクセスできました!

右上の「終了」をクリックすると、ダイアログが表示されます。

 

もう一度「終了」をクリックすると、セッションを閉じることができます

 

操作ログの確認

 

操作ログの保存先のS3バケットを見てみると、session_managerというフォルダがあります

※フォルダ名はSSM ドキュメントのs3KeyPrefixで設定した文字列

 

この中にlogファイルが保存されています!

 

SSM ドキュメントも確認してみる

 

一応、SSM ドキュメントも確認しておきます

Systems Manager > ドキュメント > 自己所有 で確認できます

 

最後に….ハマりポイント

 

S3にログが保存されず、かなりハマりました。

原因はIAMロールに適切な権限を設定していなかったから。

 

エラーメッセージが出るわけではないので原因の特定に時間がかかりました。

 

S3に操作ログが保存されないよーという方は

インスタンスプロファイルのIAMロールを確認してみてください

 

参考

 

AWS Systems Manager Session Manager - AWS Systems Manager
監査可能かつ安全なワンクリック・ブラウザ ベースのインタラクティブシェル、またはインバウンド ポートを開かずに AWS CLI を使用してノードを管理します。

https://pages.awscloud.com/rs/112-TZM-766/images/20200212_AWSBlackBelt_SystemsManager_0214.pdf

セッションマネージャーを使って鍵ストレスの無いEC2アクセス! | DevelopersIO
どうもGre212です。 みなさん、踏み台サーバーの管理やEC2インスタンスの鍵の管理など面倒に感じたことはありませんか? その悩み、もしかしたらセッションマネージャーで解決できるかもしれません! 意外と便利なセッション …
TerraformでIAMを設定してEC2にセッションマネージャー経由で接続してみる - Qiita
はじめにTerraformの勉強を始めたので備忘録を兼ねて行ったことを投稿しようと思います。これは前回の投稿の続きです。前回の投稿ではTerraformでEC2の作成を行いました。今回は作成…
AWSでセッションマネージャのログ出力をする際の設定と注意事項、ハマりどころなど

コメント

タイトルとURLをコピーしました