第1章:用户与身份认证——数据库的第一道门
各位同学,咱们今天聊聊数据库安全里最基础、也最关键的一环——用户与身份认证。说白了,就是搞清楚「谁在用数据库」以及「他到底是不是他本人」。
我做了十几年金融数据库安全,见过太多因为用户管理混乱导致的数据泄露。有一次,某银行的核心系统被入侵,查到最后发现——一个离职员工的账号居然还挂着DBA权限。嗯,这种低级错误,其实完全可以避免。
1.1 数据库用户创建与管理
先说说最基本的:怎么创建用户。不同数据库语法略有差异,但核心逻辑是一样的。
-- MySQL 创建用户
CREATE USER 'fin_user'@'192.168.1.%' IDENTIFIED BY 'StrongP@ss123';
-- Oracle 创建用户
CREATE USER fin_user IDENTIFIED BY "StrongP@ss123"
DEFAULT TABLESPACE users
QUOTA 100M ON users;
-- SQL Server 创建登录名
CREATE LOGIN fin_user WITH PASSWORD = 'StrongP@ss123';
CREATE USER fin_user FOR LOGIN fin_user;
我个人习惯,创建用户时一定要指定来源IP。你想想看,一个只应该在办公网使用的账号,如果允许从任何IP登录,那不是给黑客留后门吗?
每个用户只给够用的权限,登录来源也要严格限制。
1.2 强密码策略——别让密码形同虚设
我在项目中遇到过,某家金融科技公司,所有数据库密码都是「Admin123」。我问他们为什么,回答是「好记」。好家伙,这跟把金库钥匙挂在门口有什么区别?
强密码策略,说白了就是让密码变得「难猜、难破、难记」——难记是对用户说的,不是对系统说的。
| 策略项 | 推荐值 | 说明 |
|---|---|---|
| 最小长度 | 12位以上 | 8位密码在GPU暴力破解下,几小时就完蛋 |
| 字符组合 | 大写+小写+数字+特殊字符 | 至少包含3种以上 |
| 密码有效期 | 90天 | 金融行业建议更短,60天 |
| 历史记录 | 禁止使用最近5次密码 | 防止循环使用 |
| 锁定阈值 | 连续5次失败锁定30分钟 | 防暴力破解 |
-- MySQL 密码策略配置
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
-- 查看当前策略
SHOW VARIABLES LIKE 'validate_password%';
1.3 多因素认证(MFA)——给数据库加把智能锁
光有密码够吗?不够。密码可能被偷、被猜、被钓鱼。MFA就是再加一道验证——你知道的(密码)+ 你拥有的(手机/令牌)+ 你本身的(指纹/人脸)。
金融数据库的MFA,我建议至少做到两层:
- 第一层:传统密码认证
- 第二层:动态令牌(TOTP)或硬件Key
为什么不用短信验证码?嗯,短信有被劫持的风险。金融场景下,我更推荐TOTP或者FIDO2硬件密钥。
-- 以MySQL配合Google Authenticator为例(伪代码)
-- 1. 安装MFA插件
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
-- 2. 创建用户时绑定MFA
CREATE USER 'fin_dba'@'%' IDENTIFIED WITH auth_socket;
-- 3. 实际生产环境建议使用专业MFA中间件
-- 比如:RADIUS + Google Authenticator
1.4 LDAP/AD集成认证——统一管理才是王道
数据库多了怎么办?几十套、上百套数据库,每个都单独管理用户?累死你。LDAP/AD集成,就是让数据库「认」企业的统一身份认证系统。
说白了,员工入职时在AD里创建账号,所有数据库自动就有了。离职时AD账号一禁用,所有数据库访问同时失效。这才是金融级的管理方式。
-- MySQL 集成LDAP配置示例
-- my.cnf 中添加
[mysqld]
plugin-load-add=authentication_ldap_sasl.so
authentication_ldap_sasl_server_host=ldap.example.com
authentication_ldap_sasl_bind_base_dn=dc=example,dc=com
authentication_ldap_sasl_auth_method_name=SIMPLE
-- 创建映射用户
CREATE USER 'ldap_user'@'%' IDENTIFIED WITH authentication_ldap_sasl
BY 'cn=admin,dc=example,dc=com';
- 用户生命周期自动管理(入职/离职/转岗)
- 密码策略统一(不用每个库单独设)
- 审计日志集中(谁在什么时间访问了哪个库)
- 支持SSO单点登录
我在项目中遇到过,某券商把200多套数据库全部接入AD后,用户管理效率提升了80%,而且再也没有出现过「离职员工账号未清理」的安全事件。
知识体系总览
下面这张图,把本章的核心逻辑串起来了。我建议你保存下来,以后做数据库安全方案时可以直接参考。
好了,这一章的内容就到这里。用户与身份认证是数据库安全的地基,地基不稳,上面建得再漂亮也是白搭。下一章我们会聊权限模型——有了用户之后,怎么精细控制他们能干什么、不能干什么。
公众号:蓝海资料掘金营,微信deep3321