インフラ

【AWS】セッションマネージャーを使ってプライベートインスタンスへアクセス!【EC2】

ec2-session-manager

こんばんは!光です。

大手グローバル企業でWebエンジニアをやっています。

Webエンジニアを目指してプログラミングを勉強している初心者の方向けに情報を発信しています。

経歴や実績はこちら

システム開発のお仕事の依頼もお待ちしております。

お問い合わせページTwitterのDMからお気軽にお問い合わせください!

今回はこのような質問をいただきました。

プライベートサブネットに構築したEC2にアクセスしたい!

このような場合、踏み台サーバーを経由して接続することが多いですが、セッションマネージャーを利用することで踏み台サーバーが不要になります。

ポート開放も不要になるのでセキュリティも高まりますね!

そこで今回はこちらの質問について解説していきます!

IAMロールを用意する!

まずは構築するEC2インスタンスに付与するIAMロールを作成します。

ユースケースはEC2を選択。

ユースケース

ポリシーはAmazonSSMManagedInstanceCoreを選択します。

ポリシー

ロール名はec2-private-instance-roleとしました。

この設定でロールを作成します。

EC2インスタンスを構築する!

作成したIAMロールを付与してインスタンスを作成します。

IAMロールを選択

SSHやSCPを行いたい場合は鍵ファイルを作成しておきましょう!

私はssm-test.pemという鍵ファイルを生成しておきました。

私はAmazon Linux 2を利用しましたがそれ以外のAMIの場合はSSMエージェントのインストールが必要になります。

AWSコンソールからアクセス!

たったこれだけで、AWS System Managerのターゲットインスタンスに作成したEC2インスタンスが表示されます!

セッションマネージャー

「セッションを開始する」からEC2インスタンスへアクセスすることができます。

PCからアクセス!

今度はPCからアクセスしてみましょう!

私はMacを利用しているのでMac前提の内容となっています。

AWS CLI v2のインストール

https://awscli.amazonaws.com/AWSCLIV2.pkg

こちらのリンクからパッケージをダウンロードしてインストールします。

$ aws --version
aws-cli/2.1.36 Python/3.8.8 Darwin/20.4.0 exe/x86_64 prompt/off

Session Manager pluginのインストール

以下のようにコマンドを実行してインストールします。

$ cd /tmp
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
$ unzip sessionmanager-bundle.zip
$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin

インストール後、以下のように表示されればOKです。

$ session-manager-plugin

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

~/.ssh/configの設定

次にSSHするための設定を~/.ssh/configに追記します。

# SSH over Session Manager
host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

鍵ファイルの設定

鍵ファイルのパーミッションを変更しておきます。

$ chmod 600 ~/.ssh/ssm-test.pem

IAMポリシーの作成

MacのAWS CLIで利用するIAMユーザーを作成するために、まずはポリシーを作成します。

以下のポリシーでSSHが可能になります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ssm:StartSession",
                "ssm:TerminateSession",
                "ssm:ResumeSession",
                "ssm:DescribeSessions",
                "ssm:GetConnectionStatus"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        }
    ]
}

私はSessionManagerPolicyという名前で作成しました。

IAMユーザーの作成

上記のポリシーを付与したIAMユーザーを作成します。

プログラムによるアクセスを許可しておきます。

IAMユーザーの作成

作成するとアクセスキーとシークレットアクセスキーが生成されるのでAWS CLIに設定します。

いざSSH!

これで設定完了です。

以下のコマンドでSSHしてみましょう!

$ ssh -i ~/.ssh/ssm-test.pem ec2-user@i-XXXXXXXXXXXXXXX

鍵ファイル名とインスタンスIDは各々書き換えてください。

無事SSHできました!

$ ssh -i ~/.ssh/ssm-test.pem ec2-user@i-XXXXXXXXXXXXXXX
The authenticity of host 'i-XXXXXXXXXXXXXXX (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:UR9ZaszvdeL/zDWYbcGaiklGvFL9lMaJeeeAnsATcuDxc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'i-XXXXXXXXXXXXXXX' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-XXX-XX-XX-XX ~]$

SCP(ファイル転送)も可能!

ファイルを転送したい場合は同様にSCPも可能です!

$ scp -i ~/.ssh/ssm-test.pem test.txt ec2-user@i-XXXXXXXXXXXXXXX:/home/ec2-user

あとがき

この方法ならプライベートな環境に構築されたEC2にもアクセス可能になります。

踏み台サーバーも不要なので無駄なリソースのコストや管理が発生しなくて良いですね!

また、ポート開放やパブリック環境での構築が不要なのでセキュリティも非常に高いです。

設定さえしてしまえば普通にSSHするのとほとんど変わらないので積極的に利用していきたいですね!

参考

https://www.karakaram.com/aws-session-manager-tunneling-support-for-ssh/#attach-iam-role-to-ec2

https://dev.classmethod.jp/articles/ec2-login-with-session-manager/