レッスン 3-5
権限の
読み終えたら強すぎる
この頁の流れ
AssumeRole は、
出典を確かめた日 2026年10月27日
なぜ通るのか
AssumeRole は、
ある
どちらの
root ユーザーと IAM の 4 つの部品
AWS で
| 部品 | 役目 |
|---|---|
| root ユーザー | アカウントを |
| ユーザー | 人や |
| グループ | ユーザーを |
| ロール | 必要な |
| ポリシー | 誰が、 |
ロールには
攻め手がたどる 3 つの経路
| 経路 | 何が |
|---|---|
| 公開の置き場 | 置き場 (S3 の |
| ロールの連鎖 | 引き受けた |
| 強すぎる権限 | 1 つの |
ロールの
もうiam:PassRole です。
| 操作 | 誰が使うか | 何が |
|---|---|---|
| AssumeRole | 人やアプリ | 自分が |
| PassRole | 人や | ロールを |
自分より
公開の
脆い設定と直した設定
自分の
信頼のポリシーで、誰を信じるか
JSON
{
"Effect": "Allow",
"Principal": {
"AWS":
"arn:aws:iam::111122223333:root"
},
"Action": "sts:AssumeRole"
}JSON
{
"Effect": "Allow",
"Principal": {
"AWS":
"arn:aws:iam::111122223333:role/app"
},
"Action": "sts:AssumeRole"
}脆い方の root は、
どこまで届くかを数える
ロールごとに、assume) と、trust) を* はaccount は
Python
ROLES = {
"web-app": {"assume": ["*"],
"trust": ["ec2"]},
"batch": {"assume": ["*"],
"trust": ["account"]},
"admin": {"assume": [],
"trust": ["account"]},
}Python
ROLES = {
"web-app": {"assume": ["batch"],
"trust": ["ec2"]},
"batch": {"assume": [],
"trust": ["web-app"]},
"admin": {"assume": [],
"trust": ["sso-admins"]},
}どちらの
Python
def can_assume(src, dst, roles):
to = roles[src]["assume"]
by = roles[dst]["trust"]
go = "*" in to or dst in to
ok = "account" in by or src in by
return go and ok
def reachable(start, roles):
seen, todo = {start}, [start]
while todo:
src = todo.pop()
for dst in roles:
if dst in seen:
continue
if can_assume(src, dst,
roles):
seen.add(dst)
todo.append(dst)
return seen脆いreachable("web-app", ROLES) が
権限のポリシーで、何をさせるか
JSON
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}JSON
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource":
"arn:aws:s3:::example-images/*"
}脆い方の
ログでの見え方と検知
ロールをAssumeRole の
JSON
{
"eventSource": "sts.amazonaws.com",
"eventName": "AssumeRole",
"userIdentity": {
"type": "IAMUser",
"arn":
"arn:aws:iam::777788889999:user/John"
},
"sourceIPAddress": "192.0.2.101",
"requestParameters": {
"roleArn":
"arn:aws:iam::111122223333:role/EC2-dev",
"roleSessionName": "John-EC2-dev"
}
}userIdentity がrequestParameters.roleArn がuserIdentity のAssumedRole) に
| 見る物 | なぜ効くか |
|---|---|
| 引き受け済みの | 連鎖 |
| 置き場の | 公開の |
| ふだん | 置き場の |
| AccessDenied の | 届く |
記録を
直し方と、直ったことの確かめ方
手元の
- 作業用の
フォルダに、 脆い ロールの表と reachableを置く reachable("web-app", ROLES)にadmin が 入る ことを 確かめる - 表を
直した ものに 置き換え、 admin が 消える ことを 確かめる - 下の
試験を 足し、 脆い 表に 戻すと 試験が 落ちる ことも 確かめる - 練習用の
アカウントでは、 同じ 形の ロールを 作って AssumeRole を 2 回続け、 CloudTrail に 2 行が 残る ことと、 直した あとは 2 回目が AccessDenied に なる ことを 確かめる - 終わったら、
作業用の フォルダと、 練習用の アカウントに 作った ロールと 鍵を消す
Python
def test_app_cannot_reach_admin():
got = reachable("web-app", ROLES)
assert "admin" not in got
def test_no_wildcard_assume():
for r in ROLES.values():
assert "*" not in r["assume"]
def test_no_account_wide_trust():
for r in ROLES.values():
assert "account" not in r["trust"]1 つ目の* や
AWS の
関わる事例
キャピタル・
トヨタの
- 2023年6月15日、
クラウドメール・ Storm-0558 に認証基盤 よる 入口 2016年にMicrosoft Exchange Online 侵入 発行された 消費者向け(MSA)の 署名鍵が、 本来2021年3月に 失効する 予定だったが 延期されたまま 有効な 状態で 残っており、 何らかの 方法で 盗まれた - 2023年5月12日、自動車 トヨタ コネクティッドサービスの
車両 入口 トヨタコネクティッドがデータ 公開状態事案 管理する クラウドサーバーの 設定の 誤りにより、 個人データを 含む サーバーが 公開状態に 置かれた - 2021年1月6日、
都道府県 (保健医療行政) 福岡県 新型コロナ 入口 本来送付すべき陽性者情報の 誤送信による漏えい アドレスと 酷似していた 別人の メールアドレスに、 患者情報が 入った フォルダへの アクセス権を 付与する メールを 誤って 送信した - 2019年7月19日、
銀行 キャピタル・・ クレジットカード ワン 入口 外部の情報漏えい 人物が、 クラウド環境に 置かれた サーバーの 設定の 誤りを 突いて 侵入し、 ウェブアプリケーションファイアウォール 用の アカウントの 認証情報を 手に 入れた。
確認クイズ
1 問目
ロールの"AWS": "arn:aws:iam::111122223333:root" と
答えだと思う選択肢を押すと、その場で正誤と理由が開きます。
答え イ
アカウントを
2 問目
CloudTrail に、
答えだと思う選択肢を押すと、その場で正誤と理由が開きます。
答え ア
ロールの
説明課題
次の
- 強すぎる
ロールの 連鎖が 生まれる 理由と、絞り方
模範解答を見る
ロールは、* や
一次資料
どれも
- AssumeRole (AWS Security Token Service API Reference、英語)。
返る 鍵が アクセスキー ID、 秘密の アクセスキー、 セッションの トークンの 3 つである こと、 期限が 900 秒から ロールの 上限 (1 時間から 12 時間) までであること - Roles terms and concepts (AWS、英語)。
ロールの 連鎖の 定義と、 連鎖した セッションが 最長 1 時間に 縛られること - Security best practices in IAM (AWS、英語)。
root ユーザーの 鍵を 守る こと、 一時的な 鍵、 多要素認証、 最小の 権限、 IAM Access Analyzer での 作成と 検査、 使われていない 許可の削除 - AWS JSON policy elements Principal (AWS、英語)。
アカウントを 書くと 判断が アカウントに 任され、 最上位の 利用者だけに 絞る 意味に ならないこと - Grant a user permissions to pass a role to an AWS service (AWS、英語)。
ロールを サービスに 渡すには iam:PassRoleの許可が 要ること - Logging IAM and AWS STS API calls with AWS CloudTrail (AWS、英語)。
AssumeRole の 記録の 例と、 userIdentity と requestParameters の欄 - Heads-Up Amazon S3 Security Changes Are Coming in April of 2023 (AWS、英語)。
2023年4月から、 新しい バケットで S3 Block Public Access が 既定で 有効に なったこと - United States v. Thompson, No. 22-30179 (米第9巡回区控訴裁判所、
英語、 。2025年3月17日) 公開の IP アドレスの 走査、 鍵の 問い合わせと 保存、 権限が 許す範囲での 写し取り、 200 以上と 30 以上の 組織、 米国の 9,800 万人 - Consent Order for the Assessment of a Civil Money Penalty, #2020-036 (米通貨監督庁、
英語、 。2020年8月6日) クラウドへ 移る 前の リスク評価、 網の 統制、 警報への 対応の 不備の認定 - トヨタ
自動車株式会社による 。個人データの 漏えい 等事案に 対する 個人情報の 保護に 関する 法律に 基づく 行政上の 対応に ついて (個人情報保護委員会、 日本語、 2023年7月12日) 約 10 年、 約 230 万人分、 アクセス制御の 不備と 委託先の 監査の 不足、 設定を 見張る 仕組みと 公開の 設定を できなく する 再発防止策
次へ
次の
セキュリティを
このレッスンにつながる物
トラック 3 攻撃と検証の中で
前のレッスン 3-4 横への- 偵察と
攻撃面の 洗い出し - 再現と
影響の示し方 - 権限昇格
- 横への
広がりと 認証情報 - 報告と範囲 準備中
- 匿名の
ネットワークの 設計と限界 準備中 - 地下の
経済と リークサイト 準備中
