スポンサーリンク

AWS System Manager(SSM)でEC2にSSHを実行! ポート解放なし

スポンサーリンク
AWS
スポンサーリンク

AWSのEC2インスタンスに対してAWS System Manager、通称SSMでSSHポートを解放せずSSHする方法の紹介です。

スポンサーリンク

環境

session-manager-pluginとamazon-ssm-agent関連の設定は後ほど紹介します。
aws cliは省略します。

クライアント環境

macOS mojava

AWS CLI

1.16.215

$ aws --version
aws-cli/1.16.215 Python/3.7.3 Darwin/18.6.0 botocore/1.12.205

Session Manager Plugin

1.1.26.0

$ session-manager-plugin --version
1.1.26.0

リモート環境

Ubuntu 18.04

Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-1044-aws x86_64)

amazon-ssm-agent

2.3.687.0

$ sudo snap list amazon-ssm-agent
Name              Version    Rev   Tracking  Publisher  Notes
amazon-ssm-agent  2.3.687.0  1522  stable/…  aws✓       classic

クライアント環境のセットアップ

AWS CLIは導入済みのものとして話を進めます。

macOS に Session Manager Plugin をインストール

macOSの場合のインストール方法です。
まず、以下のコマンドを実行し、インストールします

# 作業スペースに移動
cd /tmp
# sessionmanager-bundleダウンロード
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
# unzip
unzip sessionmanager-bundle.zip
# インストールシェルの実行
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin

これで完了です。
インストールが正しく行われたか確認します。

session-manager-plugin

「The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.」と表示されれば成功です。

Linux(RedHat系) に Session Manager Plugin をインストール

# 64bitの場合
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
# 34bitの場合
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_32bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
# install
sudo yum install -y session-manager-plugin.rpm

Ubuntu に Session Manager Plugin をインストール

# 64bitの場合
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
# 34bitの場合
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_32bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
# install
sudo dpkg -i session-manager-plugin.deb

Linuxの場合もmacと同様にsession-manager-pluginコマンドでインストール状態を確認できます。

また、その他ログなどの設定やアンインストールについては awsの公式ドキュメント をご覧ください。

リモート環境のセットアップ (EC2)

次にEC2のセットアップを行います。

インストール

SSMエージェントのインストールは awsの公式ドキュメント にも記載されており、また、試した時点(2019/08/01)ではインスタンスにすでにインストールされていたので今後、新規に作成したインスタンスに対して改めてインストールする作業は不要になると思います。
※ 古いAMIから作成したインスタンスにはインストールされていないようです。
ちなみに公式ドキュメントでは次のように触れています。

 
SSM エージェント は、デフォルトでは、2017 年 9 月以降の Amazon Linux 基本 AMI にインストールされます。SSM エージェント は、デフォルトで、Amazon Linux 2 AMI にもインストールされます。

Amazon ECS 対応の AMI のようにベースイメージではないその他のバージョンの Linux では、手動で SSM エージェント をインストールする必要があります。

プロキシを使用している Amazon Linux AMI から作成されたインスタンスは、Patch Manager オペレーションをサポートするために、現在のバージョンの Python requests モジュールを実行している必要があります。詳細については、「プロキシサーバーを使用する Amazon Linux インスタンス上の Python リクエストモジュールをアップグレードする」を参照してください。

Amazon EC2 Linux インスタンスに SSM エージェント を手動でインストールする - AWS Systems Manager
次に示す Linux インスタンスの 1 つに SSM エージェント をインストールするには、以下のスクリプトの 1 つを使用します。

手動でインストールする場合は以下の方法で行います。

Amazon Linux2 (intel 64bit ※t2インスタンスなど)

インストール

sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

状態の確認

sudo systemctl status amazon-ssm-agent

起動

sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent

Ubuntu 18.04 へのインストール

UbuntuもAmazon Linuxと同様にamazon-ssm-agentの手動インストールは不要でした。

デフォルトでは、SSM エージェント は、20180627 以降の識別子のある Ubuntu Server 18.04 および 16.04 LTS 64 ビット AMI にインストールされます。バージョン 16.04 AMI の詳細については、64 ビット Ubuntu Server 16.04 インスタンスでの SSM エージェント のインストールについて を参照してください。

SSM エージェント オンプレミスサーバーにインストールする場合やエージェントを再インストールする場合は、次のスクリプトを使用できます。ダウンロードの URL を指定する必要はありません。snap コマンドでは、エージェントが Snap アプリストア https://snapcraft.io から自動的にダウンロードされます。

インストール

sudo snap install amazon-ssm-agent --classic

実行状態の確認

sudo snap list amazon-ssm-agent

開始

sudo snap start amazon-ssm-agent
sudo snap services amazon-ssm-agent

EC2へのIAMロールの割り当て

IAMロール作成

