AWS Cloud9環境で利用できる一時クレデンシャル『AWS Managed Temporary Credentials』について調べてみた

2019.12.24

こんにちは、CX事業本部の若槻です。

AWS Cloud9環境でAWS CLIを利用する際に、Cloud9上で利用できる一時クレデンシャルである『AWS Managed Temporary Credentials』に絡んだトラブルシュート(後述)をする機会があったため、せっかくなので『AWS Managed Temporary Credentials』について理解を深めるために調べてみました。

※本記事内では『AWS Managed Temporary Credentials』は『AMTC』と略すことにします。

そもそもAWS Cloud9とは

AWS Cloud9 は、ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE) です。これには、コードエディタ、デバッガー、ターミナルが含まれています。Cloud9 には、JavaScript、Python、PHP などの一般的なプログラム言語に不可欠なツールがあらかじめパッケージ化されているため、新しいプロジェクトを開始するためにファイルをインストールしたり、開発マシンを設定したりする必要はありません。Cloud9 IDE はクラウドベースのため、インターネットに接続されたマシンを使用して、オフィス、自宅、その他どこからでもプロジェクトに取り組むことができます。また、Cloud9 では、サーバーレスアプリケーションを開発するためのシームレスなエクスペリエンスが提供されており、リソースの定義、デバッグ、ローカルとリモートの間でのサーバーレスアプリケーションの実行の切り替えを簡単に行えます。Cloud9 を使用すると、開発環境をすばやくチームと共有し、ペアプログラミングを行って互いの入力をリアルタイムで追跡できます。

Cloud9上で開発作業をする上でのメリットはたくさんありますが、

  • ブラウザさえあれば開発作業を開始や再開できる
  • AWSサービスへのフルアクセス権限を持つ一時クレデンシャル(AMTC)が自動的にAWS CLIのプロファイルに既定で設定されて利用可能となる
  • 新規EC2インスタンスを利用すれば、マネージドコンソールから3ステップ(Name environment、Configure settings、Review)で新規環境を立ち上げられる手軽さ

などの点が個人的には特に便利だと思っています。様々な開発支援機能がありますが、全部はまだ使いこなせていないです。

また、Cloud9の環境にEC2インスタンスを利用する場合でも、

デフォルトの設定 (30 分間の自動休止状態を設定して 1 か月に 20 日間、1 日 4 時間 IDE を実行) を使用する場合、90 時間の使用に対する月額料金は次のようになります。

1 か月の料金 2.05 USD

よほど大きなEC2インスタンスタイプの利用や長時間利用をしなければ料金もさほどかからないのも良いですね。

AMTCによるAWSサービスへのアクセス時の動作

Here's how AWS managed temporary credentials work whenever an EC2 environment tries to access an AWS service on behalf of an AWS entity (for example, an IAM user):

  1. AWS Cloud9 checks to see if the calling AWS entity (for example, the IAM user) has permissions to take the requested action for the requested resource in AWS. If the permission doesn't exist or is explicitly denied, the request fails.

  2. AWS Cloud9 checks AWS managed temporary credentials to see if its permissions allow the requested action for the requested resource in AWS. If the permission doesn't exist or is explicitly denied, the request fails. For a list of permissions that AWS managed temporary credentials support, see Actions Supported by AWS Managed Temporary Credentials.

  3. If both the AWS entity and AWS managed temporary credentials allow the requested action for the requested resource, the request succeeds.

  4. If either the AWS entity or AWS managed temporary credentials explicitly deny (or fail to explicitly allow) the requested action for the requested resource, the request fails. This means that even if the calling AWS entity has the correct permissions, the request will fail if AWS Cloud9 doesn't also explicitly allow it. Likewise, if AWS Cloud9 allows a specific action to be taken for a specific resource, the request will fail if the AWS entity doesn't also explicitly allow it.

上記のAWSドキュメント記述を元に、AMTCによるAWSサービスへのアクセス時の動作を整理してみました。

  1. AWSエンティティ(IAMユーザーなど)でCloud9に接続し、AMTCの認証を利用してAWS CLIコマンドなどの実行によりAWSサービスに対するリクエストを行う。
  2. Cloud9は、AWSエンティティが、リクエストされたリソースに対するリクエストされたアクションの実行がIAMで許可されているかどうかを確認する。
  3. Cloud9は、AMTCが、リクエストされたリソースに対するリクエストされたアクションの実行がIAMで許可されているかどうかを確認する。
    • AMTCはサポートされるアクションに制限があり、制限されたアクションの実行は拒否されてリクエストは失敗する。
  4. AWSエンティティとAMTCの両方が、リクエストされたリソースに対するリクエストされたアクションがそれぞれのIAMで許可されている場合は、リクエストは成功する。どちらかが許可されていない場合はリクエストは失敗する。

