AWSのEC2インスタンスへの接続にSession Managerを使ってみた
こんにちは!家にいてもなかなか仕事へのセッションを切ることができないあさっちです。
これまでサービスが稼働しているAWSのEC2インスタンスにアクセスするには、鍵ファイルを使ったSSH接続を利用していたのですが、セキュリティ面を考慮してAWS Systems Manager Session Manager(以下Session Manager)に変更することにしました。今回はその目的や手順についてお話したいと思います。
変更する目的
弊社ライフイズテックでは、サービスを稼働させるクラウドプラットフォームとして主にAWSを利用しています。最近では運用コストを考慮してECS FargateやApp Runnerなどサーバーレスの構成にすることが多くなってきましたが、古くから動いているサービスではEC2インスタンスにSSHで接続して作業を行う機会もまだ残っています。
鍵ファイルを使ってSSHで接続する場合に、挙げられる課題としては以下の3つがあります。
1. 22番ポートを開放する必要がある
EC2インスタンスにSSHで接続する場合、セキュリティグループで22番ポートを開放する必要があります。オフィスやVPNからなど、必要なIPアドレスのみを許可することが多いと思いますが、うっかり全開放してしまいセキュリティリスクの一つになってしまう可能性もあります。
GuardDutyで監視していると、EC2インスタンスに対するポートスキャンの攻撃は頻繁に行われているようなので、できるだけポートは閉じておきたいところです。
2. ユーザーと鍵ファイルの管理が大変
それぞれのEC2インスタンスに必要なユーザーを作成して鍵や権限を設定するのが理想ではありますが、管理するインスタンスが増えてくると運用の手間がかかってしまいます。インスタンス作成時に設定した鍵ファイルを配布してSSHで接続してもらうこともできますが、同じユーザーでログインすることになるため、実際に誰が作業したのかが分かりにくくなります。
また、AWSで作成した鍵ファイルでログインすると、そのままだとrootユーザーに昇格することもできるため、「最小権限の原則」に反して過剰に権限が付与されてしまいます。鍵ファイルのローテーションや漏洩した場合のセキュリティリスクも考える必要があります。
3. 作業ログを残す設定が必要
サービス障害やセキュリティインシデント起こった場合、原因を調査をしたり振り返りを行ったりするために、サーバーで行った作業のログを保存する必要があります。
ログを取るためには、インスタンスに監査ログを出力する設定を入れる、作業の最初にscriptコマンドを実行するなどの方法が考えられますが、こちらも管理するインスタンス数が多くなった場合の運用や手動による作業漏れといった課題があります。
そこで、Session Managerの機能を使うと、以下のようなメリットがあります。
セキュリティグループでポートを開放する必要がなく、攻撃を受けるリスクが下がる。
鍵ファイルが不要になり、IAMポリシーの権限でユーザーからEC2インスタンスへの接続を管理できるようになる。
AWSコンソール上で設定するだけで、S3やCloudWatchにログを保存できる。
利用する準備
ここからSession Managerを利用してEC2インスタンスに接続できるようになるまでの手順をご説明します。
1. EC2インスタンスにAWS Systems Manager Agentをインストール
最初にEC2インスタンスにAWS Systems Manager Agent (SSM Agent)をインストールします。OSとアーキテクチャーごとにパッケージが用意されていますので、パッケージに合わせたコマンドを実行する形になります。
例えば、OSがAmazon Linux 2023、CPUのアーキテクチャーがARM64の場合、こちらのコマンドでインストールできます。他のOSやアーキテクチャーについては、公式ドキュメントを参考にしてください。
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_arm64/amazon-ssm-agent.rpm
2. EC2インスタンスとIAMユーザーにポリシーをアタッチ
まずEC2インスタンスには、AWS Systems Managerからインスタンスへの接続を許可するためのIAMロールを作成してアタッチします。 IAMロールに追加する必要があるポリシーは、AmazonSSMManagedInstanceCoreです。
IAMユーザーにも、コンソールでインスタンスを表示してSession Managerで接続するためのポリシーをアタッチします。詳細は公式のサンプルを参考にしてください。
3. ログの設定
Session Managerが利用されたときに自動的にログを出力するには、AWSコンソールのセッションマネージャーの画面で設定します。CloudWatch logsとS3にログを出力することができますが、今回はS3に保存する設定を行います。
AWS System Managerのメニューから、セッションマネージャーを選び、「設定を行う」ボタン、または、「設定」タブを押す
編集ボタンを押して、設定内容を入力します。
「Send session logs to S3」の「Enable」のチェックボックスにチェックを入れます。
暗号化を必須にする場合、「Allow only encrypted S3 buckets」のチェックボックスにチェックを入れます。
「Choose S3 bucket」に出力するS3バケット名を入力します。
プレフィックスを付ける場合は、「S3 のキープレフィックス」を設定します。
接続手順
コンソールから接続
ここまで設定できたら、AWSコンソールからSession Managerを利用してEC2インスタンスに接続してみます。
AWSコンソールでEC2の「インスタンス」画面にアクセスして、対象のEC2インスタンスにチェックを入れます。上にある「接続」ボタンを押します。
「セッションマネージャー」タブを選択して「接続」ボタンを押します。
ブラウザの別ウィンドウでターミナル画面が表示されます。idコマンドを実行すると、ssm-userというユーザーでログインしているようです。
端末のターミナルから接続
AWSコンソールにログインしてからEC2インスタンスに接続するのは少し手間がかかりますので、端末のターミナルからつなぐ手順もご紹介します。
最初に端末にSession Managerプラグインをインストールします。Appleシリコン搭載のMacだと以下のコマンドです。公式ドキュメントを参考に各環境に合わせてインストールしてください。
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac_arm64/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
Sesson Managerプラグインがインストールできたら、EC2インスタンスのIDと、必要があればプロファイルを指定して接続します。
aws ssm start-session --target i-xxxxxxxxxxxxxxxxx
Starting session with SessionId: (ユーザー名)-(セッションID)
正常に接続できたら、Starting session…と表示されて、SSHやコンソールからSession Managerで接続したときと同じようにコマンドが実行できるようになります。
まとめ
今回は、Session Managerを利用してEC2インスタンスに接続する手順をご紹介しました。Session Managerで接続できるユーザーの権限をどのように分けて管理していくかといった課題も残っていますが、セキュリティリスクが下がりログも簡単に残すことができるので、今後も活用していきたいと思います。それでは、また!
ライフイズテック サービス開発部では、気軽にご参加いただけるカジュアルなイベントを実施しています。開催予定のイベントは、 connpass のグループからご確認ください。興味のあるイベントがあったらぜひ参加登録をお願いいたします。皆さんのご参加をお待ちしています!