クラウドリソースの識別と管理
名前、識別子、分類、管理境界をそれぞれ確認し、操作対象の取り違えと分類漏れを見つけます。
説明
クラウドの一覧には、別アカウントで同じ名前を付けた資源が並ぶことがあります。表示名だけで操作対象を決めず、アカウント、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 deletelabには削除制限がなく、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
cat scope.txt組織root ├─ production OU │ └─ account 111111111111 └─ lab OU └─ account 222222222222 教材の組織制限: rootはus-west-2での新しい操作を拒否。productionはdeleteを拒否。 この検査のpassedは組織制限に該当しないという意味で、IAMの許可を与えるものではない。 既存資源の配置は現在の一覧であり、新しい制限を設定しても自動削除されない。
python3 inventory.py list --name webarn: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"}python3 inventory.py list --name web --account 111111111111arn:aws:ec2:ap-northeast-1:111111111111:instance/i-00000000000000001 name=web tags={"Env": "prod", "Team": "shop"}python3 inventory.py arn --id i-00000000000000001arn:aws:ec2:ap-northeast-1:111111111111:instance/i-00000000000000001 partition=aws service=ec2 region=ap-northeast-1 account=111111111111 resource=instance/i-00000000000000001
python3 inventory.py group<untagged> count=1 ids=i-00000000000000003 shop count=3 ids=i-00000000000000001,i-00000000000000002,vol-00000000000000001
python3 inventory.py tag --id i-00000000000000003 --team shop
python3 inventory.py group
python3 inventory.py list --name workertag 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"}python3 inventory.py check --id i-00000000000000001 --operation deletechain=111111111111 -> production -> root organization_guardrail=denied production:action
python3 inventory.py check --id i-00000000000000002 --operation deletechain=222222222222 -> lab -> root organization_guardrail=passed (permission not granted by this check)
python3 inventory.py check --id i-00000000000000003 --operation readchain=222222222222 -> lab -> root organization_guardrail=denied root:region
演習完了