提升 NebulaGraph 安全性:符合等保要求的配置指南

作者:ShunWah

在运维管理领域,我拥有多年深厚的专业积累,兼具坚实的理论基础与广泛的实践经验。我始终站在技术前沿,致力于推动运维自动化,不懈追求运维效率的最大化。

我精通运维自动化流程,对于OceanBase、MySQL等多种数据库的部署与运维,具备从初始部署到后期维护的全链条管理能力。凭借OceanBase的OBCA和OBCP认证、OpenGauss社区认证结业证书,以及崖山DBCA、亚信AntDBCA、翰高HDCA、GBase 8a | 8c | 8s、Galaxybase GBCA、Neo4j Graph Data Science Certification、NebulaGraph NGCI & NGCP等多项权威认证,我不仅展现了自己的专业技能,也彰显了对技术的深厚热情与执着追求。

在OceanBase & 墨天轮的技术征文大赛中,我凭借卓越的技术实力和独特的见解,多次荣获一、二、三等奖。同时,在OpenGauss第五届、第六届、第七届技术征文大赛,TiDB社区第三届专栏征文大赛,金仓数据库有奖征文活动,以及首批YashanDB「产品体验官」尝鲜征文等活动中,我也屡获殊荣。此外,我还活跃于墨天轮、CSDN、ITPUB等技术平台,经常发布原创技术文章,并多次被首页推荐,积极与业界同仁分享我的运维经验和独到见解。

image

前言

本文旨在为使用 NebulaGraph 3.8.0 图数据库的用户详细介绍如何启用和配置用户认证,并实施用户权限的三权分立(管理、操作、审计分离),以符合国家信息安全等级保护(等保)的要求。我们将涵盖从默认配置的潜在风险到逐步启用本地身份验证、修改 root 密码以及创建和管理用户的全过程。
NebulaGraph 是一款高性能的分布式图数据库,适用于大规模数据存储和复杂查询场景。为了确保数据的安全性和访问控制,在生产环境中启用用户认证并实现用户权限的三权分立是必不可少的步骤。本指南将帮助你了解并实施这些安全措施,以满足等保安全要求。

一 、身份验证

当客户端连接到 NebulaGraph 时,NebulaGraph 会创建一个会话,会话中存储连接的各种信息,如果开启了身份验证,就会将会话映射到对应的用户。
NebulaGraph 支持两种身份验证方式:本地身份验证和 LDAP 验证。

1、默认配置的风险

默认情况下,NebulaGraph 的认证功能是关闭的,这意味着任何用户都可以使用 root 用户名和任意密码连接到数据库。这在测试环境中可能是方便的,但在生产环境中是不安全的。如果你发现可以使用随意的密码登录,说明认证尚未启用。

1.1 登录

默认密码就能登录

[root@instance2 ~]# cd /opt/app/nebula-graph
[root@instance2 nebula-graph]# ls
bin  cluster.id  data  etc  logs  nebula-console  pids  scripts  share
[root@instance2 nebula-graph]# ./nebula-console --addr 127.0.0.1 --port 9669 -u root -p nebula

Welcome!

(root@nebula) [(none)]> 

随意密码也能登录

[root@instance2 nebula-graph]# ./nebula-console --addr 127.0.0.1 --port 9669 -u root -p 1234

Welcome!

(root@nebula) [(none)]> 

2、本地身份验证

本地身份验证是指在服务器本地存储用户名、加密密码,当用户尝试访问 NebulaGraph 时,将进行身份验证。

2.1 启用本地身份验证

编辑配置文件nebula-graphd.conf(默认目录为/usr/local/nebula/etc/),设置如下参数:
○ --enable_authorize:是否启用身份验证,可选值:true、false。
○ Note
■ 默认情况下,身份验证功能是关闭的,用户可以使用root用户名和任意密码连接到 NebulaGraph。
■ 开启身份验证后,默认的 God 角色账号为root,密码为nebula。角色详情请参见内置角色权限。
○ --failed_login_attempts:可选项,需要手动添加该参数。单个 Graph 节点允许连续输入错误密码的次数。超过该次数时,账户会被锁定。如果有多个 Graph 节点,允许的次数为节点数 * 次数。
○ --password_lock_time_in_secs:可选项,需要手动添加该参数。多次输入错误密码后,账户被锁定的时间。单位:秒。

