作者:肖圣龙 | StoneData 技术架构师
审核:王博
引言:
随着数据分析在企业和组织中的重要性不断增加,数据仓库成为处理大规模数据集和支持复杂分析的首选解决方案,如何保障数据安全由此成为了在数据分析过程中不可忽视的重要问题。身份认证与访问控制策略是构建安全可靠的数仓环境的核心要素,StoneData 作为一款新一代高性能、低成本的一站式实时数仓,已具备健全的身份认证与访问控制能力。 本文将围绕着账号合规、密码策略、主机名校验和基于角色的访问控制模型等,详细介 StoneData 的身份认证与访问控制能力。
一、身份认证
身份认证模块是确保账号安全的核心组成部分。 该模块综合应用了账号合规、密码策略和主机名校验等功能,提供了强大的身份认证机制。以下是详细阐述这些内容在身份认证模块中的整合和应用:
1.1. 账号合规性
账号合规性即要求用户创建符合规范的账号。这包括使用合法的字符、避免敏感信息作为账号名等。通过账号合规要求,StoneData 可以确保账号的可识别性和一致性,提高管理的便捷性和安全性。
图1-1: 账号名和密码校验逻辑
1.1.1. 合法字符要求
为了确保账号的规范性和可识别性,我们要求用户只能使用合法字符来创建账号。 合法字符指的是那些符合安全性和兼容性要求的字符集。StoneData 限制账号只能包含大小写字母和数字以及短横线,这样的限制有助于避免可能导致数据仓库故障或安全漏洞的非法字符使用。
1.1.2. 敏感信息避免
为了保护账号的安全性和隐私,用户在创建账号时应尽量避免在账号中使用敏感信息,如个人身份证号码、银行账号等,以此来减少可能导致的身份盗窃和欺诈行为的风险。
1.1.3. 账号管理功能
为了方便管理员对账号进行管理和监控,StoneData 提供了账号管理功能。 管理员可以通过该功能对账号进行添加、修改、删除等操作。以此帮助管理员更好地控制和维护账号,确保账号的合规性和安全性。
1.2. 密码 策略
身份认证模块中的密码策略要求用户设置强密码,以防止密码被猜测或被破解。 此外,我们鼓励用户定期更换密码,以降低密码被破解的风险。在密码存储方面,StoneData 采用密文存储,以此提高账号的安全性。
图1-2: 密码存储逻辑示意
1.2.1. 强密码策略
强密码策略是保护账号安全的首要步骤。StoneData 的密码策略要求密码长度不少于8个字符,包含大小写字母、数字或特殊字符这4种元素中的至少3种。
1.2.2. 密码存储与加密
StoneData 采用安全的密码存储和加密机制,以保护用户密码的安全性。存储用户密码时,StoneData 采用加密算法对密码进行哈希运算,再存储其哈希值。这样即使数据库遭到未经授权的访问,黑客也无法获得用户的明文密码。
1.3. 机名校验
账号和主机名同步校验是一项重要的安全措施。StoneData 账号名中的主机名策略允许管理员限制特定账号只能从特定的主机名或 IP 地址进行登录。 通过灵活的主机名匹配规则可以确保管理员能够根据具体需求进行定制化的主机名限制策略。以下是详细阐述这一安全措施的工作原理和实施方法:
1.3.1. 主机名限制策略
在 StoneData 中,账号名采用“用户名@主机名”的格式,其中主机名可以是 IP 地址或特定域名。 我们可以为每个账号设置特定的主机名限制,这意味着该账号只能从与其关联的特定主机名或 IP 地址进行登录。
1.3.2. 同步校验过程
在登录过程中,StoneData 首先会验证账号和密码的正确性。一旦账号和密码通过验证,接下来会进行账号和主机名的同步校验。
1.3.3. 主机名匹配规则
StoneData 使用灵活的主机名匹配规则,以确保与账号关联的主机名限制得到有效应用。 管理员可以根据具体需求选择适当的匹配模式,确保账号与主机名的限制达到预期效果。现支持以下几种主机名匹配模式:(1)精确匹配精确匹配要求登录请求的主机名与账号设置的主机名完全匹配。只有在主机名完全相符的情况下,登录请求才会被接受。
- 本机访问(localhost):限制账号仅能在本机访问
- IP 地址访问(仅支持IPv4地址):精确匹配单个IP地址,如 10.1.0.23、192.168.32.1
(2)通配符匹配通配符匹配允许使用通配符来模糊匹配主机名。StoneData 现在仅支持百分号通配符:
- 百分号(%)通配符:允许来自任一主机发起的请求。
1.3.4. 安全性增强
账号和主机名同步校验的措施增强了 StoneData 的安全性,提供了额外的保护层。 既能防止对数据库的恶意访问,也能减轻企业内部可能带来的威胁。(1)防止恶意访问通过限制账号只能从特定的主机名或 IP 地址进行登录,StoneData 可以有效防止恶意用户通过其他主机或IP 地址尝试非授权访问数据库。即使攻击者获得了正确的账号和密码,由于主机名不匹配,他们也无法成功登录。(2)减轻内部威胁通过限制账号只能从指定的 IP 登录,StoneData 可以减少内部人员滥用权限的风险。即使内部人员获取了其他人的账号和密码,由于 IP 不匹配,他们也无法登录到系统。
二、访问控制
StoneData 的访问控制策略通过 RBAC(Role-Based Access Control)模型实现,这是一种基于角色的访问控制模型。 RBAC 定义了一套明确的权限管理规则,通过角色的授权来管理用户对数据库资源的访问权限。在此基础上,为方便对用户的组织管理,我们引入了用户组的概念,以进一步提高权限管理的效率和灵活性。同时,我们兼容了 MySQL 的用户专属权限功能,以适应 MySQL 权限生态体系。 以下是 StoneData 访问控制策略的组成部分及其功能说明:
图2-1: RBAC模型关系示意
2.1. 角色(Roles)
角色用于组织一系列相关权限。在 StoneData 中,角色可以被赋予特定的操作权限,例如读取、写入、更新、删除等。角色可以根据用户的职责或工作职能进行定义,例如管理员、数据分析师、普通用户等。通过角色,StoneData 可以实现权限的集中管理和灵活分配。
2.2. 用户(Users)
用户是系统中的具体操作者,可以被分配一个或多个角色。每个用户可以根据其职责或工作需求被分配适当的角色,从而获得相应的权限。 用户可以通过角色来访问数据库中的资源,并执行与其角色关联的操作。此外,用户还可以通过被授予专属权限的方式来获得对数据库中资源的访问权限。
2.3. 用户组(User Groups)
用户组是将具有相似权限需求的用户进行组织的一种方式。 用户组可以根据组织的结构、部门或职能来定义,例如部门A、部门B或管理员组等。用户组的使用可以简化权限管理,特别是在拥有大量用户的情况下,可以将用户分组,便于集中管理和权限分配。
2.3.1. 分组策略
根据数据分析需求、用户职能和安全要求,制定适当的用户组策略。 用户组应该基于角色和权限的相关性,将具有类似权限需求的用户划分到相应的用户组中。
2.3.2. 组成员管理
定期审查和更新用户组的成员。 当用户的角色或职责发生变化时,需及时调整其所属的用户组。此外,应制定适当的程序来添加或移除用户组成员,以确保权限的正确分配和撤销。
2.3.3. 用户组权限
通过对用户组分配相应的角色使得用户组获得相关的权限。当把用户分配至用户组时,用户自动获得该用户组所关联的权限。
2.4. 权限(Permissions)
权限定义了可以执行的具体操作或访问数据库资源的能力。 在 RBAC 模型中,权限与角色相关联,通过角色来控制和限制用户对数据库资源的访问。权限可以包括对表、视图、数据库等对象的读取、写入、更新、删除等操作。通过授予角色和用户适当的权限,RBAC 模型确保了对数据库资源的细粒度访问控制。
2.5. 授权(Authorization)
授权是 RBAC 模型的关键步骤,用于将权限与角色或者与用户关联起来,并将相应的角色分配给用户。授权过程通过管理员或授权者来完成,他们根据用户的职责和需求,为用户分配适当的角色和权限。授权过程中需要进行细致的权限分析和授权策略的制定,以确保用户仅获得其所需的最小权限。
三、 涉及的 SQL 语法
3.1. 用户管理
3.1.1. 创建用户
CREATE USER [if not exists] user auth_option [, user auth_option] ...
auth_option: { IDENTIFIED BY 'auth_string'}
3.1.2. 删除用户
DROP USER [IF EXISTS] user [, user] ...
3.1.3. 重命名用户
RENAME USER old_user TO new_user [, old_user TO new_user] ...
3.1.4. 设置用户密码
SET PASSWORD [FOR user] auth_option
auth_option: { = 'auth_string'}
3.1.5. 查询用户信息
SHOW USERS [FOR role_name_or_group_name] [LIKE 'pattern']
3.2. 角色管理
3.2.1. 创建角色
CREATE ROLE [IF NOT EXISTS] role [, role ] ...
3.2.2. 删除角色
DROP ROLE [IF EXISTS] role [, role ] ...
3.2.3. 查询角色信息
SHOW ROLES [FOR username_or_group_name] [LIKE 'pattern']
3.3. 用户组 管理
3.3.1. 创建用户组
CREATE USERGROUP [if not exists] user_group [, user_group ] ..
3.3.2. 删除用户组
DROP USERGROUP [IF EXISTS] user_group [, user_group ] ...
3.3.3. 查询用户组信息
SHOW USERGROUPS [FOR role_name_or_username] [LIKE 'pattern']
3.4. 授权管理
3.4.1. 授予权限
REVOKE [IF EXISTS] priv_type [(column_list)] [, priv_type [(column_list)]] ... ON priv_level FROM user_or_role [, user_or_role] ... [IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] ALL [PRIVILEGES], GRANT OPTION FROM user_or_role [, user_or_role] ... [IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] role [, role ] ... FROM user_or_group [, user_or_group ] ... [IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] user [, user] ... FROM group [, group] ... [IGNORE UNKNOWN USER]
priv_level: { * | *.* | db_name.* | db_name.tbl_name | tbl_name}
user_or_role: { user_name | role_name}
user_or_group:{ user_name | group_name}
3.4.2. 回收权限
REVOKE [IF EXISTS] priv_type [(column_list)] [, priv_type [(column_list)]] ... ON priv_level FROM user_or_role [, user_or_role] ... [IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] ALL [PRIVILEGES], GRANT OPTION FROM user_or_role [, user_or_role] ... [IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] role [, role ] ... FROM user_or_group [, user_or_group ] ... [IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] user [, user] ... FROM group [, group] ... [IGNORE UNKNOWN USER]
priv_level: { * | *.* | db_name.* | db_name.tbl_name | tbl_name}
user_or_role: { user_name | role_name}
user_or_group:{ user_name | group_name}
3.4.3. 展示拥有的权限信息
SHOW GRANTS FOR user_or_role_or_usergroup
总结
通过综合的身份认证与访问控制策略,StoneData 构建了一个安全可靠的数据分析环境。 账号合规、密码策略、主机名校验和基于角色的访问控制模型等模块为用户提供了多重保护层,确保只有授权用户能够访问敏感数据,并以此维护数据分析过程的安全性和完整性。作为 StoneData 的使用者,遵循这些安全最佳实践可以有效保护数据资产,预防潜在的安全威胁。 StoneData 将不断改进和更新安全策略,以持续为用户提供可信赖的数据分析平台。