Memo/AmazonWebServices/IAM

https://dexlab.net:443/pukiwiki/index.php?Memo/AmazonWebServices/IAM
 

IAM(Identity and Access Management)


リソース制限


複数AWSアカウントの管理

  • ログイン用AWSアカウント
    • IAM user作成
      • ログイン、MFA設定、パスワード変更等しか出来ないようにする
      • MFA有効化
      • AccessKey?作成
  • 管理対象の複数AWSアカウント
    • IAM userは作成しない
    • IAM roleを作成
      • ログイン用AWSアカウントからAssumeRole?でswitchできるように設定
      • admin, PowerUser?, Readonly等のroleを作成
# account1にIAM userがあるとする
aws configure --profile account1
cat ~/.aws/config
[account1]
output = json
region = ap-northeast-1
[account2]
output = json
region = ap-northeast-1
role_arn = arn:aws:iam::<account2 account id>:role/role-admin
source_profile = account1
  • aws cliでのテストは policy変更後、localのcacheを削除したほうが良い。
    rm -r ~/.aws/cli/cache

ハードウェアMFA

  • バッテリー切れ/壊れた場合、AWSサポートに連絡してMFAを無効にしてもらう必要あり
  • 余っているスマホがあるなら、 Authy いれ、簡易金庫にでも保管するのが楽

チュートリアル

  • IAM のチュートリアル - AWS Identity and Access Management
    • チュートリアル: 請求コンソールへのアクセス権の委任
    • チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任
    • チュートリアル: はじめてのカスタマー管理ポリシーの作成とアタッチ
    • チュートリアル: ユーザーが自分の認証情報および MFA を設定できるようにする
    • aws cliでの利用時に、MFAが未入力でもswitch roleできるようにする場合、 「sts:AssumeRole?」を追加する。このセクションはDenyなので、許可したいAPIを列挙する。
      ...
                   "Sid": "BlockMostAccessUnlessSignedInWithMFA",
                   "Effect": "Deny",
                   "NotAction": [
                     "sts:AssumeRole",...
    • パスワード変更後に、さらにパスワード変更できない。ログアウト > ログインが必要。
    • 「パスワードリセットが必要」でユーザを作ると、初回のパスワード変更時に失敗する。IAM > アカウント設定 > パスワードポリシーの削除。またはリセットを使わない。

IAM policy内で変数を使う

  • ${aws:CurrentTime?}
  • ${aws:EpochTime?}
  • ${aws:TokenIssueTime?}
  • ${aws:principaltype}
  • ${aws:SecureTransport?}
  • ${aws:SourceIp?}
  • ${aws:UserAgent?}
  • ${aws:userid}
  • ${aws:username}
  • ログインしているIAM userが自分のリソースだけ触れるように
  • ${ec2:SourceInstanceARN}

STS(Security Token Service): 一時的セキュリティ認証情報

  • aws cliで一時的な認証情報を得る。profileを指定するのは元アカウント。一時的な認証は3つの情報(access key, secret key, session token)が必要になる。
  • awscliはassume roleに対応しており、--profileで直接指定できるため、通常keyを指定する事は無いと思う。
    aws sts assume-role \
      --role-arn "arn:aws:iam::<account2 account id>:role/role-admin" \
      --role-session-name "account2-admin-session1" \
      --duration-seconds 3600 \
      --profile account1 > account2-admin-session1.json
    
    export AWS_ACCESS_KEY_ID=$(cat account2-admin-session1.json | jq -r '.Credentials.AccessKeyId')
    export AWS_SECRET_ACCESS_KEY=$(cat account2-admin-session1.json | jq -r '.Credentials.SecretAccessKey')
    export AWS_SESSION_TOKEN=$(cat account2-admin-session1.json | jq -r '.Credentials.SessionToken')
    aws s3 ls

AssumeRole?: 複数のAWSアカウント間で権限を委譲する

一つのAWSアカウントにIAM userを作り、他のAWSアカウントではIAM roleにswitchできる。

  • メリット
    • 各AWSアカウント毎にIAM userを作る手間と、セキュリティリスク削減

アカウント名の取得

  • aws sts get-caller-identityで自分のaccount idは取得できる。account nameを取得する方法が不明
  • aws organizations にはaccount nameがある
AWS_SRC_ACCOUNT=<src account>
AWS_ORG_ACCOUNT=<organization account>

aws organizations describe-account \
 --query 'Account.Name' \
 --account-id $(aws sts get-caller-identity --profile $AWS_SRC_ACCOUNT --query 'Account' --output text) \
 --output text \
 --profile $AWS_ORG_ACCOUNT
  • account-aliasesを設定して「aws iam list-account-aliases」で取得する

AWSアカウントIDの代わりにaliasを使う

IAMユーザのサインイン画面のURLはデフォルトアカウントIDだが、aliasが複数設定できる。 aliasを設定しても、accountIDのリンクは使える。


一時的なAccess Keyの発行


IAM Roleを設定できるユーザの作成

LambdaはIAMを触る強い権限が必要になる。そうするとAdminになってしまうが、それが嫌な場合。


ポリシーのテスト

APIによって、リソースが指定できる場合と、指定できない場合がある。

  • 例:Tag「Name: web」が付いたEC2インスタンスの操作を拒否したい。制限されるAPIとされないAPIがある。
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Deny",
                "Action": [
                    "ec2:*"
                ],
                "Condition": {
                    "StringEquals": {
                        "ec2:ResourceTag/Name": "web"
                    }
                },
                "Resource": [
                    "arn:aws:ec2:ap-northeast-1:<account id>:instance/*"
                ]
            }
        ]
    }
  • aws cliの「--dry-run」付きで試すのが分かりやすい
    AWS_PROFILE=default
    AWS_REGION=ap-northeast-1
    EC2_ID=i-xxxx
    
     aws ec2 create-tags --dry-run --resources $EC2_ID --tags "Key=test-key,Value=test-val" --profile $AWS_PROFILE --region $AWS_REGION
    # 拒否された場合のメッセージ
    An error occurred (UnauthorizedOperation) when calling the CreateTags operation: You are not authorized to perform this operation.
    
    # 許可された場合のメッセージ
    An error occurred (DryRunOperation) when calling the CreateTags operation: Request would have succeeded, but DryRun flag is set.

ポリシーの例


switch role:複数AWSアカウントを切り替える


サポート用

  • AdministratorAccess?権限でも、サポートの利用はできない。別途AWSSupportAccess?権限が必要

IAMユーザが請求情報にアクセスできるように


請求情報だけにアクセスできるユーザを作成

  1. セキュリティの質問を設定
  2. AWS ウェブサイトへのアクセスのアクティベート は忘れがちなので注意
  3. IAM Groupを作成。例:AccountingGroup?
    • role
      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "aws-portal:ViewBilling"
            ],
            "Resource": "*"
          },
          {
            "Effect": "Allow",
            "Action": [
              "aws-portal:ViewUsage"
            ],
            "Resource": "*"
          }
        ]
      }

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-10-01 (月) 12:21:07 (18d)