fgedu.net.cn
目录
一、基础概念
1.1 安全加固定义
安全加固是指通过一系列措施增强TiDB集群的安全性,防止未授权访问、数据泄露和恶意攻击。TiDB的安全加固涉及多个层面,包括认证、授权、加密、审计等。
1.2 安全威胁
- 未授权访问:未经授权的用户访问数据库
- SQL注入:通过恶意SQL语句攻击数据库
- 数据泄露:敏感数据被窃取或泄露
- 权限滥用:用户滥用权限执行未授权操作
- 网络攻击:通过网络攻击数据库服务
- 内部威胁:内部人员的恶意行为
1.3 安全措施
- 认证:验证用户身份
- 授权:控制用户权限
- 加密:保护数据传输和存储
- 审计:记录用户操作
- 网络安全:保护网络通信
- 漏洞管理:及时修复安全漏洞
二、规划建议
2.1 安全架构规划
- 网络隔离:将TiDB集群部署在专用网络中
- 访问控制:设置严格的访问控制策略
- 加密传输:启用SSL/TLS加密
- 审计日志:配置详细的审计日志
- 定期安全评估:定期进行安全评估和漏洞扫描
2.2 认证与授权规划
- 用户管理:创建最小权限用户
- 密码策略:设置强密码策略
- 角色管理:使用角色进行权限管理
- 权限审计:定期审计用户权限
2.3 加密规划
- 传输加密:启用SSL/TLS加密
- 存储加密:考虑使用存储加密
- 密钥管理:安全管理加密密钥
三、实施方案
3.1 认证与授权
用户管理
# 创建用户
CREATE USER 'app_user'@'%' IDENTIFIED BY 'AppUser123!';
CREATE USER 'readonly'@'%' IDENTIFIED BY 'ReadOnly123!';
CREATE USER 'admin'@'%' IDENTIFIED BY 'Admin123!';
# 授权
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO 'app_user'@'%';
GRANT SELECT ON fgedudb.* TO 'readonly'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
# 查看用户权限
SHOW GRANTS FOR 'app_user'@'%';
SHOW GRANTS FOR 'readonly'@'%';
SHOW GRANTS FOR 'admin'@'%';
+--------------------------------------------------------------------+ | Grants for app_user@% | +--------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `app_user`@`%` | | GRANT SELECT, INSERT, UPDATE, DELETE ON `fgedudb`.* TO `app_user`@`%` | +--------------------------------------------------------------------+ +------------------------------------------------------------------+ | Grants for readonly@% | +------------------------------------------------------------------+风哥提示: | GRANT USAGE ON *.* TO `readonly`@`%` | | GRANT SELECT ON `fgedudb`.* TO `readonly`@`%` | +------------------------------------------------------------------+ +-------------------------------------------------------------+ | Grants for admin@% | +-------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO `admin`@`%` WITH GRANT OPTION | +-------------------------------------------------------------+
角色管理
# 创建角色
CREATE ROLE 'read_role';
CREATE ROLE 'write_role';
CREATE ROLE 'admin_role';
# 为角色授权
GRANT SELECT ON fgedudb.* TO 'read_role';
GRANT INSERT, UPDATE, DELETE ON fgedudb.* TO 'write_role';
GRANT ALL PRIVILEGES ON fgedudb.* TO 'admin_role';
# 为用户分配角色
GRANT 'read_role' TO 'readonly'@'%';
GRANT 'read_role', 'write_role' TO 'app_user'@'%';
GRANT 'admin_role' TO 'admin'@'%';
# 查看角色权限
SHOW GRANTS FOR 'read_role';
SHOW GRANTS FOR 'write_role';
SHOW GRANTS FOR 'admin_role';
+---------------------------------------------+ | Grants for read_role@% | +---------------------------------------------+ | GRANT SELECT ON `fgedudb`.* TO `read_role`@`%` | +---------------------------------------------+ +---------------------------------------------------+ | Grants for write_role@% | +---------------------------------------------------+ | GRANT INSERT, UPDATE, DELETE ON `fgedudb`.* TO `write_role`@`%` | +---------------------------------------------------+ +-----------------------------------------------+ | Grants for admin_role@% | +-----------------------------------------------+ | GRANT ALL PRIVILEGES ON `fgedudb`.* TO `admin_role`@`%` | +-----------------------------------------------+
3.2 加密配置
SSL/TLS配置
# 生成SSL证书
# 使用openssl生成自签名证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tidb-key.pem -out tidb-cert.pem -subj "/CN=tidb-server"
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout client-key.pem -out client-cert.pem -subj "/CN=client"
# 配置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"
# 配置TiKV启用SSL
# 修改tikv.toml
[security]
ssl-enabled = true
ssl-cert = "/tidb/ssl/tidb-cert.pem"
ssl-key = "/tidb/ssl/tidb-key.pem"
ssl-ca = "/tidb/ssl/ca.pem"
# 配置PD启用SSL
# 修改pd.toml
[security]
ssl-enabled = true
ssl-cert = "/tidb/ssl/tidb-cert.pem"
ssl-key = "/tidb/ssl/tidb-key.pem"
ssl-ca = "/tidb/ssl/ca.pem"
# 重启集群
tiup cluster restart tidb-cluster
使用SSL连接
# 使用SSL连接TiDB
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
# 验证SSL连接
mysql> STATUS;
# 输出中应包含:
# SSL: Cipher in use is TLS_AES_256_GCM_SHA384
学习交流加群风哥QQ113257174
3.3 审计配置
启用审计日志
# 修改tidb.toml启用审计日志
[audit]
enable = true
log-file = "/tidb/log/audit.log"
log-rotate = true
log-rotate-size = "100MB"
log-rotate-keep = 7
# 重启TiDB
tiup cluster restart tidb-cluster --node 192.168.1.13:4000,192.168.1.14:4000
# 查看审计日志
cat /tidb/log/audit.log | tail -100
2024-04-09T10:00:00.000Z [INFO] [audit.go:100] [user=root] [host=192.168.1.100] [database=fgedudb] [table=fgedu_users] [command=SELECT] [query=SELECT * FROM fgedu_users WHERE id = 1]
2024-04-09T10:00:01.000Z [INFO] [audit.go:100] [user=app_user] [host=192.168.1.101] [database=fgedudb] [table=fgedu_orders] [command=INSERT] [query=INSERT INTO fgedu_orders (order_no, user_id, amount) VALUES ('ORD123', 1, 100.00)]
2024-04-09T10:00:02.000Z [INFO] [audit.go:100] [user=readonly] [host=192.168.1.102] [database=fgedudb] [table=fgedu_users] [command=SELECT] [query=SELECT COUNT(*) FROM fgedu_users]
3.4 网络安全
防火墙配置
# 配置防火墙,只允许特定IP访问TiDB端口
# 允许应用服务器访问TiDB端口
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 4000 -j ACCEPT
# 允许监控服务器访问监控端口
iptables -A INPUT -s 192.168.1.18 -p tcp --dport 9090 -j ACCEPT
iptables -A INPUT -s 192.168.1.18 -p tcp --dport 3000 -j ACCEPT
# 拒绝其他所有访问
iptables -A INPUT -p tcp --dport 4000 -j DROP
iptables -A INPUT -p tcp --dport 9090 -j DROP
iptables -A INPUT -p tcp --dport 3000 -j DROP
# 保存防火墙规则
iptables-save > /etc/iptables/rules.v4
四、实战案例
4.1 安全加固实施
场景:企业生产环境需要对TiDB集群进行安全加固,防止未授权访问和数据泄露。
步骤1:用户权限审计
# 查看所有用户
SELECT user, host FROM mysql.user;
# 查看用户权限
SELECT user, host, privilege_type FROM mysql.user_privileges;
# 清理不必要的用户
DROP USER IF EXISTS 'test'@'%';
DROP USER IF EXISTS ''@'%';
# 修改root用户访问权限
RENAME USER 'root'@'%' TO 'root'@'192.168.1.%';
+---------------+-----------+ | user | host | +---------------+-----------+ | root | 192.168.1.% | | app_user | % | | readonly | % | | admin | % | +---------------+-----------+
步骤2:启用SSL/TLS
# 生成SSL证书
# 使用cfssl工具生成证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client
# 配置TiDB、TiKV和PD使用SSL
# 修改各组件配置文件
# 重启集群
tiup cluster restart tidb-cluster
# 验证SSL配置
mysql -h 192.168.1.13 -P 4000 -u root -p --ssl-ca=/tidb/ssl/ca.pem --ssl-cert=/tidb/ssl/client.pem --ssl-key=/tidb/ssl/client-key.pem -e "STATUS;"
-------------- mysql Ver 8.0.30 for Linux on x86_64 (MySQL Community Server - GPL) Connection id: 1 Current database: Current user: root@192.168.1.100 SSL: Cipher in use is TLS_AES_256_GCM_SHA384 Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.7.25-TiDB-v7.5.0 TiDB Server (Apache License 2.0) Protocol version: 10 Connection: 192.168.1.13 via TCP/IP Server characterset: utf8mb4 Db characterset: utf8mb4 Client characterset: utf8mb4 Conn. characterset: utf8mb4 TCP port: 4000 Binary data as: Hexadecimal --------------
步骤3:配置审计日志
# 配置审计日志
# 修改tidb.toml
[audit]
enable = true
log-file = "/tidb/log/audit.log"
log-rotate = true
log-rotate-size = "100MB"
log-rotate-keep = 7
# 重启TiDB
tiup cluster restart tidb-cluster --node 192.168.1.13:4000,192.168.1.14:4000
# 测试审计日志
mysql -h 192.168.1.13 -P 4000 -u app_user -p AppUser123! -e "SELECT * FROM fgedudb.fgedu_users WHERE id = 1;"
# 查看审计日志
cat /tidb/log/audit.log | grep "app_user"
2024-04-09T10:30:00.000Z [INFO] [audit.go:100] [user=app_user] [host=192.168.1.100] [database=fgedudb] [table=fgedu_users] [command=SELECT] [query=SELECT * FROM fgedu_users WHERE id = 1]
4.2 安全事件处理
场景:发现可疑的数据库访问行为,需要进行安全事件处理。
步骤1:分析审计日志
# 分析审计日志,查找可疑行为
cat /tidb/log/audit.log | grep "SELECT.*password" | grep -v "app_user"
# 发现可疑登录尝试
cat /tidb/log/audit.log | grep "Access denied" | tail -20
2024-04-09T11:00:00.000Z [INFO] [audit.go:100] [user=root] [host=192.168.2.100] [database=] [table=] [command=Connect] [query=Connect] [status=Access denied for user 'root'@'192.168.2.100'] 2024-04-09T11:00:01.000Z [INFO] [audit.go:100] [user=root] [host=192.168.2.100] [database=] [table=] [command=Connect] [query=Connect] [status=Access denied for user 'root'@'192.168.2.100'] 2024-04-09T11:00:02.000Z [INFO] [audit.go:100] [user=root] [host=192.168.2.100] [database=] [table=] [command=Connect] [query=Connect] [status=Access denied for user 'root'@'192.168.2.100']
步骤2:阻止可疑IP
# 配置防火墙,阻止可疑IP
iptables -A INPUT -s 192.168.2.100 -j DROP
# 保存防火墙规则
iptables-save > /etc/iptables/rules.v4
# 查看防火墙规则
iptables -L -n
Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 192.168.2.100 0.0.0.0/0 ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:4000 ACCEPT tcp -- 192.168.1.18 0.0.0.0/0 tcp dpt:9090 ACCEPT tcp -- 192.168.1.18 0.0.0.0/0 tcp dpt:3000 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:4000 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9090 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3000 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
步骤3:增强安全措施
# 修改root用户密码
ALTER USER 'root'@'192.168.1.%' IDENTIFIED BY 'NewRootPassword123!';
# 限制用户登录失败次数
# 修改tidb.toml
[security]
password-check = true
max-login-attempts = 5
login-retry-wait = 300
# 重启TiDB
tiup cluster restart tidb-cluster --node 192.168.1.13:4000,192.168.1.14:4000
五、经验总结
5.1 安全加固最佳实践
- 最小权限原则:为用户分配最小必要的权限
- 强密码策略:设置复杂的密码规则
- SSL/TLS加密:启用SSL/TLS保护数据传输
- 审计日志:启用详细的审计日志
- 网络隔离:将数据库部署在专用网络中
- 定期安全评估:定期进行安全评估和漏洞扫描
- 及时更新:及时更新TiDB版本,修复安全漏洞
5.2 审计最佳实践
- 启用审计日志:配置详细的审计日志
- 日志轮转:设置合理的日志轮转策略
- 日志存储:将审计日志存储在安全的位置
- 定期分析:定期分析审计日志,发现异常行为
- 告警机制:设置审计日志告警机制
5.3 常见安全问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 未授权访问 | 弱密码、权限配置不当 | 设置强密码,使用最小权限原则 |
| 数据泄露 | 未加密传输、权限滥用 | 启用SSL/TLS,限制用户权限 |
| SQL注入 | 应用程序未使用参数化查询 | 使用预处理语句,避免拼接SQL |
| 网络攻击 | 网络暴露、防火墙配置不当 | 配置防火墙,限制访问IP |
| 内部威胁 | 内部人员恶意行为 | 启用审计日志,定期权限审计 |
5.4 安全检查清单
| 检查项 | 配置要求 | 状态 |
|---|---|---|
| 用户管理 | 使用最小权限原则,删除不必要用户 | □ |
| 密码策略 | 设置强密码策略,定期修改密码 | □ |
| SSL/TLS | 启用SSL/TLS加密 | □ |
| 审计日志 | 启用详细的审计日志 | □ |
| 网络安全 | 配置防火墙,限制访问IP | □ |
| 权限审计 | 定期审计用户权限 | □ |
| 版本更新 | 使用最新稳定版本 | □ |
| 安全评估 | 定期进行安全评估和漏洞扫描 | □ |
更多视频教程www.fgedu.net.cn
© 2024 TiDB数据库培训文档
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
