🔐 権限管理(Permission Management)

概要

権限管理は、誰が(Who) 何に(Resource) どの操作(Action)を行えるかを制御する仕組みです。代表的な方式は RBAC(ロールベース)ABAC(属性ベース)。現場では併用(ハイブリッド)での運用が定番です。

RBAC

  • 役割(role)に権限を付与し、ユーザーに役割を割り当てる
  • 管理が簡単、監査しやすい
  • 柔軟性はABACに劣る

ABAC

  • ユーザー/リソースの属性+ポリシー言語で評価
  • きめ細かな制御、例:地域・部門・時間帯・金額など
  • ポリシー設計・可視化の難易度が上がる

基本

概念説明
Subject操作を行う主体(ユーザー・サービスアカウント)alice, bob
Role権限のまとまりadmin / editor / viewer
Permissionresource: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);

導入

  1. スコープ定義:保護対象リソースと操作を列挙(読み取り、作成、更新、削除、公開、承認など)
  2. 役割定義:まずはRBACで粗く整理(最小権限の原則)
  3. 属性定義:部門・地域・雇用区分・金額・時間帯などABAC条件を洗い出す
  4. ポリシー設計:denyルールは明示、説明可能性(explain)を確保
  5. 監査・可視化:権限マトリクス・差分レポート・誰が付与/改定したか履歴

コマンド

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--(読み取りのみ)

例:

3. パーミッションの変更(数値指定)

数値で指定する場合、chmod モード ファイル名の形式で実行します。

各権限の値は以下の通りです。

数字記号意味
4r読み取り
2w書き込み
1x実行

数字は 所有者・グループ・その他 の順に並べます。

$ 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. まとめ

開発現場(ベストプラクティス)

最新情報

製品やライブラリの更新は頻繁です。社内では以下を定期監視すると便利:

運用メモ(テンプレ)
  • 月初にロール棚卸(新入退/異動の反映)
  • 四半期でポリシーレビュー(deny/allowの妥当性)
  • 監査ログの保存期間・検索性のテスト

応用(ハイブリッドRBAC + ABAC)

組み合わせ方

  1. RBACで“出来ること”の大枠を許可
  2. ABACで“出来る条件”を絞り込み(denyを明示)
  3. 説明可能性(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 */ }

発展(マイクロサービス・マルチテナント)

例(権限評価サンドボックス)

ログインユーザー: -
未評価
結果がここに表示されます

おすすめツール

フレームワーク連携

  • Laravel Gates & Policies
  • Symfony Security
  • Spring Security

外部ポリシーエンジン

  • Open Policy Agent(OPA / Rego)
  • Cedar(AWS)

ID・SSO

  • OIDC / SAML プロバイダ
  • SCIM でプロビジョニング