CentOS 上 Fortran 程序的安全加固实践
一 系统基线加固
- 账户与权限
- 禁止 root 远程登录:编辑 /etc/ssh/sshd_config,设置 PermitRootLogin no;仅允许特定管理用户通过 AllowUsers 限制登录来源;必要时仅允许 wheel 组使用 su,在 /etc/pam.d/su 启用 pam_wheel.so。定期清理不必要的系统账户与 UID=0 的异常账户。
- 口令与登录策略
- 在 /etc/login.defs 设置密码策略(如 PASS_MAX_DAYS 90、PASS_MIN_LEN 9、PASS_WARN_AGE 7),并排查 /etc/shadow 中的空口令账户。
- 防火墙与网络
- 启用 firewalld 并仅放行必要端口(如 SSH 22/TCP):firewall-cmd --permanent --add-service=ssh && firewall-cmd --reload;结合 fail2ban 自动封禁暴力破解来源。
- SELinux
- 将 /etc/selinux/config 的 SELINUX=enforcing,必要时以 setenforce 1 临时生效,减少进程越权。
- 系统与软件更新
- 定期执行 yum/dnf update 获取安全补丁;遵循最小化安装,关闭不必要的服务与端口。
- 审计与监控
- 启用并配置 auditd 记录关键文件与命令;集中分析 /var/log/secure、/var/log/messages 等日志;使用 Lynis 进行基线审计。
二 构建与运行环境安全
- 编译器与依赖
- 仅从官方仓库安装 GCC/GFortran 等工具链;及时更新,避免使用已弃用或存在漏洞的库与工具链版本。
- 最小权限运行
- 以非特权用户运行计算任务;通过 sudo 按需授权,避免直接在 root 会话中执行不可信代码。
- 文件与目录
- 计算目录与输出目录设置合理权限(如 750/640),敏感数据禁止全局可读;必要时用 chattr +i 保护关键配置与结果文件。
- 网络最小化
- 若程序无需网络,确保防火墙未开放对应端口;若需对外服务,使用 TLS/SSL 加密传输并限制来源网段。
- 资源与隔离
- 通过 systemd 服务设置 CPU/内存/进程数 上限与 OOM 策略;对多用户环境使用 cgroups 或容器进行资源隔离。
三 Fortran 代码层面的安全要点
- 输入验证与边界检查
- 所有外部输入(文件、命令行、环境变量、网络)必须校验长度、范围与格式;严禁使用不安全的字符串函数(如 gets/scanf(“%s”)),改用 *read(string, , iostat=io) 并检查 io 与缓冲区边界。
- 安全内存与资源管理
- 避免全局变量与野指针;动态分配后检查分配是否成功,使用 intent(in/out/inout) 明确数据流向;在 deallocate 前检查指针状态,防止重复释放与越界访问。
- 错误处理与异常路径
- 检查 I/O 与系统调用返回码,避免忽略错误导致未定义行为;对异常分支统一清理资源并记录诊断信息。
- 并发与并行安全
- 使用 OpenMP 时正确设置 private/shared 与 reduction,避免数据竞争;对 MPI 应用校验消息长度与秩边界,防止越界与死锁。
- 第三方库与构建
- 仅引入必要依赖,优先使用支持安全更新的稳定版本;启用编译期与运行期检查(如 -fcheck=all -Wall -Wextra),并消除告警。
四 部署与运维清单
- 持续更新与补丁
- 建立定期 yum/dnf update 与重启策略;对安全公告建立变更评审与回滚预案。
- 日志与完整性
- 启用 auditd 对关键目录与可执行文件进行监控;使用 AIDE/Tripwire 做文件完整性校验,异常变更及时告警。
- 入侵防护
- 部署 fail2ban 保护 SSH;对异常登录、权限变更与关键文件访问设置实时告警。
- 备份与演练
- 定期备份源码、配置与计算结果,保留离线/异地副本;定期演练恢复流程与安全事件响应。
五 最小可行示例与环境变量安全
- 以受限用户运行示例
- 创建计算用户并赋权:
- useradd -m -s /bin/bash calcuser
- chmod 750 /opt/app && chown -R calcuser:calcuser /opt/app
- 使用 systemd 服务限制资源(示例):
- [Service]
User=calcuser
ExecStart=/usr/bin/mpirun -np 4 /opt/app/solver
CPUQuota=200%
MemoryLimit=4G
OOMScoreAdjust=-500
- 环境变量最小化
- 避免导入不受信任的 LD_LIBRARY_PATH/LD_PRELOAD/PATH;在程序启动脚本中显式设置必要路径,清理不必要变量,降低被劫持风险。