[root@instance2 nebula-graph]# ls
bin  cluster.id  data  etc  logs  nebula-console  pids  scripts  share
[root@instance2 nebula-graph]# cd etc/
[root@instance2 etc]# ls
nebula-graphd.conf             nebula-metad.conf.default     nebula-storaged.conf.production
nebula-graphd.conf.default     nebula-metad.conf.production  nebula-storaged-listener.conf.production
nebula-graphd.conf.production  nebula-storaged.conf
nebula-metad.conf              nebula-storaged.conf.default
[root@instance2 etc]# vim nebula-graphd.conf
[root@instance2 etc]# 

2.2 修改后的认证参数
# Enable authorization
--enable_authorize=true

3、重启 NebulaGraph 服务

[root@instance2 nebula-graph]# cd scripts/
[root@instance2 scripts]# ls
meta-transfer-tools.sh  nebula-metad.service  nebula-storaged-listener.service  utils.sh
nebula-graphd.service   nebula.service        nebula-storaged.service
[root@instance2 scripts]# bash nebula.service restart all
[INFO] Stopping nebula-metad...
[INFO] Done
[INFO] Starting nebula-metad...
[INFO] Done
[INFO] Stopping nebula-graphd...
[INFO] Done
[INFO] Starting nebula-graphd...
[INFO] Done
[INFO] Stopping nebula-storaged...
[INFO] Done
[INFO] Starting nebula-storaged...
[INFO] Done
[root@instance2 scripts]# 

4、登录进入 Nebula Console

[root@instance2 nebula-graph]# ls
bin  cluster.id  data  etc  logs  nebula-console  pids  scripts  share
[root@instance2 nebula-graph]# ./nebula-console --addr 127.0.0.1 --port 9669 -u root -p nebula

Welcome!

(root@nebula) [(none)]> 

5、查看用户列表(SHOW USERS)

(root@nebula) [(none)]> show users;
+---------+
| Account |
+---------+
| "root"  |
+---------+
Got 1 rows (time spent 1.987ms/3.031978ms)

Mon, 13 Jan 2025 17:02:53 CST

(root@nebula) [(none)]> 

6、修改root用户密码(ALTER USER)

一旦启用了认证,你应该立即修改 root 用户的默认密码。
执行ALTER USER语句可以修改用户密码,修改时不需要提供旧密码。当前仅 God 角色用户(即root用户)能够执行ALTER USER语句。

(root@nebula) [(none)]> 
(root@nebula) [(none)]> ALTER USER root WITH PASSWORD 'Nebula2024';
Execution succeeded (time spent 1.651ms/2.240427ms)

Tue, 14 Jan 2025 14:24:27 CST

(root@nebula) [(none)]> 

7、退出登录,再次登录

(root@nebula) [(none)]> exit

Bye root!
Tue, 14 Jan 2025 14:25:02 CST

[root@instance2 nebula-graph]# ./nebula-console --addr 127.0.0.1 --port 9669 -u root -p nebula
2025/01/14 14:25:36 Fail to create a new session from connection pool

Error:
failed to authenticate, error code: -1001, error msg: Invalid password
[root@instance2 nebula-graph]# ./nebula-console --addr 127.0.0.1 --port 9669 -u root -p 1234
2025/01/14 14:25:46 Fail to create a new session from connection pool

Error:
failed to authenticate, error code: -1001, error msg: Invalid password
[root@instance2 nebula-graph]# 

默认密码报错了,已经无法登录。

8、验证更改后的密码登录:

尝试用新的凭据重新连接到 Nebula Graph,确认密码更改已生效。

[root@instance2 nebula-graph]# 
[root@instance2 nebula-graph]# ./nebula-console --addr 127.0.0.1 --port 9669 -u root -p Nebula2024

Welcome!

(root@nebula) [(none)]> 

修改后的密码测试可以登录

二、创建用户

1、创建用户(CREATE USER)

