一覧CL-02-1 · アカウントと資源の管理

クラウドリソースの識別と管理

名前、識別子、分類、管理境界をそれぞれ確認し、操作対象の取り違えと分類漏れを見つけます。

説明

クラウドの一覧には、別アカウントで同じ名前を付けた資源が並ぶことがあります。表示名だけで操作対象を決めず、アカウント、region、資源IDを確認する必要があります。タグは分類に役立ちますが、タグが同じでも所有アカウントは同じとは限りません。

AWSのARN形式を使った固定の資源一覧と、組織階層の記録を読みます。二つのwebを特定し、タグの未設定を調べ、アカウントから組織の親へたどって制限を確認します。組織制限の検査は許可を与える検査ではなく、拒否条件に該当するかの確認です。

名前、識別子、分類、管理境界をそれぞれ確認し、操作対象の取り違えと分類漏れを見つけます。

1組織の親子関係と制限

OUはアカウントをまとめる組織単位です。この例ではproductionとlabのOUに、それぞれ一つのメンバーアカウントがあります。

cat scope.txt組織の階層と固定の制限を読む

rootの制限は両方のアカウントへ引き継がれ、productionの削除制限は111111111111へ引き継がれます。設定する範囲と対象アカウントを先に確認します。

2同じ名前の資源を探す

name=webで絞り込みます。

python3 inventory.py list --name web表示名がwebの資源を抽出する

webが2件あります。どちらもap-northeast-1ですが、所有アカウントとinstance IDが異なります。表示名を識別子の代わりにすると、意図した環境と別の環境を操作しかねません。

3アカウントまで指定して絞る

本番側のアカウント111111111111を追加条件にします。

python3 inventory.py list --name web --account 111111111111所有アカウントを検索条件へ加える

対象はi-00000000000000001の1件になります。名前による検索の後、所有アカウントと資源IDを確認することで対象を確定できます。

4ARNの各部分を確認

ARNは資源を識別する名前です。このEC2の例ではpartition、service、region、account、resource typeとIDを含みます。

python3 inventory.py arn --id i-00000000000000001対象資源のARNを構成要素に分ける

arn:aws:ec2の後にregionと12桁のアカウントIDが続き、最後はinstance/資源IDです。ARNの詳細な形式はサービスごとに異なり、regionやaccountが空の形式もあります。

5タグ分類から漏れた資源

Teamタグで全資源を集計します。タグのない資源も集計から落とさずに表示します。

python3 inventory.py groupタグ未設定を含めてTeam別に集計する

shopは3件、未設定はworkerの1件です。shopだけを調べる集計では、未設定資源が管理や費用の確認から漏れます。また、同じshopには二つのアカウントが含まれています。

6タグを補っても所有者は変わらない

workerへTeam=shopを付け、分類とアカウントを再確認します。

python3 inventory.py tag --id i-00000000000000003 --team shopworkerのTeamタグを補う python3 inventory.py group分類結果を再集計する python3 inventory.py list --name worker所有アカウントと配置を再確認する

shopが4件になりますが、workerのアカウントは222222222222、regionはus-west-2のままです。この例でタグは分類に使っており、タグ更新によって所属や操作権限を変更してはいません。

7本番側へ継承された削除制限

本番webの削除操作について、アカウントからrootまでたどります。

python3 inventory.py check --id i-00000000000000001 --operation delete削除が組織の拒否条件に該当するか確認する

chainはアカウント→production→rootです。productionのaction制限によりdeniedになります。資源のタグをshopへそろえても、この組織階層の制限を解除したことにはなりません。

8組織制限を通過しても許可は別

lab側のwebについて同じ削除操作を調べます。

python3 inventory.py check --id i-00000000000000002labアカウントのwebを検査対象にする --operation delete

labには削除制限がなく、ap-northeast-1もrootの拒否対象ではないためpassedです。ただしこの結果は、実行主体へ削除権限を与えていません。IAMなどの許可条件を別に満たす必要があります。

9既存資源にも新しい操作制限は効く

workerの読取り操作を、現在の組織制限で検査します。

python3 inventory.py check --id i-00000000000000003 --operation readus-west-2の既存資源を現在の制限で検査する

rootのregion制限でdeniedです。一覧に資源が存在することと、現在の制限で操作できることは別です。制限の追加は既存資源を自動削除する処理ではありません。

まとめ

表示名だけで対象を決めず、アカウント・region・資源IDを確認します。

タグ分類では未設定も集計し、分類と所有アカウントを混同しないようにします。

組織制限に該当しないことと、実行主体に許可があることは別の確認です。

操作履歴と解説を振り返れます。

シェル / Python 3

1
cat scope.txt
組織root
├─ production OU
│  └─ account 111111111111
└─ lab OU
   └─ account 222222222222

教材の組織制限: rootはus-west-2での新しい操作を拒否。productionはdeleteを拒否。
この検査のpassedは組織制限に該当しないという意味で、IAMの許可を与えるものではない。
既存資源の配置は現在の一覧であり、新しい制限を設定しても自動削除されない。
2
python3 inventory.py list --name web
arn:aws:ec2:ap-northeast-1:111111111111:instance/i-00000000000000001 name=web tags={"Env": "prod", "Team": "shop"}
arn:aws:ec2:ap-northeast-1:222222222222:instance/i-00000000000000002 name=web tags={"Env": "lab", "Team": "shop"}
3
python3 inventory.py list --name web --account 111111111111
arn:aws:ec2:ap-northeast-1:111111111111:instance/i-00000000000000001 name=web tags={"Env": "prod", "Team": "shop"}
4
python3 inventory.py arn --id i-00000000000000001
arn:aws:ec2:ap-northeast-1:111111111111:instance/i-00000000000000001
partition=aws service=ec2 region=ap-northeast-1 account=111111111111 resource=instance/i-00000000000000001
5
python3 inventory.py group
<untagged> count=1 ids=i-00000000000000003
shop count=3 ids=i-00000000000000001,i-00000000000000002,vol-00000000000000001
6
python3 inventory.py tag --id i-00000000000000003 --team shop python3 inventory.py group python3 inventory.py list --name worker
tag updated i-00000000000000003 Team=shop
shop count=4 ids=i-00000000000000001,i-00000000000000002,i-00000000000000003,vol-00000000000000001
arn:aws:ec2:us-west-2:222222222222:instance/i-00000000000000003 name=worker tags={"Team": "shop"}
7
python3 inventory.py check --id i-00000000000000001 --operation delete
chain=111111111111 -> production -> root
organization_guardrail=denied production:action
8
python3 inventory.py check --id i-00000000000000002 --operation delete
chain=222222222222 -> lab -> root
organization_guardrail=passed (permission not granted by this check)
9
python3 inventory.py check --id i-00000000000000003 --operation read
chain=222222222222 -> lab -> root
organization_guardrail=denied root:region

演習完了