つまり、AWS Cloud9でAMTCを利用してAWSサービスへリクエストを行う場合は、Cloud9に接続しているAWSエンティティAMTCのいずれに対してもIAMで許可されたリソースおよびアクションのみ、リクエストが成功します。

AMTCでサポートされるアクション

For an AWS Cloud9 EC2 development environment, AWS managed temporary credentials allow all AWS actions for all AWS resources in the caller's AWS account, with the following restrictions:

・For AWS Cloud9, only the following actions are allowed:
(中略)

・For IAM, only the following actions are allowed:
(中略)

・All IAM actions that interact with roles are allowed only for role names starting with Cloud9-. However, iam:PassRole works with all role names.

・For AWS Security Token Service (AWS STS), only the following actions are allowed:
(中略)

・All supported AWS actions are restricted to the IP address of the environment. This is an AWS security best practice.

If AWS Cloud9 doesn't support an action or resource that you need an EC2 environment to access, or if AWS managed temporary credentials is turned off for an EC2 environment and you cannot turn it back on, consider the following alternatives:

・Attach an instance profile to the Amazon EC2 instance that connects to the EC2 environment. For instructions, see Create and Use an Instance Profile to Manage Temporary Credentials.

・Store your permanent AWS access credentials in the EC2 environment, for example, by setting special environment variables or by running the aws configure command. For instructions, see Create and Store Permanent Access Credentials in an Environment.

The preceding alternatives override all permissions that are allowed (or denied) by AWS managed temporary credentials in an EC2 environment.

上記はAMTCでサポートされるアクションについてのAWSドキュメントの記述です。要約してみると、

  • AMTCは、AWS Cloud9IAMAWS STSに対する一部のアクションが制限されている。それらを除けばすべてのリソースに対するすべてのアクションが許可されている。
  • AMTCは、すべてのアクションが環境のIPアドレスで制限されている。
  • AMTCでサポートされていないアクションを実行したい場合は、Cloud9環境のEC2インスタンスにインスタンスプロファイルをアタッチするか、別のAWS認証情報をEC2に保存して利用することができる。

とのこと。AWS Cloud9IAMAWS STSのうちサポートされたアクションの一覧は記載を省略しているので、確認されたい方は元のドキュメントをご覧ください。

遭遇したトラブルと行ったトラブルシュート

本記事のはじめに触れたAMTCのトラブルシュートについてです。

Cloud9上でAWS CLIでAMTCの認証を利用して以下のようにiam attach-role-policyコマンドを実行したところ、以下のようにInvalidClientTokenIdエラーとなりました。Cloud9に接続しているIAMユーザーはAWSに対するフルアクセスを持っています。

$ aws iam attach-role-policy 
  --role-name hoge_role 
  --policy-arn arn:aws:iam::012345678901:policy/fugaPolicy

An error occurred (InvalidClientTokenId) when calling the AttachRolePolicy operation: The security token included in the request is invalid

またエラー時にCloud9の画面右上に以下のようなダイアログも表示されました。 image.png

そこで、前項のAWSドキュメントを確認することにより、AMTCのサポートされたアクション一覧にiam attach-role-policyは含まれていないことが原因であると分かりました。

それでは、AWS CLIの認証を行うIAMユーザーを別途作成してCloud9で認証に利用して、AMTCでサポートされていないコマンドも実行できるようにする設定を行っていきます。

AMCから管理ポリシーAdministratorAccessを付与したIAMユーザーを作成します。アクセスキーIDとシークレットアクセスキーを控えます。

次に作成したIAMユーザーをCloud9のAWS CLIプロファイルに設定していきますが、その前に現在(既定)のログインプロファイルの設定状況を確認してみます。

$ cat ~/.aws/credentials
# Do not modify this file, if this file is modified it will not be updated. If the file is deleted, it will be recreated on Tue Dec 24 2019 05:45:03 GMT+0000 (UTC).
# 48d6506ec784eec13b97c5bda76c9b9efff1fd8ac0b3bfe2b11c0d19f24764f1 #

[default]
aws_access_key_id=ASIAQAXXXXXXXXXXXXXXXXX
aws_secret_access_key=hpEONLEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
aws_session_token=IQoJb3JpZ2luX2VjENb//////////wEaD(中略)zQ1Y=
region=ap-northeast-1