执行CREATE USER语句可以创建新的 NebulaGraph 用户。当前仅 God 角色用户(即root用户)能够执行CREATE USER语句。
● 语法
CREATE USER [IF NOT EXISTS] <user_name> [WITH PASSWORD ‘’];
○ IF NOT EXISTS:检测待创建的用户名是否存在,只有不存在时,才会创建新用户。
○ user_name:待创建的用户名。
○ password:用户名对应的密码。
执行GRANT ROLE语句可以将指定图空间的内置角色权限授予用户。当前仅 God 角色用户和 Admin 角色用户能够执行GRANT ROLE语句。角色权限的说明,请参见内置角色权限。nebula> GRANT ROLE admin ON biao_test TO admin;
God 初始最高权限角色,拥有所有操作的权限
Admin 对权限内的图空间拥有 Schema 和 data 的读写权限
DBA 对权限内的图空间拥有 Schema 和 data 的读写权限。
User 对权限内的图空间拥有 Schema 的只读权限。
Guest 对权限内的图空间拥有 Schema 和 data 的只读权限。

2、查看用户

创建用户前我们先查看有那些用户;

(root@nebula) [(none)]> show users;
+---------+
| Account |
+---------+
| "root"  |
+---------+
Got 1 rows (time spent 1.666ms/2.577728ms)

Tue, 14 Jan 2025 14:29:14 CST

(root@nebula) [(none)]> 

查看后,目前只有Root用户

3、创建操作员:operator

(root@nebula) [(none)]> CREATE USER operator WITH PASSWORD 'Nebula2023';
Execution succeeded (time spent 1.614ms/2.128208ms)

Tue, 14 Jan 2025 15:37:00 CST

(root@nebula) [(none)]> 

4、创建审计管理员:sysaudit

(root@nebula) [(none)]> CREATE USER sysaudit WITH PASSWORD 'Nebula2024';
Execution succeeded (time spent 1.741ms/2.349151ms)

Tue, 14 Jan 2025 15:37:52 CST

(root@nebula) [(none)]> 

5、创建安全管理员:sysadmin

(root@nebula) [(none)]> CREATE USER sysadmin WITH PASSWORD 'Nebula2025';
Execution succeeded (time spent 1.743ms/2.32076ms)

Tue, 14 Jan 2025 15:38:14 CST

(root@nebula) [(none)]> 

6、再次查看用户列表(SHOW USERS)

(root@nebula) [(none)]> show users;
+------------+
| Account    |
+------------+
| "root"     |
| "operator" |
| "sysaudit" |
| "sysadmin" |
+------------+
Got 4 rows (time spent 1.589ms/2.312696ms)

Tue, 14 Jan 2025 15:38:42 CST

(root@nebula) [(none)]> 

三、管理用户

1、创建示例空间

创建用户授权前,我们先创建示例空间;

(root@nebula) [(none)]> CREATE SPACE IF NOT EXISTS space1 (vid_type=FIXED_STRING(30));
Execution succeeded (time spent 1.542ms/2.076204ms)

Tue, 14 Jan 2025 14:39:50 CST

(root@nebula) [(none)]> CREATE SPACE IF NOT EXISTS space2 (vid_type=FIXED_STRING(30));
Execution succeeded (time spent 1.165ms/1.730596ms)

Tue, 14 Jan 2025 14:40:02 CST

(root@nebula) [(none)]> 

2、查看空间 SHOW SPACES;

(root@nebula) [(none)]> SHOW SPACES;
+----------+
| Name     |
+----------+
| "space1" |
| "space2" |
+----------+
Got 2 rows (time spent 1.452ms/2.197014ms)

Tue, 14 Jan 2025 14:40:45 CST

(root@nebula) [(none)]> 

3、授权用户(GRANT ROLE)

执行GRANT ROLE语句可以将指定图空间的内置角色权限授予用户。当前仅 God 角色用户和 Admin 角色用户能够执行GRANT ROLE语句。角色权限的说明,请参见内置角色权限。nebula> GRANT ROLE admin ON biao_test TO admin;

3.1 sysaudit用户授权空间1 为USER角色
(root@nebula) [(none)]> 
(root@nebula) [(none)]> GRANT ROLE USER ON space1 TO sysaudit;
Execution succeeded (time spent 1.773ms/2.34586ms)

