EC2への接続に22番ポートの開放はやめてSystems Managerを使おう

EC2にSSH接続をする必要がある場合、セキュリティグループの22番ポートを開放していませんか？
ソースIPがフルオープンということは無いかもしれませんが、この設定だと悪意のある人から接続を試みられる可能性があります。

![Page-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180441/731f0032-01a7-9dd0-83cf-ad1d3bf23f59.png)

鍵認証をしているとはいえ、DDoS攻撃の標的になるかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180441/b0098b4e-0c43-6f1a-96b5-cabd727e3602.png)

AWSには**Systems Manager**というサービスがあります。Systems Managerの機能の一つである**Session Manager**を使うとセキュリティグループの22番ポートは閉じたままでもSSH接続が可能です。

悪意のある人からの接続はセキュリティグループが防いでくれるので、EC2は影響を受けなくてすみます。

![Untitled Diagram-Copy of Page-1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180441/dc14a1d8-3670-0510-f431-90e8bdfa16db.png)

設定方法を紹介します。

# 環境

EC2は以下の状態で始めます

| 項目 | 設定 |
| --- | --- |
| VPC | デフォルトVPC |
| IPアドレス | パブリックIPアドレスあり |
| IAMロール | なし |

※パブリックIPを付与できない場合はNATゲートウェイやVPCゲートウェイを使えば同様のことが可能です。

# 設定

## EC2に必要なIAMロールを設定

Systems Managerにアクセスするために権限が必要です。個別に設定してもいいですが、Systems Managerに「高速セットアップ」という機能があるので、これを使ってみましょう。
Systems Managerのコンソール画面の左上メニューにあります。

![ap-northeast-1.console.aws.amazon.com_systems-manager_home_region=ap-northeast-1(Laptop with MDPI screen).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180441/53bbb834-c5eb-0625-2fb1-712e450449ff.png)

高速セットアップを使うと、定期的にSystems Managerのエージェントの更新の自動化やCloudWatchエージェントのインストールなどが行なえます。また、Systems Managerを使用するのに必要なIAMロールをEC2に自動で追加してくれます。

![ap-northeast-1.console.aws.amazon.com_systems-manager_quick-setup_region=ap-northeast-1(Laptop with MDPI screen) (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180441/c0cf82e6-2b13-36e3-3104-538acbbde717.png)

適用対象は、リージョン内の全インスタンスにしたり、特定のインスタンスを選択したりできます。

![ap-northeast-1.console.aws.amazon.com_systems-manager_quick-setup_region=ap-northeast-1(Laptop with MDPI screen) (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180441/bba8ab25-a3a0-72d7-95ea-90db3aefafc1.png)

高速セットアップを行うと、EC2に`AmazonSSMRoleForInstancesQuickSetup`というIAMロールが適用されます。このIAMロールには`AmazonSSMManagedInstanceCore`ポリシーと`AmazonSSMPatchAssociation`ポリシーが含まれます。

```json:AmazonSSMManagedInstanceCore
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeAssociation",
                "ssm:GetDeployablePatchSnapshotForInstance",
                "ssm:GetDocument",
                "ssm:DescribeDocument",
                "ssm:GetManifest",
                "ssm:GetParameter",
                "ssm:GetParameters",
                "ssm:ListAssociations",
                "ssm:ListInstanceAssociations",
                "ssm:PutInventory",
                "ssm:PutComplianceItems",
                "ssm:PutConfigurePackageResult",
                "ssm:UpdateAssociationStatus",
                "ssm:UpdateInstanceAssociationStatus",
                "ssm:UpdateInstanceInformation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2messages:AcknowledgeMessage",
                "ec2messages:DeleteMessage",
                "ec2messages:FailMessage",
                "ec2messages:GetEndpoint",
                "ec2messages:GetMessages",
                "ec2messages:SendReply"
            ],
            "Resource": "*"
        }
    ]
}
```

```json:AmazonSSMPatchAssociation
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ssm:DescribeEffectivePatchesForPatchBaseline",
            "Resource": "arn:aws:ssm:*:*:patchbaseline/*"
        },
        {
            "Effect": "Allow",
            "Action": "ssm:GetPatchBaseline",
            "Resource": "arn:aws:ssm:*:*:patchbaseline/*"
        },
        {
            "Effect": "Allow",
            "Action": "tag:GetResources",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ssm:DescribePatchBaselines",
            "Resource": "*"
        }
    ]
}
```

## 接続するWindows PC側へのインストール

Windows PCには
* [AWS CLI](https://aws.amazon.com/jp/cli/)
* [Session Manager plugin](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)
をインストールしてください。ウイザードに従うだけでインストールできます。

## IAMユーザーの作成

せっかくなので、Session Managerだけ可能な`SessionManagerUser`を作成してみました。必要なポリシーは以下となります。

```json:SessionManagerStartSessionPolicy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ssm:StartSession",
            "Resource": [
                "arn:aws:ssm:*:*:document/AWS-StartSSHSession",
                "arn:aws:ec2:*:XXXXXXXXXXXX:instance/*"
            ]
        }
    ]
}
```

作成したユーザーの認証情報を`aws configure`を行い登録します。profile名は`ssh-session-user`としました。
(https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html)

```terminal
aws configure --profile ssh-session-user
AWS Access Key ID [None]: XXXXXXX
AWS Secret Access Key [None]: XXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: 
```

## SSH接続の設定

SSH接続用の設定ファイル（`%USERPROFILE%\.ssh\config`）に以下を追加します。

```
# SSH over Session Manager
Host i-* mi-*
  ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p --profile ssh-session-user"
```

これで設定完了です。

# 接続

インスタンス名(i-01af40cfdcecbfe5f)とユーザー(ec2-user)、キーペア名(key-pair.pem)を指定するとSystems Managerを経由してSSH接続ができます。

```terminal
ssh -i key-pair.pem ec2-user@i-01af40cfdcecbfe5f
```

無事接続できましたでしょうか？

もちろんVSCodeのSSH拡張を使って接続することもできます。https://code.visualstudio.com/docs/remote/ssh-tutorial
SSH接続用の設定ファイル（`%USERPROFILE%\.ssh\config`）に以下を追加しておくと簡単に接続できます。

```
Host i-01af40cfdcecbfe5f
  User ec2-user
  IdentityFile ~/.ssh/key-pair.pem
```

便利ですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180441/92993f93-3fb4-618b-080c-b4b2f0c59c45.png)