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

tidb教程FG131-TiDB安全加固与审计生产实战

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

联系我们

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

微信号:itpux-com

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