- 打卡等级:魔龙套勇士
- 打卡总天数:130
- 打卡月天数:23
- 打卡总奖励:14868
- 最近打卡:2025-08-23 00:38:01
管理员
本站站长
- 积分
- 8650
|
在 GOM 引擎中,合理分配数据库权限需遵循 “最小权限原则”、“职责分离原则”、“动态权限原则”,并结合游戏运营的实际场景设计精细的权限体系。以下是具体的权限分配策略和实施步骤:
一、基于角色的权限分离(RBAC 模型)
将数据库操作角色划分为系统层、运营层、应用层,每层赋予不同的权限集:
角色 权限范围 典型操作
DBA(数据库管理员) 完全控制(CREATE/ALTER/DROP TABLE,BACKUP/RESTORE DATABASE) 创建表结构、修改字段类型、执行全量备份、恢复数据
GM(游戏管理员) 玩家数据查询(SELECT)、有限修改(UPDATE 特定表) 查询玩家角色信息、重置玩家密码、发放活动奖励
运维工程师 监控与优化(SHOW STATUS,OPTIMIZE TABLE) 查看数据库性能指标、优化查询语句、重启服务
游戏服务器进程 特定表的增删改查(INSERT/UPDATE/DELETE/SELECT) 读写玩家角色数据、物品数据、任务进度
第三方插件 只读(SELECT)或受限写(INSERT 特定表) 读取玩家数据生成统计报表、记录登录日志
二、核心数据表的权限细化
针对 GOM 引擎的关键数据表,按业务风险分级配置权限:
1. 高风险表(玩家资产 / 核心配置)
表名:Role(角色表)、Backpack(背包表)、Item(物品表)、GoldLog(金币流水)
权限策略:
DBA:完全控制
GM:仅允许SELECT,需修改时通过存储过程(如sp_GiveItem)间接操作
游戏进程:SELECT/UPDATE(仅限当前登录玩家的数据)
禁止:第三方插件访问
2. 中风险表(运营数据)
表名:Activity(活动表)、Quest(任务表)、Rank(排行榜)
权限策略:
DBA:完全控制
GM:SELECT/INSERT/UPDATE(活动配置)
游戏进程:SELECT(读取活动规则)、INSERT(提交任务)
第三方插件:SELECT(生成活动报表)
3. 低风险表(日志 / 统计)
表名:LoginLog(登录日志)、ChatLog(聊天日志)、Performance(性能监控)
权限策略:
DBA:完全控制
GM:SELECT(查询可疑登录)
运维:SELECT/DELETE(清理过期日志)
第三方插件:SELECT(读取日志生成报表)
三、操作类型的权限限制
按 SQL 操作类型划分权限,避免 “过度授权”:
SQL 操作 允许角色 限制条件
SELECT 所有角色(按表权限) - 禁止SELECT *(必须指定字段)
- 游戏进程只能查询当前玩家关联数据
INSERT 游戏进程、GM(受限) - 禁止向Role表直接插入(通过注册接口生成)
- 必须校验数据完整性
UPDATE 游戏进程、GM(存储过程) - 禁止直接修改Role.Level(通过升级逻辑触发)
- 必须记录修改日志
DELETE DBA、运维(按策略) - 禁止直接删除Role表数据(标记为禁用状态)
- 仅允许删除过期日志
ALTER DBA - 生产环境需审批
- 修改前强制备份
四、实施步骤与工具
1. 权限规划阶段
数据分级:梳理数据库表,按 “玩家隐私> 游戏资产 > 运营数据 > 日志” 分级(参考 NIST 数据分类标准)。
角色定义:明确组织内的角色(如 DBA、GM、运维),避免 “一人多角色”。
权限矩阵:为每个角色创建权限矩阵(如下表),明确可访问的表和操作。
2. 技术实现(以 MySQL 为例)
sql
-- 创建GM只读账号
CREATE USER 'gm_reader'@'%' IDENTIFIED BY 'secure_password';
GRANT SELECT ON MirDB.Role TO 'gm_reader'@'%';
GRANT SELECT ON MirDB.Backpack TO 'gm_reader'@'%';
FLUSH PRIVILEGES;
-- 创建游戏进程账号(仅允许操作当前玩家数据)
CREATE USER 'game_server'@'localhost' IDENTIFIED BY 'game_password';
GRANT SELECT, UPDATE ON MirDB.Role TO 'game_server'@'localhost'
WHERE CURRENT_USER() = USER(); -- 限制只能操作当前会话关联的用户
GRANT INSERT, DELETE ON MirDB.Backpack TO 'game_server'@'localhost';
FLUSH PRIVILEGES;
-- 创建运维监控账号
CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor_password';
GRANT SHOW STATUS, PROCESSLIST ON *.* TO 'monitor'@'%';
GRANT SELECT ON information_schema.* TO 'monitor'@'%';
FLUSH PRIVILEGES;
3. 动态权限控制
基于时间的权限:GM 账号在非工作时间(如 20:00 - 次日 8:00)自动降级为只读权限。
基于 IP 的权限:游戏进程账号只能从特定服务器 IP(如 192.168.1.10)连接。
基于操作频率的限制:防止批量操作(如每分钟最多执行 10 次UPDATE)。
4. 权限审计与监控
启用慢查询日志:记录执行时间超过 1 秒的 SQL(含权限信息)。
部署审计插件:如 MySQL Enterprise Audit,记录所有权限变更和敏感操作。
定期权限复核:每月核查账号权限,删除冗余权限(如离职员工账号)。
五、最佳实践与注意事项
避免使用默认账号:禁用root/sa等超级账号,创建专用 DBA 账号。
密码管理:
使用密码管理器生成随机密码(长度≥16,含大小写 / 数字 / 符号)。
每 90 天轮换一次密码,禁止在代码中明文存储密码。
存储过程替代直接操作:
对于敏感操作(如发放物品),通过存储过程封装逻辑:
sql
CREATE PROCEDURE sp_GiveItem(
IN player_id INT,
IN item_id INT,
IN count INT,
IN operator VARCHAR(50)
)
BEGIN
-- 校验权限
IF EXISTS (SELECT 1 FROM GMAuth WHERE GMName = operator AND Permission = 'GiveItem') THEN
-- 记录操作日志
INSERT INTO GMLog (GMName, Action, Timestamp) VALUES (operator, 'GiveItem', NOW());
-- 执行物品发放
INSERT INTO Backpack (RoleID, ItemID, Count) VALUES (player_id, item_id, count);
ELSE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '权限不足';
END IF;
END;
最小化网络暴露:
数据库仅开放必要端口(如 MySQL 的 3306),并通过防火墙限制访问 IP。
优先使用内网连接,禁止公网直接访问数据库。
通过以上策略,可构建 “分层防御、动态控制、可审计追溯” 的数据库权限体系,在保障游戏功能正常运行的同时,最大限度降低因权限错误导致的数据泄露、篡改风险。核心原则是:“权限永远小于需求,操作必须留痕”。
|
|