Tue, 14 Jan 2025 14:42:19 CST

(root@nebula) [(none)]> 

User 对权限内的图空间拥有 Schema 的只读权限。

3.2 sysadmin用户授权空间2 为ADMIN角色
(root@nebula) [(none)]> GRANT ROLE ADMIN ON space2 TO sysadmin;
Execution succeeded (time spent 1.422ms/2.008812ms)

Tue, 14 Jan 2025 14:43:28 CST

(root@nebula) [(none)]> 

Admin 对权限内的图空间拥有 Schema 和 data 的读写权限

4、测试 sysadmin 安全管理员 ADMIN角色授权空间1和空间2

[root@instance2 nebula-graph]# ./nebula-console --addr 127.0.0.1 --port 9669 -u sysadmin -p Nebula2025

Welcome!

(sysadmin@nebula) [(none)]> SHOW SPACES;
+----------+
| Name     |
+----------+
| "space2" |
+----------+
Got 1 rows (time spent 1.606ms/2.585068ms)

Tue, 14 Jan 2025 14:45:13 CST

(sysadmin@nebula) [(none)]> 

sysadmin 安全管理员能看到,并读写空间2

5、测试 sysaudit 审计管理员 USER角色授权空间1和空间2

[root@instance2 nebula-graph]# ./nebula-console --addr 127.0.0.1 --port 9669 -u sysaudit -p Nebula2024

Welcome!

(sysaudit@nebula) [(none)]> SHOW SPACES;
+----------+
| Name     |
+----------+
| "space1" |
+----------+
Got 1 rows (time spent 1.329ms/2.212657ms)

Tue, 14 Jan 2025 14:46:42 CST

(sysaudit@nebula) [(none)]> 

sysaudit 审计管理员 只能看到读空间1,不能写空间1

6、删除用户(DROP USER)

执行DROP USER语句可以删除用户。当前仅 God 角色用

(root@nebula) [(none)]> DROP USER sysadmin;
Execution succeeded (time spent 2.054ms/2.764438ms)

Tue, 14 Jan 2025 14:54:08 CST

(root@nebula) [(none)]> DROP USER sysaudit;
Execution succeeded (time spent 1.642ms/2.261796ms)

Tue, 14 Jan 2025 14:54:15 CST

7、查看用户列表(SHOW USERS)

(root@nebula) [(none)]> show users;
+---------+
| Account |
+---------+
| "root"  |
+---------+
Got 1 rows (time spent 1.264ms/1.875929ms)

Tue, 14 Jan 2025 14:54:24 CST

(root@nebula) [(none)]> 

四、用户默认密码登录报错-故障排除

可以采用临时禁用认证以重置密码
如果无法通过现有凭证登录到 Nebula Console,可以考虑暂时禁用认证来重置 root 密码。请注意,这会带来安全风险,仅应在受控环境中进行,并尽快恢复认证功能。

1. 编辑配置文件:再次打开 nebula-graphd.conf 文件,并将 --enable_authorize 设置为 false。
2. 重启服务:重启所有相关的 Nebula Graph 服务。
3. 进入 Nebula Console:使用默认凭证(如 root 和空字符串)登录。
4. 修改密码:执行以下命令更改 root 用户的密码。

ALTER USER 'root' WITH PASSWORD 'Nebula2024';

5. 恢复认证:再次编辑配置文件,将 --enable_authorize 设置回 true,并重启服务。

总结

通过上述步骤,已经成功启用了 NebulaGraph 3.8.0 的用户认证机制,并增强了系统的安全性。确保定期审查用户列表和权限,遵循最小权限原则,只为用户分配他们实际需要的权限。希望这篇指南能帮助你在生产环境中更好地管理和保护你的 NebulaGraph 数据库。

参考文献
NebulaGraph 官方文档
轻松上手:通过 RPM 包快速部署 NebulaGraph
如果你有任何问题或需要更多帮助,请查阅官方文档或联系 NebulaGraph 的支持团队。

希望这篇征文能够清晰地指导读者完成 NebulaGraph 3.8.0 的用户认证配置,仅供参考。如果有更多具体的问题或需要进一步的帮助,请随时告知。

2 个赞