Posted at

IAMRoleでS3期限付きURLの生成をしてはいけない

More than 3 years have passed since last update.

S3期限付きURLが指定したexpireより前に期限切れしてしまう、

という事象を追って調査した際のメモ。

こちらは同様の事象かと思われる。

- https://forums.aws.amazon.com/thread.jspa?messageID=713763


なにが起きたか


  • EC2でIAM Roleの権限を使用して、S3期限付きURLの発行を行なっていた。



  • その際に、有効期限(expire)を一月後に設定し発行。

  • しばらくURLは有効だったが、数時間後に"ExpiredToken"となってしまう。


どうすればよいか

IAM Userのアクセスキーペアを使用する。


何故?

IAM Roleで使用で発行されるキーは有効期限がある。

その為、キーの有効期限以上のexpireを設定する事は出来ない。


まとめ

ということで、一時的な権限の使用以外ではIAMUserの権限を使用する必要がある。

IAM RoleとIAM Userの違いについて知ると確かに、ということだった。

https://aws.amazon.com/jp/iam/faqs/

IAM RoleとIAM User


Q: IAM ロールと IAM ユーザーの違いは何ですか?

IAM ユーザーには永続的な長期の認証情報があります。また、IAM ユーザーを使用して AWS サービスと直接やり取りすることができます。IAM ロールには認証情報がなく、AWS サービスに対して直接リクエストを送信することはできません。IAM ロールは、IAM ユーザー、アプリケーション、AWS のサービス (EC2 など) などの認可されたエンティティに割り当てるために用意されたものです。

Q: IAM ユーザー、IAM グループ、または IAM ロールはどのように使い分ける必要がありますか?

IAM ユーザーには永続的な長期の認証情報があります。また、IAM ユーザーを使用して AWS のサービスと直接やり取りすることができます。IAM グループは、主に、許可が同じ1組の IAM ユーザーを管理するための管理用の機能です。IAM ロールとは、AWS サービスリクエストの送信許可を持つ AWS Identity and Access Management (IAM)エンティティです。IAM ロールから AWS のサービスに対してリクエストを直接送信することはできません。IAM ロールは、IAM ユーザー、アプリケーション、AWS のサービス (EC2 など) などの認可されたエンティティに割り当てるために用意されたものです。IAM ロールは AWS アカウント間でアクセス権限を委任するために使用します。


コードにキーを埋め込まなくていいからと全てIAM Roleでやろうとして発覚。

長期的な権限を発行する際にはIAMRoleで発行するのは控えたほうがよいですね。

通常はIAMRoleを使用するべきですが、用途によってはIAMUserを使わないと行けない場面があるということを改めて認識致しました。


おまけ - IAMRoleのキーの有効期限について -

EC2内で下記メタデータ取得のcurlで確認可能

curl 169.254.169.254/latest/meta-data/iam/security-credentials/[role name]/

結果

{

"Code" : "Success",
"LastUpdated" : "2016-09-06T08:08:23Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "*******",
"SecretAccessKey" : "******",
"Token" : "*******",
"Expiration" : "2016-09-06T14:12:37Z" ← 有効期限
}