RBAC
ロール (役割) に基づいてアクセス権限を管理する認可モデル
セキュリティ認可
RBAC とは
RBAC (Role-Based Access Control) は、ロール (役割) に基づいてアクセス権限を管理する認可モデルである。ユーザーに直接権限を付与するのではなく、ロールに権限を付与し、ユーザーにロールを割り当てる。
RBAC の構造
RBAC ではユーザーにロール (役割) を割り当て、ロールに権限を紐づける。ユーザーは直接権限を持たず、ロールを介して間接的に権限を取得する。新しいユーザーにはロールを割り当てるだけで適切な権限が付与され、権限の変更もロール単位で一括管理できる。
ユーザー → ロール → 権限
Alice → admin → [read, write, delete, manage-users]
Bob → editor → [read, write]
Carol → viewer → [read]
RBAC vs ABAC
RBAC と ABAC の違いを以下にまとめる。
| 観点 | RBAC | ABAC |
|---|---|---|
| 基準 | ロール (役割) | 属性 (部署、時間、IP) |
| 柔軟性 | 中程度 | 高い |
| 複雑さ | 低い | 高い |
| 例 | admin, editor, viewer | 部署=営業 AND 時間=営業時間 |
| AWS | IAM ロール | IAM ポリシーの Condition |
アプリケーションレベルの RBAC
アプリケーションレベルの RBAC のコード例を示す。
type Role = 'admin' | 'editor' | 'viewer';
type Permission = 'read' | 'write' | 'delete' | 'manage-users';
const rolePermissions: Record<Role, Permission[]> = {
admin: ['read', 'write', 'delete', 'manage-users'],
editor: ['read', 'write'],
viewer: ['read'],
};
function hasPermission(role: Role, permission: Permission): boolean {
return rolePermissions[role].includes(permission);
}
// Lambda ハンドラでの認可チェック
if (!hasPermission(user.role, 'write')) {
return { statusCode: 403, body: JSON.stringify({ error: 'Forbidden' }) };
}
const groups = event.requestContext.authorizer?.claims?.['cognito:groups'] ?? '';
const isAdmin = groups.includes('admin');
RBAC の設計指針
最小権限の原則に従い、必要最小限の権限のみを付与する。ロールの粒度は細かすぎず粗すぎないバランスを取り、viewer < editor < admin のように権限の継承関係を明確にする。不要なロールが蓄積しないよう、定期的に棚卸しを行う。
体系的に学ぶなら関連書籍を参照してほしい。
この記事は役に立ちましたか?
関連用語
IAM (概念)
Identity and Access Management の一般概念で、認証と認可を管理する仕組み
IAM
AWS のアクセス管理サービスで、誰が何のリソースにどのような操作を行えるかを制御する
OpenID Connect
OAuth 2.0 の上に構築された認証レイヤーで、ユーザーの身元情報を ID トークンとして提供する
最小権限の原則
ユーザーやプログラムに、タスクの遂行に必要な最小限の権限のみを付与するセキュリティ原則
脅威モデリング
システムに対する潜在的な脅威を体系的に特定・評価し、対策を設計するセキュリティ手法
ABAC
ユーザー、リソース、環境の属性に基づいてアクセス制御を動的に判断する認可モデル