1. 首页 > 国产数据库教程 > TiDB教程 > 正文

tidb教程FG119-TiDB安全最佳实践生产实战

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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息