EC2 Instance Connectをより安全に使う方法

2022.02.15

Amazon Linux 2やUbuntuを使用している場合、AWSアカウントの全員がすべてのEC2インスタンスにSSHでアクセスできる可能性が高くなります。

EC2 Instance Connectとは?

EC2 Instance Connectは、メタデータサービスを利用してEC2インスタンス上で公開SSH鍵を利用できるようにする。公開鍵をEC2インスタンスにプッシュするには、SendSSHPublicKey APIを使用する。

SSHデーモン(sshd)は、SSH接続時にメタデータサービスにすべての公開鍵を問い合わせるよう設定する必要がある。Amazon Linux 2とUbuntuのAMIでは、この設定がデフォルトで有効になっています。

どのように機能するのですか?

これを実現するためには、3つの要件を満たす必要があります。

  • Amazon Linux 2またはUbuntuの公式AMIを使用してください。
  • ポート22のトラフィックを許可する。過去にインスタンスの管理にSSHを使用していた場合、ポートはすでに開かれています。
  • IAMユーザーまたはロールにパーミッション(アクションec2-instance-connect:SendSSHPublicKey)が必要です。AdministratorAccessor PowerUserAccessのような管理されたポリシーのおかげで、これらのパーミッションを持っている可能性が非常に高いです。

これで、あなたとあなたのIAMユーザーは、AWSアカウント内のすべてのEC2インスタンスにSSH接続を開くことができるようになりました。

上記の場合、どのように我々のEC2を保護するか。

EC2 Instance Connectを使用することに興味がない場合は、次のいずれかを行うことができます。

  • EC2 Instance Connectをアンインストールします。
  • ポート22のトラフィックを許可しない。
  • Service control policies (SCP)でec2-instance-connect:SendSSHPublicKeyをグローバルに拒否してください。

EC2 Instance Connectを使用する場合。

ec2-instance-connect:SendSSHPublicKey アクションを慎重に付与してください。IAMのドキュメントによると、ユーザーを制限するためには条件しか使えません。EC2 Instance Connectのドキュメントによると、リソースレベルのパーミッションを使って、特定のEC2インスタンスへのアクセスを制限することもできるようです。残念ながら、EC2 Instanceタグはサポートされていないようです。

まとめ

AWS Linux 2およびUbuntu AMIでは、デフォルトでInstance Connectが有効になっています。これは、あなたのアカウントにアクセスできる人なら誰でも、あなたのEC2インスタンス(IAMユーザーまたはロール)にアクセスできるため、セキュリティ上の懸念がある。これは、コンソールベースのSSM(Systems Manager)にも言えることで、Key Pairがなくても使用できる。 しかし、これらのサービスが悪いというわけではなく、正しく活用すれば良いサービスである。

リファレンス