【AWS】IAM ~ 基本編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2017/02/26/231046

の続き。

IAM について、もう少し掘り下げる。

目次

【1】IAM
 1)認証 (Authentication)
 2)認可 (Authorization)
【2】IAMユーザ・グループ
 1)認証種類
 2)MFA設定手順
【3】IAM Policy(ポリシー)
【4】IAM role
 1)ロールを切り替えるのは
【5】Billing and Cost Management コンソールの閲覧許可する
【6】IAM ロールを引き受けるには

【1】IAM

* AWS操作をより安全に行うための認証・認可の仕組み

1)認証 (Authentication)

* アクセスしたユーザに対して、
 その人本人であるかの確認を取ること

* ユーザID/パスワード

2)認可 (Authorization)

* 「認証」したユーザが何をしていいかを許可すること

* アクセス制御機能

【2】IAMユーザ・グループ

* 『認証』の部分

1)認証種類

* 以下の2種類
~~~~~~~
[1] ユーザーIDとパスワード
[2] アクセスキーとシークレットアクセスキー
~~~~~~~

[1] ユーザーIDとパスワード

* Webコンソールでアクセスする際に使用
* MFAと組み合わせも可能(後述「2)MFA設定手順」参照)

[2] アクセスキーとシークレットアクセスキー

* CLIやAPIからAWSリソースにアクセスする際に使用

2)MFA設定手順

 * 以下の関連記事を参照

IAM ~ 多要素認証(MFA)の設定 ~
https://dk521123.hatenablog.com/entry/2020/12/09/150822

 【3】IAM Policy(ポリシー)

http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html

* アクセス制御
 => AWSユーザに対して、AWS サービス を実行権限をコントロールできる
* 『認可』の部分
* 詳細は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2020/09/30/133123
基本的な運用方法

* IAMグループごと又はIAMロールごとに、
 ポリシーを付与するようにする

【4】IAM role

導入

* IAMユーザに対して、IAMポリシーを直接アタッチできるが
 EC2などのAWSサービスに対しては、直接アタッチはできない
 => EC2などのAWSサービスに対しては、IAMロールを割り当てる

IAMロールとは?

* 一時的にAWSリソースへのアクセス権限を付与する場合などに使用
 => この『一時的に』がポイント。
~~~~~
 [1] AWSリソースへの権限付与
 [2] クロスアカウントアクセス
 [3] IDフェデレーション
 => Active Directoryでアクセス
 [4] Web ID フェデレーション
 => GoogleやFacebookアカウントでアクセス
~~~~~

補足:IDフェデレーション

* 以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2022/10/18/185246

1)ロールを切り替えるのは

* 1ユーザには複数のロールを設定することができ、
   ログインした際に切り替えることできる

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-console.html
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_permissions-to-switch.html
手順

[1] [IAM]-[ロール] を選択
[2] 対象のロールを選択する
[3] コンソールで [ロールの切り替える]リンクを押下 

【5】Billing and Cost Management コンソールの閲覧許可する

* IAMユーザでの Billing and Cost Management コンソールの
 閲覧許可する方法を記載する。

 現象

 * IAM ユーザ/AdministratorAccess 管理ポリシーで、
   Billing and Cost Management コンソールへのアクセスしても権限で怒られる

 原因

 * Billing and Cost Management コンソールへのアクセスを
 アクティベートする必要がある

 対応方法
http://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/grantaccess.html

に記載されている 

[1] ルートアカウント認証情報 (AWS アカウントの作成に
 使用した E メール アドレスとパスワード) で 
    AWS マネジメントコンソール にサインイン
[2] ナビゲーションバーでアカウント名を選択してから、[アカウント] を選択
[3] [IAM User Access to Billing Information] の横で、[編集] を選択
[4] [Activate IAM Access] チェックボックスをオンにする
[5] ログオフして、IAMユーザでログインし直して、
    Billing and Cost Management コンソールにアクセスできるか確認する

【6】IAM ロールを引き受けるには

* 以下の公式ドキュメントに記載されていることを参考にやってみる
 => 動画も倍速でいいので、一読しておくといいかも

https://repost.aws/ja/knowledge-center/iam-assume-role-cli

動画
https://youtu.be/xeET-P4v9wE?si=mIMzlg2zZq9sWzen&t=28

Step1: ロールを引き受ける権限を持つ IAM ユーザーを作成

AWS Management コンソール 上でもできる工程もあるが、
AWS CLIで行ってみる

[1] IAM ユーザを作成

# 作成するユーザ「demo-user」の場合
aws iam create-user --user-name demo-user
# => ARN はメモしておく

[2] IAM ポリシーを作成

 作成したユーザ「demo-user」に
アクセス権限を付与する IAM ポリシーを作成

[2-1] IAMポリシーの基になるIAM ポリシーをJSONファイルとして保存 (user-policy.json)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Describe*",
        "iam:ListRoles",
        "sts:AssumeRole"
      ],
      "Resource": "*"
    }
  ]
}
Actions Explanations Memo
ec2:Describe* EC2の読み取り専用アクセス権限を付与 ここは要件によって変更するとよさそう
iam:ListRoles ロールの完全なARNが不明な場合、ユーザがアカウント内のターゲットIAMロールが見つけられるためのAction ★ここがキモ
sts:AssumeRole ユーザがターゲットIAMロールを引き受けることを許可する ★ここがキモ

[2-2] IAM ポリシーを作成する

# aws iam create-policy --policy-name 【PolicyName】 --policy-document 【PolicyJSONPath】
aws iam create-policy --policy-name demo-user-policy --policy-document ./user-policy.json
# ARN: arn:aws:iam::123456789012:policy/demo-user-policy

[3] 作成したIAM ポリシーをIAMユーザにアタッチする

# アタッチ実行
aws iam attach-user-policy \
  --user-name Bob \
  --policy-arn "arn:aws:iam::123456789012:policy/demo-user-policy"

# 確認
aws iam list-attached-user-policies --user-name demo-user

Step2: 確認

[1] アクセスキー作成する

$ aws iam create-access-key --user-name demo-user
{
    "AccessKey": {
        "UserName": "demo-user",
        "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "Status": "Active",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "CreateDate": "2024-05-14T17:34:16Z"
    }
}

[2] アクセスキーを設定する

$ export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
$ export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ export AWS_DEFAULT_REGION=us-west-2

[3] IAM ユーザーアクセスを確認する

$ aws sts get-caller-identity
{
    "Account": "123456789012",
    "UserId": "XXXX*****************",
    "Arn": "arn:aws:iam::123456789012:user/demo-user"
}

 関連記事

IAM ~ IAM Policy 編 ~
https://dk521123.hatenablog.com/entry/2020/09/30/133123
IAM ~ アクセスキー ~
https://dk521123.hatenablog.com/entry/2023/02/02/091544
IAM ~ クロスアカウント ~
https://dk521123.hatenablog.com/entry/2022/05/23/000000
IAM ~ 別AWSアカウントのS3にファイルアップロード ~
https://dk521123.hatenablog.com/entry/2024/03/08/003841
IAM ~ Service-Linked Roles ~
https://dk521123.hatenablog.com/entry/2023/01/22/000000
AWS CLIaws sts
https://dk521123.hatenablog.com/entry/2023/04/09/104204
IAM ~ 多要素認証(MFA)の設定 ~
https://dk521123.hatenablog.com/entry/2020/12/09/150822
IDフェデレーション
https://dk521123.hatenablog.com/entry/2022/10/18/185246