本文档风哥主要介绍TiDB
SQL注入防护与安全加固的相关内容,包括SQL注入的概念、安全加固的概念、TiDB的安全特性、常见攻击向量、注入防护实施、安全加固实施、安全测试、实战案例和故障处理等,风哥教程参考TiDB官方文档安全相关内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 SQL注入的概念
SQL注入是一种常见的网络攻击方式,攻击者通过在用户输入中插入恶意SQL代码,从而绕过应用程序的验证,执行未授权的数据库操作:
- 注入点:用户输入被应用程序直接拼接到SQL语句中的位置
- 攻击向量:攻击者输入的恶意SQL代码
- 执行环境:数据库服务器执行恶意SQL代码的环境
- 攻击后果:未授权数据访问、数据修改、数据库服务器控制
- 防护措施:参数化查询、输入验证、最小权限原则
1.2 安全加固的概念
安全加固是通过一系列措施提高系统安全性,减少安全漏洞和攻击面的过程:
- 攻击面:系统可能被攻击的所有入口点
- 漏洞:系统中可能被攻击者利用的弱点
- 加固措施:减少攻击面和修复漏洞的措施
- 安全基线:系统安全的最低标准
- 合规性:符合行业安全标准和法规要求
1.3 TiDB的安全特性
TiDB提供了多种安全特性,用于防止SQL注入和提高系统安全性:
# TiDB的安全特性
## 1. 访问控制
– **用户管理**:
– 支持创建、修改、删除用户
– 支持密码策略和账户锁定
– 支持角色管理和权限控制
– **权限管理**:
– 细粒度的权限控制(全局、数据库、表、列级)
– 支持基于角色的访问控制(RBAC)
– 支持权限审计
## 2. 加密功能
– **传输加密**:
– 支持SSL/TLS加密
– 双向认证
– **存储加密**:
– 支持透明数据加密(TDE)
– 密钥管理
## 3. 审计功能
– **审计日志**:
– 记录用户操作
– 支持多种审计事件类型
– 支持日志轮转和存储管理
## 4. 防注入措施
– **参数化查询**:
– 支持预处理语句
– 自动转义特殊字符
– **输入验证**:
– 支持正则表达式验证
– 支持长度限制
## 5. 安全监控
– **性能监控**:
– 实时监控数据库性能
– 异常检测
– **安全监控**:
– 登录失败监控
– 权限变更监控
– 异常操作监控
## 6. 其他安全特性
– **密码策略**:
– 支持密码强度检查
– 支持密码过期和轮换
– **账户锁定**:
– 支持登录失败次数限制
– 支持账户锁定时间设置
– **网络访问控制**:
– 支持IP白名单
– 支持防火墙集成
1.4 常见攻击向量
常见的SQL注入攻击向量包括:
## 1. 基于错误的注入
– **攻击方式**:通过输入特殊字符,触发数据库错误信息,从而获取数据库结构信息
– **示例**:
“`sql
SELECT * FROM users WHERE id = ‘1’ OR 1=1 –‘;
“`
– **防御**:禁用错误信息显示,使用参数化查询
## 2. 基于布尔的盲注
– **攻击方式**:通过输入布尔表达式,根据返回结果的真假来推断数据库信息
– **示例**:
“`sql
SELECT * FROM users WHERE id = ‘1’ AND (SELECT COUNT(*) FROM users) > 0 –‘;
“`
– **防御**:使用参数化查询,限制查询时间
## 3. 基于时间的盲注
– **攻击方式**:通过输入时间延迟函数,根据响应时间来推断数据库信息
– **示例**:
“`sql
SELECT * FROM users WHERE id = ‘1’ AND SLEEP(5) –‘;
“`
– **防御**:限制查询时间,使用参数化查询
## 4. 联合查询注入
– **攻击方式**:通过UNION语句,合并查询结果,获取其他表的数据
– **示例**:
“`sql
SELECT * FROM users WHERE id = ‘1’ UNION SELECT username, password FROM admin –‘;
“`
– **防御**:使用参数化查询,限制查询结果集
## 5. 堆叠查询注入
– **攻击方式**:通过分号分隔多个SQL语句,执行额外的SQL命令
– **示例**:
“`sql
SELECT * FROM users WHERE id = ‘1’; DROP TABLE users –‘;
“`
– **防御**:禁用堆叠查询,使用参数化查询学习交流加群风哥QQ113257174
## 6. 二次注入
– **攻击方式**:将恶意代码存储到数据库,当应用程序读取并使用这些数据时触发攻击
– **示例**:
– 第一步:注册用户时输入恶意代码
– 第二步:应用程序读取用户数据并执行SQL查询
– **防御**:对所有输入进行验证和转义,使用参数化查询
## 7. 其他攻击向量
– **Cookie注入**:通过修改Cookie值注入SQL代码
– **HTTP头部注入**:通过修改HTTP头部字段注入SQL代码
– **XFF注入**:通过修改X-Forwarded-For头部注入SQL代码
– **LDAP注入**:通过LDAP查询注入恶意代码
– **NoSQL注入**:针对NoSQL数据库的注入攻击
Part02-生产环境规划与建议
2.1 安全规划
在生产环境中,安全规划需要考虑以下因素:
## 1. 考虑因素
– **业务需求**:
– 数据敏感程度
– 业务重要性
– 合规要求
– **安全要求**:
– 数据保护
– 访问控制
– 审计需求
– **技术环境**:
– 系统架构
– 网络环境
– 数据库版本
## 2. 规划步骤
– **风险评估**:
识别潜在安全风险
评估风险影响
制定风险缓解策略
– **安全架构设计**:
设计安全的系统架构
确定安全边界
规划安全控制措施
– **实施计划**:
制定安全实施步骤
分配资源和责任
设定时间线
– **运维计划**:
制定安全运维流程
规划安全监控和响应
定期安全评估
– **培训计划**:
对开发人员进行安全培训
对运维人员进行安全培训
定期安全意识教育
## 3. 规划原则
– **深度防御**:
实施多层次安全防护
避免单点故障
– **最小权限**:
只授予必要的权限
定期审查和回收权限
– **安全优先**:
在设计和开发阶段考虑安全
优先修复高风险漏洞
– **可审计性**:
记录所有安全相关操作
确保操作可追溯
– **持续改进**:
定期更新安全措施
适应新的安全威胁
## 4. 规划工具
– **风险评估工具**:
识别和评估安全风险
生成风险报告
– **安全扫描工具**:
扫描系统漏洞
检测安全配置问题
– **安全监控工具**:
监控系统安全状态
检测异常行为
– **合规检查工具**:
检查系统是否符合合规要求
生成合规报告
2.2 注入防护策略
SQL注入防护策略需要考虑以下因素:
## 1. 应用程序层面
– **参数化查询**:
使用预处理语句
绑定参数
避免直接拼接SQL语句
– **输入验证**:
验证输入数据类型
验证输入数据长度
使用正则表达式验证输入格式
– **输出转义**:
对输出数据进行转义
防止XSS攻击
– **错误处理**:
禁用详细错误信息
记录错误但不显示给用户
– **安全编码实践**:
遵循安全编码规范
定期代码审计
使用安全的开发框架
## 2. 数据库层面
– **最小权限原则**:
为应用程序使用专用数据库用户
只授予必要的权限
定期审查权限
– **存储过程**:
使用存储过程处理复杂逻辑
减少直接SQL语句的使用
– **数据库防火墙**:
部署数据库防火墙
过滤恶意SQL语句
– **审计日志**:
启用审计日志
监控异常SQL操作
– **数据库参数配置**:
禁用危险的数据库功能
配置合理的安全参数
## 3. 网络层面
– **网络隔离**:
将数据库服务器放在专用网络
限制数据库端口访问
– **防火墙**:
配置防火墙规则
只允许合法IP访问
– **VPN**:
使用VPN连接数据库
加密网络传输
– **入侵检测**:
部署入侵检测系统
检测异常网络流量
## 4. 运维层面
– **定期安全扫描**:
定期扫描系统漏洞
检测SQL注入漏洞
– **安全补丁**:
及时应用安全补丁
定期更新数据库版本
– **安全测试**:
进行渗透测试
模拟SQL注入攻击
– **安全培训**:
对开发人员进行SQL注入防护培训
提高安全意识
– **应急响应**:
制定SQL注入应急响应计划
定期演练
## 5. 监控与审计
– **实时监控**:
监控数据库访问
检测异常SQL语句
– **审计日志**:
记录所有SQL操作
分析审计日志
– **告警机制**:
配置SQL注入告警
及时响应安全事件
– **合规检查**:
定期检查合规性
生成合规报告
2.3 安全加固策略
安全加固策略需要考虑以下因素:
## 1. 系统层面
– **操作系统加固**:
更新操作系统补丁
关闭不必要的服务
配置防火墙规则
限制用户权限
– **网络加固**:
配置网络访问控制
加密网络传输
检测网络异常
– **存储加固**:
加密存储数据
备份关键数据
实施访问控制
## 2. 数据库层面
– **数据库配置加固**:
禁用不必要的功能
配置合理的参数
启用安全特性
– **用户和权限加固**:
创建专用数据库用户
实施最小权限原则
定期审查权限
– **数据加固**:
加密敏感数据
实施数据脱敏
限制数据访问
– **审计加固**:
启用审计功能
配置审计日志
分析审计数据
## 3. 应用程序层面
– **代码加固**:
安全编码实践
代码审计
静态代码分析
– **依赖加固**:
更新依赖库
检测依赖漏洞
使用安全的依赖版本
– **配置加固**:
安全的配置管理
加密配置文件
限制配置访问
## 4. 安全监控与响应
– **监控加固**:
实时安全监控
异常检测
告警机制
– **响应加固**:
安全事件响应计划
应急演练
事后分析
– **备份与恢复**:
定期备份数据
测试恢复流程
灾难恢复计划
## 5. 合规与审计
– **合规加固**:
了解合规要求
实施合规措施
定期合规检查
– **审计加固**:
全面审计日志
审计日志分析
审计报告生成
– **文档加固**:
安全文档管理
变更管理
知识共享
Part03-生产环境项目实施方案
3.1 注入防护实施
3.1.1 参数化查询实施
## 1. 应用程序代码修改
### 1.1 Java应用
– **使用PreparedStatement**:
“`java
// 不安全的代码
String sql = “SELECT * FROM users WHERE username = ‘” + username + “‘ AND password = ‘” + password + “‘;”;
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// 安全的代码
String sql = “SELECT * FROM users WHERE username = ? AND password = ?”;
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
“`
### 1.2 Python应用
– **使用参数化查询**:
“`python
# 不安全的代码
sql = f”SELECT * FROM users WHERE username = ‘{username}’ AND password = ‘{password}'”;
cursor.execute(sql)
# 安全的代码
sql = “SELECT * FROM users WHERE username = %s AND password = %s”;
cursor.execute(sql, (username, password))
“`
### 1.3 PHP应用
– **使用PDO预处理语句**:
“`php
// 不安全的代码
$sql = “SELECT * FROM users WHERE username = ‘$username’ AND password = ‘$password'”;
$result = mysqli_query($conn, $sql);
// 安全的代码
$sql = “SELECT * FROM users WHERE username = ? AND password = ?”;
$stmt = $pdo->prepare($sql);
$stmt->execute([$username, $password]);
“`
## 2. 输入验证实施
### 2.1 前端验证
– **HTML5验证**:
“`html
“`
### 2.2 后端验证
– **Java验证**:
“`java
// 验证用户名
if (!username.matches(“[a-zA-Z0-9]{3,20}”)) {
throw new IllegalArgumentException(“Invalid username”);
}
// 验证密码
if (!password.matches(“(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,}”)) {
throw new IllegalArgumentException(“Invalid password”);
}
“`
### 2.3 服务器端验证
– **使用过滤器**:
“`java
public class InputFilter {
public static String sanitize(String input) {
if (input == null) {
return null;
}
return input.replaceAll(“[;<>“‘\\]+”, “”);
}
}
“`
## 3. 数据库层面防护
### 3.1 最小权限配置
– **创建应用专用用户**:
“`sql
CREATE USER ‘app_user’@’%’ IDENTIFIED BY ‘App@123’;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO ‘app_user’@’%’;
“`
### 3.2 存储过程使用
– **创建存储过程**:
“`sql
DELIMITER //
CREATE PROCEDURE get_user(IN p_username VARCHAR(50), IN p_password VARCHAR(50))
BEGIN
SELECT * FROM users WHERE username = p_username AND password = p_password;
END //
DELIMITER ;
“`
### 3.3 数据库防火墙配置
– **配置MySQL防火墙**:
“`bash
# 安装MySQL防火墙插件
mysql -h 192.168.1.10 -P 4000 -u root -e “INSTALL PLUGIN mysql_firewall SONAME ‘mysql_firewall.so’;”
# 配置防火墙规则
mysql -h 192.168.1.10 -P 4000 -u root -e “CALL mysql.sp_firewall_create_rule(‘app_user’, ‘SELECT * FROM users
WHERE username = ? AND password = ?’);”
“`
## 4. 验证与测试
### 4.1 注入测试
– **手动测试**:
“`
# 测试输入
username: admin’ —
password: any
# 预期结果:登录失败,无SQL错误
“`
### 4.2 自动化测试
– **使用SQLmap**:
“`bash
sqlmap -u “http://example.com/login.php” –data “username=admin&password=pass” –dbs
“`
### 4.3 代码审计
– **使用静态代码分析工具**:
“`bash
# 使用SonarQube
sonar-scanner -Dsonar.projectKey=myapp -Dsonar.sources=src
“`
3.2 安全加固实施
3.2.1 系统层面加固
## 1. 操作系统加固
### 1.1 更新系统补丁
– **更新系统**:
“`bash
# Oracle Linux
yum update -y
# Ubuntu
apt update && apt upgrade -y
“`
### 1.2 关闭不必要的服务
– **检查服务**:
“`bash
systemctl list-unit-files –type=service
“`
– **禁用服务**:
“`bash
systemctl disable firewalld
systemctl stop firewalld
“`
### 1.3 配置防火墙
– **配置iptables**:
“`bash
# 允许SSH
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
# 允许TiDB端口
iptables -A INPUT -p tcp –dport 4000 -j ACCEPT
# 允许PD端口
iptables -A INPUT -p tcp –dport 2379 -j ACCEPT
# 允许TiKV端口
iptables -A INPUT -p tcp –dport 20160 -j ACCEPT
# 拒绝其他所有流量
iptables -A INPUT -j DROP
“`
### 1.4 限制用户权限
– **创建专用用户**:
“`bash
useradd -m -s /bin/bash tidb
chown -R tidb:tidb /tidb/app
“`
## 2. 数据库层面加固
### 2.1 数据库配置加固
– **修改TiDB配置**:
“`bash
vim /tidb/app/tidb/conf/tidb.toml
[security]
# 禁用远程root登录
skip-grant-tables = false
# 启用密码验证插件
validate-password = true
# 配置密码策略
validate_password_length = 8
validate_password_policy = “MEDIUM”
“`
### 2.2 用户和权限加固
– **创建专用用户**:
“`sql
— 创建只读用户
CREATE USER ‘read_only’@’%’ IDENTIFIED BY ‘ReadOnly@123’;
GRANT SELECT ON fgedudb.* TO ‘read_only’@’%’;
— 创建读写用户
CREATE USER ‘read_write’@’%’ IDENTIFIED BY ‘ReadWrite@123’;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO ‘read_write’@’%’;
— 撤销不必要的权限
REVOKE ALL PRIVILEGES ON *.* FROM ‘app_user’@’%’;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO ‘app_user’@’%’;
“`
### 2.3 数据加固
– **加密敏感数据**:
“`sql
— 创建加密函数
DELIMITER //
CREATE FUNCTION encrypt_data(data VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
RETURN AES_ENCRYPT(data, ‘encryption_key’);
END //
DELIMITER ;
— 创建解密函数
DELIMITER //
CREATE FUNCTION decrypt_data(encrypted_data VARBINARY(255)) RETURNS VARCHAR(255)
BEGIN
RETURN AES_DECRYPT(encrypted_data, ‘encryption_key’);
END //
DELIMITER ;
— 使用加密函数
INSERT INTO users (username, password) VALUES (‘admin’, encrypt_data(‘Admin@123’));
SELECT username, decrypt_data(password) FROM users;
“`
### 2.4 审计加固
– **启用审计日志**:
“`bash
vim /tidb/app/tidb/conf/tidb.toml
[audit]
audit_log = true
audit_log_file = “/tidb/log/audit.log”
audit_log_format = “json”
audit_log_level = “info”
audit_log_include = [“login”, “query”, “admin”]
“`
## 3. 应用程序层面加固
### 3.1 代码加固
– **安全编码实践**:
“`java
// 避免硬编码密码
// 错误
String password = “password123”;
// 正确
String password = System.getenv(“DB_PASSWORD”);
“`
### 3.2 依赖加固
– **更新依赖**:
“`bash
# Maven
mvn dependency:tree
mvn versions:display-dependency-updates
# npm
npm audit
npm update
“`
### 3.3 配置加固
– **加密配置文件**:
“`bash
# 使用Ansible Vault
ansible-vault encrypt config.yml
# 使用HashiCorp Vault
vault kv put secret/config db_password=Admin@123
“`
## 4. 网络层面加固
### 4.1 网络隔离
– **配置VLAN**:
“`bash
# 创建VLAN
vconfig add eth0 10
ifconfig eth0.10 192.168.10.1 netmask 255.255.255.0 up
“`
### 4.2 VPN配置
– **配置OpenVPN**:
“`bash
# 安装OpenVPN
yum install -y openvpn
# 配置OpenVPN
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
systemctl start openvpn@server
systemctl enable openvpn@server
“`
### 4.3 入侵检测
– **安装IDS**:
“`bash
# 安装Suricata
yum install -y suricata
# 配置Suricata
vim /etc/suricata/suricata.yaml
systemctl start suricata
systemctl enable suricata
“`
3.3 安全测试
3.3.1 安全测试实施
## 1. 漏洞扫描
### 1.1 数据库漏洞扫描
– **使用Nmap**:
“`bash
nmap -sV -p 4000,2379,20160 192.168.1.10
“`
### 1.2 Web应用漏洞扫描
– **使用Nikto**:
“`bash
nikto -h http://example.com
“`
### 1.3 综合漏洞扫描
– **使用OpenVAS**:
“`bash
# 启动OpenVAS
gvm-start
# 访问Web界面
# https://localhost:9392
“`
## 2. 渗透测试
### 2.1 SQL注入测试
– **使用SQLmap**:
“`bash
# 测试GET参数
sqlmap -u “http://example.com/login.php?id=1” –dbs
# 测试POST参数
sqlmap -u “http://example.com/login.php” –data “username=admin&password=pass” –dbs
# 测试Cookie
sqlmap -u “http://example.com” –cookie “id=1” –dbs
“`
### 2.2 XSS测试
– **手动测试**:
“`
# 测试反射型XSS
http://example.com/search.php?q=
# 测试存储型XSS
在评论框输入:
“`
### 2.3 权限提升测试
– **测试垂直权限提升**:
“`
# 尝试访问管理员页面
http://example.com/admin/
# 尝试使用普通用户访问管理员API
curl -H “Authorization: Bearer user_token” http://example.com/api/admin
“`
## 3. 安全代码审计
### 3.1 静态代码分析
– **使用SonarQube**:
“`bash
# 安装SonarQube
docker run -d –name sonarqube -p 9000:9000 sonarqube
# 分析代码
sonar-scanner -Dsonar.projectKey=myapp -Dsonar.sources=src -Dsonar.host.url=http://localhost:9000
-Dsonar.login=admin -Dsonar.password=admin
“`
### 3.2 动态代码分析
– **使用OWASP ZAP**:
“`bash
# 启动ZAP
zap.sh
# 配置代理
# 浏览器设置代理为 127.0.0.1:8080
# 访问目标网站
# 查看扫描结果
“`
### 3.3 依赖分析
– **使用Dependency-Check**:
“`bash
# 安装Dependency-Check
wget https://github.com/jeremylong/DependencyCheck/releases/download/v6.5.3/dependency-check-6.5.3-release.zip
unzip dependency-check-6.5.3-release.zip
# 分析项目
./dependency-check/bin/dependency-check.sh -s /path/to/project -o /path/to/report
“`
## 4. 安全监控测试
### 4.1 日志监控测试
– **测试审计日志**:
“`bash
# 执行测试操作
mysql -h 192.168.1.10 -P 4000 -u root -e “SELECT * FROM fgedudb.users;”
# 检查审计日志
tail -f /tidb/log/audit.log
“`
### 4.2 告警测试
– **测试登录失败告警**:
“`bash
# 多次尝试登录失败
for i in {1..5}; do mysql -h 192.168.1.10 -P 4000 -u root -p’wrongpassword’ -e “SELECT 1;”; done
# 检查告警
tail -f /tidb/log/grafana.log
“`
### 4.3 异常检测测试
– **测试异常SQL检测**:
“`bash
# 执行异常SQL
mysql -h 192.168.1.10 -P 4000 -u app_user -e “SELECT * FROM information_schema.tables;”
# 检查异常检测
tail -f /tidb/log/prometheus.log
“`
## 5. 合规测试
### 5.1 GDPR合规测试
– **数据保护测试**:
“`bash
# 检查数据加密
mysql -h 192.168.1.10 -P 4000 -u root -e “SHOW VARIABLES LIKE ‘encrypt%’;”
# 检查数据访问控制
mysql -h 192.168.1.10 -P 4000 -u root -e “SHOW GRANTS FOR ‘app_user’@’%’;”
“`
### 5.2 PCI DSS合规测试
– **支付卡数据测试**:
“`bash
# 检查支付卡数据存储
mysql -h 192.168.1.10 -P 4000 -u root -e “SELECT * FROM payments LIMIT 1;”
# 检查访问控制
mysql -h 192.168.1.10 -P 4000 -u root -e “SELECT user, host FROM mysql.user;”
“`
### 5.3 合规报告生成
– **生成合规报告**:
“`bash
# 使用OpenSCAP
oscap xccdf eval –profile xccdf_org.ssgproject.content_profile_pci-dss –report /tmp/pci-dss-report.html
/usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml
“`
Part04-生产案例与实战讲解
4.1 注入防护实战
4.1.1 SQL注入防护实战案例
## 1. 环境信息
– **TiDB版本**:6.1.0
– **操作系统**:Oracle Linux 9.3
– **数据库**:fgedudb
– **应用程序**:Java Web应用
## 2. 需求分析
– **安全要求**:防止SQL注入攻击
– **合规要求**:符合PCI DSS要求
– **性能要求**:防护措施对性能影响最小化
## 3. 实施步骤
### 3.1 应用程序修改
#### 3.1.1 使用PreparedStatement
– **修改登录代码**:
“`java
// 旧代码
String sql = “SELECT * FROM users WHERE username = ‘” + username + “‘ AND password = ‘” + password + “‘;”;
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// 新代码
String sql = “SELECT * FROM users WHERE username = ? AND password = ?”;
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
“`
#### 3.1.2 输入验证
– **添加输入验证**:
“`java
// 验证用户名
if (!username.matches(“[a-zA-Z0-9]{3,20}”)) {
throw new IllegalArgumentException(“Invalid username”);
}
// 验证密码
if (!password.matches(“(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,}”)) {
throw new IllegalArgumentException(“Invalid password”);
}
“`
### 3.2 数据库层面防护
#### 3.2.1 创建专用用户
– **创建应用用户**:
“`sql
CREATE USER ‘app_user’@’%’ IDENTIFIED BY ‘App@123’;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO ‘app_user’@’%’;
“`
#### 3.2.2 使用存储过程
– **创建登录存储过程**:
“`sql
DELIMITER //
CREATE PROCEDURE user_login(IN p_username VARCHAR(50), IN p_password VARCHAR(50))
BEGIN
SELECT * FROM users WHERE username = p_username AND password = p_password;
END //
DELIMITER ;
“`
#### 3.2.3 配置数据库防火墙
– **启用MySQL防火墙**:
“`sql
INSTALL PLUGIN mysql_firewall SONAME ‘mysql_firewall.so’;
CALL mysql.sp_firewall_create_rule(‘app_user’, ‘SELECT * FROM users WHERE username = ? AND password = ?’);
“`
### 3.3 测试与验证
#### 3.3.1 手动测试
– **测试注入攻击**:
“`
# 测试1:单引号注入
Username: admin’
Password: any
# 测试2:OR 1=1注入
Username: admin’ OR 1=1 —
Password: any
# 测试3:UNION注入
Username: admin’ UNION SELECT username, password FROM admin —
Password: any
“`
#### 3.3.2 自动化测试
– **使用SQLmap测试**:
“`bash
sqlmap -u “http://example.com/login” –data “username=admin&password=pass” –dbs
“`
#### 3.3.3 性能测试
– **测试性能影响**:
“`bash
# 使用ab测试
ab -n 1000 -c 100 “http://example.com/login?username=admin&password=Admin@123”
“`
## 4. 实施结果
– **应用程序修改**:成功修改登录代码,使用PreparedStatement和输入验证
– **数据库配置**:成功创建专用用户,使用存储过程,配置数据库防火墙
– **测试验证**:SQL注入攻击被有效防止,性能影响在可接受范围内
– **合规性**:符合PCI DSS要求
## 5. 常见问题处理
– **问题**:PreparedStatement性能下降
**原因**:预处理语句的编译开销
**解决**:使用连接池,复用PreparedStatement
– **问题**:输入验证过于严格
**原因**:正则表达式限制过严
**解决**:调整正则表达式,允许合理的输入
– **问题**:存储过程维护困难
**原因**:存储过程逻辑复杂
**解决**:使用版本控制,定期审查存储过程
4.2 安全加固实战
4.2.1 安全加固实战案例
## 1. 环境信息
– **TiDB版本**:6.1.0
– **操作系统**:Oracle Linux 9.3
– **数据库**:fgedudb
– **应用程序**:Java Web应用
## 2. 需求分析
– **安全要求**:提高系统安全性,防止未授权访问
– **合规要求**:符合GDPR要求
– **运维要求**:便于管理和监控
## 3. 实施步骤
### 3.1 系统层面加固
#### 3.1.1 更新系统补丁
– **更新系统**:
“`bash
yum update -y
“`
#### 3.1.2 配置防火墙
– **配置iptables**:
“`bash
# 允许SSH
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
# 允许TiDB端口
iptables -A INPUT -p tcp –dport 4000 -j ACCEPT
# 允许PD端口
iptables -A INPUT -p tcp –dport 2379 -j ACCEPT
# 允许TiKV端口
iptables -A INPUT -p tcp –dport 20160 -j ACCEPT
# 拒绝其他所有流量
iptables -A INPUT -j DROP
# 保存规则
service iptables save
“`
#### 3.1.3 限制用户权限
– **创建专用用户**:
“`bash
useradd -m -s /bin/bash tidb
chown -R tidb:tidb /tidb/app
“`
### 3.2 数据库层面加固
#### 3.2.1 数据库配置加固
– **修改TiDB配置**:
“`bash
vim /tidb/app/tidb/conf/tidb.toml
[security]
# 禁用远程root登录
skip-grant-tables = false
# 启用密码验证插件
validate-password = true
# 配置密码策略
validate_password_length = 8
validate_password_policy = “MEDIUM”
[audit]
# 启用审计日志
audit_log = true
audit_log_file = “/tidb/log/audit.log”
audit_log_format = “json”
audit_log_level = “info”
audit_log_include = [“login”, “query”, “admin”]
“`
#### 3.2.2 用户和权限加固
– **创建专用用户**:
“`sql
— 创建只读用户
CREATE USER ‘read_only’@’%’ IDENTIFIED BY ‘ReadOnly@123’;
GRANT SELECT ON fgedudb.* TO ‘read_only’@’%’;
— 创建读写用户
CREATE USER ‘read_write’@’%’ IDENTIFIED BY ‘ReadWrite@123’;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO ‘read_write’@’%’;
— 撤销不必要的权限
REVOKE ALL PRIVILEGES ON *.* FROM ‘app_user’@’%’;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO ‘app_user’@’%’;
“`
#### 3.2.3 数据加固
– **加密敏感数据**:
“`sql
— 创建加密函数
DELIMITER //
CREATE FUNCTION encrypt_data(data VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
RETURN AES_ENCRYPT(data, ‘encryption_key’);
END //
DELIMITER ;
— 创建解密函数
DELIMITER //
CREATE FUNCTION decrypt_data(encrypted_data VARBINARY(255)) RETURNS VARCHAR(255)
BEGIN
RETURN AES_DECRYPT(encrypted_data, ‘encryption_key’);
END //
DELIMITER ;
— 更新现有数据
UPDATE users SET password = encrypt_data(password);
“`
### 3.3 应用程序层面加固
#### 3.3.1 代码加固
– **安全编码实践**:
“`java
// 避免硬编码密码
String password = System.getenv(“DB_PASSWORD”);
// 避免SQL注入
String sql = “SELECT * FROM users WHERE username = ? AND password = ?”;
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
“`
#### 3.3.2 依赖加固
– **更新依赖**:
“`bash
mvn dependency:tree
mvn versions:display-dependency-updates
mvn versions:update-properties
“`
### 3.4 安全监控配置
#### 3.4.1 配置Prometheus监控
– **修改Prometheus配置**:
“`bash
vim /tidb/app/prometheus/prometheus.yml
scrape_configs:
– job_name: ‘tidb’
static_configs:
– targets: [‘192.168.1.10:10080’]
– job_name: ‘tikv’
static_configs:
– targets: [‘192.168.1.20:20180’, ‘192.168.1.21:20180’, ‘192.168.1.22:20180’]
– job_name: ‘pd’
static_configs:
– targets: [‘192.168.1.10:2379’, ‘192.168.1.11:2379’, ‘192.168.1.12:2379’]
“`
#### 3.4.2 配置Grafana告警
– **创建告警规则**:
“`yaml
groups:
– name: tidb-security
rules:
– alert: LoginFailures
expr: rate(tidb_security_login_failures_total[5m]) > 5
for: 1m
labels:
severity: critical
annotations:
summary: “登录失败次数过多”
description: “在过去5分钟内,登录失败次数超过5次”
– alert: UnauthorizedAccess
expr: rate(tidb_security_unauthorized_access_total[5m]) > 0
for: 1m
labels:
severity: critical
annotations:
summary: “未授权访问”
description: “检测到未授权访问尝试”
“`
## 4. 实施结果
– **系统层面**:成功更新系统补丁,配置防火墙,限制用户权限
– **数据库层面**:成功配置数据库参数,创建专用用户,加密敏感数据,启用审计日志
– **应用程序层面**:成功修改代码,更新依赖
– **安全监控**:成功配置Prometheus监控和Grafana告警
– **合规性**:符合GDPR要求
## 5. 常见问题处理
– **问题**:防火墙配置错误导致服务不可访问
**原因**:防火墙规则配置不当
**解决**:检查防火墙规则,确保必要端口开放
– **问题**:密码策略过于严格导致用户无法设置密码
**原因**:密码策略配置过严
**解决**:调整密码策略参数,如validate_password_length和validate_password_policy
– **问题**:审计日志过大占用磁盘空间
**原因**:审计日志配置不当
**解决**:调整审计日志轮转配置,如audit_log_rotate_size和audit_log_rotate_days
4.3 安全故障处理
SQL注入防护与安全加固过程中的故障处理:
## 1. SQL注入相关故障
### 1.1 SQL注入攻击
– **问题描述**:检测到SQL注入攻击
– **原因分析**:应用程序未使用参数化查询,输入验证不足
– **解决方案**:
– 紧急修复:
暂时关闭受影响的应用功能
阻止攻击者IP
– 根本解决:
修改代码使用参数化查询
增加输入验证
部署WAF
– 后续措施:
进行安全扫描
加强监控
### 1.2 注入漏洞扫描失败
– **问题描述**:安全扫描工具无法检测到SQL注入漏洞
– **原因分析**:扫描工具配置不当,漏洞隐藏较深
– **解决方案**:
– 调整扫描工具配置:
使用更全面的扫描规则
增加扫描深度
– 手动测试:
使用多种注入测试方法
测试不同的输入点
– 代码审计:
进行详细的代码审计
查找潜在的注入点
### 1.3 注入防护措施失效
– **问题描述**:已实施的注入防护措施失效
– **原因分析**:防护措施配置错误,存在绕过方法
– **解决方案**:
– 检查防护配置:
验证参数化查询是否正确使用
检查输入验证规则
– 测试防护效果:
使用最新的注入技术测试
寻找防护措施的漏洞
– 加强防护:
增加多层防护
定期更新防护规则
## 2. 安全加固相关故障
### 2.1 系统加固导致服务不可用
– **问题描述**:系统加固后服务无法正常运行
– **原因分析**:防火墙规则过严,权限设置不当
– **解决方案**:
– 紧急恢复:
临时关闭防火墙
恢复默认权限
– 逐步加固:
分步骤实施加固措施
每步测试服务可用性
– 优化配置:
调整防火墙规则
修正权限设置
### 2.2 数据库加固导致性能下降
– **问题描述**:数据库加固后性能明显下降
– **原因分析**:加密开销大,审计日志过多
– **解决方案**:
– 性能分析:
识别性能瓶颈
分析资源使用情况
– 优化配置:
调整加密参数
优化审计日志配置
– 硬件升级:
增加内存
使用更快的存储
### 2.3 安全监控告警过多
– **问题描述**:安全监控系统产生大量告警
– **原因分析**:告警阈值设置过低,规则过于敏感
– **解决方案**:
– 调整告警阈值:
根据实际情况调整阈值
增加告警时间窗口
– 优化告警规则:
合并相似告警
排除正常行为
– 实施告警分级:
对告警进行分级
优先处理高优先级告警
## 3. 安全测试相关故障
### 3.1 渗透测试失败
– **问题描述**:渗透测试无法完成
– **原因分析**:测试环境配置不当,测试工具问题
– **解决方案**:
– 检查测试环境:
确保测试环境与生产环境相似
验证测试工具配置
– 调整测试策略:
使用多种测试工具
尝试不同的测试方法
– 手动测试:
进行手动渗透测试
重点测试关键功能
### 3.2 漏洞修复后问题
– **问题描述**:修复漏洞后出现新的问题
– **原因分析**:修复方法不当,引入新的漏洞
– **解决方案**:
– 回滚修复:
暂时回滚修复
重新评估修复方案
– 全面测试:
在修复后进行全面测试
确保修复不会引入新问题
– 代码审查:
对修复代码进行审查
确保修复方法正确
### 3.3 合规测试失败
– **问题描述**:合规测试未通过
– **原因分析**:合规要求理解不足,实施措施不全面
– **解决方案**:
– 了解合规要求:
详细研究合规标准
识别未满足的要求
– 实施合规措施:
针对未满足的要求实施措施
确保所有要求都被覆盖
– 再次测试:
重新进行合规测试
验证措施有效性
## 4. 其他安全故障
### 4.1 安全事件响应
– **问题描述**:发生安全事件,需要紧急响应
– **原因分析**:系统被攻击,数据泄露
– **解决方案**:
– 启动应急响应:
按照应急响应计划行动
隔离受影响的系统
– 调查事件:
收集证据
确定攻击范围
– 修复漏洞:
修复被利用的漏洞
加强安全措施
– 恢复系统:
从备份恢复数据
验证系统完整性
### 4.2 安全文档缺失
– **问题描述**:安全文档不完整,影响合规性
– **原因分析**:文档管理不当,安全措施未记录
– **解决方案**:
– 补全文档:
记录所有安全措施
整理安全配置
– 建立文档管理:
建立安全文档管理系统
定期更新文档
– 培训员工:
培训员工使用安全文档
提高文档意识
### 4.3 安全意识不足
– **问题描述**:员工安全意识不足,导致安全问题
– **原因分析**:缺乏安全培训,安全意识教育不足
– **解决方案**:
– 开展安全培训:
对员工进行安全培训
提高安全意识
– 制定安全政策:
制定明确的安全政策
建立安全奖惩机制
– 定期安全演练:
进行安全事件演练
提高应急响应能力
Part05-风哥经验总结与分享
5.1 安全最佳实践
SQL注入防护与安全加固的最佳实践:
- 使用参数化查询:所有SQL语句使用预处理语句和参数绑定
- 输入验证:对所有用户输入进行严格验证,包括类型、长度、格式
- 最小权限原则:为应用程序使用专用数据库用户,只授予必要的权限
- 存储过程:使用存储过程处理复杂逻辑,减少直接SQL语句的使用
- 数据库防火墙:部署数据库防火墙,过滤恶意SQL语句
- 错误处理:禁用详细错误信息,避免泄露数据库结构
- 安全编码规范:遵循安全编码规范,定期进行代码审计
- 系统加固:更新系统补丁,关闭不必要的服务,配置防火墙
- 数据库加固:配置安全参数,创建专用用户,加密敏感数据
- 应用程序加固:安全编码,更新依赖,配置管理
- 网络加固:网络隔离,VPN配置,入侵检测
- 安全监控:实时监控,告警机制,异常检测
- 安全测试:定期漏洞扫描,渗透测试,代码审计
- 应急响应:制定应急响应计划,定期演练
- 安全策略:制定明确的安全策略和流程
- 安全培训:定期对员工进行安全培训
- 安全审计:定期进行安全审计和评估
- 合规管理:确保符合行业合规要求
- 持续改进:不断更新安全措施,适应新的安全威胁
5.2 常见安全问题与解决方案
SQL注入防护与安全加固的常见问题与解决方案:
## 1. SQL注入问题
### 1.1 应用程序未使用参数化查询
– **问题**:应用程序直接拼接SQL语句
– **解决**:
– 修改代码使用参数化查询
– 使用ORM框架
– 进行代码审计
### 1.2 输入验证不足
– **问题**:用户输入未经过验证
– **解决**:
– 对所有输入进行验证
– 使用正则表达式
– 限制输入长度
### 1.3 权限配置不当
– **问题**:数据库用户权限过大
– **解决**:
– 实施最小权限原则
– 创建专用数据库用户
– 定期审查权限
## 2. 安全加固问题
### 2.1 系统补丁更新不及时
– **问题**:系统存在未修复的漏洞
– **解决**:
– 定期更新系统补丁
– 使用自动化工具管理补丁
– 建立补丁管理流程
### 2.2 防火墙配置错误
– **问题**:防火墙规则配置不当
– **解决**:
– 仔细配置防火墙规则
– 测试防火墙规则
– 定期审查防火墙配置
### 2.3 安全监控不足
– **问题**:缺乏有效的安全监控
– **解决**:
– 部署安全监控系统
– 配置合理的告警规则
– 定期分析监控数据
## 3. 安全测试问题
### 3.1 测试覆盖不足
– **问题**:安全测试覆盖不全面
– **解决**:
– 制定详细的测试计划
– 使用多种测试工具
– 进行手动测试
### 3.2 测试环境与生产环境不一致
– **问题**:测试环境与生产环境差异较大
– **解决**:
– 确保测试环境与生产环境一致
– 定期同步环境配置
– 在生产环境的副本上进行测试
### 3.3 测试结果未及时处理
– **问题**:测试发现的问题未及时修复
– **解决**:
– 建立问题跟踪系统
– 制定修复计划
– 定期审查修复进度
## 4. 安全管理问题
### 4.1 安全意识不足
– **问题**:员工安全意识不足
– **解决**:
– 开展安全培训
– 进行安全意识教育
– 建立安全奖惩机制
### 4.2 安全文档缺失
– **问题**:安全文档不完整
– **解决**:
– 建立安全文档管理系统
– 定期更新安全文档
– 培训员工使用安全文档
### 4.3 应急响应能力不足
– **问题**:发生安全事件时响应不及时
– **解决**:
– 制定应急响应计划
– 定期进行应急演练
– 建立应急响应团队
## 5. 性能与安全平衡问题
### 5.1 安全措施影响性能
– **问题**:安全措施导致性能下降
– **解决**:
– 优化安全措施
– 平衡安全与性能
– 使用硬件加速
### 5.2 安全配置过于复杂
– **问题**:安全配置过于复杂,难以维护
– **解决**:
– 简化安全配置
– 使用自动化工具管理配置
– 建立配置管理流程
### 5.3 安全与可用性冲突
– **问题**:安全措施影响系统可用性
– **解决**:
– 实施分级安全措施
– 确保安全措施的可用性
– 建立安全与可用性平衡机制
## 6. 合规问题
### 6.1 合规要求理解不足
– **问题**:对合规要求理解不深入
– **解决**:
– 深入研究合规标准
– 咨询合规专家
– 参加合规培训
### 6.2 合规实施不全面
– **问题**:合规措施实施不全面
– **解决**:
– 制定合规实施计划
– 确保所有要求都被覆盖
– 定期进行合规检查
### 6.3 合规文档不完整
– **问题**:合规文档不完整
– **解决**:
– 建立合规文档管理系统
– 定期更新合规文档
– 确保文档的准确性和完整性
## 7. 技术债务问题
### 7.1 遗留系统安全问题
– **问题**:遗留系统存在安全问题
– **解决**:
– 评估遗留系统的安全风险
– 制定安全升级计划
– 逐步实施安全改进
### 7.2 技术栈过时
– **问题**:使用过时的技术栈
– **解决**:
– 评估技术栈的安全风险
– 制定技术栈升级计划
– 逐步迁移到更安全的技术栈
### 7.3 代码质量问题
– **问题**:代码质量差,存在安全隐患
– **解决**:
– 进行代码重构
– 提高代码质量标准
– 定期进行代码审计
## 8. 人为因素问题
### 8.1 内部威胁
– **问题**:内部人员导致的安全问题
– **解决**:
– 实施最小权限原则
– 监控内部人员的操作
– 进行背景调查
### 8.2 社会工程学攻击
– **问题**:员工容易受到社会工程学攻击
– **解决**:
– 开展社会工程学攻击培训
– 提高员工的安全意识
– 建立可疑活动报告机制
### 8.3 人为错误
– **问题**:员工操作失误导致安全问题
– **解决**:
– 简化操作流程
– 提供明确的操作指南
– 定期进行操作培训
## 9. 供应链安全问题
### 9.1 第三方依赖漏洞
– **问题**:第三方依赖存在安全漏洞
– **解决**:
– 定期检查依赖漏洞
– 及时更新依赖版本
– 使用安全的依赖管理工具
### 9.2 供应商安全问题
– **问题**:供应商存在安全问题
– **解决**:
– 评估供应商的安全状况
– 签订安全协议
– 定期审查供应商的安全措施
### 9.3 供应链攻击
– **问题**:供应链被攻击
– **解决**:
– 实施供应链安全管理
– 验证供应链的完整性
– 建立供应链安全应急响应计划
## 10. 云环境安全问题
### 10.1 云服务配置错误
– **问题**:云服务配置错误导致安全问题
– **解决**:
– 正确配置云服务
– 使用云安全配置工具
– 定期审查云服务配置
### 10.2 云数据安全
– **问题**:云数据安全问题
– **解决**:
– 加密云存储数据
– 实施访问控制
– 定期备份数据
### 10.3 云服务依赖风险
– **问题**:过度依赖云服务
– **解决**:
– 实施多云战略
– 建立云服务中断应急计划
– 定期测试云服务可用性
## 5.3 安全配置技巧
### 5.3.1 SQL注入防护技巧
– **参数化查询**:
#!/bin/bash
# 使用参数化查询示例
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# Java示例
echo “Java参数化查询示例:”
echo “String sql = \”SELECT * FROM users WHERE username = ? AND password = ?\”;”
echo “PreparedStatement pstmt = connection.prepareStatement(sql);”
echo “pstmt.setString(1, username);”
echo “pstmt.setString(2, password);”
echo “ResultSet rs = pstmt.executeQuery();”
# Python示例
echo “\nPython参数化查询示例:”
echo “sql = \”SELECT * FROM users WHERE username = %s AND password = %s\””
echo “cursor.execute(sql, (username, password))”
# PHP示例
echo “\nPHP参数化查询示例:”
echo “$sql = \”SELECT * FROM users WHERE username = ? AND password = ?\”;”
echo “$stmt = $pdo->prepare($sql);”
echo “$stmt->execute([$username, $password]);”
### 5.3.2 安全加固技巧
– **系统加固**:
#!/bin/bash
# system_hardening.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 更新系统
echo “更新系统补丁…”
yum update -y
# 关闭不必要的服务
echo “关闭不必要的服务…”
systemctl disable firewalld
systemctl stop firewalld
# 配置防火墙
echo “配置防火墙…”
iptables -F
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
iptables -A INPUT -p tcp –dport 4000 -j ACCEPT
iptables -A INPUT -p tcp –dport 2379 -j ACCEPT
iptables -A INPUT -p tcp –dport 20160 -j ACCEPT
iptables -A INPUT -j DROP
service iptables save
# 限制用户权限
echo “限制用户权限…”
useradd -m -s /bin/bash tidb
chown -R tidb:tidb /tidb/app
echo “系统加固完成”
### 5.3.3 数据库加固技巧
– **数据库加固**:
#!/bin/bash
# database_hardening.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 创建专用用户
echo “创建专用用户…”
mysql -h 192.168.1.10 -P 4000 -u root -e “CREATE USER ‘app_user’@’%’ IDENTIFIED BY ‘App@123’;”
mysql -h 192.168.1.10 -P 4000 -u root -e “GRANT SELECT, INSERT, UPDATE, DELETE ON fgedudb.* TO ‘app_user’@’%’;”
# 配置密码策略
echo “配置密码策略…”
mysql -h 192.168.1.10 -P 4000 -u root -e “SET GLOBAL validate_password_length = 8;”
mysql -h 192.168.1.10 -P 4000 -u root -e “SET GLOBAL validate_password_policy = ‘MEDIUM’;”
# 启用审计日志
echo “启用审计日志…”
sed -i ‘/\[audit\]/a audit_log = true’ /tidb/app/tidb/conf/tidb.toml
sed -i ‘/audit_log = true/a audit_log_file = “/tidb/log/audit.log”‘ /tidb/app/tidb/conf/tidb.toml
sed -i ‘/audit_log_file = “/tidb/log/audit.log”/a audit_log_format = “json”‘ /tidb/app/tidb/conf/tidb.toml
sed -i ‘/audit_log_format = “json”/a audit_log_level = “info”‘ /tidb/app/tidb/conf/tidb.toml
sed -i ‘/audit_log_level = “info”/a audit_log_include = [“login”, “query”, “admin”]’ /tidb/app/tidb/conf/tidb.toml
# 重启TiDB
echo “重启TiDB…”
systemctl restart tidb
echo “数据库加固完成”
### 5.3.4 安全监控技巧
– **安全监控**:
#!/bin/bash
# security_monitoring.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置Prometheus
echo “配置Prometheus…”
cat > /tidb/app/prometheus/prometheus.yml << EOF global: scrape_interval: 15s scrape_configs: - job_name: 'tidb'
static_configs: - targets: ['192.168.1.10:10080'] - job_name: 'tikv' static_configs: - targets:
['192.168.1.20:20180', '192.168.1.21:20180' , '192.168.1.22:20180' ] - job_name: 'pd' static_configs: - targets:
['192.168.1.10:2379', '192.168.1.11:2379' , '192.168.1.12:2379' ] EOF # 重启Prometheus echo "重启Prometheus..."
systemctl restart prometheus # 配置Grafana告警 echo "配置Grafana告警..." cat> /tidb/app/grafana/alerts.yml << EOF
groups: - name: tidb-security rules: - alert: LoginFailures expr:
rate(tidb_security_login_failures_total[5m])> 5
for: 1m
labels:
severity: critical
annotations:
summary: “登录失败次数过多”
description: “在过去5分钟内,登录失败次数超过5次”
– alert: UnauthorizedAccess
expr: rate(tidb_security_unauthorized_access_total[5m]) > 0
for: 1m
labels:
severity: critical
annotations:
summary: “未授权访问”
description: “检测到未授权访问尝试”
EOF
# 重启Grafana
echo “重启Grafana…”
systemctl restart grafana-server
echo “安全监控配置完成”
### 5.3.5 安全测试技巧
– **安全测试**:
#!/bin/bash
# security_testing.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 漏洞扫描
echo “进行漏洞扫描…”
nmap -sV -p 4000,2379,20160 192.168.1.10
# SQL注入测试
echo “进行SQL注入测试…”
sqlmap -u “http://example.com/login” –data “username=admin&password=pass” –dbs
# 代码审计
echo “进行代码审计…”
sonar-scanner -Dsonar.projectKey=myapp -Dsonar.sources=src -Dsonar.host.url=http://localhost:9000
-Dsonar.login=admin -Dsonar.password=admin
# 生成测试报告
echo “生成测试报告…”
echo “=== 安全测试报告 ===” > /tidb/reports/security_test_$(date +%Y%m%d).txt
echo “Date: $(date)” >> /tidb/reports/security_test_$(date +%Y%m%d).txt
echo “漏洞扫描结果: ” >> /tidb/reports/security_test_$(date +%Y%m%d).txt
nmap -sV -p 4000,2379,20160 192.168.1.10 >> /tidb/reports/security_test_$(date +%Y%m%d).txt
echo “SQL注入测试结果: ” >> /tidb/reports/security_test_$(date +%Y%m%d).txt
sqlmap -u “http://example.com/login” –data “username=admin&password=pass” –dbs >>
/tidb/reports/security_test_$(date +%Y%m%d).txt
echo “安全测试完成,报告已保存到 /tidb/reports/security_test_$(date +%Y%m%d).txt”
### 5.3.6 应急响应技巧
– **应急响应**:
#!/bin/bash
# incident_response.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 检测安全事件
echo “检测安全事件…”
# 检查登录失败
login_failures=$(grep -i “login” /tidb/log/audit.log | grep -i “fail” | wc -l)
if [ $login_failures -gt 5 ]; then
echo “警告:检测到多次登录失败,可能存在暴力破解攻击”
fi
# 检查异常SQL
abnormal_sql=$(grep -i “union\|select.*from.*information_schema” /tidb/log/audit.log | wc -l)
if [ $abnormal_sql -gt 0 ]; then
echo “警告:检测到异常SQL语句,可能存在SQL注入攻击”
fi
# 检查权限变更
permission_changes=$(grep -i “grant\|revoke” /tidb/log/audit.log | wc -l)
if [ $permission_changes -gt 0 ]; then
echo “警告:检测到权限变更,需要审核”
fi
# 生成应急响应报告
echo “生成应急响应报告…”
echo “=== 安全事件应急响应报告 ===” > /tidb/reports/incident_response_$(date +%Y%m%d).txt
echo “Date: $(date)” >> /tidb/reports/incident_response_$(date +%Y%m%d).txt
echo “登录失败次数: $login_failures” >> /tidb/reports/incident_response_$(date +%Y%m%d).txt
echo “异常SQL次数: $abnormal_sql” >> /tidb/reports/incident_response_$(date +%Y%m%d).txt
echo “权限变更次数: $permission_changes” >> /tidb/reports/incident_response_$(date +%Y%m%d).txt
# 采取应急措施
echo “采取应急措施…”
if [ $login_failures -gt 5 ]; then
echo “暂时锁定可疑IP”
# iptables -A INPUT -s 可疑IP -j DROP
fi
echo “应急响应完成,报告已保存到 /tidb/reports/incident_response_$(date +%Y%m%d).txt”
### 5.3.7 安全自动化技巧
– **安全自动化**:
#!/bin/bash
# security_automation.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 执行系统加固
echo “执行系统加固…”
bash /tidb/scripts/system_hardening.sh
# 执行数据库加固
echo “执行数据库加固…”
bash /tidb/scripts/database_hardening.sh
# 执行安全监控配置
echo “执行安全监控配置…”
bash /tidb/scripts/security_monitoring.sh
# 执行安全测试
echo “执行安全测试…”
bash /tidb/scripts/security_testing.sh
# 执行应急响应
echo “执行应急响应…”
bash /tidb/scripts/incident_response.sh
echo “安全自动化完成”
### 5.3.8 安全文档管理技巧
– **安全文档管理**:
#!/bin/bash
# security_documentation.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 创建安全文档目录
echo “创建安全文档目录…”
mkdir -p /tidb/docs/security
# 生成系统加固文档
echo “生成系统加固文档…”
echo “=== 系统加固文档 ===” > /tidb/docs/security/system_hardening.md
echo “Date: $(date)” >> /tidb/docs/security/system_hardening.md
echo “\n## 系统补丁” >> /tidb/docs/security/system_hardening.md
echo “- 已更新所有系统补丁” >> /tidb/docs/security/system_hardening.md
echo “\n## 防火墙配置” >> /tidb/docs/security/system_hardening.md
echo “- 允许SSH (22)” >> /tidb/docs/security/system_hardening.md
echo “- 允许TiDB (4000)” >> /tidb/docs/security/system_hardening.md
echo “- 允许PD (2379)” >> /tidb/docs/security/system_hardening.md
echo “- 允许TiKV (20160)” >> /tidb/docs/security/system_hardening.md
echo “- 拒绝其他所有流量” >> /tidb/docs/security/system_hardening.md
# 生成数据库加固文档
echo “生成数据库加固文档…”
echo “=== 数据库加固文档 ===” > /tidb/docs/security/database_hardening.md
echo “Date: $(date)” >> /tidb/docs/security/database_hardening.md
echo “\n## 用户配置” >> /tidb/docs/security/database_hardening.md
mysql -h 192.168.1.10 -P 4000 -u root -e “SELECT user, host FROM mysql.user;” >>
/tidb/docs/security/database_hardening.md
echo “\n## 权限配置” >> /tidb/docs/security/database_hardening.md
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
