AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました

213件のシェア(すこし話題の記事)

AWS Systems Manager セッションマネージャーに待望の機能(のひとつ)がやってきました!

Session Manager launches tunneling support for SSH and SCP

サーバーにSSHしたり、ローカル・リモート間での SCP 越しのファイルの送受信も可能になりました。

更には SSH セッション越しにいろいろなものを転送できます。

ということで、さっそく試してみましょう!

リモートの準備

SSM エージェントをアップデート

SSH先サーバーに 2.3.672.0 以上の SSM エージェントがインストールされている必要があります。

古いエージェントがインストールされている場合、アップデートしてください。

Manually Install SSM Agent on Amazon EC2 Linux Instances - AWS Systems Manager

手元の Amazon Linux2環境では バージョン 2.3.372.0 がインストールされていたため、最新のパッケージでアップデートしました。

# バージョンチェック
$ rpm -qi amazon-ssm-agent
Name        : amazon-ssm-agent
Version     : 2.3.372.0
Release     : 1.amzn2
Architecture: x86_64
Install Date: Tue 18 Jun 2019 10:24:24 PM UTC
Group       : Amazon/Tools
Size        : 63120343
License     : ASL 2.0
Signature   : RSA/SHA256, Sat 12 Jan 2019 03:13:39 AM UTC, Key ID 11cf1f95c87f5b1a
Source RPM  : amazon-ssm-agent-2.3.372.0-1.amzn2.src.rpm
Build Date  : Fri 11 Jan 2019 10:41:55 PM UTC
Build Host  : build.amazon.com
Relocations : (not relocatable)
Packager    : Amazon.com, Inc. <http://aws.amazon.com>
Vendor      : Amazon.com
URL         : http://docs.aws.amazon.com/ssm/latest/APIReference/Welcome.html
Summary     : Manage EC2 Instances using SSM APIs
Description :
This package provides Amazon SSM Agent for managing EC2 Instances using SSM APIs

# アップデート
$ sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
...

# バージョンチェック
$ rpm -qi amazon-ssm-agent | grep ^Version
Version     : 2.3.672.0

セキュリティグループ

クライアントのネットワークに対して SSH のポートをあける必要はありません。

クライアントの準備

Session Managerプラグインをアップデート

SSH/SCP 時には、バージョン 1.1.23.0 以上の Session Managerプラグインが必要です。

古いプラグインがインストールされいたり、そもそもプラグインがインストールされていない場合は、最新版をインストールして下さい。

(Optional) Install the Session Manager Plugin for the AWS CLI - AWS Systems Manager

手元のMac環境では バージョンが 1.0.37.0 と古かったためアップデートしました。

# バージョンチェック
$ session-manager-plugin --version
1.0.37.0

# アップデート
$ 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

# バージョンチェック
$ session-manager-plugin --version
1.1.23.0

SSH ファイルの設定

SSHの設定ファイルに以下の設定を追加します。

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

Unix 系OSの場合、設定ファイルのパスは ~/.ssh/config です。

試してみた

実際に SSH/SCP を試してみます。

SSH のホスト部分にインスタンスIDを指定するだけです。

EC2 インスタンスに SSH

EC2 インスタンスに SSH します。

$ ssh -i ~/path/to/key.pem ec2-user@i-12345 -v
...
debug1: Executing proxy command: exec sh -c "aws ssm start-session --target i-12345 --document-name AWS-StartSSHSession --parameters 'portNumber=22'"
...
debug1: ssh_exchange_identification: Starting session with SessionId: botocore-session-1562754981-0f103e19877cbaefb
...
Authenticated to i-12345 (via proxy).
...

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

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-10-20-10-165 ~]$

上の例では、SSH 時のログを出力させるために verbose(-v) オプションをつけていますが、通常時は不要です。

ログの3行目から SSH の ProxyCommand が走っていることを確認できますね。

この時の /var/log/secure ログを確認します。

Jul 10 11:02:08 ip-10-20-10-165 sshd[2440]: Accepted publickey for ec2-user from 127.0.0.1 port 46162 ssh2: RSA SHA256:vreR8DpS6+bFBCKurj5NvzVGScnhqY19q+VePgMjg0c
Jul 10 11:02:08 ip-10-20-10-165 sshd[2440]: pam_unix(sshd:session): session opened for user ec2-user by (uid=0)

from が 127.0.0.1 となっていますね。

プライベートサブネットのインスタンスに対しても、SSH 接続できます。

ネットワーク設定は、次の過去ブログを参照ください。

プライベートサブネットに配置したEC2にAWS Systems Manager Session Managerを使ってアクセスする

SCP でファイル転送

SSH でシェルアクセスするだけだと、ありがたみが今ひとつです。 SCP でファイル転送します。

$ scp -i ~/path/to/key.pem foo.txt ec2-user@i-12345:~/
foo.txt                                       100%    0     0.0KB/s   00:00
$ ssh -i ~/path/to/key.pem ec2-user@i-12345 ls
foo.txt

確かにファイル転送できています。

ポートフォワードしてプライベートサブネットのRDS接続

SSH のセッションをはれるということは、当然ながら、ポート転送も可能です。 プライベートサブネットにある RDS MySQL に対してポートフォワードし、ローカル環境から MySQL に接続してみます。

RDS と同じ VPC にある EC2 に SSH します。 その際に、RDS エンドポイントの 3306 ポートを ローカルの 9999 ポートに向けます。

$ ssh -i ~/path/to/.pem ec2-user@i-123 -L 9999:RDS-ENDPOINT:3306

ローカル環境から MySQL に接続します。

$ mysql -u admin -p -h 127.0.0.1 -P 9999
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.6.10 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select @@aurora_version;
+------------------+
| @@aurora_version |
+------------------+
| 1.17.8           |
+------------------+
1 row in set (0.02 sec)

無事接続できました。

まとめ

従来の SSH 運用を SSM セッションマネージャーに置き換えようとすると

  • ファイル転送できない
  • ポート転送できない

という欠点が解消された嬉しいアップデートです。

SSM エージェントのおかげで、SSH のためにセキュリティグループで SSH ポートを開けなくてもよいのも嬉しいですね。

直近の案件で、このあたりが課題だったため、非常に嬉しいアップデートです。

それでは。

参考