neo4j-security-skill について
Neo4jのユーザー、ロール、権限、プロパティ単位の制御、ABACルールを扱うセキュリティ向けエージェントスキルです。セキュリティ変更の実行前に、コマンドの提示と明示的な承認を求めます。
主な機能
- 01ユーザーとロールの管理指針
- 02権限の付与・拒否・確認
- 03プロパティ単位のアクセス制御
- 04OIDCクレームとユーザータグによるABAC
- 05セキュリティ変更の承認ゲート
活用シーン
- 01データベースユーザーの作成や停止
- 02読み取り専用・書き込みロールの設計
- 03機密プロパティへのアクセス制限
- 04クレームやタグに応じたロール割り当て
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ neo4j-contrib/ neo4j-skills --skill neo4j-security-skillインストール後、Claude Code で/neo4j-security-skillを入力して読み込まれたか確認します。
同梱ファイルREADME.mdreferences/privilege-reference.md
詳細
使用する場合
- ユーザーの作成、変更、一時停止、削除
- ロールの作成、ロールメンバーシップの付与/取り消し
- グラフ、データベース、または DBMS の権限の付与/拒否/取り消し
- 現在の権限の確認(
SHOW PRIVILEGES) - プロパティレベルのアクセス制御(プロパティごとの読み取り/書き込み)の実装
- OIDC クレームまたはネイティブユーザータグに対する ABAC ルールの設定
- LDAP/SSO 認証プロバイダー設定の参照
使用しない場合
- アプリケーションデータに対する Cypher クエリの作成 →
neo4j-cypher-skill - クラスター運用、バックアップ、サーバー設定 →
neo4j-cli-tools-skill - ドライバー接続のセットアップ →
neo4j-driver-*-skill
MCP 書き込みゲート — 必須
次のいずれかを実行する前に、実行予定のコマンドを提示し、明示的な確認を待ってください。
CREATE USER/ALTER USER/DROP USERCREATE ROLE/DROP ROLEGRANT/DENY/REVOKE(すべての権限)CREATE AUTH RULE/DROP AUTH RULE
権限の変更を自動実行してはいけません。正確な Cypher を提示し、影響を説明して、「yes」という確認を得てください。
実行コンテキスト
セキュリティ関連の Cypher はすべて、system データベースに対して実行します。
// Neo4j auto-routes CREATE/ALTER/SHOW USER|ROLE|PRIVILEGE to system
// If using cypher-shell: cypher-shell -d system
// If using driver: use database="system"
1. ユーザー管理
ユーザーの作成
CREATE USER alice SET PASSWORD 'secret' CHANGE NOT REQUIRED;
// CHANGE REQUIRED (default): forces password change on first login
// CHANGE NOT REQUIRED: password valid immediately
// SET STATUS ACTIVE (default) | SUSPENDED
パラメーター化されたパスワード(スクリプトで推奨)
CREATE USER $username SET PASSWORD $password CHANGE NOT REQUIRED;
2027.01 アップグレード(2027 年 1 月)に伴い、Aura のパスワードの最小文字数が 8 文字から 16 文字に引き上げられます。新規ユーザーの作成時とパスワードの変更/リセット時のみ適用され、既存のパスワードは引き続き使用できます。プロビジョニングスクリプトでは、今から 16 文字以上のパスワードを生成してください。
ユーザーの変更
ALTER USER alice SET PASSWORD $newPw CHANGE NOT REQUIRED;
ALTER USER alice SET STATUS SUSPENDED; // lock account
ALTER USER alice SET STATUS ACTIVE; // unlock
ALTER USER alice SET HOME DATABASE mydb; // default db on connect
ALTER USER alice IF EXISTS SET PASSWORD $pw; // safe if missing
ユーザータグ [2026.06 以降、Enterprise]
タグはネイティブユーザーオブジェクトに付与できる任意の文字列で、ABAC ルール内では abac.native.user_tags() で読み取れます。
CREATE USER jake SET PASSWORD $pw SET TAGS 'finance', 'auditor';
ALTER USER jake REMOVE TAG 'auditor' ADD TAG 'on-call'; // REMOVE before ADD before SET
ALTER USER jake SET TAGS 'finance', 'auditor'; // replaces all existing tags
ALTER USER jake REMOVE ALL TAGS;
ALTER USERS jake, alice ADD TAGS 'pii-access'; // bulk tag edit
SET/ADD/REMOVE TAG[S] には SET USER METADATA が必要です。タグ値の読み取りには SHOW USER METADATA が必要です。
GRANT SET USER METADATA ON DBMS TO userAdmin;
GRANT SHOW USER METADATA ON DBMS TO auditor;
GRANT USER METADATA MANAGEMENT ON DBMS TO userManager; // both of the above
ユーザーの表示
SHOW USERS YIELD user, roles, passwordChangeRequired, suspended, home
WHERE suspended = false
RETURN user, roles ORDER BY user;
// tags column returns null without SHOW USER METADATA [2026.06+]
SHOW USERS YIELD user, roles, tags;
// runnable CREATE USER commands for the whole DBMS [2026.09]
// requires SHOW USER + SHOW USER CREDENTIALS; tags omitted without SHOW USER METADATA
SHOW USERS AS COMMANDS;
SHOW USERS WITH AUTH AS COMMANDS; // includes auth provider config + credentials
SHOW USERS WITH AUTH AS COMMANDS は認証情報を公開します。セキュリティが確保されたバックアップ/復元処理でのみ使用してください。認証情報が不要な場合は、SHOW USERS AS COMMANDS を優先してください。認証情報のエクスポート結果を、平文のドキュメント、ログ、チケット、ソース管理に貼り付けてはいけません。
ユーザーの削除
DROP USER alice IF EXISTS;
2. ロール管理
ロールの作成/削除
CREATE ROLE analyst;
CREATE ROLE analyst IF NOT EXISTS;
DROP ROLE analyst IF EXISTS;
ロールの割り当て/削除
GRANT ROLE analyst TO alice;
GRANT ROLE analyst, writer TO alice, bob; // bulk
REVOKE ROLE analyst FROM alice;
ロールの確認
SHOW ROLES YIELD role, member ORDER BY role;
SHOW ROLE analyst PRIVILEGES AS COMMANDS; // returns runnable GRANT commands
SHOW POPULATED ROLES YIELD role; // only roles with members
// runnable CREATE ROLE commands for the whole DBMS [2026.09]
SHOW ROLES AS COMMANDS;
SHOW ROLES WITH USERS AS COMMANDS; // adds GRANT ROLE ... TO user
SHOW ROLES WITH AUTH RULES AS COMMANDS; // adds GRANT ROLE ... TO AUTH RULE
3. 権限の判断表
| 目的 | コマンド |
|---|---|
| データベースへの接続を許可する | GRANT ACCESS ON DATABASE mydb TO analyst |
| すべてのグラフデータを読み取る | GRANT MATCH {*} ON GRAPH mydb ELEMENTS * TO analyst |
| 特定のラベルを読み取る | GRANT MATCH {*} ON GRAPH mydb NODES Person TO analyst |
| 特定のリレーションシップタイプを読み取る | GRANT MATCH {*} ON GRAPH mydb RELATIONSHIPS KNOWS TO analyst |
| 1 つのプロパティを読み取る | GRANT READ {email} ON GRAPH mydb NODES Person TO analyst |
| プロパティを隠してトラバースする | GRANT TRAVERSE ON GRAPH mydb NODES Person TO analyst |
| 書き込み(作成/設定) | GRANT WRITE ON GRAPH mydb TO writer |
| ノードのみを作成する | GRANT CREATE ON GRAPH mydb NODES Person TO writer |
| ノードのみを削除する | GRANT DELETE ON GRAPH mydb NODES Person TO writer |
| プロシージャを実行する | GRANT EXECUTE PROCEDURE apoc.* TO analyst |
| 関数を実行する | GRANT EXECUTE USER DEFINED FUNCTION apoc.* TO analyst |
| 1 つのデータベースに対するすべての権限 | GRANT ALL ON DATABASE mydb TO dba |
| DBMS の完全な管理権限 | GRANT ALL ON DBMS TO dba |
| ユーザーを管理する | GRANT USER MANAGEMENT ON DBMS TO secadmin |
| ユーザータグを管理する [2026.06] | GRANT USER METADATA MANAGEMENT ON DBMS TO secadmin |
| ロールを管理する | GRANT ROLE MANAGEMENT ON DBMS TO secadmin |
| スキーマを変更する | GRANT CREATE ELEMENT TYPES ON DATABASE mydb TO schemaadmin |
DENY は GRANT より優先されます
// Analyst can read Person but NOT the ssn property
GRANT MATCH {*} ON GRAPH mydb NODES Person TO analyst;
DENY READ {ssn} ON GRAPH mydb NODES Person TO analyst;
REVOKE は特定の GRANT または DENY を取り消します
REVOKE GRANT READ {email} ON GRAPH mydb NODES Person FROM analyst;
REVOKE DENY READ {ssn} ON GRAPH mydb NODES Person FROM analyst;
REVOKE MATCH {*} ON GRAPH mydb NODES Person FROM analyst; // removes both grant+deny
4. よくあるロールのパターン
読み取り専用アナリスト
CREATE ROLE analyst IF NOT EXISTS;
GRANT ACCESS ON DATABASE mydb TO analyst;
GRANT MATCH {*} ON GRAPH mydb ELEMENTS * TO analyst;
GRANT EXECUTE PROCEDURE apoc.* TO analyst;
書き込みロール(管理権限なし)
CREATE ROLE writer IF NOT EXISTS;
GRANT ACCESS ON DATABASE mydb TO writer;
GRANT MATCH {*} ON GRAPH mydb ELEMENTS * TO writer;
GRANT WRITE ON GRAPH mydb TO writer;
特定のラベルのみ読み取り専用
CREATE ROLE limited_reader IF NOT EXISTS;
GRANT ACCESS ON DATABASE mydb TO limited_reader;
GRANT TRAVERSE ON GRAPH mydb ELEMENTS * TO limited_reader; // can traverse
GRANT MATCH {*} ON GRAPH mydb NODES Person TO limited_reader; // Person props visible
GRANT MATCH {*} ON GRAPH mydb NODES Company TO limited_reader; // Company props visible
// Other labels: traversable but properties invisible
DBA ロール(完全な管理権限)
CREATE ROLE dba IF NOT EXISTS;
GRANT ALL ON DBMS TO dba;
GRANT ALL ON DATABASE * TO dba;
5. プロパティレベルのアクセス制御(Enterprise)
個々のプロパティへの読み取りアクセスを制限します:
// Grant read on all Person props, then deny sensitive ones
GRANT MATCH {*} ON GRAPH mydb NODES Person TO analyst;
DENY READ {ssn, dateOfBirth} ON GRAPH mydb NODES Person TO analyst;
プロパティベースのパターンマッチング(サブグラフアクセス):
// Only see Person nodes where classification = 'public'
GRANT MATCH {*} ON GRAPH mydb
FOR (n:Person) WHERE n.classification = 'public'
TO analyst;
// Block access to classified nodes
DENY MATCH {*} ON GRAPH mydb
FOR (n) WHERE n.classification <> 'UNCLASSIFIED'
TO regularUsers;
// List-valued property contains a value [2026.08, Cypher 25]
GRANT MATCH {*} ON GRAPH mydb
FOR (n) WHERE 'gold' IN n.clearanceLevels
TO goldTier;
GRANT READ {*} ON GRAPH mydb FOR (n) WHERE 'EU' IN n.regions TO regularUsers;
GRANT MATCH {*} ON GRAPH mydb FOR (n) WHERE NOT 'EU' IN n.regions TO regularUsers;
// Property on the right-hand side of a comparison [2026.08, Cypher 25]
GRANT MATCH {*} ON GRAPH mydb
FOR (n) WHERE 1 > n.level
TO analyst;
GRANT READ {*} ON GRAPH mydb FOR (n) WHERE 3 < n.securityLevel TO regularUsers;
// Dynamic row-level security: property matches caller's native user tags [2026.10, Enterprise]
GRANT TRAVERSE ON GRAPH * FOR (n:Project) WHERE n.department IN abac.native.user_tags() TO projectTeam;
n.prop IN abac.native.user_tags()[2026.10] — 1 つのロールですべてのタグ値に対応します。dbms.security.abac.authorization_providersにnativeが必要です(§6 を参照)。NOTで否定できないため、タグに一致した場合に許可しますvalue IN n.listProp— リストプロパティに値が含まれます- プロパティが存在しない、またはスカラーの場合 — 一致しません
- 左辺の値 — 非 null かつ NaN ではありません
n.prop IN [v1, v2]— スカラーとリストの比較- Cypher 25 より前 — 比較の左辺にプロパティを置きます
PBAC のエッジケースとエクスポートパターン → references/privilege-reference.md
制約:
FORパターンは読み取り権限にのみ適用され、書き込みには適用されません- プロパティベースの各権限で制限できるプロパティは 1 つだけです
- 2026.08 より前 — リストのメンバーシップとプロパティを右辺に置く述語は拒否されます。
n.prop <op> <literal>に反転するか、スカラーフラグプロパティを維持してください - パフォーマンスへのオーバーヘッドはルールの数に応じて増加します。
TRAVERSEルールはREADよりもコストがかかります - ルールで使用するプロパティを、制限対象のロールが変更できないようにしてください
6. ABAC — 属性ベースのアクセス制御(Enterprise)
ABAC は、GRANT ROLE ... TO user を明示的に指定するのではなく、OIDC/JWT クレームまたはネイティブユーザータグに基づいてロールを動的に付与します。
前提条件
# neo4j.conf — providers must also appear in dbms.security.authorization_providers
dbms.security.abac.authorization_providers=<oidc-provider-alias>,native # native [2026.06+]
プロバイダーが一覧にない場合、そのアクセサー関数(abac.oidc.user_attribute()、abac.native.user_tags())は使用できず、それを参照するルールは失敗します(デフォルト値への暗黙のフォールバックはありません)。
認可ルールの作成
CREATE AUTH RULE salesRule
SET CONDITION abac.oidc.user_attribute('department') = 'sales';
GRANT ROLE analyst TO AUTH RULE salesRule;
複合条件
CREATE OR REPLACE AUTH RULE seniorRule
SET CONDITION abac.oidc.user_attribute('department') = 'engineering'
AND abac.oidc.user_attribute('level') >= 5;
GRANT ROLE senior_engineer TO AUTH RULE seniorRule;
認可ルールの管理
SHOW AUTH RULES YIELD ruleName, condition, roles;
ALTER AUTH RULE salesRule SET ENABLED false; // disable without dropping
RENAME AUTH RULE salesRule TO salesDeptRule;
DROP AUTH RULE salesDeptRule;
REVOKE ROLE analyst FROM AUTH RULE salesRule;
ネイティブユーザー [2026.06 以降]:ネイティブ DB ユーザーにタグを付け(ユーザータグ を参照)、abac.native.user_tags() を使用してルール内でタグを照合します。OIDC は不要です:
CREATE AUTH RULE nativeSalesRule
SET CONDITION 'sales' IN abac.native.user_tags();
GRANT ROLE analyst TO AUTH RULE nativeSalesRule;
// require several tags at once
CREATE AUTH RULE financeAuditRule
SET CONDITION all(tag IN ['finance', 'auditor'] WHERE tag IN abac.native.user_tags());
// combine tags with OIDC claims and temporal conditions
CREATE AUTH RULE onCallRule
SET CONDITION 'on-call' IN abac.native.user_tags()
AND abac.oidc.user_attribute('department') = 'engineering'
AND time.transaction('UTC').hour >= 9;
❌ タグが存在しないことを条件にしてはいけません:NOT ('restricted' IN abac.native.user_tags()) — タグなしで作成されたユーザーはすべてこの条件を満たし、権限が昇格します。
✅ タグの存在を必須にします:'unrestricted' IN abac.native.user_tags()。
注意:
- クレームがない場合は NULL と評価されます → ルール条件は false になります → ロールは付与されません
- クレームがすでに読み込まれている場合、ルールは既存のセッションに即座に適用されます
- OIDC クレームには
abac.oidc.user_attribute()、ネイティブユーザータグにはabac.native.user_tags()を使用します [2026.06 以降]。LDAP にはアクセサー関数がないため、LDAP ユーザーのネイティブユーザーオブジェクトにタグを付けてください - PBAC のプロパティルール述語では、ユーザー定義関数は拒否されます [2026.06 以降]
- Infinigraph(シャーディングされたプロパティデータベース)は、仮想データベースに付与された PBAC
READのみをサポートします [2026.07 以降、Aura では非対応] — references/privilege-reference.md を参照してください
7. SHOW PRIVILEGES のパターン
// All privileges in the system
SHOW PRIVILEGES YIELD *;
// Privileges for a specific user (as runnable commands)
SHOW USER alice PRIVILEGES AS COMMANDS;
// Privileges for a specific role
SHOW ROLE analyst PRIVILEGES YIELD privilege, action, resource, graph, segment;
// Privileges of roles granted to an auth rule [2026.09]
SHOW AUTH RULES salesRule PRIVILEGES AS COMMANDS;
// Find who has access to a database
SHOW PRIVILEGES YIELD *
WHERE graph = 'mydb'
RETURN role, action, resource, segment ORDER BY role;
// Find all DENY rules
SHOW PRIVILEGES YIELD *
WHERE access = 'DENIED'
RETURN role, action, resource, segment;
8. 組み込みロール(削除しないでください)
| ロール | スコープ |
|---|---|
admin | DBMS 全体 + すべてのデータベース |
architect | すべてのデータベースでのスキーマ変更 + 書き込み |
publisher | すべてのデータベースへの書き込み |
editor | スキーマ変更を除く書き込み |
reader | すべてのデータベースへの読み取り専用アクセス |
public | すべてのユーザーに暗黙的に適用。デフォルトのホームデータベースへのアクセス |
組み込みロールを割り当てます:GRANT ROLE reader TO alice;
9. 認証プロバイダー設定リファレンス(運用向け — Cypher ではありません)
ネイティブ(デフォルト)
dbms.security.auth_enabled=true
dbms.security.auth_max_failed_attempts=3 # lockout threshold
LDAP
dbms.security.auth_provider=ldap
dbms.security.ldap.host=ldap://ldap.example.com
dbms.security.ldap.authentication.mechanism=simple
dbms.security.ldap.authentication.user_dn_template=uid={0},ou=users,dc=example,dc=com
dbms.security.ldap.authorization.group_membership_attributes=memberOf
dbms.security.ldap.authorization.group_to_role_mapping=\
"cn=analysts,ou=groups,dc=example,dc=com" = analyst;\
"cn=admins,ou=groups,dc=example,dc=com" = admin
OIDC / SSO(Okta、Auth0、Entra ID)
dbms.security.oidc.<alias>.display_name=Okta
dbms.security.oidc.<alias>.auth_flow=pkce # `implicit` deprecated 2026.06, removal planned — keep pkce
dbms.security.oidc.<alias>.well_known_discovery_uri=https://example.okta.com/.well-known/openid-configuration
dbms.security.oidc.<alias>.audience=neo4j
dbms.security.oidc.<alias>.claims.username=email
dbms.security.oidc.<alias>.claims.groups=groups
dbms.security.oidc.<alias>.authorization.group_to_role_mapping=\
"neo4j-analysts" = analyst;\
"neo4j-admins" = admin
設定を変更するには、サーバーの再起動が必要です。マッピングで参照するロールは、Neo4j に存在している必要があります(ネイティブ、または Cypher で作成)。
チェックリスト — 新しいロールの設定
- 必要な操作を確認します:読み取り/書き込み/管理
- 対象のデータベースとグラフの範囲(すべてのラベルか特定のラベルか)を特定します
- 非表示にする必要があるプロパティを特定します(→ DENY READ)
- ロールを作成します:
CREATE ROLE ... IF NOT EXISTS - データベースに ACCESS を付与します
- 必要に応じて MATCH/TRAVERSE/WRITE を付与します
- 制限対象のプロパティに DENY を適用します
-
SHOW ROLE ... PRIVILEGES AS COMMANDSを実行して確認します - ユーザーに割り当てます:
GRANT ROLE ... TO ... -
SHOW USER ... PRIVILEGES AS COMMANDSでテストします
すべての権限構文については、references/privilege-reference.md を参照してください。