ABACとは?属性ベースアクセス制御の仕組みとRBACとの使い分けを実装視点で解説
権限設計のレビューで詰まるのは、たいてい「この部署にこのファイルを見せてよいか」を条件つきで表現したくなった瞬間です。ABAC(Attribute-Based Access Control/属性ベースアクセス制御)は、ロールではなく主体・対象・操作・環境の属性を突き合わせてアクセス可否を決める認可方式を指します。定義の出どころはNIST SP 800-162で、2014年1月に初版が出て2019年8月2日に更新されました。本記事では4分類の属性とPDP・PEPの分離という仕組みから始めて、RBACとの権限管理コストの差、AWS・Azure・アプリ層・データベース層という実装レイヤごとの書き方の違い、そして属性マスタの鮮度と逆引き監査という運用側の穴までを、導入判断の順序で整理します。
まとめ:ABAC採用の判断軸とRBAC併用から始める段階導入の結論
結論から置きます。ABACはRBACの置き換えではありません。実装として成立している製品はいずれもRBACを土台に条件を足す形を取っており、Azureは公式ドキュメントで「Azure ABACはAzure RBACを基盤とし、ロール割り当てに条件を追加して構築される」と明記しています。粗い権限をロールで配り、細かい線引きだけを属性条件で絞る。これが現実的な入り口です。
効果が出る条件ははっきりしています。守る対象が増え続け、その都度ポリシーを書き足す運用が回らなくなっている環境。AWSのユーザーガイドがRBACの弱点として挙げるのも、新しいリソースを追加するたびにポリシーを更新しなければアクセスできない点でした。逆に、ロールが20個程度で職務もリソースも安定しているなら、ABACの導入コストは回収できません。
導入で失敗する原因は、ポリシー言語ではなく属性の側にあります。人事マスタの反映が遅れれば権限も遅れて誤る。もう1つは「このファイルに誰が到達できるか」を即答できなくなる逆引きの問題で、監査要件が逆引き前提なら設計段階で回答手段を用意しておく必要があります。後半の独自章で、採用してよい3条件と見送るべき3場面に分解します。
ABACの定義とNIST SP 800-162が定める4分類の属性と評価の流れ
まず、ABACが何を指す言葉なのかを一次情報の定義に戻して確認します。
主体・リソース・操作・環境という4種類の属性とポリシー評価の関係
NIST SP 800-162はABACを、主体(subject)・対象(object)・要求された操作・環境条件に紐づく属性を、ポリシーやルール、関係性に照らして評価することで認可を決める方式と定義しています。判断材料が4種類ある、というのがRBACとの構造上の違いです。
実務に落とすと、主体属性は所属部署・職位・在籍状態・雇用形態あたり。対象属性は機密区分やデータ所有部署、クラウドならリソースタグが該当します。操作属性は読み取りか書き込みか削除か。環境条件には時刻、接続元ネットワーク、端末の管理状態が入ります。「経理部の正社員が、機密区分が社外秘までの文書を、社内ネットワークから、業務時間内に読む場合のみ許可」といった1文が、そのまま1本のポリシーになる。
PEP・PDP・PIP・PAPの役割分担と認可判断が流れる経路
ABACの実装は4つの役割に分かれます。PEP(Policy Enforcement Point)がアクセス要求を受け止めて判断を仰ぎ、PDP(Policy Decision Point)がポリシーと属性を突き合わせて許可か拒否かを返す。PIP(Policy Information Point)は判断に必要な属性をディレクトリや人事データベースから供給し、PAP(Policy Administration Point)がポリシーを管理します。
この分離は図解のための飾りではありません。認可条件がコントローラのif文に散っている状態では、条件を1つ変えるのに全画面の再テストが要る。PDPを外に出しておけば、変更はポリシー定義の差分だけで済みます。代償として、要求ごとにPDPへの問い合わせが1回増える点は設計時に見込んでおきます。
XACML 3.0とAuthZEN 1.0という2つの標準の位置づけの違い
ABACの標準実装として長く参照されてきたのがXACML(eXtensible Access Control Markup Language)です。バージョン3.0は2013年1月22日にOASIS標準として発行され、ポリシー記述とPEP・PDP間のリクエスト/レスポンス形式の両方を規定しています。ただしXMLベースで記述量が多く、新規案件で選ばれる場面は減りました。
置き換わりつつあるのがAuthZEN Authorization APIです。OpenID FoundationのAuthZEN Working Groupが策定し、Authorization API 1.0は2026年1月12日にFinal Specificationとして承認が公表されました(賛成81・反対1・棄権25)。JSONベースで「誰が・何を・どのリソースに」を問い合わせるPDPとPEP間のAPIを定めるもので、ポリシー言語そのものは規定しません。Keycloakは26.7.0で実験的サポートを追加し、2026年5月20日に告知しています。PDPを後から差し替えられる余地を残したいなら、独自プロトコルよりこちらに寄せる判断が立ちます。
RBACとの違いと管理対象が増えたときの運用コストの分かれ目と限界
比較の軸を「柔軟性」に置くと判断できません。増え方の差で見ます。
ロールの組み合わせ爆発が起きる条件とポリシー数を一定に保てる理由
RBACでは職務ごとにポリシーを作り、そこにアクセス可能なリソースを列挙します。AWSのユーザーガイドはこの欠点を、Starプロジェクトに新しいコンテナを足したらStar用ロールのポリシーを更新しないとメンバーはアクセスできない、という例で説明しています。リソースが増えるたびに管理作業が発生する構造でした。
掛け算の条件が増えると事態はさらに悪化します。部署5×職位4×プロジェクト10を個別ロールで表現すれば200通り。ここに「委託先は閲覧のみ」が加われば倍になります。ABACは「主体のタグと対象のタグが一致すれば許可」という1本で同じ範囲を覆えるため、プロジェクトが増えてもポリシー本数は増えません。増えるのはタグの付与作業のほうへ移ります。
RBACとABACの比較表と併用構成で権限を設計するときの分担
両者の性質を実務の観点で並べます。
| 観点 | RBAC | ABAC |
|---|---|---|
| 可否の決定根拠 | 付与されたロール | 主体と対象の属性の一致 |
| 対象が増えたとき | ポリシー改訂が要る | タグ付与だけで済む |
| 権限の逆引き | ロール所属で即答できる | 全件評価しないと不明 |
| 判定のコスト | 低い | 属性取得の分だけ増える |
| 前提になる整備 | 職務とロールの定義 | 属性マスタと分類規約 |
| 向く環境 | 職務も対象も安定した組織 | 対象が増え続ける環境 |
表の3行目が採否を分けます。ロール設計そのものの進め方はRBACの仕組みと導入判断で整理しているので、土台側の設計はそちらを先に固めてください。
全面移行ではなく追加として入れる判断とRBACを土台に残す条件
ABACへ全面移行する提案には慎重でいてください。Azureのロール割り当て条件には、条件を使って特定リソースへのアクセスを明示的に拒否することはできない、という制約があります。つまり条件はロール割り当てが与えた権限を絞り込むフィルタであって、権限を与える主体ではありません。土台のロールが粗いままだと、条件を書き忘れた経路がそのまま素通りになる。
推奨する分担はこうです。ロールで「触れてよい領域の輪郭」を決め、属性条件で「その中のどれか」を絞る。最小権限の原則はロール側で担保し、動的に変わる部分だけを条件に逃がす。この順序を逆にすると、条件式が事実上のアクセス制御の全責任を負い、1つの記述ミスが全社の情報漏えいに直結します。
AWSとAzureとアプリ層で属性条件を書く実装の具体と設計差分
「ABACを入れる」と言っても、どのレイヤに書くかで作業量も限界も変わります。4つのレイヤを並べます。
AWS IAMのタグ条件キーで主体とリソースの一致を判定する書き方
AWSはABACの属性をタグとして扱います。IAMポリシーの条件で使うキーはaws:PrincipalTag(呼び出し元に付いたタグ)、aws:ResourceTag(操作対象に付いたタグ)、aws:RequestTag(作成時に付けようとしているタグ)、aws:TagKeys(指定されたキーの集合)の4種類です。「principalのaccess-projectタグとresourceのaccess-projectタグが等しければ許可」という条件を1本書けば、プロジェクトが増えてもポリシーは触りません。
federationとの組み合わせが効きます。SAMLまたはOIDCのIdPからセッションタグを渡す設定にしておくと、社内ディレクトリの属性がそのままIAMプリンシパルの属性として届く。人事側でプロジェクト異動を反映すれば、AWS側の権限も追随します。前提となるIAMのポリシー評価と権限設計はAWS IAMの仕組みと権限設計で解説しました。落とし穴はタグ付け漏れで、タグの無いリソースは条件が一致せず誰からも見えなくなる点に注意してください。
Azure ABACのロール割り当て条件で絞れる範囲と現在の提供状況
Azureは既存のロール割り当てに条件式を追加する形を取ります。ドキュメント(ms.dateは2025年5月19日)によれば、条件を追加できるのはBlobストレージまたはキューストレージのデータアクションを持つロールの割り当てで、対象は全リソース種別ではありません。使える属性はBLOBインデックスタグ、パス、コンテナー名、スナップショット、現在のUTC時刻などです。
機能ごとの提供時期も設計に効きます。ポータルの条件エディタとPowerShell・CLI・REST APIからの条件追加は2022年10月にGA、プリンシパルのカスタムセキュリティ属性の利用は2023年11月にGA、環境属性の利用は2024年4月にGAとなりました。制約として、ビジュアルエディタで書ける式は1条件あたり5つまで(それ以上はコードエディタを使う)と明記されています。式が5本を超えたら、粒度を疑うサインです。
アプリ層でOPAやCedarへ判断を外出しする構成と応答遅延の設計
業務システム側の認可をABAC化する場合は、OPA(Open Policy Agent、ポリシー言語はRego)やCedarのようなポリシーエンジンにPDPを担わせます。アプリケーションはPEPとして「この主体がこの操作をこの対象に行ってよいか」を問い合わせるだけになり、条件の変更がデプロイと切り離せる。
設計の焦点は応答遅延です。PDPを別サービスとして立てると1判定ごとにネットワーク往復が乗ります。実装の選択肢は3つ。エンジンをサイドカーとして同一ノードに置く、一覧画面のように多数の対象を判定する経路ではまとめて問い合わせる、そして属性の取得結果に生存期間つきのキャッシュを持たせる。3つ目は権限剥奪の反映が遅れる副作用があるため、退職や異動といった強い変更だけはキャッシュを無効化する経路を別に用意します。
データベース層の行レベル制御で属性条件を持たせるときの適用限界
データベース側で行単位の可視範囲を制御する方法もあります。PostgreSQLなどが備える行レベルセキュリティは、テーブルにポリシーを定義して、現在の接続ユーザやセッション変数の値に応じて見える行を絞る仕組みです。詳細は行単位アクセス制御の仕組みとDB別の設定方法にまとめています。
適用範囲は狭く見ておくべきです。制約は2つ。アプリが共通ユーザでコネクションプールを共有していると現在の利用者の属性がDBに伝わらず、リクエストごとにセッション変数へ属性を設定する処理が要ります。もう1つは二重管理で、アプリ層とDB側のポリシーが別々に育つと、どちらが真の判断なのか分からなくなる。DB層は「アプリをすり抜けた直接接続に対する最後の防波堤」と位置づけ、主たる判断はPDPに寄せてください。
属性マスタの鮮度と逆引き監査という導入前に潰すべき2つの落とし穴
ここからは競合記事がほぼ触れていない、運用に入ってから表面化する2つの穴を扱います。
属性の出所と更新頻度がアクセス制御の正確さをそのまま決める理由
ABACの判断精度は属性の鮮度で決まります。人事マスタの反映が月次バッチなら、4月1日付の異動が権限に反映されるのは翌月。その間、異動者は前部署のデータを見続けます。RBACなら「ロールの付け替えを忘れている」と気づけますが、ABACでは属性が自動で流れてくる前提が裏目に出て、誰も気づかないまま権限がずれる。
設計時に決めるべきことは3つあります。第1に属性ごとの権威ソースを1つに固定すること(所属は人事システム、機密区分は文書管理システム、というように二重定義を作らない)。第2に反映遅延の許容値を数値で決めること。退職と異動については24時間以内、といった具体値で合意しておくと、バッチ設計の要件がそこから逆算できます。第3にPIPが応答しないときの既定動作で、認可判断は取得失敗時に拒否へ倒す(フェイルクローズ)のが原則です。属性が取れないときに許可へ倒す実装は、PIPの障害がそのまま全社的な権限開放になります。
誰がどのリソースへ到達できるかを逆引きできない問題と監査の作り方
監査で必ず聞かれるのが「この機密文書にアクセスできる人を全部挙げてください」という質問です。RBACなら該当ロールの所属者を列挙すれば答えになります。ABACでは条件式と属性値の組み合わせで動的に決まるため、ポリシーを読んだだけでは答えが出ません。
対処は2通りです。1つは定期的に主体×対象の全組み合わせをPDPに評価させ、結果をスナップショットとして保存する方式。件数が現実的な範囲に収まるならこれが確実で、前月との差分を出せば権限変動の検知にもなります。もう1つはポリシーを静的解析して到達可能な属性値の集合を導出する方式で、ポリシー言語の表現力に依存します。どちらも後付けは高くつくため、要件定義の段階で「逆引きに答える手段」を成果物に含めてください。設計と実装のずれが実際の抜け穴になっていないかは、認可バイパスとIDOR・権限昇格の実装対策で整理した観点で確認すると漏れが見つかります。自社での検証が難しい場合は、脆弱性診断・セキュリティ診断で権限境界の実挙動を第三者に確認させる進め方もあります。
ポリシー変更を壊さずに回すための自動テスト設計と段階適用の手順
ポリシーはコードとして扱います。RegoもCedarもポリシー単体のテストを書ける仕組みを持っており、「経理部の正社員は許可」「委託先は拒否」といった代表ケースをテストとして固定しておけば、条件の追加で既存の許可が消える事故を検知できます。
本番投入は段階を踏みます。手順は次の通りです。
- 新ポリシーを判定だけ実行し遮断はしないshadowモードで動かす
- 既存の認可結果との差分をログに出し、想定外の拒否を洗い出す
- 差分がゼロになった対象範囲から順に遮断を有効化する
- 切り戻し手順とポリシーの版管理を先に用意しておく
差分観測を飛ばして一斉に切り替えると、業務停止の形で問題が表面化します。shadowモードで1週間から2週間の業務サイクルを回してから遮断へ進めてください。
ABACを採用してよい条件と見送るべき場面を切り分ける判断の結論
ここは言い切ります。ABACは万能の上位互換ではなく、前提が揃った環境でだけ投資が回収できる方式です。
ABACを採用してよい3条件と属性が揃わない組織が先にやること
採用してよいのは、次の3つが同時に満たされる場合に限ります。第1に、判断材料となる属性の権威ソースが存在し、更新が自動で流れてくること。第2に、守る対象が増え続け、追加のたびにポリシーを書き直す運用がすでに破綻しかけていること。第3に、判定結果を後から説明・再現できること。監査ログに「どの属性値でどの条件が真になったか」まで残せる設計が要ります。
揃っていない組織がやるべきことは、ABACの製品選定ではありません。順序は、対象へのタグ付け規約を決めて既存リソースに遡って付与する、人事マスタとIdPの同期を自動化する、この2つが先です。ここを飛ばして条件式だけ書くと、タグの無いリソースが大量に残り、条件が一致しないまま業務が止まります。
ABACを見送るべき3つの場面とRBACに条件を1枚だけ足す代替案
見送りを推奨する場面も挙げます。1つ目、属性がスプレッドシートで手管理されている場合。更新が人手である限り、ロールの付け替え漏れが属性の更新漏れに名前を変えるだけです。2つ目、ロールが20個程度で職務も対象リソースも安定している場合。ポリシー本数を減らす効果が小さく、設計と検証の工数だけが残ります。3つ目、1リクエストあたりの応答予算が数ミリ秒しかない経路。外部PDPへの往復が予算を食い潰すため、RBACで判定するか判定結果を事前計算して持たせます。
それでも細かい線引きが必要なら、全面ABACではなく「ロール+条件1枚」で足ります。AWSならタグ一致の条件を1本、Azureなら既存のロール割り当てに条件を1つ追加する。PDPの新設もポリシー言語の学習も不要で、効果の大半はここで得られます。
小さく始めるときの順序と最初に属性条件を入れる対象領域の選び方
最初の適用先は慎重に選びます。条件は2つで、対象が増え続けていること、そして分類のための属性がすでに存在すること。この条件を満たしやすいのはオブジェクトストレージやファイル共有の領域です。文書には機密区分が付いていることが多く、プロジェクト単位でタグを設計しやすい。Azureの条件機能がBlobストレージから提供されているのも、需要がこの領域に集中しているためです。
逆に、最初の対象として選ぶべきでないのは基幹システムの更新系処理です。判定を誤ったときの影響が受注や出荷の停止に直結し、shadowモードでの差分観測も業務時間中には回しづらい。読み取り系から入り、そこで属性の鮮度と逆引き監査の運用が回ることを確認してから、更新系へ広げる順序を守ってください。
よくある質問
ABACの導入検討でよく挙がる質問に答えます。
ABACとRBACはどちらを選ぶべきですか?
二者択一で考えないのが実務的な答えです。AWSもAzureも、RBACを土台に属性条件を追加する構成を前提にしています。判断が必要になるのは「条件を足すかどうか」で、対象リソースが増え続けてポリシー改訂が追いつかないなら追加する価値がある。ロールが20個程度で対象も安定しているなら、RBACのままで十分です。
ABACは小規模な組織でも導入できますか?
組織の規模ではなく、属性の整備状況で決まります。従業員50人でも、IdPに部署と雇用形態が同期されていてクラウドリソースにタグ規約があるなら、タグ一致の条件を1本入れるだけで効果が出る。逆に1,000人規模でも、所属情報がスプレッドシート管理なら導入は失敗します。判断材料は人数ではなく、属性の権威ソースが1つに定まっていて更新が自動化されているかどうかです。
ABACの属性はどこから取得しますか?
属性ごとに権威ソースを1つ決めて、そこから同期します。所属・職位・在籍状態は人事システムからIdPへ、機密区分は文書管理システムまたはリソースタグから、端末状態はデバイス管理から取得するのが一般的な構成です。AWSではSAMLまたはOIDCのIdPからセッションタグとして渡す方法が用意されており、federation時にIAMプリンシパルへ属性が引き継がれます。
XACMLは今から学ぶ必要がありますか?
新規案件では優先度は高くありません。XACML 3.0は2013年1月にOASIS標準となったABACの代表的な標準ですが、XMLベースで記述量が多く、実装の主流はRegoやCedarのような軽量なポリシー言語へ移りました。PDPとPEP間のやり取りを標準化したいなら、2026年1月にFinal Specificationとして承認が公表されたAuthZEN Authorization API 1.0を見るほうが実装に直結します。既存システムでXACMLのPDPが動いている場合に限り、仕様の理解が要ります。
ABACを入れると認可の応答は遅くなりますか?
属性の取得とポリシー評価の分だけ確実に増えます。増加量は構成次第で、PDPを別サービスとして立てればネットワーク往復が乗り、サイドカーとして同一ノードに置けば大幅に縮む。一覧画面のように多数の対象を判定する経路では、まとめて判定させる設計が効きます。キャッシュは反映遅れの副作用があるため、退職や異動だけは無効化する経路を用意してください。
関連記事
- AWS IAM Identity Centerとは?権限セット設計とCLI認証・IAMとの使い分け:属性の供給元となるIdP側の権限セット設計を扱っています
- ゼロトラストとは?境界型防御との違い・NIST7原則と導入判断:ABACが前提とする「毎回検証する」考え方の全体像です
- CIAMとは?顧客ID基盤の設計と会員DB移行・同意管理:顧客側IDで属性を扱う場合の基盤設計をまとめています
- OAuth 2.0とは?仕組み・認可フローと認証・認可の違い:認可の前段にあたるトークン発行フローの基礎を解説しています