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
ポリシーが含まれます。
{
"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": "*"
}
]
}
{
"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
を作成してみました。必要なポリシーは以下となります。
{
"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
便利ですね!