今回遭遇した条件
- 公式AMIから新規でEC2インスタンス構築
- アクセス可能なメタデータを無効
これで構築したインスタンスにsshアクセスすると、登録した公開鍵がrootやec2-userに適用されずにsshログイン出来ずパーミッションエラーとなる。
回避策
新規EC2インスタンス構築時は、アクセス可能なメタデータを有効にする。あとから次のどちらかを実行する
- awsコマンドからメタデータの設定を無効にする
- 構築したインスタンスのAMIを取得して別のEC2インスタンスを構築
1の場合は次のコマンドを実行する
aws ec2 modify-instance-metadata-options --instance-id i-xxxxxxx --http-endpoint disabled
参考資料
インスタンスメタデータオプションの設定 - Amazon Elastic Compute Cloud
2は、最初に構築したメタデータ有効のインスタンスからAMIを取得し、そこから新しいEC2インスタンスを構築。構築時はアクセス可能なメタデータを無効にする。メタデータを無効にして構築しても、元のAMIにはすでに公開鍵が登録されているためsshログインできる。
確認方法
実際にメタデータが取得できるか確認する。何もデータが返らなければOK
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
参考
インスタンスメタデータの取得 - Amazon Elastic Compute Cloud
背景
自分たちの利用範囲ではメタデータにアクセスする必要はなく、もしSSRF攻撃があった場合にもしかしたらメタデータにアクセスされるかもしれない。であれば、最初からメタデータを無効にしておきたい。
今まではiptablesで 169.254.169.254 にアクセスできない設定をしていたが、今後はiptablesを使いたくない。