SSMからの接続を許可するIAMロールを作成しEC2に割り当てます。

  • IAM(https://console.aws.amazon.com/iam/home#/home)に移動
  • EC2用のロール作成
  • 作成したロールに ポリシー : AmazonEC2RoleforSSM を割り当て
  • 作成したロールをEC2に割り当て

シェルログインをテスト

ロールが正しく割り当てられるとaws ssm start-sessionで接続することが出来ます。
試しにubuntuで接続テストをしてみます。Amazon Linuxの場合も同様に接続することができます。

$ aws ssm start-session --target i-XXXXXXXXXXXXXXX

Starting session with SessionId: botocore-session-0123456789abcdefghijk
$ whoami  
ssm-user
$ sudo su  - ubuntu
ubuntu@ip-X-X-X-X:~$

インスタンスにSSHする

ワンライナーで接続

SSHでProxyCommandを用いて次のように条件を設定することで接続することができます。

ssh \
ユーザ名@i-XXXXXXXXXXXX \
-i ~/.ssh/path/to/key.pem \
-o ProxyCommand=" sh -c \"aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'\""

ssh_configに設定を記述する

ssh configに設定を書いておくと簡単に接続することができます。

Host my-server
    HostName i-XXXXXXXXXX
    User ユーザ名
    ServerAliveInterval 300
    IdentityFile ~/.ssh/path/to/key.pem
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
ssh my-server

SSHできない場合

数日後に、上記の手順でSSH接続を実行したところ正常に接続できなくなりました。
原因はわかりませんでしたが、リモート側のamazon-ssm-agentをアップデートしたところ繋がるようになりました。
amazon-ssm-agentのアップデートはマネジメントコンソールから、System Managerを選択し、ランコマンドからAWS-UpdateSSMAgentを実行することでアップデートできます。
ただSSMのアップデートは定期的に必要なためcron実行にしました。

ssmのcreate-associationでcron実行するには次のように実行します。
実行すると次のようなJSONが返ってきます。

$ aws ssm create-association --targets Key=tag:Name,Values=instanceX --name AWS-UpdateSSMAgent --schedule-expression "cron(0 8 * * ? *)"
{
    "AssociationDescription": {
        "Name": "AWS-UpdateSSMAgent",
        "AssociationVersion": "1",
        "Date": 1565771993.094,
        "LastUpdateAssociationDate": 1565771993.094,
        "Overview": {
            "Status": "Pending",
            "DetailedStatus": "Creating"
        },
        "DocumentVersion": "$DEFAULT",
        "AssociationId": "abcdefg-1234-1234-abcd-abcd1234",
        "Targets": [
            {
                "Key": "tag:Name",
                "Values": [
                    "instanceX"
                ]
            }
        ],
        "ScheduleExpression": "cron(0 8 * * ? *)"
    }
}

この例ではタグで実行対象を決定してますが、次のようにインスタンスidで指定することも可能です。

aws ssm create-association --targets Key=instanceids,Values=i-XXXXXXXXXXXXXXXXX,i-YYYYYYYYYYYYYYYYY --name your document name --schedule-expression "cron(0 2 ? * SUN *)"

参考

(オプション) AWS CLI 用の Session Manager Plugin をインストールする - AWS Systems Manager
Session Manager をシステムにインストールします。
Amazon EC2 Linux インスタンスに SSM エージェント を手動でインストールする - AWS Systems Manager
次に示す Linux インスタンスの 1 つに SSM エージェント をインストールするには、以下のスクリプトの 1 つを使用します。
SSH Session ManagerをAssumeRoleで利用する方法
技術一課の杉村です。2019年7月、AWS Systems Manager Session ManagerでSSH/SCPセッションを利用できる機能が発表されました。 Session Manager launches tunneling support for SSH and SCP この機能を利用すれば「踏み台インス...
Session Manager で SSH/SCPをトンネリングしてEC2に接続する - Qiita
## はじめに 2019/7/9 に AWS Systems Manager Session Manager が SSHおよびSCP接続の トンネリングをサポートしました。 これにより、踏み台サーバー等を使用せずに、Session M...
AWS Systems Manager Session Manager for Shell AccessでMacからLinux EC2インスタンスに端末でアクセスする | DevelopersIO
ども、大瀧です。 本日AWS Systems Managerの新機能Session Manager for Shell Accessがリリースされ、SSHなしでEC2インスタンスにシェルアクセスできるようになりました。
AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました | DevelopersIO
AWS Systems Manager セッションマネージャーに待望の機能(のひとつ)がやってきました! Session Manager launches tunneling support for SSH and SC
リファレンス: Systems Manager の Cron および Rate 式 - AWS Systems Manager
AWS Systems Manager メンテナンスウィンドウまたは ステートマネージャー の関連付けを作成するときは、ウィンドウまたは関連付けを実行するスケジュールを指定します。スケジュールを指定する形式として、時間ベースのエントリ ( cron 式 ) または頻度ベースのエントリ ( rate 式 ) のいずれかを...
自動的に SSM エージェント (CLI) を更新する - AWS Systems Manager
以下の手順では、AWS Command Line Interface (AWS CLI) を使用して ステートマネージャー の関連付けを作成するプロセスを説明します。関連付けにより、ユーザーが指定したスケジュールに従って SSM エージェント エージェントを自動的に更新できます。SSM エージェント の詳細については、...
ステップ 7: (オプション) SSH Session Manager セッションを有効にする - AWS Systems Manager
AWS アカウントのユーザーが AWS CLI を使用して、マネージドインスタンスで SSH によるセッションを開始できるようにすることができます。SSH を使用して接続するユーザーは、SCP を使用してローカルマシンとマネージドインスタンス間でファイルをコピーすることもできます。この機能を使用すると、インバウンドポー...
AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました | DevelopersIO
AWS Systems Manager セッションマネージャーに待望の機能(のひとつ)がやってきました! Session Manager launches tunneling support for SSH and SC
タイトルとURLをコピーしました