在开始具体操作前,必须明确两个核心原则:最小权限原则与纵深防御原则。这意味着系统内的每个用户、每个进程只应拥有完成其任务所必需的最小权限,并且安全防护应由网络、主机、应用、数据多层共同构成。
一个基础的防护架构应包含以下四层:
将档案管理系统部署在独立的网络区域,与办公网、互联网隔离。通过配置防火墙,仅允许特定IP地址或IP段访问系统服务端口。
假设档案管理系统运行在服务器的192.168.10.100:8080,仅允许运维网段(192.168.20.0/24)访问。
在服务器上执行以下命令:
``` 清空现有INPUT链规则(生产环境请谨慎,建议先备份规则) sudo iptables -F INPUT 设置默认策略为拒绝所有入站连接 sudo iptables -P INPUT DROP 允许本地回环接口通信 sudo iptables -A INPUT -i lo -j ACCEPT 允许已建立的连接和相关的数据包通过 sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 仅允许特定网段访问8080端口 sudo iptables -A INPUT -p tcp --dport 8080 -s 192.168.20.0/24 -j ACCEPT 保存规则(根据系统不同,命令可能为iptables-save > /etc/iptables/rules.v4) sudo iptables-save | sudo tee /etc/iptables/rules.v4 ```关键点:规则顺序至关重要,匹配即停止。应将最具体的规则放在前面。
在系统内部,必须实现基于角色的访问控制。首先定义清晰的角色,如“档案管理员”、“部门查阅员”、“审计员”。每个角色对应明确的权限集合。
创建以下核心表结构来管理用户、角色和权限:
``` CREATE TABLE `sys_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL UNIQUE, `real_name` varchar(50) NOT NULL, `password_hash` varchar(255) NOT NULL, -- 存储加盐哈希值,非明文 `status` tinyint(1) DEFAULT 1, PRIMARY KEY (`id`) ); CREATE TABLE `sys_role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `role_code` varchar(50) NOT NULL UNIQUE, -- 如 'ARCHIVE_ADMIN' `role_name` varchar(50) NOT NULL, -- 如 '档案管理员' PRIMARY KEY (`id`) ); CREATE TABLE `sys_permission` ( `id` int(11) NOT NULL AUTO_INCREMENT, `perm_code` varchar(100) NOT NULL UNIQUE, -- 如 'archive:document:view' `perm_name` varchar(100) NOT NULL, -- 如 '查看档案文件' PRIMARY KEY (`id`) ); CREATE TABLE `user_role` ( `user_id` int(11) NOT NULL, `role_id` int(11) NOT NULL, PRIMARY KEY (`user_id`, `role_id`), FOREIGN KEY (`user_id`) REFERENCES `sys_user`(`id`), FOREIGN KEY (`role_id`) REFERENCES `sys_role`(`id`) ); CREATE TABLE `role_permission` ( `role_id` int(11) NOT NULL, `perm_id` int(11) NOT NULL, PRIMARY KEY (`role_id`, `perm_id`), FOREIGN KEY (`role_id`) REFERENCES `sys_role`(`id`), FOREIGN KEY (`perm_id`) REFERENCES `sys_permission`(`id`) ); ```操作要点:在业务代码中,每次关键操作(如查看文件、下载、修改)前,都必须根据当前用户的角色查询其拥有的权限码(perm_code)进行校验,禁止仅依赖前端菜单隐藏。
对于存储在服务器磁盘上的敏感档案文件(如PDF、扫描件),必须进行加密。推荐使用AES-256-GCM算法,它同时提供加密和完整性验证。
在将文件存入存储目录前,先进行加密。以下是一个使用Bash脚本的示例:
``` !/bin/bash 文件加密脚本 encrypt_file.sh INPUT_FILE=$1 OUTPUT_FILE="${INPUT_FILE}.enc" 从安全的位置读取密钥,这里仅为示例。实际应将密钥存储在硬件安全模块(HSM)或配置管理服务中。 KEY_HEX="YOUR_256_BIT_KEY_HEX_HERE" 例如:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF IV_HEX=$(openssl rand -hex 12) 生成96位的随机IV 使用 AES-256-GCM 加密 openssl enc -aes-256-gcm \ -K $KEY_HEX \ -iv $IV_HEX \ -in $INPUT_FILE \ -out $OUTPUT_FILE \ -a 将IV以明文形式与加密文件关联存储(这是GCM模式的标准做法) echo $IV_HEX > "${OUTPUT_FILE}.iv" 删除原始明文文件(确保安全) shred -u $INPUT_FILE echo "文件已加密: $OUTPUT_FILE, IV已保存至: ${OUTPUT_FILE}.iv" ```
解密时,使用对应的IV和密钥进行反向操作。密钥管理是核心,绝对禁止将密钥硬编码在代码或配置文件中。应使用环境变量或专用的密钥管理服务(KMS)。
所有对档案数据的操作都必须记录不可篡改的日志。审计日志应包含:操作时间、操作人、客户端IP、操作类型(增、删、改、查)、操作对象(文件ID)、操作结果(成功/失败)、以及操作前后的关键数据快照(对于修改操作)。
记录时机:在业务逻辑执行后、返回结果前,将日志异步写入数据库。可以使用AOP(面向切面编程)或中间件统一处理,避免代码分散。
数据库是数据的最后一道防线。为档案管理系统创建独立的数据库用户,并授予最小权限。
开启数据库的二进制日志(binlog),用于数据恢复和审计追溯。在MySQL配置文件`my.cnf`中增加:
``` [mysqld] server-id = 1 log-bin = /var/lib/mysql/mysql-bin expire_logs_days = 30 binlog_format = ROW -- 使用ROW格式,记录行级更改 ```使用工具监控系统关键文件(如应用程序代码、配置文件、审计日志文件)是否被篡改。推荐使用AIDE(Advanced Intrusion Detection Environment)。
1. 在初始干净的系统状态下安装并初始化AIDE数据库:
``` sudo apt-get install aide -y Debian/Ubuntu 或 sudo yum install aide -y RHEL/CentOS sudo aideinit sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz ```2. 配置监控规则,编辑 `/etc/aide/aide.conf`,确保包含以下关键目录和文件:
``` 监控所有bin目录下的文件 /bin All /sbin All /usr/bin All /usr/sbin All 监控应用目录 /opt/archive-system All 监控配置文件 /etc All 监控审计日志目录 /var/log/archive-audit All ```3. 设置定时任务,每天执行一次完整性检查,并将报告发送给管理员:
``` sudo crontab -e 添加以下行 0 2 /usr/bin/aide --check | mail -s "AIDE Report for $(hostname)" admin@yourcompany.com ```技术措施需配合管理流程。必须预先制定并演练数据泄露应急响应预案。
定期(建议每季度)执行安全审计和渗透测试,模拟攻击者视角检验上述所有防护措施的有效性,并根据结果持续迭代改进。