概要
権限管理は、誰が(Who) 何に(Resource) どの操作(Action)を行えるかを制御する仕組みです。代表的な方式は RBAC(ロールベース) と ABAC(属性ベース)。現場では併用(ハイブリッド)での運用が定番です。
RBAC
- 役割(role)に権限を付与し、ユーザーに役割を割り当てる
- 管理が簡単、監査しやすい
- 柔軟性はABACに劣る
ABAC
- ユーザー/リソースの属性+ポリシー言語で評価
- きめ細かな制御、例:地域・部門・時間帯・金額など
- ポリシー設計・可視化の難易度が上がる
基本
| 概念 | 説明 | 例 |
|---|---|---|
| Subject | 操作を行う主体(ユーザー・サービスアカウント) | alice, bob |
| Role | 権限のまとまり | admin / editor / viewer |
| Permission | resource:action 形式 | article:edit, user:delete |
| Policy | 評価ロジック(allow/deny + 条件) | region==JP なら allow |
| Audit | 誰が何をいつしたかの記録 | 監査ログ・レポート |
基礎(データモデルと最小API)
# MySQL 例(最小)
CREATE TABLE users(id VARCHAR(64) PRIMARY KEY, name VARCHAR(128));
CREATE TABLE roles(id VARCHAR(64) PRIMARY KEY, name VARCHAR(128));
CREATE TABLE user_roles(user_id VARCHAR(64), role_id VARCHAR(64), PRIMARY KEY(user_id, role_id));
CREATE TABLE permissions(id INT AUTO_INCREMENT PRIMARY KEY, resource VARCHAR(64), action VARCHAR(64));
CREATE TABLE role_permissions(role_id VARCHAR(64), permission_id INT, PRIMARY KEY(role_id, permission_id));
-- 例
INSERT INTO users VALUES ('alice','Alice'),('bob','Bob'),('carol','Carol');
INSERT INTO roles VALUES ('admin','Admin'),('editor','Editor'),('viewer','Viewer');
INSERT INTO permissions(resource,action) VALUES ('article','view'),('article','edit'),('user','delete');
INSERT INTO user_roles VALUES ('alice','admin'),('bob','editor'),('carol','viewer');
INSERT INTO role_permissions
SELECT 'admin', id FROM permissions
UNION ALL SELECT 'editor', id FROM permissions WHERE (resource='article' AND action IN ('view','edit'))
UNION ALL SELECT 'viewer', id FROM permissions WHERE (resource='article' AND action='view');
// JS: API 叩き方(fetch)
const csrf = document.querySelector('meta[name="csrf-token"]').content;
fetch('?api=check', {
method: 'POST',
headers: {'Content-Type':'application/json','X-CSRF-Token': csrf},
body: JSON.stringify({ resource:'article', action:'edit', resourceAttrs:{ department:'platform' } })
}).then(r => r.json()).then(console.log);
導入
- スコープ定義:保護対象リソースと操作を列挙(読み取り、作成、更新、削除、公開、承認など)
- 役割定義:まずはRBACで粗く整理(最小権限の原則)
- 属性定義:部門・地域・雇用区分・金額・時間帯などABAC条件を洗い出す
- ポリシー設計:denyルールは明示、説明可能性(explain)を確保
- 監査・可視化:権限マトリクス・差分レポート・誰が付与/改定したか履歴
コマンド
Linuxのパーミッション確認と変更方法
Linuxではファイルやディレクトリに対してアクセス権限(パーミッション)を設定できます。この記事では、パーミッションの確認方法、表示の読み方、変更方法(数値・アルファベット指定)をまとめます。
1. パーミッションの確認方法
カレントディレクトリ内のファイルやディレクトリの情報を確認するには、次のコマンドを使用します。
$ ls -l
または
$ ll
例:
-rw-r--r-- 1 user group 9 1月 1 00:00 hoge.txt
drwxr-xr-x 6 user group 20480 1月 1 00:00 ダウンロード
2. パーミッション表示の読み方
先頭の10文字は以下の意味を持ちます。
| 位置 | 意味 | 例 |
|---|---|---|
| 1文字目 | ファイル種別 | -(通常ファイル)、d(ディレクトリ)、l(シンボリックリンク) |
| 2〜4文字目 | 所有者の権限 | rw-(読み取り・書き込み) |
| 5〜7文字目 | 所有グループの権限 | r--(読み取りのみ) |
| 8〜10文字目 | その他ユーザーの権限 | r--(読み取りのみ) |
例:
-rw-r--r--→ 通常ファイル、所有者は読み書き可、グループとその他は読み取りのみdrwxr-xr-x→ ディレクトリ、所有者は読み書き実行可、グループとその他は読み取り実行可
3. パーミッションの変更(数値指定)
数値で指定する場合、chmod モード ファイル名の形式で実行します。
各権限の値は以下の通りです。
| 数字 | 記号 | 意味 |
|---|---|---|
| 4 | r | 読み取り |
| 2 | w | 書き込み |
| 1 | x | 実行 |
数字は 所有者・グループ・その他 の順に並べます。
$ ls -l
-rw-r--r-- 1 user group 9 1月 1 00:00 hoge.txt
$ chmod 764 hoge.txt
$ ls -l
-rwxrw-r-- 1 user group 9 1月 1 00:00 hoge.txt
764は、所有者にrwx(7=4+2+1)、グループにrw(6=4+2)、その他にr(4)を付与しています。
4. パーミッションの変更(アルファベット指定)
アルファベットで指定する場合は、chmod 対象 記号 権限 ファイル名の形式で実行します。
| 対象 | 意味 |
|---|---|
| u | ユーザー(所有者) |
| g | グループ |
| o | その他 |
| a | 全員 |
| 記号 | 意味 |
|---|---|
| + | 権限を追加 |
| - | 権限を削除 |
| = | 指定した権限に置き換え |
権限はr(読み取り)、w(書き込み)、x(実行)です。
$ chmod u+x hoge.txt # 所有者に実行権限を付与
$ chmod g+w hoge.txt # グループに書き込み権限を付与
$ chmod go+w hoge.txt # グループとその他に書き込み権限を付与
$ chmod a-wx hoge.txt # 全員から書き込み・実行権限を削除
ヒント: 数値指定は一括変更向き、アルファベット指定は個別変更向きです。覚えやすい方を選びましょう。
5. まとめ
ls -lやllでパーミッションを確認できる- 表示の最初の文字は種別、残り9文字は権限(所有者・グループ・その他)
chmodで数値またはアルファベット指定して権限を変更できる
開発現場(ベストプラクティス)
- 最小権限 まず viewer ベース、昇格は申請フローで
- 明示的Deny優先 ABACのdenyはRBACより優先
- テスト容易性 ポリシーは関数/DSL化しユニットテストを充実
- 監査ログ 重要操作はID・IP・UAを記録
- 権限の可視化 UIで「なぜ出来ないのか」を説明
最新情報
製品やライブラリの更新は頻繁です。社内では以下を定期監視すると便利:
- 認可ミドルウェア(例:Laravel Gates/Policies, Spring Security)のリリースノート
- OIDC/SCIM/SSOベンダーの変更点
- 監査要件(個人情報保護・金融・医療など)の更新
運用メモ(テンプレ)
- 月初にロール棚卸(新入退/異動の反映)
- 四半期でポリシーレビュー(deny/allowの妥当性)
- 監査ログの保存期間・検索性のテスト
応用(ハイブリッドRBAC + ABAC)
組み合わせ方
- RBACで“出来ること”の大枠を許可
- ABACで“出来る条件”を絞り込み(denyを明示)
- 説明可能性(explain trace)を返却
// PHP(本ページの evaluator 抜粋)
$rbac = rbac_allows($user, 'article', 'edit');
$abac = abac_decision($user, 'article', 'edit', ['department'=>'platform']);
if ($abac['effect']==='deny') { /* Deny */ }
elseif ($rbac && in_array($abac['effect'],['allow','neutral'])) { /* Allow */ }
発展(マイクロサービス・マルチテナント)
- 外部化(PDP/PIP/PEP分離):Policy Decision Point を独立デプロイ
- テナント分離:テナント別のrole/perm命名 & ポリシー
- カスケード承認:金額閾値、時間帯、機密区分で多段ワークフロー
例(権限評価サンドボックス)
ログインユーザー: -
未評価
結果がここに表示されます
おすすめツール
フレームワーク連携
- Laravel Gates & Policies
- Symfony Security
- Spring Security
外部ポリシーエンジン
- Open Policy Agent(OPA / Rego)
- Cedar(AWS)
ID・SSO
- OIDC / SAML プロバイダ
- SCIM でプロビジョニング
関連リンク
- 認可の基本設計ガイド(社内Wiki等を想定)
- 監査ログ運用基準
- 個人情報保護・金融/医療ガイドライン