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


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

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

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

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

設定方法を紹介します。

環境

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

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

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

設定

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

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

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

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

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

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": "*"
        }
    ]
}
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
* Session Manager plugin
をインストールしてください。ウイザードに従うだけでインストールできます。

IAMユーザーの作成

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

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)

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接続ができます。

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

便利ですね!