広く開けて狭める vs 狭く開けて広げる
一言でいうと
最小権限は、一度に設計するものではなく、測定して絞っていく過程です。どのAPIを呼び出すのか、あらかじめすべて知っている人はいません。
なぜ必要なのか
新しいサービスをデプロイします。どんな権限が必要かは、ドキュメントにも正確に出ていません。そのため、2つの方式のどちらかを選ぶことになります。
A. 広く開けて絞る: s3:*で始めて動くようにしてから、あとで減らします。
B. 狭く開けて広げる: 必要なものだけを入れ、塞がれるたびに1つずつ追加します。
現実には、Aは絞るコミットが来ません。動き始めると、誰も触り直しません。そのため原則はBですが、Bは開発中に遅くなります。
どう動くのか
実務で使う折衷案
1. 개발 환경에서만 넓게 연다 (운영 계정에는 절대 넣지 않는다)
2. 실제로 호출된 API 를 기록한다 (감사 로그·액세스 어드바이저)
3. 그 목록으로 정책을 생성한다
4. 스테이징에서 좁힌 정책으로 검증한다
5. 운영에는 좁힌 정책만 배포한다
核心は1つ目の環境の分離です。広い権限が存在してもよい場所を決めておけば、「とりあえず開けて、あとで」が事故につながりません。
2つ目の材料は、クラウドが提供します。どのプリンシパルがどのサービスを最後にいつ呼び出したかを教えてくれる機能があります。90日間1度も使われていない権限は、なくしてよい候補です。
権限境界(permission boundary)
開発者にロールを作る権限を与えると、その開発者は自分より強いロールを作れます。これを防ぐ仕組みが権限境界です。
실효 권한 = (붙은 정책) ∩ (권한 경계)
積集合なので、境界の外の権限は、ポリシーに書いても生まれません。「ロールは自由に作ってよいが、この範囲は超えられない」を表現する方法です。
組織レベルでは、これよりも上に、サービスコントロールポリシー(SCP)のようなガードレールもあります。アカウント全体にかかるDenyなので、管理者でも突破できません。
よく使うガードレール
| ガードレール | 防ぐもの |
|---|---|
| 承認されたリージョン以外の使用禁止 | 見当違いのリージョンにリソースができること |
| ルートアカウントの使用禁止 | 最上位アカウントの日常的な使用 |
| 監査ログの無効化禁止 | 痕跡を消す行為 |
| 暗号化なしのストレージ作成禁止 | 既定値のミス |
| 公開アクセス設定の禁止 | バケット公開事故 |
この5つをかけておくだけで、よくある事故の大半がなくなります。そして、これは人の注意力ではなく、システムが守るルールなので、時間が経っても維持されます。
絞るときによく見落とすもの
- 読み取りに見える書き込み:
s3:GetObjectは読み取りですが、s3:PutObjectAclは権限を変えます。名前だけを見て分類すると間違えます。 - 権限昇格の経路:
iam:PassRole、iam:CreatePolicyVersionのような操作は、自分により大きな権限を与えるために使われることがあります。 - 削除: リストから漏らしやすいのに、被害が最も大きいものです。
現場での姿
- 開発のときに
*で開け、そのまま本番にデプロイ → 最もよくある事故の経路。 - 90日間使われていない権限が半分 → アクセスアドバイザーを1度も見ていませんでした。
- 開発者が作ったロールが管理者級 → 権限境界がありませんでした。
人と機械の権限は違うものとして扱う
最小権限を絞っていくとき、人が使う権限とプログラムが使う権限は性格が違うので、同じ方式で扱うと、どちらもずれます。
機械の権限は絞りやすいです。プログラムがやることは決まっていて、変わるとデプロイが起きるので、実際の呼び出しを記録して、ちょうどその分だけを与える方式がうまく通ります。そして、機械には長期の資格情報を与えないことが原則です。インスタンスやワークロードにロールを付けて、短い寿命の資格情報を自動で受け取るようにすれば、キーがリポジトリにコミットされたりログに出力されたりする事故そのものがなくなります。外部のCIのように、クラウドの外で動くものも、最近はアイデンティティフェデレーションで同じ構造を作れます。
人の権限は絞りにくいです。やることが毎回違い、障害が起きたときは、普段使わない権限が突然必要になります。そのため、人には常時の権限を低くしておき、必要なときだけ一時的に引き上げる経路を作ります。承認を経て数時間の権限を受け取り、その事実が記録に残る方式です。これがないと、結局、「障害のときに困るから」という理由で、全員が高い権限を常時持つことになります。
どちらの場合も、資格情報の寿命が短いほど、流出の値打ちが下がります。そのため、絞ることと同じくらい重要なのが寿命を縮めることで、実はこちらのほうが簡単です。ポリシーを1行ずつ整えるには数週間かかりますが、長期のキーをロールに替える作業は、一度で終わり、効果がすぐに現れます。
最後に、去る人と消えるサービスを整理する手順を押さえておきます。権限を与える手順はどの組織にもありますが、取り消す手順はないことが多いです。使われていないアカウントとロールが溜まると、それ自体が攻撃面になり、何が生きているのかわからず、整理もできなくなります。90日間使われていないプリンシパルを定期的に抜き出してみることが、この問題を防ぐ最も安上がりな方法です。
次に見ること
これらがすべて崩れたとき、実際にどんな事故が起きるかを、事例で見ます。