目次
- はじめに
- AWS SessionManagerを利用した接続の種類
- Webブラウザ版
- AWSCLI版
- AWSCLI版・ポート転送
- AWS SessionManager接続のアクセス制限方法
- AWS SessionManagerが利用するssm-userの特権の変更方法
はじめに
AWSではEC2インスタンスへ接続する方法として、AWS Session Manager が提供されています。こちらの機能は AWS Systems Manager の一部として 2018年9月にリリース されました。その後、 ポート転送の機能追加 や EC2コンソールへの統合 などを経て、現在はかなり活用しやすくなったと感じています。
AWS Session Managerでは、EC2インスタンスへの接続ポリシーをIAMで管理できるのが特徴です。従来のSSH接続と比べてセキュリティを強化し、運用コストを削減できます。
ただ実際に導入を進めると、AWSCLIの導入可否やファイル転送の有無など、利用者の要件に応じて幾つかの方法から選んでもらう必要があり、利用者向けの説明を念入りに行う必要がありました。
そこで今回は、現時点で利用できるSSMエージェントを利用したEC2インスタンスへの接続方法を整理してみます。
AWS SessionManagerを利用した接続の種類
まず、AWS SessionManagerの利用者側の要件として、3つのポイントを確認しておきます。
- 追加のアプリケーション(awscli+session-manager-plugin)をインストールしてもよいか
- WinSCP等のファイル転送ソフトを利用するか
- リモートデスクトップを利用するか
要件に応じて、以下の3種類から適切な接続方法を選択します。
いずれの場合も、EC2インスタンスにはSSMエージェントが必要です。Amazon Linux以外ではインストールが必要ですので AWS Systems Manager ユーザーガイド - SSM エージェント の使用 を参照してください。
それぞれの接続方法について説明します。
Webブラウザ版
Webブラウザ上でAWSマネジメントコンソールに接続して、SessionManager画面から利用します。アプリケーションの追加導入ができない場合、利用できるのはマネジメントコンソール版のみとなります。テキストのコピー&ペースト処理など、TeraTermのような専用のターミナルアプリに比べて出来ることが少ないので、対応不可能な業務もありそうです。また、現時点でファイルの転送機能は無く、基本的にインスタンス内のデータを表示することしかできません。
AWSCLI版
AWSCLIコマンド経由で、EC2インスタンスのシェルにログインする方法です。Webブラウザ版と同様にファイル転送機能はありません。普段から使い慣れたAWSCLIを利用できるので、使い勝手を重視する場合はこちらを利用するのが良いと思います。
PS> aws ssm start-session --profile <AWSCLI に設定済みのプロファイル名> `
--target <EC2インスタンスID>
AWSCLI版・ポート転送
AWSCLI版のポート転送機能では、クライアントとEC2インスタンス間にトンネル接続を作成できます。トンネル接続を利用すると、任意のアプリケーションを使ってEC2インスタンス上のアプリケーションと安全に接続できます。例えば、WinSCPのようなGUI経由のファイル送受信や、リモートデスクトップ接続などでも、セキュリティグループでSSHポートやRDPポートを開放する必要がありません。
PS> aws ssm start-session --profile <AWSCLIに設定済みのプロファイル名> `
--target <EC2インスタンスID> `
--document-name AWS-StartPortForwardingSession `
--parameters '{\"portNumber\": [\"<EC2 インスタンス側のポート番号>\"],\"localPortNumber\": [\"<ローカル側のポート番号>\"]}'
AWS SessionManager接続のアクセス制限方法
SSMエージェントは、Linuxの場合はrootアクセス権限、Windowsの場合はSYSTEMアクセス権限を使用して、EC2インスタンスへアクセスします。SSMエージェントで接続できるIAMユーザやIAMロールと、対象のEC2インスタンスの特権アクセスを持つこととは、イコールです。
そのため、特権行使できる範囲を適切な方法で限定する必要があります。
IAMポリシーを使用してインスタンス単位で接続を限定する方法
AWSのユーザーガイド では、IAMポリシーを使用したアクセス制限方法が掲載されています。
例えば、以下のようにインスタンスIDを含んだIAMポリシーを使用して、特定のインスタンスだけに接続許可を与えることも可能です。ただし、TerminateSessionを限定するため、終了できるセッションは自分で作成したセッションのみです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:StartSession"
],
"Resource": [
"arn:aws:ec2:us-east-2:123456789012:instance/i-1234567890EXAMPLE",
"arn:aws:ec2:us-east-2:123456789012:instance/i-abcdefghijEXAMPLE",
"arn:aws:ec2:us-east-2:123456789012:instance/i-0e9d8c7b6aEXAMPLE"
]
},
{
"Effect": "Allow",
"Action": [
"ssm:TerminateSession"
],
"Resource": [
"arn:aws:ssm:*:*:session/${aws:username}-*"
]
}
]
}
その他にも、EC2タグに基づいて制限する方法などもありますので、詳細は AWS Systems Manager ユーザーガイド - 追加の Session Manager 用のサンプル IAM ポリシー を参照してください。
AWS SessionManagerが利用するssm-userの特権の変更方法
IAMポリシーを使用した接続許可設定を紹介しましたが、実際にはEC2インスタンス内においても、利用者ごとに制約を設けたいシーンは多いと思います。
Linuxの場合に限られますが、そのような場合は、AWS SessionManagerが利用するssm-userアカウントの特権を修正することで対応が可能です。
SSMエージェントが利用するssm-userアカウントは、以下のファイルに特権設定を作成しています。
# User rules for ssm-user
ssm-user ALL=(ALL) NOPASSWD:ALL
例えば、以下のように変更することで、OSグループごとに特権を割り当てることができます。
# User rules for ssm-user
ssm-user ALL=(%admin,%devel) ALL
Defaults:ssm-user targetpw
修正後の設定内容は以下の通りです。
- ssm-userは、adminグループ or develグループ に所属するユーザとして、全てのコマンドを実行できる
- 実行時はグループに所属するユーザのパスワードを必要とする
実際に利用する際は、以下のように ssm-userから各ユーザに切り替えて、特権昇格が可能です。
sh-4.2$ sudo -iu tanaka <-- adminグループに所属するtaroユーザー
[sudo] password for tanaka: ******** <-- taroユーザーのパスワード
taro@web01 [~] <-- adminグループの権限を取得
まとめ
AWS Session Managerを利用した接続方法と、アクセス制限方法を紹介しました。
AWS Session Managerによるポリシーの一元化は、今後のセキュリティ強化と運用コスト削減のための、ひとつの解となりそうです。AWSの機能アップデートに合わせて、利用者側の環境も積極的に追従していきたいですね。
以上です。