本文档详细介绍TiDB安全最佳实践,包括身份认证、授权、数据加密、审计等内容。风哥教程参考TiDB官方文档安全指南、行业安全标准等内容,适合DBA和安全人员进行TiDB集群安全配置和管理。
Part01-基础概念与理论知识
1.1 安全概述
TiDB安全是指保护TiDB集群免受未授权访问、数据泄露、篡改等安全威胁的措施。安全是数据库运维的重要组成部分,需要从多个层面进行防护。
- 网络安全:网络访问控制、加密传输
- 身份认证:用户身份验证
- 授权管理:权限控制
- 数据安全:数据加密、备份安全
- 审计日志:操作审计、行为监控
- 系统安全:操作系统安全、补丁管理
1.2 安全威胁
TiDB可能面临的安全威胁包括:未授权访问、SQL注入、数据泄露、DDoS攻击、内部威胁等。了解这些威胁有助于制定相应的防护措施。
# 1. 外部威胁
# – 未授权访问:攻击者尝试通过猜测密码或利用漏洞访问系统
# – SQL注入:攻击者通过恶意SQL语句获取或篡改数据
# – DDoS攻击:攻击者通过大量请求使系统不可用
# – 数据窃取:攻击者通过网络嗅探或其他手段窃取数据
# – 恶意软件:病毒、木马等恶意软件感染系统
# 2. 内部威胁
# – 权限滥用:内部人员使用过高权限进行未授权操作
# – 数据泄露:内部人员有意或无意泄露数据
# – 配置错误:安全配置不当导致的安全漏洞
# – 操作失误:误操作导致的数据损坏或泄露
# 3. 系统威胁
# – 软件漏洞:TiDB或依赖组件的安全漏洞
# – 硬件故障:硬件故障导致的数据丢失
# – 自然灾害:火灾、洪水等自然灾害导致的系统损坏
# – 电力故障:电力中断导致的系统不可用
# 4. 合规威胁
# – 数据隐私法规:如GDPR、CCPA等法规要求
# – 行业合规:如金融行业的PCI DSS、医疗行业的HIPAA等风哥提示:
# – 内部政策:企业内部安全政策要求
# 5. 供应链威胁
# – 第三方组件漏洞:依赖的第三方组件存在安全漏洞
# – 供应链攻击:攻击者通过供应链注入恶意代码
# – 依赖包安全:依赖包的安全问题
1.3 安全原则
TiDB安全遵循以下原则:最小权限原则、 defense in depth(深度防御)、安全审计、定期评估、持续改进等。
Part02-生产环境规划与建议
2.1 安全架构设计
# 1. 网络架构
# – 网络分区:将TiDB集群部署在独立的网络分区
# – 防火墙:配置防火墙规则,限制网络访问
# – VPC:使用虚拟私有云,隔离网络环境
# – VPN:使用虚拟专用网络,确保远程访问安全
# 2. 访问控制
# – 网络访问控制:使用防火墙、安全组等限制网络访问
# – 主机访问控制:使用SSH密钥、sudo等限制主机访问
# – 数据库访问控制:使用用户权限、IP白名单等限制数据库访问
# 3. 加密策略
# – 传输加密:使用TLS/SSL加密网络传输
# – 存储加密:使用磁盘加密、TiKV加密等保护数据存储
# – 备份加密:对备份数据进行加密
# – 密钥管理:安全管理加密密钥
# 4. 认证授权
# – 身份认证:使用强密码、多因素认证等
# – 授权管理:基于角色的访问控制(RBAC)
# – 权限最小化:只授予必要的权限
# – 定期权限审查:定期审查用户权限
# 5. 审计监控
# – 操作审计:记录所有数据库操作
# – 行为监控:监控异常行为
# – 日志管理:集中管理日志,确保日志安全
# – 告警机制:设置安全相关告警
# 6. 灾备方案
# – 数据备份:定期备份数据
# – 异地灾备:建立异地灾备集群
# – 恢复演练:定期进行恢复演练
# – 业务连续性:确保业务连续运行
# 7. 安全合规
# – 合规评估:定期进行合规评估
# – 安全认证:获取相关安全认证
# – 政策制定:制定安全政策和流程
# – 培训教育:对运维人员进行安全培训
2.2 安全控制措施
# 1. 物理安全
# – 数据中心安全:物理访问控制
# – 服务器安全:服务器物理安全
# – 网络设备安全:网络设备物理安全
# 2. 网络安全
# – 防火墙:配置防火墙规则
# – 入侵检测:部署入侵检测系统(IDS)
# – 入侵防御:部署入侵防御系统(IPS)
# – 网络隔离:使用VLAN、子网等隔离网络
# 3. 系统安全
# – 操作系统加固:关闭不必要的服务,配置安全参数
# – 补丁管理:及时更新系统补丁
# – 防病毒:安装防病毒软件
# – 安全配置:按照安全基线配置系统
# 4. 数据库安全
# – 访问控制:配置用户权限,限制访问
# – 密码策略:设置强密码策略
# – 审计日志:启用审计日志
# – 加密传输:启用TLS/SSL
# 5. 应用安全
# – 代码安全:进行代码安全审计
# – 输入验证:对用户输入进行验证
# – 安全编码:遵循安全编码规范
# – 漏洞扫描:定期进行漏洞扫描
# 6. 数据安全
# – 数据分类:对数据进行分类管理
# – 数据加密:对敏感数据进行加密
# – 数据备份:定期备份数据
# – 数据销毁:安全销毁不需要的数据
# 7. 管理安全
# – 安全策略:制定安全策略
# – 安全培训:对员工进行安全培训
# – 安全审计:定期进行安全审计
# – 事件响应:建立安全事件响应流程
# 8. 应急响应
# – 应急计划:制定应急响应计划
# – 应急团队:组建应急响应团队学习交流加群风哥QQ113257174
# – 应急演练:定期进行应急演练
# – 恢复流程:建立系统恢复流程
2.3 合规性要求
# 1. 数据隐私法规
# – GDPR(通用数据保护条例):欧盟数据隐私法规
# – CCPA(加州消费者隐私法案):美国加州数据隐私法规
# – 个人信息保护法:中国个人信息保护法规
# – 其他国家/地区的数据隐私法规
# 2. 行业合规标准
# – PCI DSS(支付卡行业数据安全标准):金融行业
# – HIPAA(健康保险可携性和责任法案):医疗行业
# – SOX(萨班斯-奥克斯利法案):上市公司
# – ISO 27001:信息安全管理体系标准
# – NIST Cybersecurity Framework:美国国家标准与技术研究院网络安全框架
# 3. 内部合规要求
# – 企业安全政策:企业内部安全政策
# – 数据分类标准:企业内部数据分类标准
# – 安全操作流程:企业内部安全操作流程
# – 审计要求:企业内部审计要求
# 4. 合规性评估
# – 定期评估:定期进行合规性评估
# – 差距分析:分析合规差距
# – 整改措施:制定整改措施
# – 文档记录:记录合规性评估结果
# 5. 合规性认证
# – ISO 27001认证:信息安全管理体系认证
# – SOC 2认证:服务组织控制认证
# – PCI DSS认证:支付卡行业数据安全认证
# – 其他行业认证
# 6. 数据本地化要求
# – 数据存储位置:数据必须存储在特定地区
# – 数据传输限制:数据传输必须符合法规要求
# – 数据处理要求:数据处理必须符合法规要求
# 7. 数据跨境传输
# – 数据跨境传输合规:确保数据跨境传输合规
# – 数据传输协议:签订数据传输协议
# – 数据安全保障:确保数据传输安全
# 8. 合规性监控
# – 合规性监控:持续监控合规状态
# – 合规性报告:定期生成合规性报告
# – 合规性更新:及时更新合规要求
# – 合规性培训:对员工进行合规性培训
itpux-com
Part03-生产环境项目实施方案
3.1 身份认证与授权
3.1.1 用户管理
# 1. 创建用户
# 创建管理员用户
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
CREATE USER ‘admin’@’%’ IDENTIFIED BY ‘Admin123!’;
GRANT ALL PRIVILEGES ON *.* TO ‘admin’@’%’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
”
# 创建应用用户
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
CREATE USER ‘app’@’%’ IDENTIFIED BY ‘App123!’;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO ‘app’@’%’;
FLUSH PRIVILEGES;
”
# 创建只读用户
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
CREATE USER ‘readonly’@’%’ IDENTIFIED BY ‘Readonly123!’;
GRANT SELECT ON fgedudb.* TO ‘readonly’@’%’;
FLUSH PRIVILEGES;
”
# 2. 密码策略
# 设置密码复杂度要求
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
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;
”
# 3. 角色管理
# 创建角色
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
CREATE ROLE ‘role_dev’;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO ‘role_dev’;
CREATE ROLE ‘role_readonly’;
GRANT SELECT ON fgedudb.* TO ‘role_readonly’;
FLUSH PRIVILEGES;
”
# 授予角色给用户
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
GRANT ‘role_dev’ TO ‘app’@’%’;
GRANT ‘role_readonly’ TO ‘readonly’@’%’;
FLUSH PRIVILEGES;
”
# 4. 权限管理
# 查看用户权限
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
SHOW GRANTS FOR ‘app’@’%’;
SHOW GRANTS FOR ‘readonly’@’%’;
”
# 撤销权限
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
REVOKE DELETE ON fgedudb.* FROM ‘app’@’%’;
FLUSH PRIVILEGES;
”
# 5. 用户审计
# 查看用户登录历史
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
SELECT * FROM information_schema.user_statistics;
”
# 6. 禁用匿名用户
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
DELETE FROM mysql.user WHERE User=”;
FLUSH PRIVILEGES;
”
# 7. 限制root用户访问
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
CREATE USER ‘root’@’192.168.1.%’ IDENTIFIED BY ‘Root123!’;
GRANT ALL PRIVILEGES ON *.* TO ‘root’@’192.168.1.%’ WITH GRANT OPTION;
DELETE FROM mysql.user WHERE User=’root’ AND Host!=’192.168.1.%’;
FLUSH PRIVILEGES;
”
# 8. 定期清理过期用户
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
DROP USER IF EXISTS ‘old_user’@’%’;
FLUSH PRIVILEGES;
”
# 9. 密码过期策略
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p’root123′ -e ”
ALTER USER ‘app’@’%’ PASSWORD EXPIRE INTERVAL 90 DAY;
FLUSH PRIVILEGES;
”
# 10. 测试用户权限
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u app -p’App123!’ -e ”
— 测试SELECT权限
SELECT * FROM fgedudb.fgedu_users LIMIT 10;
— 测试INSERT权限
INSERT INTO fgedudb.fgedu_users (username, email) VALUES (‘test’, ‘test@fgedu.net.cn’);
— 测试DELETE权限(应该失败)
DELETE FROM fgedudb.fgedu_users WHERE username = ‘test’;
”
# 输出示例
# SELECT成功
# INSERT成功
# DELETE失败:ERROR 1142 (42000): DELETE command denied to user ‘app’@’%’ for table ‘fgedu_users’
3.1.2 访问控制
# 1. IP白名单
# 配置TiDB IP白名单
[root@fgedu.net.cn ~]# cat > /tidb/deploy/tidb-192.168.1.13/conf/tidb.toml << EOF [security] # 允许的客户端IP地址 #
格式:逗号分隔的IP地址或CIDR allowed-ips=["192.168.1.0/24", "10.0.0.0/8" ] EOF # 重启TiDB [root@fgedu.net.cn ~]# tiup
cluster restart fgedudb -R tidb # 2. 网络访问控制 # 配置防火墙规则 [root@fgedu.net.cn ~]# firewall-cmd --permanent
--add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="4000" accept'
[root@fgedu.net.cn ~]# firewall-cmd --permanent
--add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="2379" accept'
[root@fgedu.net.cn ~]# firewall-cmd --permanent
--add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="20160" accept'
[root@fgedu.net.cn ~]# firewall-cmd --reload # 3. SSH访问控制 # 配置SSH密钥登录 [root@fgedu.net.cn ~]# ssh-keygen
-t rsa -b 4096 -f ~/.ssh/id_rsa [root@fgedu.net.cn ~]# ssh-copy-id tidb@192.168.1.13 # 禁用密码登录
[root@fgedu.net.cn ~]# sudo vi /etc/ssh/sshd_config # 修改以下配置 # PasswordAuthentication no #
ChallengeResponseAuthentication no # UsePAM no [root@fgedu.net.cn ~]# sudo systemctl restart sshd # 4.
数据库连接控制 # 限制最大连接数 [root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p'root123' -e "
SET GLOBAL max_connections = 1000;
SET GLOBAL max_user_connections = 100;
" # 5. 应用连接安全 # 使用连接池 # 配置连接超时 # 定期轮换连接密码 # 6. 第三方工具访问控制 # 限制备份工具访问 # 限制监控工具访问 # 限制管理工具访问 # 7. 云服务访问控制 # 使用IAM角色 #
配置安全组 # 使用VPC端点 # 8. 访问审计 # 启用连接审计 # 记录访问日志 # 监控异常访问 # 9. 测试访问控制 # 从允许的IP访问 [root@fgedu.net.cn ~]# mysql
-h192.168.1.13 -P4000 -u app -p'App123!' -e "SELECT 1;" # 从禁止的IP访问(应该失败) # 从10.0.0.1访问 # mysql
-h192.168.1.13 -P4000 -u app -p'App123!' -e "SELECT 1;" # 应该返回:ERROR 1129 (HY000): Host '10.0.0.1' is
blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' # 10. 访问控制最佳实践 # 最小权限原则
# 定期审查访问权限 # 及时撤销不必要的权限 # 使用角色管理权限 # 实施多因素认证
3.2 数据加密
3.2.1 传输加密
# 1. 生成SSL证书
# 创建证书目录
[root@fgedu.net.cn ~]# mkdir -p /tidb/ssl
[root@fgedu.net.cn ~]# cd /tidb/ssl
# 生成CA证书
[root@fgedu.net.cn ssl]# openssl genrsa -out ca-key.pem 4096
[root@fgedu.net.cn ssl]# openssl req -new -x509 -days 3650 -key ca-key.pem -out ca.pem -subj
“/CN=TiDB CA”
# 生成TiDB服务器证书
[root@fgedu.net.cn ssl]# openssl genrsa -out tidb-key.pem 4096
[root@fgedu.net.cn ssl]# openssl req -new -key tidb-key.pem -out tidb.csr -subj “/CN=tidb” -addext
“subjectAltName = DNS:tidb,IP:192.168.1.13,IP:192.168.1.14”
[root@fgedu.net.cn ssl]# openssl x509 -req -days 3650 -in tidb.csr -CA ca.pem -CAkey ca-key.pem
-CAcreateserial -out tidb.pem
# 生成客户端证书
[root@fgedu.net.cn ssl]# openssl genrsa -out client-key.pem 4096
[root@fgedu.net.cn ssl]# openssl req -new -key client-key.pem -out client.csr -subj “/CN=client”
[root@fgedu.net.cn ssl]# openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca-key.pem
-CAcreateserial -out client.pem
# 设置权限
[root@fgedu.net.cn ssl]# chmod 600 *.pem
# 2. 配置TiDB传输加密
# 编辑tidb.toml
[root@fgedu.net.cn ~]# cat > /tidb/deploy/tidb-192.168.1.13/conf/tidb.toml << EOF [security] # 启用SSL
ssl-enabled=true # CA证书路径 ssl-ca="/tidb/ssl/ca.pem" # 服务器证书路径 ssl-cert="/tidb/ssl/tidb.pem" #
服务器私钥路径 ssl-key="/tidb/ssl/tidb-key.pem" # 要求客户端提供证书 require-secure-transport=true EOF # 重启TiDB
[root@fgedu.net.cn ~]# tiup cluster restart fgedudb -R tidb # 3. 配置PD传输加密 # 编辑pd.toml
[root@fgedu.net.cn ~]# cat> /tidb/deploy/pd-192.168.1.10/conf/pd.toml << EOF [security] # 启用SSL
ssl-enabled=true # CA证书路径 ssl-ca="/tidb/ssl/ca.pem" # 服务器证书路径 ssl-cert="/tidb/ssl/tidb.pem"
# 服务器私钥路径 ssl-key="/tidb/ssl/tidb-key.pem" EOF # 重启PD [root@fgedu.net.cn ~]# tiup cluster
restart fgedudb -R pd # 4. 配置TiKV传输加密 # 编辑tikv.toml [root@fgedu.net.cn ~]# cat>
/tidb/deploy/tikv-192.168.1.10/conf/tikv.toml << EOF [security] # 启用SSL ssl-enabled=true #
CA证书路径 ssl-ca="/tidb/ssl/ca.pem" # 服务器证书路径 ssl-cert="/tidb/ssl/tidb.pem" # 服务器私钥路径
ssl-key="/tidb/ssl/tidb-key.pem" EOF # 重启TiKV [root@fgedu.net.cn ~]# tiup cluster
restart fgedudb -R tikv # 5. 测试SSL连接 # 使用SSL连接TiDB [root@fgedu.net.cn ~]# mysql
-h192.168.1.13 -P4000 -u root -p'root123' \ --ssl-ca=/tidb/ssl/ca.pem \
--ssl-cert=/tidb/ssl/client.pem \ --ssl-key=/tidb/ssl/client-key.pem \
-e "SELECT @@ssl_cipher;" # 输出示例 # +-----------------------------+ # | @@ssl_cipher | #
+-----------------------------+ # | TLS_AES_256_GCM_SHA384 | #
+-----------------------------+ # 测试非SSL连接(应该失败) [root@fgedu.net.cn ~]# mysql
-h192.168.1.13 -P4000 -u root -p'root123' --ssl-mode=DISABLED -e "SELECT 1;" # 输出示例 #
ERROR 1045 (28000): Access denied for user 'root' @'192.168.1.10' (using password: YES)
# 6. 应用连接配置 # JDBC连接配置 #
jdbc:mysql://192.168.1.13:4000/fgedudb?useSSL=true&requireSSL=true&verifyServerCertificate=true&sslCA=/path/to/ca.pem&sslCert=/path/to/client.pem&sslKey=/path/to/client-key.pem
# MySQL客户端配置 # [client] # ssl-ca=/tidb/ssl/ca.pem # ssl-cert=/tidb/ssl/client.pem #
ssl-key=/tidb/ssl/client-key.pem # 7. 证书管理 # 定期轮换证书 # 监控证书过期时间 # 建立证书管理流程 # 8. 传输加密最佳实践
# 使用强加密算法 # 定期轮换证书 # 启用证书验证 # 限制SSL版本 # 配置安全的密码套件
3.2.2 存储加密
# 1. TiKV加密
# 编辑tikv.toml
[root@fgedu.net.cn ~]# cat > /tidb/deploy/tikv-192.168.1.10/conf/tikv.toml << EOF
[security] # 启用数据加密 data-encryption-enabled=true # 加密密钥路径
data-encryption-key-path="/tidb/keys/encryption.key" EOF # 创建密钥文件
[root@fgedu.net.cn ~]# mkdir -p /tidb/keys [root@fgedu.net.cn ~]# openssl rand
-hex 32> /tidb/keys/encryption.key
[root@fgedu.net.cn ~]# chmod 600 /tidb/keys/encryption.key
# 重启TiKV
[root@fgedu.net.cn ~]# tiup cluster restart fgedudb -R tikv
# 2. 磁盘加密
# 使用LUKS加密磁盘
[root@fgedu.net.cn ~]# sudo cryptsetup luksFormat /dev/sdb
[root@fgedu.net.cn ~]# sudo cryptsetup open /dev/sdb tidb-data
[root@fgedu.net.cn ~]# sudo mkfs.ext4 /dev/mapper/tidb-data
[root@fgedu.net.cn ~]# sudo mount /dev/mapper/tidb-data /tidb/data
# 配置自动挂载
[root@fgedu.net.cn ~]# sudo vi /etc/crypttab
# 添加以下行
# tidb-data /dev/sdb none luks
[root@fgedu.net.cn ~]# sudo vi /etc/fstab
# 添加以下行
# /dev/mapper/tidb-data /tidb/data ext4 defaults 0 2
# 3. 备份加密
# 使用BR工具备份加密
[root@fgedu.net.cn ~]# tiup br backup full –pd “192.168.1.10:2379” \
–storage “s3://tidb-backup/fgedudb/full/20240409” \
–s3.endpoint “s3.amazonaws.com” \
–s3.access-key “AKI…” \
–s3.secret-access-key “SK…” \
–encrypt
# 4. 密钥管理
# 使用密钥管理服务(KMS)
# 定期轮换密钥
# 备份密钥
# 建立密钥管理流程
# 5. 加密性能影响
# 测试加密前后性能
# 优化加密配置
# 选择合适的加密算法
# 6. 存储加密最佳实践
# 结合传输加密
# 定期备份密钥
# 实施密钥轮换
# 监控加密状态
# 建立加密审计
# 7. 验证存储加密
# 检查TiKV加密状态
[root@fgedu.net.cn ~]# curl http://192.168.1.10:20180/status | jq
‘.security.encryption_enabled’
# 检查磁盘加密状态
[root@fgedu.net.cn ~]# sudo cryptsetup status tidb-data
# 8. 数据销毁
# 安全删除数据
[root@fgedu.net.cn ~]# sudo shred -vzn 3 /dev/sdb
# 销毁加密密钥
[root@fgedu.net.cn ~]# shred -vzn 3 /tidb/keys/encryption.key
rm -f /tidb/keys/encryption.key
# 9. 加密合规性
# 符合GDPR要求
# 符合PCI DSS要求
# 符合其他法规要求
# 10. 存储加密注意事项
# 密钥安全管理
# 性能影响评估
# 备份恢复测试
# 灾难恢复计划
3.3 审计与日志
3.3.1 审计配置
# 1. 启用TiDB审计
# 编辑tidb.toml
[root@fgedu.net.cn ~]# cat > /tidb/deploy/tidb-192.168.1.13/conf/tidb.toml << EOF
[audit] # 启用审计 enabled=true # 审计日志路径 log="/tidb/log/audit.log" # 审计级别:off,
error, warn, info, debug level="info" # 审计事件类型:all, ddl, dml, admin, login
events=["all"] # 审计格式:json, text format="json" EOF # 重启TiDB [root@fgedu.net.cn
~]# tiup cluster restart fgedudb -R tidb # 2. 配置审计日志轮转 # 创建日志轮转配置
[root@fgedu.net.cn ~]# sudo vi /etc/logrotate.d/tidb-audit # 添加以下内容
/tidb/log/audit.log { daily rotate 30 compress delaycompress missingok
notifempty create 640 tidb tidb postrotate systemctl reload tidb.service
endscript } # 测试日志轮转 [root@fgedu.net.cn ~]# sudo logrotate -f
/etc/logrotate.d/tidb-audit # 3. 审计日志内容 # 查看审计日志 [root@fgedu.net.cn ~]# tail -f
/tidb/log/audit.log # 示例审计日志 # { # "time" : "2024-04-09T10:00:00Z" , # "type"
: "login" , # "user" : "root" , # "host" : "192.168.1.10" , # "ip"
: "192.168.1.10" , # "port" : 50000, # "result" : "success" , # "sql" : "" ,
# "duration" : 10 # } # { # "time" : "2024-04-09T10:00:01Z" , # "type" : "dml" ,
# "user" : "app" , # "host" : "192.168.1.10" , # "ip" : "192.168.1.10" ,
# "port" : 50001, # "database" : "fgedudb" , # "table" : "fgedu_users" ,
# "result" : "success" , # "sql"
: "INSERT INTO fgedu_users (username, email) VALUES ('test', 'test@fgedu.net.cn')"
, # "duration" : 100 # } # 4. 集中日志管理 # 配置rsyslog [root@fgedu.net.cn ~]# sudo vi
/etc/rsyslog.d/tidb-audit.conf # 添加以下内容 local6.* /tidb/log/audit.log # 重启rsyslog
[root@fgedu.net.cn ~]# sudo systemctl restart rsyslog # 配置TiDB使用syslog
[root@fgedu.net.cn ~]# cat> /tidb/deploy/tidb-192.168.1.13/conf/tidb.toml << EOF
[audit] enabled=true log="syslog" syslog-facility="local6" level="info"
events=["all"] format="json" EOF # 5. 审计日志分析 # 使用ELK stack分析审计日志 #
配置Filebeat [root@fgedu.net.cn ~]# cat> /etc/filebeat/filebeat.yml << EOF
filebeat.inputs: - type: log paths: - /tidb/log/audit.log
json.keys_under_root: true json.overwrite_keys: true
output.elasticsearch: hosts: ["192.168.1.20:9200"]
index: "tidb-audit-%{+yyyy.MM.dd}" EOF # 启动Filebeat [root@fgedu.net.cn
~]# sudo systemctl start filebeat # 6. 审计日志保留 # 配置保留策略 # 定期归档审计日志 #
备份审计日志 # 7. 审计日志安全 # 限制审计日志访问权限 # 加密审计日志 # 防止审计日志被篡改 # 8. 审计监控 #
监控审计日志大小 # 监控审计日志异常 # 建立审计告警 # 9. 测试审计功能 # 执行各种操作,查看审计日志
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root -p'root123'
-e "
CREATE TABLE fgedudb.test_audit (id INT, name VARCHAR(20));
INSERT INTO fgedudb.test_audit VALUES (1, 'test');
SELECT * FROM fgedudb.test_audit;
DROP TABLE fgedudb.test_audit;
" # 查看审计日志 [root@fgedu.net.cn ~]# grep -A 10 "test_audit" /tidb/log/audit.log # 10. 审计最佳实践 # 启用详细审计 # 集中管理审计日志 #
定期分析审计日志 # 建立审计告警机制 # 定期审计审计日志配置
3.3.2 安全日志管理
# 1. 系统日志
# 配置syslog
[root@fgedu.net.cn ~]# sudo vi /etc/rsyslog.conf
# 确保以下配置存在
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
# 重启rsyslog
[root@fgedu.net.cn ~]# sudo systemctl restart rsyslog
# 2. 应用日志
# TiDB日志
[root@fgedu.net.cn ~]# tail -f /tidb/log/tidb-192.168.1.13.log
# PD日志
[root@fgedu.net.cn ~]# tail -f /tidb/log/pd-192.168.1.10.log
# TiKV日志
[root@fgedu.net.cn ~]# tail -f /tidb/log/tikv-192.168.1.10.log
# 3. 安全事件日志
# 查看认证日志
[root@fgedu.net.cn ~]# tail -f /var/log/secure
# 查看sudo日志
[root@fgedu.net.cn ~]# tail -f /var/log/auth.log
# 查看登录日志
[root@fgedu.net.cn ~]# last
# 4. 日志集中管理
# 使用ELK stack
# 配置Logstash
[root@fgedu.net.cn ~]# cat > /etc/logstash/conf.d/tidb.conf << EOF
input { file { path=> “/tidb/log/*.log”
start_position => “beginning”
sincedb_path => “/var/lib/logstash/sincedb”
}
file {
path => “/var/log/secure”
start_position => “beginning”
sincedb_path => “/var/lib/logstash/sincedb_secure”
}
}
output {
elasticsearch {
hosts => [“192.168.1.20:9200”]
index => “tidb-logs-%{+yyyy.MM.dd}”
}
}
EOF
# 启动Logstash
[root@fgedu.net.cn ~]# sudo systemctl start logstash
# 5. 日志分析
# 使用Kibana分析日志
# 配置Kibana仪表盘
# 建立日志告警
# 6. 日志保留
# 配置日志轮转
[root@fgedu.net.cn ~]# sudo vi /etc/logrotate.d/tidb
# 添加以下内容
/tidb/log/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 640 tidb tidb
}
# 7. 日志安全
# 限制日志访问权限
[root@fgedu.net.cn ~]# sudo chmod 640 /tidb/log/*.log
[root@fgedu.net.cn ~]# sudo chown tidb:tidb /tidb/log/*.log
# 加密日志传输
# 防止日志被篡改
# 8. 日志监控
# 监控日志大小
# 监控日志异常
# 建立日志告警
# 9. 测试日志功能
# 执行操作,查看日志
[root@fgedu.net.cn ~]# sudo systemctl restart tidb
[root@fgedu.net.cn ~]# tail -f /tidb/log/tidb-192.168.1.13.log
# 10. 日志管理最佳实践
# 集中管理所有日志
# 配置合理的日志保留策略
# 定期分析日志
# 建立日志告警机制
# 确保日志安全
Part04-生产案例与实战讲解
4.1 安全实施方案
# 场景:金融行业TiDB集群,需要符合PCI DSS合规要求
# 1. 安全架构设计
# – 网络架构:
# – 隔离网段:生产环境与测试环境隔离
# – 防火墙:配置严格的防火墙规则
# – VPN:远程访问使用VPN
# – 访问控制:
# – IP白名单:限制数据库访问IP
# – 最小权限:基于角色的访问控制
# – 多因素认证:管理员访问使用多因素认证
# – 加密策略:
# – 传输加密:启用TLS 1.3
# – 存储加密:TiKV数据加密 + 磁盘加密
# – 备份加密:备份数据加密
# – 审计监控:
# – 详细审计:记录所有操作
# – 日志集中:使用ELK stack
# – 实时监控:建立安全监控
# 2. 实施步骤
# 步骤1:网络安全配置
# 配置防火墙规则
[root@fgedu.net.cn ~]# firewall-cmd –permanent
–add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.0/24″
port protocol=”tcp” port=”4000″ accept’
[root@fgedu.net.cn ~]# firewall-cmd –permanent
–add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.0/24″
port protocol=”tcp” port=”2379″ accept’
[root@fgedu.net.cn ~]# firewall-cmd –reload
# 配置VPN
[root@fgedu.net.cn ~]# sudo yum install -y openvpn
[root@fgedu.net.cn ~]# sudo cp
/usr/share/doc/openvpn/examples/sample-config-files/server.conf
/etc/openvpn/
[root@fgedu.net.cn ~]# sudo systemctl start openvpn@server
[root@fgedu.net.cn ~]# sudo systemctl enable openvpn@server
# 步骤2:身份认证与授权
# 创建角色和用户
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root
-p’root123′ -e ”
CREATE ROLE ‘role_admin’;
CREATE ROLE ‘role_app’;
CREATE ROLE ‘role_readonly’;
GRANT ALL PRIVILEGES ON *.* TO ‘role_admin’;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO ‘role_app’;
GRANT SELECT ON fgedudb.* TO ‘role_readonly’;
CREATE USER ‘admin’@’192.168.1.%’ IDENTIFIED BY ‘Admin123!’;
CREATE USER ‘app’@’192.168.1.%’ IDENTIFIED BY ‘App123!’;
CREATE USER ‘readonly’@’192.168.1.%’ IDENTIFIED BY ‘Readonly123!’;
GRANT ‘role_admin’ TO ‘admin’@’192.168.1.%’;
GRANT ‘role_app’ TO ‘app’@’192.168.1.%’;
GRANT ‘role_readonly’ TO ‘readonly’@’192.168.1.%’;
FLUSH PRIVILEGES;
”
# 配置密码策略
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root
-p’root123′ -e ”
SET GLOBAL validate_password_policy = ‘STRONG’;
SET GLOBAL validate_password_length = 12;
SET GLOBAL validate_password_mixed_case_count = 2;
SET GLOBAL validate_password_number_count = 2;
SET GLOBAL validate_password_special_char_count = 2;
”
# 步骤3:数据加密
# 配置传输加密
[root@fgedu.net.cn ~]# # 生成SSL证书(略)
[root@fgedu.net.cn ~]# # 配置TiDB、PD、TiKV使用SSL(略)
# 配置存储加密
[root@fgedu.net.cn ~]# # 配置TiKV数据加密(略)
[root@fgedu.net.cn ~]# # 配置磁盘加密(略)
# 步骤4:审计与日志
# 配置审计
[root@fgedu.net.cn ~]# # 配置TiDB审计(略)
# 配置日志集中管理
[root@fgedu.net.cn ~]# # 配置ELK stack(略)
# 步骤5:安全监控
# 配置安全告警
[root@fgedu.net.cn ~]# # 配置Prometheus告警规则(略)
# 步骤6:合规性验证
# 执行PCI DSS合规性评估
# 进行安全渗透测试
# 验证加密配置
# 3. 实施结果
# – 符合PCI DSS合规要求
# – 建立了完整的安全体系
# – 提高了系统安全性
# – 降低了安全风险
# 4. 经验总结
# – 安全实施需要全面考虑各个层面
# – 定期进行安全评估和测试
# – 建立安全事件响应流程
# – 对运维人员进行安全培训
# – 持续改进安全措施
4.2 安全审计案例
# 场景:定期进行TiDB集群安全审计
# 1. 审计准备
# – 审计范围:TiDB集群安全配置
# – 审计标准:ISO 27001、PCI DSS
# – 审计工具:安全扫描工具、手动检查
# – 审计团队:安全专家、DBA
# 2. 审计步骤
# 步骤1:网络安全审计
# 检查防火墙规则
[root@fgedu.net.cn ~]# firewall-cmd –list-all
# 检查网络访问控制
[root@fgedu.net.cn ~]# netstat -tuln
# 扫描开放端口
[root@fgedu.net.cn ~]# nmap -sV 192.168.1.13
# 步骤2:身份认证与授权审计
# 检查用户列表
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root
-p’root123′ -e ”
SELECT user, host FROM mysql.user;
”
# 检查用户权限
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root
-p’root123′ -e ”
SELECT user, host, privilege_type FROM
information_schema.user_privileges;
”
# 检查角色权限
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root
-p’root123′ -e ”
SELECT role_name, privilege_type FROM
information_schema.role_privileges;
”
# 步骤3:数据加密审计
# 检查传输加密
[root@fgedu.net.cn ~]# mysql -h192.168.1.13 -P4000 -u root
-p’root123′ –ssl-mode=DISABLED -e “SELECT 1;”
# 检查存储加密
[root@fgedu.net.cn ~]# curl http://192.168.1.10:20180/status | jq
‘.security.encryption_enabled’
# 步骤4:审计与日志审计
# 检查审计配置
[root@fgedu.net.cn ~]# cat
/tidb/deploy/tidb-192.168.1.13/conf/tidb.toml | grep -A 10 “audit”
# 检查审计日志
[root@fgedu.net.cn ~]# tail -f /tidb/log/audit.log
# 检查日志保留
[root@fgedu.net.cn ~]# ls -la /tidb/log/audit.log*
# 步骤5:系统安全审计
# 检查系统补丁
[root@fgedu.net.cn ~]# sudo yum check-update
# 检查系统安全配置
[root@fgedu.net.cn ~]# sudo openscap-scan
# 检查文件权限
[root@fgedu.net.cn ~]# sudo find /tidb -type f -perm -o+w
# 步骤6:应用安全审计
# 检查应用连接配置
[root@fgedu.net.cn ~]# grep -r “password” /path/to/app/config
# 检查SQL注入防护
[root@fgedu.net.cn ~]# # 执行SQL注入测试
# 3. 审计发现
# – 发现问题:
# 1. 部分用户密码复杂度不足
# 2. 审计日志保留时间不足
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
