はじめに
JAWS-UG CLI専門支部 #185R IAM入門 (ユーザー/グループ)のハンズオンに参加した。
当日は手順書通りに作業を実施して問題なく完了したものの、「何のために何をやっているのか」きちんと理解しきれていなかった部分があったので、改めて噛みしめながら復習する。
※手順はハンズオンから一部変更している。
今回実施すること
今回は、アクセスキーを使用し、異なるIAMユーザーの権限を利用してAWSリソースにアクセスする。
図示すると以下のようになる。
- IAMFullAccess権限しか持っていないCloud9環境を用意する。このCloud9環境では、S3やEC2へのアクセスは出来ない。
- S3FullAccess権限を持っているIAMユーザーのアクセスキーを利用し、このCloud9環境上からS3へアクセス出来ることを確認する。
- アクセスキーを利用しても、EC2へのアクセスは出来ないことを確認する。
(個人的反省)なぜ今回のハンズオンで、途中で理解が追い付かなくなったのか
作業に入る前に、なぜ今回のハンズオンで途中から理解が追い付かなくなったのか改めて考えてみると、以下の2点にハマってしまったように思う。(※個人の感想なので、他の受講者の人はまた違うかもしれない)
アクセス先のユーザーをCloud9で作成したことで混乱してしまった
もともと自分の中には、「アクセスキーを利用してAWSリソースにアクセスするのは、AWS外のリソースからアクセスする場合」という若干偏った認識があった。その場合、外部リソースは、何等かの方法でアクセスキーIDとクレデンシャル情報(シークレットアクセスキー)を他所から手に入れて、それを使ってアクセスすることになる。
ところが今回は、アクセス先のユーザーや、そのユーザーが保持するアクセスキー自体を、Cloud9環境で作成した。
そのため、なんだか自作自演感があり、どのリソースが何を司っているのかよく分からなくなってしまった。(※個人の感想です)
そこで、改めて今回やることを図示し、自分の頭を整理し直した。
やりたい事を実行するためのコマンドと、変数やファイルを作成するためのコマンドを分類できていなかった。
CLI支部でのハンズオンでは毎回、結構な数の変数を作成する(基本的にコマンドの引数は変数を参照させるため)。中には一つの変数やファイルを作成するためにかなり色々とやるケースがあり、特に今回クレデンシャルファイルを作成する際には前段で色々な準備が発生したため、当日は何のために何をやっているのかついていけなくなった感がある。
この点に関しては、以下のように逆算・分類して考えるべきだった。
- やりたい事を実行するために必要なコマンドは何か
- そのコマンドで必要な引数やファイルは何か
- その引数を格納する変数やファイルの作成に必要なコマンドは何か
そこで今回は、「変数やファイルを作成するためのコマンド」は一旦省略し、「やりたい事を実行するために必要なコマンド」にフォーカスする。
変数を作成するためのコマンドについては、後日、別の記事としてまとめたいと思う。
実作業
IAMユーザの作成
IAMユーザー「handson-cli-novice-user」を作成する。
IAMユーザーの作成には、aws iam create-user
コマンドを使用する。
コマンド | 内容 |
---|---|
aws iam create-user | IAMユーザーを作成する |
--user-name | ユーザー名を指定する |
[ec2-user@ip-10-0-0-127%]$ IAM_USER_NAME='handson-cli-novice-user' [ec2-user@ip-10-0-0-127%]$ aws iam create-user \ > --user-name ${IAM_USER_NAME} { "User": { "Path": "/", "UserName": "handson-cli-novice-user", "UserId": "AIDATO53NFKUDFSH7BZLN", "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/handson-cli-novice-user", "CreateDate": "2021-07-02T13:08:20Z" } } [ec2-user@ip-10-0-0-127%]$
IAMログインプロファイルの作成
IAMユーザー「handson-cli-novice-user」のログインプロファイル(パスワード等)を作成する。aws iam create-login-profile
コマンドを使用する。
コマンド | 内容 |
---|---|
aws iam create-login-profile | ログインプロファイルを作成する |
--user-name | ユーザー名を指定する |
--password | パスワードを指定する |
[ec2-user@ip-10-0-0-127%]$ IAM_USER_NAME='handson-cli-novice-user' [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ IAM_USER_PASSWORD='#userPass123' [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws iam create-login-profile \ > --user-name ${IAM_USER_NAME} \ > --password "${IAM_USER_PASSWORD}" { "LoginProfile": { "UserName": "handson-cli-novice-user", "CreateDate": "2021-07-02T13:12:05Z", "PasswordResetRequired": false } } [ec2-user@ip-10-0-0-127%]$
アクセスキーの作成
IAMユーザー「handson-cli-novice-user」のアクセスキーを作成する。aws iam create-access-key
コマンドを使用する。
コマンド | 内容 |
---|---|
aws iam create-access-key | アクセスキーを作成する |
--user-name | ユーザー名を指定する |
[ec2-user@ip-10-0-0-127%]$ IAM_USER_NAME='handson-cli-novice-user' [ec2-user@ip-10-0-0-127%]$ FILE_ACCESS_KEY='/home/ec2-user/environment/conf-handson-cli-iam/handson-cli-novice-user-token-0.json' [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws iam create-access-key \ > --user-name ${IAM_USER_NAME} \ > > ${FILE_ACCESS_KEY} \ > && cat ${FILE_ACCESS_KEY} { "AccessKey": { "UserName": "handson-cli-novice-user", "AccessKeyId": "XXXXXXXXXXXXXXXXXXXX", "Status": "Active", "SecretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX", "CreateDate": "2021-07-02T13:19:26Z" } } [ec2-user@ip-10-0-0-127%]$
クレデンシャルファイルの作成
クレデンシャルファイルは、AWS CLIでは、デフォルトでは~/.aws/credentials
に格納されるファイルで、以下の内容になっている。
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
当日のハンズオンでは、このファイルをjp.pyやsedを駆使して作成していたが、そこを掘り下げるとそれだけでブログが1本書けそうなので、今回は省略する。
以下のパスでクレデンシャルファイルを作成した。
[ec2-user@ip-10-0-0-127%]$ ls ${FILE_USER_CREDENTIAL} /home/ec2-user/environment/conf-handson-cli-iam/handson-cli-novice-user.ini [ec2-user@ip-10-0-0-127%]$
IAMグループの作成
IAMグループ「handson-cli-novice-group」作成する。IAMグループの作成は、aws iam create-group
コマンドを使用する。
コマンド | 内容 |
---|---|
aws iam create-group | IAMグループを作成する |
--group-name | グループ名を指定する |
[ec2-user@ip-10-0-0-127%]$ IAM_GROUP_NAME='handson-cli-novice-group' [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws iam create-group \ > --group-name ${IAM_GROUP_NAME} { "Group": { "Path": "/", "GroupName": "handson-cli-novice-group", "GroupId": "AGPATO53NFKUB2ZZ2ITWG", "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/handson-cli-novice-group", "CreateDate": "2021-07-02T16:35:18Z" } } [ec2-user@ip-10-0-0-127%]$
IAMグループへのポリシーアタッチ
IAMグループ「handson-cli-novice-group」にIAMポリシー「AmazonS3FullAccess」をアタッチする。ポリシーのアタッチにはaws iam attach-group-policy
コマンドを使用する。
コマンド | 内容 |
---|---|
aws iam attach-group-policy | IAMポリシーをアタッチする |
--group-name | グループ名を指定する |
--policy-arn | ポリシーのARNを指定する |
ポリシーのARNはaws iam list-policies
で参照する。詳細はこちらの記事を参照。
[ec2-user@ip-10-0-0-127%]$ IAM_GROUP_NAME='handson-cli-novice-group' [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ IAM_POLICY_NAME='AmazonS3FullAccess' [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ IAM_POLICY_ARN=$( \ > aws iam list-policies \ > --scope AWS \ > --max-items 1000 \ > --query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].Arn" \ > --output text \ > ) \ > && echo "${IAM_POLICY_ARN}" arn:aws:iam::aws:policy/AmazonS3FullAccess [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws iam attach-group-policy \ > --group-name ${IAM_GROUP_NAME} \ > --policy-arn ${IAM_POLICY_ARN} [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws iam list-attached-group-policies \ > --group-name ${IAM_GROUP_NAME} \ > --query "AttachedPolicies[?PolicyName == \`${IAM_POLICY_NAME}\`].PolicyName" \ > --output text AmazonS3FullAccess [ec2-user@ip-10-0-0-127%]$
IAMユーザーのIAMグループへの追加
IAMユーザー「handson-cli-novice-user」をIAMグループ「handson-cli-novice-group」へ追加する。IAMユーザーをIAMグループに追加するにはaws iam add-user-to-group
コマンドを使用する。
コマンド | 内容 |
---|---|
aws iam add-user-to-group | IAMユーザーをIAMグループに追加する |
--group-name | グループ名を指定する |
--user-name | ユーザー名を指定する |
[ec2-user@ip-10-0-0-127%]$ IAM_GROUP_NAME='handson-cli-novice-group' [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ IAM_USER_NAME='handson-cli-novice-user' [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws iam add-user-to-group \ > --group-name ${IAM_GROUP_NAME} \ > --user-name ${IAM_USER_NAME} [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws iam list-groups-for-user \ > --user-name ${IAM_USER_NAME} \ > --query "Groups[?GroupName==\`${IAM_GROUP_NAME}\`].GroupName" \ > --output text handson-cli-novice-group [ec2-user@ip-10-0-0-127%]$
アクセスキーを利用してアクセス確認
準備が整ったので、いよいよアクセスキーを利用してアクセス確認を行う。その前に、まずは現在のCloud9の権限でS3、EC2にアクセスできないことを確認する。
[ec2-user@ip-10-0-0-127%]$ aws iam list-attached-role-policies \ > --role-name handson-cloud9-environment-role { "AttachedPolicies": [ { "PolicyName": "IAMFullAccess", "PolicyArn": "arn:aws:iam::aws:policy/IAMFullAccess" } ] } [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None None access_key ****************3HXR iam-role secret_key ****************AjZt iam-role region <not set> None None [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws s3 ls An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws ec2 describe-instances --instance-ids i-0cdb696axxxxx7373 You must specify a region. You can also configure your region by running "aws configure". [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ export AWS_DEFAULT_REGION=ap-northeast-1 [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws ec2 describe-instances --instance-ids i-0cdb696axxxxx7373 An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation. [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$
想定通り、S3もEC2も権限が無く表示することが出来なかった。
なお、EC2を表示させようとした時に「デフォルトリージョンを指定しろ」と怒られたので、環境変数AWS_DEFAULT_REGION
を東京リージョンに指定した。ちなみに、CLI環境の環境変数の設定は、aws configure
コマンドで実施することも可能。
今度はアクセスキーを利用してアクセス確認をする。アクセスキーを利用するには、環境変数AWS_DEFAULT_PROFILE
を「handson-cli-novice-user」に設定し、「handson-cli-novice-user」のプロファイルを使用するようにする。
さらに、環境変数AWS_SHARED_CREDENTIALS_FILE
で先ほど作成したクレデンシャルファイルパスを指定し、利用するアクセスキーを指定する。
AWS CLIの環境変数については、以下のサイトを参照。
[ec2-user@ip-10-0-0-127%]$ export AWS_SHARED_CREDENTIALS_FILE="${HOME}/environment/conf-handson-cli-iam/handson-cli-novice-user.ini" [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ export AWS_DEFAULT_PROFILE='handson-cli-novice-user' [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws configure list Name Value Type Location ---- ----- ---- -------- profile handson-cli-novice-user env ['AWS_DEFAULT_PROFILE', 'AWS_PROFILE'] access_key ****************YIMY shared-credentials-file secret_key ****************eTQf shared-credentials-file region ap-northeast-1 env AWS_DEFAULT_REGION [ec2-user@ip-10-0-0-127%]$
aws configure list
の出力結果が変わっていることが分かる。この状態で、改めてS3とEC2にアクセスを試行してみる。
[ec2-user@ip-10-0-0-127%]$ aws s3 ls 2021-05-16 09:21:41 cf-templates-t1azjfgdsw8s-ap-northeast-1 [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws ec2 describe-instances --instance-ids i-0cdb696axxxxx7373 An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation. [ec2-user@ip-10-0-0-127%]$
想定通り、S3の情報は表示できたが、EC2の情報は表示できなかった。
なお、環境変数を削除すれば、プロファイル設定はすぐに元に戻る。
[ec2-user@ip-10-0-0-127%]$ export -n AWS_DEFAULT_PROFILE [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ [ec2-user@ip-10-0-0-127%]$ aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None None access_key ****************HA5W iam-role secret_key ****************wdqW iam-role region ap-northeast-1 env AWS_DEFAULT_REGION [ec2-user@ip-10-0-0-127%]$
おわりに
じっくりと復習することで、大分理解が深まった。今回深堀しなかったクレデンシャルファイルの作成等は、別途ブログにまとめたいと思う。
また、以下のページで推奨されている、IAMロールを使用した一時認証情報でのアクセスについても実際に試して理解を深めたいと思う。
その他にも、ウェブIDフェデレーションや、AD連携などの認証方式もあるので、これらもなるべく実際に自分で構築して理解を深めたい。
認証の道は果てしなく続いているが、実務で避けて通れないところでもあるので、コツコツ取り組みたいと思う。