fgedu.net.cn
目录
一、基础概念
1.1 数据库安全定义
数据库安全是指保护数据库免受未经授权的访问、使用、披露、修改或破坏的措施。TiDB作为分布式数据库,其安全体系包括认证、授权、加密、审计和合规等多个方面。
1.2 安全威胁类型
- 未授权访问:未经许可的用户访问数据库
- 数据泄露:敏感数据被窃取或暴露
- SQL注入:恶意SQL语句被执行
- 权限提升:用户获取超出其权限范围的访问能力
- 拒绝服务攻击:数据库服务被恶意请求占用
- 数据篡改:未经授权修改数据库中的数据
1.3 TiDB安全特性
- 认证机制:支持密码认证、LDAP认证和证书认证
- 授权系统:基于角色的访问控制(RBAC)
- 加密功能:支持传输加密和存储加密
- 审计日志:记录数据库操作行为
- 安全加固:提供多种安全配置选项
二、规划建议
2.1 安全架构规划
- 网络隔离:将数据库部署在专用网络中,限制访问
- 分层防护:采用防火墙、入侵检测等多层防护措施
- 最小权限原则:只授予用户必要的权限
- 定期安全评估:定期进行安全审计和漏洞扫描
- 灾难恢复计划:制定安全事件响应和恢复计划
2.2 认证与授权规划
- 用户管理:建立统一的用户管理机制
- 密码策略:设置强密码要求和定期更换机制
- 角色设计:基于业务需求设计合理的角色体系
- 权限审计:定期检查用户权限,及时回收不必要的权限
2.3 加密策略规划
- 传输加密:启用TLS/SSL加密传输
- 存储加密:对敏感数据进行存储加密
- 密钥管理:建立安全的密钥管理机制
- 加密算法:选择合适的加密算法和密钥长度
三、实施方案
3.1 认证与授权配置
创建用户
CREATE USER 'admin'@'%' IDENTIFIED BY 'Admin123!@#';
创建角色
CREATE ROLE 'read_only';
授予权限
-- 授予角色权限
GRANT SELECT ON fgedudb.* TO 'read_only';
-- 授予用户角色
GRANT 'read_only' TO 'admin'@'%';
-- 激活角色
SET DEFAULT ROLE 'read_only' FOR 'admin'@'%';
权限管理
-- 查看用户权限
SHOW GRANTS FOR 'admin'@'%';风哥提示:
-- 回收权限
REVOKE SELECT ON fgedudb.* FROM 'read_only';
-- 删除用户
DROP USER 'admin'@'%';
3.2 加密配置
配置TLS/SSL
-- 生成证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tidb-key.pem -out tidb-cert.pem -subj "/CN=tidb-server"
Generating a RSA private key ................+++++ ................+++++ writing new private key to 'tidb-key.pem' -----
配置TiDB启用SSL
-- 修改tidb.toml配置文件
[security]
ssl-enabled = true
ssl-ca = "/tidb/ssl/ca.pem"
ssl-cert = "/tidb/ssl/tidb-cert.pem"
ssl-key = "/tidb/ssl/tidb-key.pem"
测试SSL连接
mysql -h 192.168.1.13 -P 4000 -u root -p --ssl-ca=/tidb/ssl/ca.pem --ssl-cert=/tidb/ssl/client-cert.pem --ssl-key=/tidb/ssl/client-key.pem
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12345 Server version: 5.7.25-TiDB-v7.5.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible Copyright (c) 2000, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
3.3 审计配置
启用审计日志
-- 修改tidb.toml配置文件
[auditor]
enable = true
output = "file"
file = "/tidb/log/audit.log"
format = "json"
ignore-list = ["SELECT\s+1", "SHOW\s+.*"]
查看审计日志
tail -f /tidb/log/audit.log
{"time":"2024-04-09T10:00:00Z","type":"general","level":"info","message":"User admin@192.168.1.10:54321 executed statement: SELECT * FROM fgedudb.fgedu_users WHERE id = 1","result":"success","affected_rows":1,"duration":0.123}
3.4 安全加固
禁用不必要的功能
-- 修改tidb.toml配置文件
[server]
skip-grant-tables = false
skip-name-resolve = true
设置密码策略
-- 设置密码复杂度要求
SET GLOBAL validate_password_policy = 'STRONG';
SET GLOBAL validate_password_length = 8;
SET GLOBAL validate_password_mixed_case_count = 1;
SET GLOBAL validate_password_number_count = 1;
SET GLOBAL validate_password_special_char_count = 1;
限制用户连接
-- 设置最大连接数
SET GLOBAL max_connections = 1000;
-- 设置连接超时
SET GLOBAL wait_timeout = 3600;
SET GLOBAL interactive_timeout = 3600;
四、实战案例
4.1 企业级安全配置案例
学习交流加群风哥QQ113257174
场景:大型企业生产环境,需要配置严格的安全措施保护敏感数据。
步骤1:创建安全的用户体系
-- 创建管理员用户
CREATE USER 'admin'@'%' IDENTIFIED BY 'Admin123!@#';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
-- 创建只读用户
CREATE USER 'readonly'@'%' IDENTIFIED BY 'Readonly123!@#';
GRANT SELECT ON fgedudb.* TO 'readonly'@'%';
-- 创建应用用户
CREATE USER 'app'@'%' IDENTIFIED BY 'App123!@#';
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO 'app'@'%';
步骤2:配置SSL加密
-- 生成CA证书
openssl genrsa -out ca-key.pem 2048
openssl req -new -x509 -days 365 -key ca-key.pem -out ca.pem -subj "/CN=TiDB-CA"
-- 生成TiDB服务器证书
openssl req -newkey rsa:2048 -nodes -keyout tidb-key.pem -out tidb-csr.pem -subj "/CN=tidb-server"
openssl x509 -req -days 365 -in tidb-csr.pem -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out tidb-cert.pem
-- 生成客户端证书
openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client-csr.pem -subj "/CN=client"
openssl x509 -req -days 365 -in client-csr.pem -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem
步骤3:配置TiDB使用SSL
-- 修改tidb.toml配置文件
[security]
ssl-enabled = true
ssl-ca = "/tidb/ssl/ca.pem"
ssl-cert = "/tidb/ssl/tidb-cert.pem"
ssl-key = "/tidb/ssl/tidb-key.pem"
require-ssl = true
步骤4:配置审计日志
-- 修改tidb.toml配置文件
[auditor]
enable = true
output = "file"
file = "/tidb/log/audit.log"
format = "json"
ignore-list = ["SELECT\s+1", "SHOW\s+.*"]
步骤5:安全测试
-- 测试非SSL连接(应该失败)
mysql -h 192.168.1.13 -P 4000 -u app -p
ERROR 2026 (HY000): SSL connection error: SSL is required but not supported
-- 测试SSL连接(应该成功)
mysql -h 192.168.1.13 -P 4000 -u app -p --ssl-ca=/tidb/ssl/ca.pem --ssl-cert=/tidb/ssl/client-cert.pem --ssl-key=/tidb/ssl/client-key.pem
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12345 Server version: 5.7.25-TiDB-v7.5.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible mysql>
4.2 数据脱敏与访问控制案例
场景:金融行业应用,需要对敏感数据进行脱敏处理并严格控制访问权限。
步骤1:创建敏感数据表
CREATE TABLE fgedudb.fgedu_customers (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
id_card VARCHAR(18) NOT NULL,
phone VARCHAR(11) NOT NULL,
bank_card VARCHAR(19) NOT NULL,
address VARCHAR(200) NOT NULL
);
步骤2:创建视图进行数据脱敏
CREATE VIEW fgedudb.fgedu_customers_view AS
SELECT
id,
name,
CONCAT(SUBSTRING(id_card, 1, 3), '***********', SUBSTRING(id_card, 15)) AS id_card,
CONCAT(SUBSTRING(phone, 1, 3), '****', SUBSTRING(phone, 8)) AS phone,
CONCAT(SUBSTRING(bank_card, 1, 4), ' **** **** ', SUBSTRING(bank_card, 13)) AS bank_card,
address
FROM fgedudb.fgedu_customers;
步骤3:配置访问权限
-- 创建普通员工角色
CREATE ROLE 'employee';
GRANT SELECT ON fgedudb.fgedu_customers_view TO 'employee';
-- 创建管理员角色
CREATE ROLE 'manager';
GRANT SELECT ON fgedudb.fgedu_customers TO 'manager';
-- 创建用户并分配角色
CREATE USER 'emp1'@'%' IDENTIFIED BY 'Emp123!@#';
GRANT 'employee' TO 'emp1'@'%';
CREATE USER 'mgr1'@'%' IDENTIFIED BY 'Mgr123!@#';
GRANT 'manager' TO 'mgr1'@'%';
步骤4:测试数据访问
-- 普通员工访问(看到脱敏数据)
mysql -h 192.168.1.13 -P 4000 -u emp1 -p -e "SELECT * FROM fgedudb.fgedu_customers_view LIMIT 1"
+----+------+-------------+-------------+-------------------------+---------+ | id | name | id_card | phone | bank_card | address | +----+------+-------------+-------------+-------------------------+---------+ | 1 | 张三 | 110***********1234 | 138****5678 | 6222 **** **** 3456 | 北京市 | +----+------+-------------+-------------+-------------------------+---------+
-- 管理员访问(看到完整数据)
mysql -h 192.168.1.13 -P 4000 -u mgr1 -p -e "SELECT * FROM fgedudb.fgedu_customers LIMIT 1"
+----+------+------------------+-------------+-------------------+---------+ | id | name | id_card | phone | bank_card | address | +----+------+------------------+-------------+-------------------+---------+ | 1 | 张三 | 110101199001011234 | 13812345678 | 622202123456783456 | 北京市 | +----+------+------------------+-------------+-------------------+---------+
五、经验总结
5.1 安全最佳实践
- 采用最小权限原则:只授予用户必要的权限
- 启用多因素认证:提高认证安全性
- 定期更换密码:设置合理的密码过期时间
- 加密敏感数据:对敏感数据进行传输和存储加密
- 启用审计日志:记录所有数据库操作
- 定期安全审计:检查权限配置和安全设置
- 及时更新补丁:保持TiDB版本的安全性
- 备份安全策略:确保备份数据的安全性
5.2 安全配置检查清单
| 检查项 | 配置要求 | 状态 |
|---|---|---|
| 用户认证 | 启用密码复杂度检查,设置合理的密码策略 | □ |
| 权限管理 | 采用RBAC模型,定期检查权限 | □ |
| 传输加密 | 启用TLS/SSL加密 | □ |
| 存储加密 | 对敏感数据进行加密存储 | □ |
| 审计日志 | 启用并配置审计日志 | □ |
| 网络安全 | 配置防火墙,限制访问IP | □ |
| 漏洞管理 | 定期进行漏洞扫描 | □ |
| 备份安全 | 加密备份数据,设置访问控制 | □ |
5.3 常见安全问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 弱密码 | 用户密码强度不足 | 启用密码复杂度检查,强制定期更换密码 |
| 权限过大 | 用户拥有超出其职责的权限 | 采用最小权限原则,定期检查并回收不必要的权限 |
| 未加密传输 | 数据传输过程中未加密 | 启用TLS/SSL加密 |
| 审计日志未启用 | 无法追踪数据库操作 | 启用审计日志,配置合理的日志级别 |
| SQL注入 | 应用程序未使用参数化查询 | 使用参数化查询,避免直接拼接SQL语句 |
5.4 安全事件响应
- 建立安全事件响应团队:明确团队成员和职责
- 制定响应预案:包括检测、分析、 containment、消除和恢复等步骤
- 定期演练:定期进行安全事件响应演练
- 及时报告:按照规定流程报告安全事件
- 持续改进:根据安全事件总结经验教训,改进安全措施
更多视频教程www.fgedu.net.cn
© 2024 TiDB数据库培训文档
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
