Y_Yamashitaのブログ

勉強したことのアウトプット・メモ中心。たまに日記とか。

JAWS-UG CLI専門支部 #185R IAM入門 (ユーザー/グループ)を噛みしめながら復習する①

はじめに

JAWS-UG CLI専門支部 #185R IAM入門 (ユーザー/グループ)のハンズオンに参加した。

jawsug-cli.connpass.com

当日は手順書通りに作業を実施して問題なく完了したものの、「何のために何をやっているのか」きちんと理解しきれていなかった部分があったので、改めて噛みしめながら復習する。
※手順はハンズオンから一部変更している。

今回実施すること

今回は、アクセスキーを使用し、異なるIAMユーザーの権限を利用してAWSリソースにアクセスする。
図示すると以下のようになる。 f:id:YuY_83:20210703015259p:plain

  • IAMFullAccess権限しか持っていないCloud9環境を用意する。このCloud9環境では、S3やEC2へのアクセスは出来ない。
  • S3FullAccess権限を持っているIAMユーザーのアクセスキーを利用し、このCloud9環境上からS3へアクセス出来ることを確認する。
  • アクセスキーを利用しても、EC2へのアクセスは出来ないことを確認する。

(個人的反省)なぜ今回のハンズオンで、途中で理解が追い付かなくなったのか

作業に入る前に、なぜ今回のハンズオンで途中から理解が追い付かなくなったのか改めて考えてみると、以下の2点にハマってしまったように思う。(※個人の感想なので、他の受講者の人はまた違うかもしれない)

アクセス先のユーザーをCloud9で作成したことで混乱してしまった

もともと自分の中には、「アクセスキーを利用してAWSリソースにアクセスするのは、AWS外のリソースからアクセスする場合」という若干偏った認識があった。その場合、外部リソースは、何等かの方法でアクセスキーIDとクレデンシャル情報(シークレットアクセスキー)を他所から手に入れて、それを使ってアクセスすることになる。

ところが今回は、アクセス先のユーザーや、そのユーザーが保持するアクセスキー自体を、Cloud9環境で作成した。
そのため、なんだか自作自演感があり、どのリソースが何を司っているのかよく分からなくなってしまった。(※個人の感想です) f:id:YuY_83:20210703015400p:plain

そこで、改めて今回やることを図示し、自分の頭を整理し直した。

やりたい事を実行するためのコマンドと、変数やファイルを作成するためのコマンドを分類できていなかった。

CLI支部でのハンズオンでは毎回、結構な数の変数を作成する(基本的にコマンドの引数は変数を参照させるため)。中には一つの変数やファイルを作成するためにかなり色々とやるケースがあり、特に今回クレデンシャルファイルを作成する際には前段で色々な準備が発生したため、当日は何のために何をやっているのかついていけなくなった感がある。

この点に関しては、以下のように逆算・分類して考えるべきだった。

  1. やりたい事を実行するために必要なコマンドは何か
  2. そのコマンドで必要な引数やファイルは何か
  3. その引数を格納する変数やファイルの作成に必要なコマンドは何か


そこで今回は、「変数やファイルを作成するためのコマンド」は一旦省略し、「やりたい事を実行するために必要なコマンド」にフォーカスする。
変数を作成するためのコマンドについては、後日、別の記事としてまとめたいと思う。

実作業

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環境変数については、以下のサイトを参照。

docs.aws.amazon.com

[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ロールを使用した一時認証情報でのアクセスについても実際に試して理解を深めたいと思う。

docs.aws.amazon.com

その他にも、ウェブIDフェデレーションや、AD連携などの認証方式もあるので、これらもなるべく実際に自分で構築して理解を深めたい。

認証の道は果てしなく続いているが、実務で避けて通れないところでもあるので、コツコツ取り組みたいと思う。