概要
とあるクライアントのAWSで運用しているサイトを管理することになりました。
インスタンスが300近くあり、それぞれSFTPにて接続を行うといった運用でした。
サイトごとに接続するのがとても面倒臭く、またサーバー料金に関しても見直して欲しいとのことだったので、SSMのポートフォワード機能を用いた接続に切り替えました。
これにより、
- インスタンスIDがわかればワンコマンドで1000つ族可能
- Public IPなしでEC2への接続が可能になり、Public IPv4の料金が下がる($3.6 / 月ほど)
- SSHポートを外部に公開しないためセキュリティが強固になる
この記事の目的
- EC2のSSHポートを外部に公開しない安全な接続構成の実現
- Public IPv4アドレスの利用料金(約 $3.6 / 月 / IP)の削減
- 複数のEC2インスタンスへの接続管理の簡素化
- AWS公式の推奨方式による接続を行えるようになる
やらないこと
-
EC2の作成手順
-
IAMユーザーやIAMロールの基本的な作成方法
-
AWS CLIのインストール方法
-
SSM Agentのインストール方法
(Amazon Linux 2 / Amazon Linux 2023ではデフォルトでインストール済み)
SSMとは
SSMは、AWSが提供しているインスタンス管理機能の一つで、EC2に直接SSH接続しなくても、AWSの管理経由で安全に接続できる仕組みです。
イメージとしては、
- 従来:EC2の「正面入口」を外部に公開して入る
- SSM:AWSの「管理用の専用通路」を通って入る
という違いがあります。
EC2自体は外部に公開されず、AWSの認証を通過した接続のみが許可されるため、インスタンスに対するセキュリティが向上します。
仕組み
設定~接続まで
EC2に以下のIAMロールを付与します。
- AmazonSSMManagedInstanceCore
これにより、EC2上のSSM AgentがAWS Systems ManagerへHTTPS(TCP 443)でアウトバウンド接続を行い、SSMからの接続要求を受け付けられる状態になります。
※ AWSの認証情報をローカルに登録していない方は先に後述の「AWS認証情報の設定方法」についてご確認ください。
以下のコマンドをローカルにて実行します。
aws ssm start-session \
--target i-xxxxxxxxxxxxx \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["22"],"localPortNumber":["10022"]}'
PCに設定された
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
に紐づく、IAMユーザーの権限によりSSMセッションが開始されます。
SSMセッションが開始されると、以下のポート転送が確立されます:
ローカルPC:10022 → SSM → EC2:22
これにより、ローカルPCから localhost:10022 へ接続することで、EC2のSSHポート(22)へアクセスできるようになります。
SFTP接続例
SSMトンネル確立後は、接続先をEC2のIPアドレスではなく、localhost とポート 10022 を指定してSFTP接続を行います。
sftp -i ~/.ssh/your-key.pem -P 10022 ec2-user@localhost
※ SSMトンネルが起動していない状態では接続できないため、必ず先に aws ssm start-session を実行してください。
一言でまとめると
SSMポートフォワーディングにより、ローカルポートをEC2のSSHポートへ安全に転送するトンネルをAWS経由で確立し、Public IPを使用せずにSSH/SFTP接続を可能にする。
ローカルPCにおいてのAWS認証情報の設定方法
SSMポートフォワーディングを利用するためには、ローカルPCにAWSの認証情報を設定する必要があります。
これは、SSMセッションを開始する際にIAMによる認証を行うためです。
設定方法はいくつかありますが、今回は一般的な aws configure を使用する方法 を紹介します。
手順
ターミナルで以下を実行します:
aws configure
以下の情報の入力を求められます:
AWS Access Key ID [None]: [AKIAxxxxxxxxxxxx]
AWS Secret Access Key [None]: [xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]
Default region name [None]: ap-northeast-1
Default output format [None]: json
※ AWS Access Key IDとAWS Secret Access Keyはご自身の環境のものをご確認ください。
入力後、認証情報は以下のファイルに保存されます:
~/.aws/credentials
例:
[default]
aws_access_key_id = AKIAxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
例え:セキュリティの厳しいビル
この仕組みは、セキュリティの厳しいビルに例えると分かりやすいです。
従来の方式は、
ビルの正面入口を外部に公開し、鍵を使って入る方式
でした。
一方SSMは、
ビルの管理室で本人確認を行い、管理者専用の通路から入る方式
です。
ビルの正面入口を開ける必要がなくなります。
ビルの例で比較
| 項目 | SFTP | SSM |
|---|---|---|
| 入口 | 正面入口 | 秘密通路 |
| EC2のポート公開 | 必要 | 不要 |
| インターネットから見える | 見える | 見えない |
| セキュリティ | やや弱い | 非常に強い |
| 認証 | SSH鍵 | IAM認証 |
まとめ
今回の移行により、EC2を外部に公開することなく、安全に接続できる構成へ変更できました。
Public IPに依存した従来の接続方式から、AWSのセキュリティベストプラクティスに沿ったインフラ構成となりました。
- セキュリティの向上
- コスト削減
- 運用の安全性向上
を同時に実現できています。
今後EC2へ接続する際は、SSMポートフォワーディングを利用することで、より安全な構成を維持していきます。