Skip to main content
Glama

mcp-dbutils

MIT License
81
  • Linux
  • Apple
security-best-practices.md11.3 kB
# 数据库写操作安全最佳实践 本文档提供了使用MCP数据库工具写操作功能的安全最佳实践指南。遵循这些建议可以帮助您安全地使用写操作功能,降低数据损坏或安全漏洞的风险。 > ⚠️ **重要提示**:数据库写操作具有潜在风险,可能导致数据丢失、损坏或安全漏洞。请谨慎使用,并始终遵循安全最佳实践。 ## 1. 配置安全 ### 1.1 默认只读原则 - **保持默认只读**:除非明确需要写操作,否则保持默认的只读模式 - **最小权限原则**:只为必要的连接启用写操作,只为必要的表启用写操作 - **环境隔离**:在生产环境中使用只读连接,将写操作限制在开发或测试环境 ```yaml # 推荐配置:默认只读,只有特定连接可写 connections: production_db: type: postgres # 其他连接信息... # 未指定writable,默认为false(只读) development_db: type: postgres # 其他连接信息... writable: true # 仅在开发环境启用写操作 ``` ### 1.2 细粒度权限控制 - **表级权限**:明确指定哪些表允许写操作,而不是允许所有表 - **操作级权限**:限制允许的操作类型,避免不必要的DELETE权限 - **默认拒绝策略**:使用`default_policy: read_only`作为未明确指定表的默认策略 ```yaml # 推荐配置:细粒度权限控制 write_permissions: tables: logs: operations: [INSERT] # 只允许插入,不允许更新或删除 temp_data: operations: [INSERT, UPDATE, DELETE] # 临时数据允许所有操作 default_policy: read_only # 未指定的表默认只读 ``` ### 1.3 数据库用户权限 - **专用账户**:为MCP数据库工具创建专用的数据库用户账户 - **最小权限**:只授予必要的数据库权限 - **避免管理员账户**:不要使用数据库管理员账户(如root、postgres) - **只读默认**:默认使用只读账户,只在需要时使用具有写权限的账户 **MySQL示例**: ```sql -- 创建只读用户 CREATE USER 'mcp_readonly'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT ON database_name.* TO 'mcp_readonly'@'localhost'; -- 创建有限写权限用户 CREATE USER 'mcp_writer'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT ON database_name.* TO 'mcp_writer'@'localhost'; GRANT INSERT, UPDATE ON database_name.logs TO 'mcp_writer'@'localhost'; GRANT INSERT, UPDATE, DELETE ON database_name.temp_data TO 'mcp_writer'@'localhost'; ``` **PostgreSQL示例**: ```sql -- 创建只读用户 CREATE USER mcp_readonly WITH PASSWORD 'password'; GRANT USAGE ON SCHEMA public TO mcp_readonly; GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_readonly; -- 创建有限写权限用户 CREATE USER mcp_writer WITH PASSWORD 'password'; GRANT USAGE ON SCHEMA public TO mcp_writer; GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_writer; GRANT INSERT, UPDATE ON logs TO mcp_writer; GRANT INSERT, UPDATE, DELETE ON temp_data TO mcp_writer; ``` ## 2. 操作安全 ### 2.1 SQL注入防护 虽然MCP数据库工具提供了基本的安全检查,但您仍应遵循以下实践来防止SQL注入: - **参数化查询**:使用参数化查询而不是字符串拼接 - **输入验证**:验证所有用户输入,特别是用于构建SQL的输入 - **避免动态SQL**:避免使用动态生成的SQL语句 **不安全示例**: ```sql -- 不要这样做!容易受到SQL注入攻击 "DELETE FROM users WHERE username = '" + username + "'" ``` **安全示例**: ```sql -- 使用参数化查询 "DELETE FROM users WHERE username = ?" -- 参数:username ``` ### 2.2 事务管理 - **使用事务**:将相关操作包装在事务中,确保数据一致性 - **适当的事务大小**:避免在单个事务中处理过多数据 - **错误处理**:实现适当的错误处理和回滚机制 ```sql -- 推荐:使用事务包装相关操作 BEGIN; INSERT INTO orders (customer_id, total) VALUES (123, 1000); INSERT INTO order_items (order_id, product_id, quantity) VALUES (LAST_INSERT_ID(), 456, 2); COMMIT; ``` ### 2.3 批量操作 - **使用批量语法**:使用数据库支持的批量操作语法,而不是多次单行操作 - **分批处理**:对于大量数据,分批处理以减少资源消耗和锁定时间 - **监控性能**:监控批量操作的性能和资源使用情况 ```sql -- 推荐:使用批量插入 INSERT INTO logs (event, timestamp) VALUES ('event1', '2025-05-01 10:00:00'), ('event2', '2025-05-01 10:05:00'), ('event3', '2025-05-01 10:10:00'); -- 不推荐:多次单行插入 INSERT INTO logs (event, timestamp) VALUES ('event1', '2025-05-01 10:00:00'); INSERT INTO logs (event, timestamp) VALUES ('event2', '2025-05-01 10:05:00'); INSERT INTO logs (event, timestamp) VALUES ('event3', '2025-05-01 10:10:00'); ``` ## 3. 数据安全 ### 3.1 备份策略 - **定期备份**:实施定期数据库备份策略 - **写操作前备份**:在执行重要的写操作前进行备份 - **验证备份**:定期验证备份的完整性和可恢复性 - **保留策略**:实施适当的备份保留策略 ### 3.2 数据验证 - **前置验证**:在执行写操作前验证数据的有效性和完整性 - **后置验证**:在写操作后验证数据的一致性 - **约束使用**:利用数据库约束(如外键、唯一约束)确保数据完整性 ### 3.3 敏感数据处理 - **数据脱敏**:避免在SQL语句中包含敏感数据 - **加密存储**:对敏感数据使用加密存储 - **访问控制**:实施适当的访问控制,限制对敏感数据的访问 ## 4. 监控与审计 ### 4.1 审计日志 - **启用审计日志**:确保审计日志系统已启用 - **定期审查**:定期审查审计日志,识别异常活动 - **保留策略**:实施适当的审计日志保留策略 - **安全存储**:确保审计日志的安全存储和保护 ### 4.2 监控系统 - **性能监控**:监控数据库性能,识别异常活动 - **错误监控**:监控和分析错误模式 - **资源使用**:监控资源使用情况,防止资源耗尽 - **警报设置**:设置适当的警报阈值,及时发现问题 ### 4.3 异常检测 - **基线建立**:建立正常操作的基线 - **异常识别**:识别偏离基线的异常活动 - **自动响应**:实施自动响应机制,如阻止可疑活动 - **定期审查**:定期审查和更新异常检测规则 ## 5. 应急响应 ### 5.1 事件响应计划 - **制定计划**:制定数据库安全事件响应计划 - **角色定义**:明确定义响应团队的角色和责任 - **通信渠道**:建立清晰的通信渠道 - **定期演练**:定期进行事件响应演练 ### 5.2 恢复策略 - **恢复程序**:制定明确的数据恢复程序 - **恢复点目标**:定义恢复点目标(RPO) - **恢复时间目标**:定义恢复时间目标(RTO) - **测试恢复**:定期测试恢复程序 ### 5.3 事后分析 - **根本原因分析**:进行彻底的根本原因分析 - **改进措施**:实施改进措施,防止类似事件再次发生 - **文档更新**:更新文档和程序,反映学到的经验 - **团队培训**:基于事件经验对团队进行培训 ## 6. 环境特定建议 ### 6.1 开发环境 - **隔离环境**:使用与生产环境隔离的开发环境 - **测试数据**:使用匿名化或合成的测试数据 - **宽松权限**:可以使用相对宽松的写权限配置 - **频繁重置**:定期重置开发数据库,保持干净状态 ### 6.2 测试环境 - **生产相似**:测试环境应尽可能接近生产环境 - **受控数据**:使用受控的测试数据集 - **有限权限**:实施与生产环境类似的权限控制 - **自动化测试**:使用自动化测试验证写操作的正确性 ### 6.3 生产环境 - **严格控制**:实施最严格的权限控制 - **变更管理**:实施正式的变更管理流程 - **审批流程**:要求对写操作进行多级审批 - **监控强化**:实施强化的监控和警报系统 ## 7. 安全检查清单 使用以下检查清单确保数据库写操作的安全性: ### 7.1 配置检查 - [ ] 默认连接保持只读模式 - [ ] 只为必要的连接启用写操作 - [ ] 实施细粒度的表级和操作级权限控制 - [ ] 使用最小权限原则配置数据库用户 - [ ] 配置文件权限受到适当保护 ### 7.2 操作检查 - [ ] 使用参数化查询防止SQL注入 - [ ] 相关操作包装在事务中 - [ ] 使用批量操作语法处理多条记录 - [ ] 实施适当的错误处理和回滚机制 - [ ] 在执行写操作前验证数据 ### 7.3 监控检查 - [ ] 审计日志系统已启用并正常工作 - [ ] 定期审查审计日志 - [ ] 监控系统已配置并正常工作 - [ ] 异常检测规则已定义并测试 - [ ] 警报阈值已适当设置 ### 7.4 应急检查 - [ ] 数据库备份策略已实施并测试 - [ ] 事件响应计划已制定并演练 - [ ] 恢复程序已定义并测试 - [ ] 团队成员了解其在应急响应中的角色 - [ ] 文档保持最新并易于访问 ## 8. 常见问题解答 ### 8.1 一般问题 **问**:如何确定哪些表需要写权限? **答**:分析您的应用程序需求,识别需要创建、更新或删除数据的功能。只为这些功能所需的表启用写权限。 **问**:是否可以临时启用写权限? **答**:是的,您可以临时修改配置文件启用写权限,完成操作后恢复为只读模式。建议在变更配置前备份数据。 **问**:如何处理需要跨表事务的操作? **答**:确保所有相关表都有适当的写权限,并使用数据库的事务机制确保操作的原子性。 ### 8.2 安全问题 **问**:如何防止未授权的写操作? **答**:通过配置文件控制写权限,使用最小权限原则配置数据库用户,并实施适当的访问控制。 **问**:审计日志如何帮助提高安全性? **答**:审计日志记录所有写操作,帮助您识别异常活动、追踪问题根源,并在安全事件后进行取证分析。 **问**:如何保护配置文件中的数据库凭据? **答**:限制配置文件的访问权限,考虑使用环境变量或安全的凭据管理系统存储敏感信息。 ### 8.3 性能问题 **问**:写操作会影响查询性能吗? **答**:是的,写操作可能会影响查询性能,特别是在高并发环境中。考虑在非高峰时段执行大量写操作,并优化数据库配置。 **问**:如何优化大量数据的写入? **答**:使用批量操作,分批处理数据,考虑临时禁用索引(如果可能),并在适当的时候使用事务。 **问**:审计日志会影响性能吗? **答**:审计日志可能会对性能产生轻微影响。系统设计为最小化这种影响,使用异步记录和批量写入等技术。 ## 9. 相关资源 - [数据库写操作配置指南](../configuration-write-operations.md) - [数据库写操作使用指南](../usage-write-operations.md) - [数据库写操作功能设计](./write-operations-design.md) - [审计日志系统](./audit-logging.md)

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/donghao1393/mcp-dbutils'

If you have feedback or need assistance with the MCP directory API, please join our Discord server