EC2 metadataサービスのクレデンシャル更新間隔と有効期間
EC2のmetadataサービスを利用したクレデンシャル不正取得
約1億人もの個人情報が流出したCapital Oneの事件、WAFの設定ミスからIAMのクレデンシャル情報が漏洩したことが原因のようです。現時点では詳細な情報は開示されていないものの、Server Side Request Forgery(SSRF)により、EC2のmetadataサービスからIAM Roleのクレデンシャル情報が不正に持ち出されたのではないかと言われています。
また、ロールに付与していたIAM Policyの権限が大きかったこと、外部からのAPIによるアクセスを制限していなかったことも、被害のインパクトが大きくなった要因になったようです。
EC2に付与したロールのクレデンシャル情報について正直あまり馴染みがなかったのですが、流失した場合の影響を把握するために、更新間隔と有効期限を調べてみました。
EC2 access keyの更新間隔・有効期限
EC2にアタッチしたロールのクレデンシャル情報はEC2の中でmetadataサービスに対してhttpリクエストを行うことで取得可能です。
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/{ロール名}/ { "Code" : "Success", "LastUpdated" : "2019-08-11T10:31:44Z", "Type" : "AWS-HMAC", "AccessKeyId" : "XXXXXXXXXXXXXXXXXXXXXXXX", "SecretAccessKey" : "XXXXXXXXXXXXXXXXXXXXXXXXXX", "Token" : "XXXXXXXXXXXXX...XXXXXXXXXXXXXXXX", "Expiration" : "2019-08-11T16:40:57Z" }
なお、取得したアクセスキー、シークレットキー、トークンを環境変数にセットし、AWS CLIからget-caller-identityを呼び出すことで有効なロールか確認できます。
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXXXX export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXX export AWS_SESSION_TOKEN=XXXXXXXXXXXXXXXXX aws sts get-caller-identity
metadataサービスへアクセスして、キーの更新間隔と有効期間を確認しました。 概ね1時間毎にキーが更新。キーの有効期間は6時間強でした。 つまり、キーが漏洩した場合でもデフォルトだと最大6時間程度、キーが利用できてしまいます。 AWSRevokeOlderSessionsポリシーを設定することで即時に無効化することもできるようです。
LastUpdated | Expiration |
---|---|
08:32:55 | 14:44:41 |
09:32:19 | 16:01:50 |
10:31:44 | 16:40:57 |
11:31:00 | 17:36:52 |
12:31:23 | 19:03:46 |
13:31:11 | 20:01:47 |
有効期限が切れたキーを使うと想定どおりエラーになりました。
aws sts get-caller-identity An error occurred (ExpiredToken) when calling the GetCallerIdentity operation: The security token included in the request is expired