mcpField
N
neo4j-security-skill

neo4j-security-skill

github.com/neo4j-contribセキュリティ118835 回インストール1 週間前に更新
リポジトリ

neo4j-security-skill について

Neo4jのユーザー、ロール、権限、プロパティ単位の制御、ABACルールを扱うセキュリティ向けエージェントスキルです。セキュリティ変更の実行前に、コマンドの提示と明示的な承認を求めます。

主な機能

  1. 01ユーザーとロールの管理指針
  2. 02権限の付与・拒否・確認
  3. 03プロパティ単位のアクセス制御
  4. 04OIDCクレームとユーザータグによるABAC
  5. 05セキュリティ変更の承認ゲート

活用シーン

  1. 01データベースユーザーの作成や停止
  2. 02読み取り専用・書き込みロールの設計
  3. 03機密プロパティへのアクセス制限
  4. 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 USER
  • CREATE ROLE/DROP ROLE
  • GRANT/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. 組み込みロール(削除しないでください)

ロールスコープ
adminDBMS 全体 + すべてのデータベース
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 を参照してください。

コメント