$ cat ~/.aws/config
cat: /home/ec2-user/.aws/config: No such file or directory

~/.aws/credentialsファイルには[default]としてAMTCの認証情報が設定されていますね。一方で~/.aws/configファイルはそもそも作成されていませんでした。

では先ほど作成したIAMユーザーをプロファイルに設定します。

$ aws configure --profile c9_work
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX        
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json

コマンドを実行すると以下のようなダイアログが表示されます。 image.png

AWS managed temporary credentials

Could not update credentials

We cannot update your AWS managed temporary credentials because the credentials file has been modified. Would you like to force an update?

これは、AMTCの認証情報が記載されていた~/.aws/credentialsファイルが先のコマンドで手動で更新されたために、AMTCの認証が自動アップデートできなくなったため、強制的にアップデートして良いか?を聞かれています。 Cancel をクリックします。(ここで Force Update を選択するとAMTCの強制的な自動アップデートとともに~/.aws/credentialsファイルが上書きされて、今しがた手動で設定したc9_workのプロファイルが消えてしまいます。)

すると次は以下のようなダイアログが表示されます。 image.png

AWS managed temporary credentials

Unable to update credentials

Would you like to permanently disable AWS managed temporary credentials? You can always turn it back on in Preferences > AWS Settings.

Permanently disable をクリックしてc9_workのプロファイルを永続的に使えるようにします。( Re-enable after refresh をクリックするとCloud9環境がリフレッシュされた際にc9_workのプロファイルが消えてしまいます。)

ここまでの操作により、Cloud9の[AWS Settings]でAMTCが無効にされたことが分かります。 image.png

この状態でログインプロファイルの設定状況を確認してみると、~/.aws/credentialsにAMTCに加えて[c9_work]のプロファイルも追加されています。また~/.aws/configも作成されて[profile c9_work]の情報が追加されています。

$ cat ~/.aws/credentials
# Do not modify this file, if this file is modified it will not be updated. If the file is deleted, it will be recreated on Tue Dec 24 2019 05:45:03 GMT+0000 (UTC).
# 48d6506ec784eec13b97c5bda76c9b9efff1fd8ac0b3bfe2b11c0d19f24764f1 #

[default]
aws_access_key_id=ASIAQAXXXXXXXXXXXXXXXXX
aws_secret_access_key=hpEONLEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
aws_session_token=IQoJb3JpZ2luX2VjENb//////////wEaD(中略)zQ1Y=
region=ap-northeast-1
[c9_work]
aws_access_key_id = XXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

$ cat ~/.aws/config
[profile c9_work]
output = json
region = ap-northeast-1

そして本来行いたかったCloud9上でのiam attach-role-policyコマンドの実行をc9_workのプロファイルを利用して行って見ると、無事実行することができました。

$ aws iam attach-role-policy --profile c9_work 
  --role-name hoge_role 
  --policy-arn arn:aws:iam::012345678901:policy/fugaPolicy

この後は恒久的にこのIAMユーザーを使うもよし、一時的に使った後にIAMユーザーは削除し、再度[AWS Settings]で有効化してAMTCを使うもよしです。

ちなみに

深くは調べられていませんが。

その1

AMTCを[AWS Settings]で無効するとAMTCが認証不可になると思っていましたが、[AWS Settings]で無効後も、~/.aws/credentialsからAMTCの認証情報は[default]プロファイルとして残ったままで、かつ利用(AWS CLIコマンドの実行)することができました。Cloud9環境のEC2を念の為再起動してみても利用し続けられました。[AWS Settings]でのAMTCの無効化は、「AMTCのプロファイルの強制アップデートを無効化」しているようです。

その2

sts get-caller-identityコマンドによりAMTCのアカウント情報を見てみると、Cloud9への接続に利用しているAWSエンティティ(IAMユーザー:testuser)でした。Cloud9はAMTCの認証情報としてAWSエンティティから作成したアクセスキーを利用しているようです。

# AMTCのアカウント情報
$ aws sts get-caller-identity --profile default
{
    "Account": "<私のアカウントID>", 
    "UserId": "12345678ABCD", 
    "Arn": "arn:aws:iam::<私のアカウントID>:user/testuser"
}

# 比較のためc9_workのアカウント情報も見てみる
$ aws sts get-caller-identity --profile c9_work
{
    "Account": "<私のアカウントID>", 
    "UserId": "987654321EFGH", 
    "Arn": "arn:aws:iam::<私のアカウントID>:user/c9_work"
}

おわりに

AWS Managed Temporary Credentialsは思った以上に奥が深いことが分かりました。参考になれば幸いです。

以上