quadrifolia/PolyServer

GitHub: quadrifolia/PolyServer

一个面向 Debian 13 的企业级服务器安全加固基础平台,集成 25+ 安全工具和 GDPR 合规工具包,提供从网络入侵检测到自动化事件响应的纵深防御能力。

Stars: 1 | Forks: 1

# PolyServer - 强化的 Debian 服务器基础 本仓库提供了一个全面且经过安全强化的 Debian 服务器基础环境,可用作部署各种应用程序的基础平台,包括 React/Next.js 前端、PHP 后端、商业智能平台、分析服务以及其他 Web 应用程序。 ## 目录 - [概述](#overview) - [仓库结构](#repository-structure) - [基础服务器设置流程](#base-server-setup-process) - [SSH 密钥设置(推荐)](#ssh-key-setup-recommended) - [步骤 1:本地设置和配置](#step-1-local-setup-and-configuration) - [步骤 2:服务器配置](#step-2-server-provisioning) - [步骤 3:部署并运行服务器强化](#step-3-deploy-and-run-server-hardening) - [步骤 4:运行服务器强化](#step-4-run-server-hardening) - [专用服务器部署](#specialized-server-deployments) - [堡垒机设置](#bastion-host-setup) - [独立数据库服务器](#dedicated-database-server) - [应用程序部署](#application-deployment) - [部署模式](#deployment-modes) - [支持的应用程序](#supported-applications) - [部署示例](#deployment-examples) - [下一步](#next-steps) - [DSGVO/GDPR 合规性](#dsgvogdpr-compliance) - [它的作用](#what-it-does) - [可用的文档模板](#available-documentation-templates) - [可用的合规性脚本](#available-compliance-scripts) - [何时何地进行设置](#when-and-where-to-set-up) - [详细文档](#detailed-documentation) - [基础服务器功能](#base-server-features) - [基础服务器组件](#base-server-components) - [可选应用程序组件](#optional-application-components) - [更新和维护](#updating-and-maintenance) - [更新计划建议](#update-schedule-recommendations) - [更新应用程序](#updating-applications) - [更新 Debian 服务器](#updating-debian-server) - [更新 Nginx](#updating-nginx) - [更新 Netdata 监控](#updating-netdata-monitoring) - [更新验证](#update-verification) - [SSL 证书管理](#ssl-certificate-management) - [备份策略](#backup-strategy) - [主要:用于备份的 S3 兼容对象存储](#primary-s3-compatible-object-storage-for-backups) - [可选:用于本地备份的块存储](#optional-block-storage-for-local-backups) - [服务器监控和安全](#server-monitoring-and-security) - [防火墙配置](#firewall-configuration) - [Web 应用程序防火墙 (ModSecurity)](#web-application-firewall-modsecurity) - [容器安全](#container-security) - [AppArmor 保护](#apparmor-protection) - [网络入侵检测 (Suricata)](#network-intrusion-detection-suricata) - [审计框架 (auditd)](#audit-framework-auditd) - [Unbound DNS 缓存](#unbound-dns-cache) - [Netdata 监控](#netdata-monitoring) - [恶意软件防护](#malware-protection) - [Rootkit 检测](#rootkit-detection) - [文件完整性监控](#file-integrity-monitoring) - [RAID 阵列监控](#raid-array-monitoring) - [Logcheck 系统监控](#logcheck-system-monitoring) - [Logwatch 系统监控](#logwatch-system-monitoring) - [自动安全更新](#automatic-security-updates) - [带有 Fail2ban 的高级防火墙](#advanced-firewall-with-fail2ban) - [特定于应用程序的强化](#application-specific-hardening) - [事件响应工具](#incident-response-tools) - [系统监控工具](#system-monitoring-tools) - [网络监控工具](#network-monitoring-tools) - [网络诊断工具](#network-diagnostics-tools) - [文件完整性工具](#file-integrity-tools) - [事件响应参考](#incident-response-reference) - [维护和监控](#maintenance-and-monitoring) - [日志位置](#log-locations) - [监控](#monitoring) - [维护任务](#maintenance-tasks) - [灾难恢复测试](#disaster-recovery-testing) - [日志轮转和管理](#log-rotation-and-management) - [高级网络流量监控](#advanced-network-traffic-monitoring) - [自定义部署](#customizing-the-deployment) - [性能比较](#performance-comparison) - [Docker 模式优势](#docker-mode-benefits) - [裸金属模式优势](#bare-metal-mode-benefits) - [本地测试](#local-testing) - [测试不同的部署模式](#testing-different-deployment-modes) - [基于 Docker 的测试](#docker-based-testing) - [测试内容](#what-gets-tested) - [测试 PolyServer 脚本](#testing-polyserver-scripts) - [测试您的应用程序](#testing-your-applications) - [CI/CD 和测试](#cicd-and-testing) - [自动化测试工作流](#automated-testing-workflows) - [测试策略](#testing-strategy) - [本地运行测试](#running-tests-locally) - [贡献指南](#contributing-guidelines) - [工作流维护](#workflow-maintenance) ## 概述 PolyServer 为安全的 Debian 服务器部署提供了一个**基础层**,具备以下特点: ### 🔒 **安全优先设计** - **25+ 集成安全工具和框架** - **后量子密码学**:具有混合密钥交换算法的 SSH,提供面向未来的安全性 - **双栈安全**:IPv4/IPv6 支持,带有 DNSSEC 验证和完整性保护 - **深度防御**:ModSecurity WAF、Suricata IDS、带有 UFW/nftables 后端的 fail2ban - **全面的审计框架**:auditd 结合文件完整性监控和持久化检测 - **增强的访问控制**:AppArmor 强制访问控制与严格的 sudoers 配置 - **DNS 安全**:Unbound 结合 DNSSEC 验证、双栈支持和备用 DNS - **恶意软件防护**:ClamAV、Linux Malware Detect 和 rootkit 检测(RKHunter、chkrootkit) - **容器安全**:Trivy 漏洞扫描,支持基于严重性级别的过滤 - **自动安全更新**:无人值守升级,带有智能服务重启管理(needrestart 自动化) - **生产环境强化**:SSH 主机密钥生成、journald 速率限制(1000 burst)、使用 trap 函数进行错误处理 - **完整的 DSGVO/GDPR 合规性工具包**,包含自动违规响应和取证收集 ### ⚡ **性能优化** - Unbound DNS 缓存,改善响应时间 - 优化的系统设置和资源管理 - 使用 Netdata 进行实时监控以及可选的云端集成 - Systemd 看门狗服务,用于自动故障恢复 - 增强的 systemd 计时器,支持持久化执行以弥补错过的运行 ### 📋 **应用程序就绪的基础** - 与应用程序无关的安全配置 - 基于模板的配置系统 - 针对各种应用程序类型的标准化部署模式 ## 仓库结构 ``` polyserver/ ├── scripts/ # Deployment and administration scripts │ ├── deploy-unified.sh # Base configuration deployment script │ ├── generate-configs.sh # Configuration generation from templates │ ├── server-setup-bastion.sh # Specialized bastion host hardening script │ ├── configure-vrack-isolation.sh # vRack private network isolation (OVH) │ ├── audit-report.sh # Security audit reporting │ ├── breach-response-checklist.sh # DSGVO breach response procedures │ ├── collect-forensics.sh # Forensic evidence collection │ ├── data-subject-request.sh # Data subject request handling │ ├── dsgvo-compliance-check.sh # GDPR compliance verification │ ├── maldet-config.sh # Malware detection configuration │ ├── setup-dsgvo.sh # DSGVO compliance setup │ ├── trivy-scan.sh # Security vulnerability scanning │ ├── remove-apparmor.sh # AppArmor removal utility │ └── ssh-disable-password-auth.sh # SSH security hardening ├── templates/ # Template files for configuration │ ├── defaults.env # Base system configuration variables │ ├── server-setup.sh.template # Server hardening script template │ ├── apparmor/ # AppArmor security profiles │ │ └── application-profile.template │ ├── audit/ # Audit system templates │ │ ├── auditd.conf.template │ │ ├── audit.rules.template │ │ └── rules.d/ │ ├── dsgvo/ # DSGVO/GDPR compliance templates │ │ ├── contacts.conf.template │ │ ├── data_inventory.json.template │ │ ├── deletion_procedures.md.template │ │ ├── processing-activities-record.md │ │ ├── processing_records.md.template │ │ ├── retention_policy.md.template │ │ └── subject_request_procedures.md.template │ ├── netdata/ # Performance monitoring templates │ │ ├── docker.conf.template │ │ ├── health_alarm_notify.conf.template │ │ └── health.d/ │ │ └── cgroups.conf.template │ ├── mariadb/ # MariaDB/MySQL server templates │ │ └── 50-server.cnf.template # Performance-optimized MariaDB configuration │ ├── postgresql/ # PostgreSQL server templates │ │ ├── postgresql.conf.template # Performance-optimized PostgreSQL configuration │ │ └── pg_hba.conf.template # PostgreSQL authentication configuration │ ├── nginx/ # Traditional web server templates (mode-specific) │ │ ├── nginx-baremetal.conf.template # Nginx config for bare metal mode │ │ ├── nginx-docker.conf.template # Nginx config for Docker mode (reverse proxy) │ │ ├── default-baremetal.conf.template # Default site for bare metal mode │ │ ├── default-docker.conf.template # Default site for Docker mode (reverse proxy) │ │ ├── index.html.template │ │ ├── proxy_params.template │ │ └── security.conf.template │ ├── php/ # PHP-FPM configuration templates │ │ ├── www.conf.template # PHP-FPM pool configuration │ │ ├── php.ini.template # Security-hardened PHP configuration │ │ ├── 99-security.ini.template # Additional security hardening │ │ ├── security-pool.conf.template # Security-focused pool configuration │ │ └── xdebug.ini.template # Development debugging configuration │ ├── redis/ # Redis cache configuration │ │ └── redis.conf.template # Performance and security optimized Redis │ ├── scripts/ # Script templates │ │ ├── backup.sh.template │ │ └── s3backup.sh.template │ ├── suricata/ # Network intrusion detection templates │ │ └── local.yaml.template │ ├── systemd/ # System service templates │ │ └── application.service.template │ └── unbound/ # DNS resolver templates │ └── local.conf.template ├── config/ # Generated configuration files (git-ignored) │ └── [generated from templates/] # Output directory for processed templates ├── CLAUDE.md # Claude Code AI assistant context and commands ├── DSGVO.md # DSGVO/GDPR compliance guide ├── DSGVO-TOOLS.md # DSGVO/GDPR tools documentation ├── GDPR-COMPLIANCE-ROADMAP.md # GDPR implementation roadmap ├── README.md # This documentation ├── SECURITY.md # Comprehensive security documentation and guidelines ├── local-test-cleanup-docker.sh # Local Docker testing cleanup script └── local-test-docker.sh # Local Docker testing script ``` ## 高级安全功能 PolyServer 实施了企业级的安全性,具备全面的监控、检测和响应能力: ### 🛡️ **增强的安全强化** #### **APT 包安全** - **软件包锁定**:关键安全软件包被锁定以防止意外降级 - **完整性验证**:自动验证软件包签名和校验和 - **受控更新**:带有验证和回滚功能的分阶段更新 #### **持久化检测系统** - **全面监控**:监控所有自启动位置(/etc/init.d、systemd、cron、用户配置文件) - **SUID/SGID 二进制文件跟踪**:检测新的特权二进制文件和权限更改 - **基线创建**:自动化基线创建和变更检测 - **实时警报**:针对未经授权的持久化尝试发送电子邮件通知 #### **全盘加密支持** - **LUKS 检测**:自动检测磁盘加密并报告状态 - **安全状态跟踪**:全面记录加密状态 - **合规性报告**:与安全审计报告集成 #### **高级网络安全** - **IPv6 强化**:采用双重保险的方法,结合 sysctl + ip6tables + UFW - **Suricata 规则管理**:每周自动更新规则并进行配置验证 - **增强的防火墙规则**:支持应用感知过滤和速率限制 ### 📊 **监控与可观测性** #### **Netdata 云集成** - **可选的云连接**:跨多台服务器的集中监控 - **自动认领**:可配置的 Netdata Cloud 自动注册 - **移动端访问**:通过移动应用进行实时监控 - **团队协作**:共享仪表板和警报管理 #### **Systemd 可靠性增强** - **看门狗服务**:为关键服务提供自动重启 - **持久化计时器**:为错过的安全扫描和监控提供追赶执行 - **故障检测**:带有分级重启限制的增强型故障检测 - **服务监控**:带有自动恢复的实时健康检查 #### **配置备份与完整性** - **每日自动备份**:所有安全配置均经过完整性验证后备份 - **配置验证**:对 SSH、Nginx、Suricata 和 fail2ban 配置进行语法检查 - **30 天保留期**:带有可配置保留期的自动清理 - **电子邮件通知**:针对备份失败或配置损坏发出警报 ### 🔧 **高级系统强化** #### **AppArmor 强制访问控制** - **配置文件强制执行**:为 SSH、Nginx 和关键服务提供自定义配置文件 - **能力限制**:对系统能力进行精确控制 - **自动配置文件加载**:强制执行验证和抱怨模式检测 #### **无人值守升级管理** - **重启警告系统**:自动重启前的 wall 消息和电子邮件通知 - **计划维护**:可配置的维护时间窗口(默认:凌晨 4 点) - **用户通知**:清晰传达待处理的系统维护信息 #### **增强的 SSH 安全** - **HMAC 强化**:完全消除 SHA-1,仅限于 SHA-2 算法 - **算法限制**:增强的密钥交换算法(curve25519、ECDH-SHA256/512) - **密钥类型强制执行**:强化的公钥类型(RSA-SHA2、ECDSA、Ed25519) ### 🎯 **安全监控** #### **挂载选项安全审计** - **文件系统安全**:自动审计挂载选项 - **安全合规性**:验证 /tmp、/var/tmp、/home 上的安全挂载选项 - **风险评估**:检测潜在危险的挂载配置 #### **服务白名单审计** - **减少攻击面**:预定义的必要服务白名单 - **未经授权的服务检测**:针对意外运行的服务发出警报 - **安全基线**:与已知良好的服务配置进行持续比对 #### **实时安全基线** - **自动化基线创建**:初始安全状态捕获和监控 - **变更检测**:实时监控安全关键位置 - **取证能力**:为事件响应和合规性提供详细的日志记录 ## 基础服务器设置流程 ### SSH 密钥设置(推荐) 为了安全地访问您的服务器,强烈建议使用 SSH 密钥而不是密码进行身份验证。PolyServer 可以在设置期间自动配置基于 SSH 密钥的身份验证。 #### 创建 SSH 密钥 如果您还没有 SSH 密钥,请在本地机器上创建它们: **对于 Ed25519 密钥(推荐):** ``` # Generate a new Ed25519 SSH key ssh-keygen -t ed25519 -C "your-email@example.com" # When prompted, save to default location: ~/.ssh/id_ed25519 # Enter a strong passphrase when prompted ``` **对于 RSA 密钥(备选):** ``` # Generate a new RSA SSH key (4096 bits) ssh-keygen -t rsa -b 4096 -C "your-email@example.com" # When prompted, save to default location: ~/.ssh/id_rsa # Enter a strong passphrase when prompted ``` #### 获取您的公钥 显示您的公钥以将其复制到 PolyServer 配置中: ``` # For Ed25519 keys cat ~/.ssh/id_ed25519.pub # For RSA keys cat ~/.ssh/id_rsa.pub # Example output: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG4rT3vTt99Ox5kndS4HmgTrKBT8SKzhK4rhGkEVGlCI your-email@example.com ``` 复制整个输出内容(以 `ssh-ed25519` 或 `ssh-rsa` 开头),以便在下一步中使用。 #### SSH 身份验证选项 PolyServer 提供灵活的 SSH 身份验证配置: **选项 1:仅密钥身份验证(推荐)** - 在 `defaults.env` 中设置 `SSH_PUBLIC_KEY="your-ssh-public-key"` - 密码身份验证将被自动禁用 - 最安全的选项 **选项 2:密码身份验证(仅限初始设置)** - 在 `defaults.env` 中保留 `SSH_PUBLIC_KEY=""` 为空 - 密码身份验证保持启用状态以便初始访问 - 在服务器设置期间,系统会提示您设置密码 - 稍后使用 `./scripts/ssh-disable-password-auth.sh` 添加 SSH 密钥 **选项 3:稍后转换** - 从密码身份验证开始 - 手动将 SSH 密钥添加到您的服务器 - 运行转换脚本以禁用密码身份验证: # 在服务器上,添加 SSH 密钥后 sudo /opt/polyserver/scripts/ssh-disable-password-auth.sh ### 步骤 1:本地设置和配置 **在您的本地机器上运行:** 1. **克隆仓库:** git clone https://github.com/quadrifolia/PolyServer cd PolyServer 2. **创建您的配置文件:** 复制示例配置以创建您自己的 `defaults.env`: cp templates/defaults.env.example templates/defaults.env **注意:** `defaults.env` 文件已被 gitignore 忽略,以防止意外提交您的生产配置。 3. **自定义基础配置:** 编辑 `templates/defaults.env` 以设置您特定环境的值: nano templates/defaults.env **必填更改:** - `LOGWATCH_EMAIL=your-email@example.com`(用于每日安全报告) - `SSL_EMAIL=your-email@example.com`(用于 Let's Encrypt 证书) - `BASE_DOMAIN=your-domain.com`(您的实际域名) - `TIMEZONE=Your/Timezone`(例如,America/New_York) - `DEPLOYMENT_MODE=baremetal` 或 `docker`(选择您的部署策略) **Netdata Cloud 集成(可选):** 用于跨多台服务器的集中监控: # 启用带有 Cloud 集成的 Netdata NETDATA_ENABLED=true NETDATA_CLAIM_TOKEN=your_claim_token_from_netdata_cloud **电子邮件配置(推荐):** 为了可靠的安全通知交付,请配置外部 SMTP: # 启用外部 SMTP 以实现可靠的邮件发送 SMTP_ENABLED=true SMTP_SERVER=smtp.gmail.com # 或您的 SMTP 提供商 SMTP_PORT=587 SMTP_USERNAME=your-email@gmail.com SMTP_PASSWORD=your-app-password # Gmail 请使用应用专用密码 SMTP_FROM_EMAIL=your-email@gmail.com SMTP_USE_TLS=true **注意**:如果 `SMTP_ENABLED=false`,所有系统电子邮件将存储在本地 `/var/mail/root` 中 **SSH 配置:** # 对于基于密钥的身份验证(推荐): SSH_PUBLIC_KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG... your-email@example.com" # 对于密码身份验证(仅限初始设置): SSH_PUBLIC_KEY="" **可选更改:** - `HOSTNAME=polyserver`(可安全更改为您的首选主机名) - `SSH_PORT=2222`(用于安全性的自定义 SSH 端口) - `BACKEND_HOST=127.0.0.1` 和 `BACKEND_PORT=3000`(用于 Docker 模式) - `NETDATA_ENABLED=true`(启用/禁用 Netdata 监控) - 其他安全和监控设置 4. **生成配置文件:** ./scripts/generate-configs.sh 这将创建一个包含所有配置文件的 `config/` 目录,其中包括一个使用您在 `defaults.env` 中设置的自定义 `server-setup.sh` 脚本。 ### 步骤 2:服务器配置 **设置您的服务器:** 1. 从您首选的提供商处配置一台 Debian 13 (trixie) 服务器 - 推荐规格:2+ vCores,4GB+ RAM,50GB+ SSD - 确保可以使用公钥身份验证进行 SSH 访问 - 记录服务器 IP 地址和初始 SSH 端口(通常为 22) ### 步骤 3:部署并运行服务器强化 **在本地机器上运行:** 使用统一的部署脚本将所有配置文件部署到您的服务器: ``` # Basic deployment (uses defaults from templates/defaults.env) ./scripts/deploy-unified.sh --host your-server-ip # Or with custom options ./scripts/deploy-unified.sh \ --host your-server-ip \ --user root \ --port 22 \ --env-file templates/defaults.env \ --identity ~/.ssh/id_ed25519 ``` **SSH 密钥身份验证:** 部署脚本支持使用 `-i` 标志的 SSH 密钥身份验证。如果您的 SSH 密钥未被自动选择: ``` # Specify your SSH key explicitly ./scripts/deploy-unified.sh \ --host your-server-ip \ --identity ~/.ssh/id_ed25519 # Or add your key to the SSH agent for automatic selection ssh-add ~/.ssh/id_ed25519 ./scripts/deploy-unified.sh --host your-server-ip ``` **部署的内容:** - 环境配置 (`defaults.env`) → `/opt/polyserver/config/` - 服务器设置脚本 (`server-setup.sh`) → `/opt/polyserver/config/` - Nginx 配置 → `/opt/polyserver/config/nginx/` - 备份脚本 → `/opt/polyserver/scripts/` - 审计配置(如果启用) → `/opt/polyserver/config/audit/` - Unbound DNS 配置(如果启用) → `/opt/polyserver/config/unbound/` ### 步骤 4:运行服务器强化 **通过 SSH 连接到您的服务器并运行强化脚本:** ``` # Connect to your server ssh root@your-server-ip # Navigate to the config directory cd /opt/polyserver/config # Run the hardening script (reads settings from defaults.env) sudo bash server-setup.sh ``` **该脚本将自动:** - 从 `/opt/polyserver/config/defaults.env` 读取所有配置 - 更新并保护基础 Debian 系统 - 安装和配置所有安全工具 - 设置监控和日志系统 - 配置 DSGVO/GDPR 合规性框架 - 强化网络和系统访问 - 将 SSH 端口更改为 2222(之后使用此端口重新连接) **重要提示:** 脚本完成后,SSH 将在端口 2222 上运行,您将以 `deploy` 用户身份连接(而不是 root)。 ## 专用服务器部署 PolyServer 包含专门用于特定服务器角色的设置脚本,超越了标准的应用程序服务器部署。 ### 堡垒机设置 对于需要安全访问内部网络的环境,PolyServer 包含一个专门的堡垒机强化脚本。堡垒机提供了一个用于管理访问内部基础设施的安全网关。 ### 什么是堡垒机? 堡垒机是一台专门的服务器,它: - 提供对内部网络的安全 SSH 访问 - 作为系统管理的单一入口点 - 执行严格的安全策略和日志记录 - 支持到内部服务的安全隧道和端口转发 ### 设置堡垒机 **先决条件:** - 全新的 Debian 13 (trixie) 服务器 - 用于身份验证的 SSH 公钥(必需 - 不允许密码身份验证) - **服务器的 Root 访问权限**(或 sudo 权限) **设置过程:** 1. **在脚本中配置 SSH 公钥:** # 编辑堡垒机设置脚本 nano scripts/server-setup-bastion.sh # 找到这一行并替换为您实际的 SSH 公钥: SSH_PUBLIC_KEY="" # 替换为您的密钥: SSH_PUBLIC_KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG... user@domain.com" 2. **获取您的 SSH 公钥:** # 显示您的 Ed25519 公钥 cat ~/.ssh/id_ed25519.pub # 或者显示您的 RSA 公钥 cat ~/.ssh/id_rsa.pub # 复制整个输出内容以在脚本中使用 3. **部署堡垒机:** # 将脚本复制到您的服务器(以 root 身份) scp scripts/server-setup-bastion.sh root@your-bastion-ip:/root/ # 通过 SSH 以 root 身份连接到您的服务器并运行强化脚本 ssh root@your-bastion-ip chmod +x /root/server-setup-bastion.sh /root/server-setup-bastion.sh **在设置过程中,系统将提示您输入:** - 用于接收安全通知的电子邮件地址 - 可选的外部 SMTP 配置,用于可靠的邮件发送 - SMTP 服务器详细信息(推荐用于生产环境) **如果您有 sudo 访问权限的备选方法:** # 将脚本复制到您的服务器(以普通用户身份) scp scripts/server-setup-bastion.sh debian@your-bastion-ip:/home/debian/ # 通过 SSH 连接到您的服务器并使用 sudo 运行 ssh debian@your-bastion-ip chmod +x /home/debian/server-setup-bastion.sh sudo /home/debian/server-setup-bastion.sh **⚠️ 重要提示:** 该脚本必须以 root 身份运行,因为它会: - 安装和配置系统软件包 - 修改关键系统配置文件 - 设置防火墙规则和安全服务 - 配置 SSH、审计系统和内核参数 ### 堡垒机功能 堡垒机设置提供了超越标准服务器强化的增强安全性: #### 核心安全组件(始终安装) - **Fail2ban**:暴力破解防护,带有积极的 SSH 监控 - **UFW 防火墙**:限制性规则,仅开放必要端口 - **AIDE**:文件完整性监控,用于检测未经授权的更改 - **Unbound DNS**:缓存 DNS 解析器,提高性能和隐私 - **Postfix**:用于安全通知的本地邮件系统 - **AppArmor**:关键服务的强制访问控制 #### 增强的安全组件(默认启用) 这些重要的安全工具**现在默认启用**,以提供全面的堡垒机保护: - **RKHunter + chkrootkit**:Rootkit 检测和系统完整性检查(低资源消耗 - 约 10MB RAM) - **Suricata IDS**:具有实时流量分析的网络入侵检测系统(中等资源消耗 - 约 150MB RAM) **为什么这些默认启用:** - 堡垒机是需要最高安全性的高价值目标 - Rootkit 检测至关重要,且资源影响极小 - 网络 IDS 对于监控通过堡垒机网关的所有流量至关重要 - 总资源使用量:约 160MB RAM - 对现代堡垒机而言可以接受 #### 可选安全组件 提供用于特定需求的额外安全工具: ``` # Enable optional components (disabled by default) export INSTALL_CLAMAV=true # Antivirus scanning (HIGH resource - 500MB+ RAM) export INSTALL_MALDET=true # Linux Malware Detect (MEDIUM resource - disk I/O intensive) # Disable default components if needed (not recommended) export INSTALL_RKHUNTER=false # Disable rootkit detection (not recommended) export INSTALL_SURICATA=false # Disable network IDS (not recommended) # Run the script with environment preserved sudo -E ./scripts/server-setup-bastion.sh ``` **每个组件的作用:** - **ClamAV** (`INSTALL_CLAMAV`):文件的防病毒扫描。更适合邮件/文件服务器。资源消耗高。 - **Malware Detect** (`INSTALL_MALDET`):Linux 恶意软件扫描程序。更适合带有文件上传的 Web 服务器。磁盘 I/O 密集型。 - **RKHunter** (`INSTALL_RKHUNTER`):**默认启用** - 带有每日自动扫描的 Rootkit 检测。 - **Suricata** (`INSTALL_SURICATA`):**默认启用** - 监控所有堡垒机流量的网络 IDS。 **查看当前配置:** 安装后,检查哪些组件处于活动状态: ``` sudo bastionstat ``` 这显示了哪些安全服务正在运行,哪些处于非活动状态(未安装)。 #### 增强的 SSH 安全 - **仅限密钥的身份验证**:不允许密码身份验证 - **自定义 SSH 端口**:默认端口 2222 以减少攻击面 - **已启用 SSH 隧道**:支持内部访问的端口转发 - **连接限制**:最多 5 个并发会话 - **客户端保活**:自动会话管理 #### 身份验证和访问模型 **重要提示:** 堡垒机使用严格的仅限 SSH 密钥的身份验证模型,以实现最大的安全性。 **堡垒机用户帐户:** - **密码身份验证**:故意禁用(无法进行密码登录) - **SSH 密钥身份验证**:必需(必须配置您的公钥) - **Sudo 访问权限**:**仅限于**特定的白名单命令(安全强化) - **登录方式**:仅限 SSH 密钥身份验证 **Root 帐户:** - **密码**:在安装期间设置,用于紧急控制台访问 - **SSH 登录**:已禁用(root 无法通过 SSH 登录) - **控制台访问**:可通过托管服务提供商控制台进行紧急恢复 - **用例**:当 SSH 密钥丢失或堡垒机用户被锁定时的紧急访问 **Sudo 命令限制(重要!):** 堡垒机使用**严格的 sudoers** 配置,仅允许对特定的白名单命令进行无密码 sudo。这可以防止未经授权的特权升级。 **允许的命令(无需密码):** ``` # System monitoring commands sudo bastionstat # Show comprehensive bastion status sudo sshmon # Monitor SSH connections sudo bastionmail # Read system mail # Service status checks (read-only) sudo systemctl status sshd sudo systemctl is-active ssh sudo ufw status sudo fail2ban-client status # Log file access (read-only) sudo tail /var/log/auth.log sudo tail /var/log/syslog sudo tail /var/log/fail2ban.log ``` **受限命令(需要 Root 权限):** ``` # These will NOT work with sudo - use 'su -' to become root sudo ./my-script.sh # ❌ Scripts in home directory sudo systemctl restart sshd # ❌ Service control sudo apt update # ❌ Package management sudo nano /etc/ssh/sshd_config # ❌ Configuration editing ``` **如何运行管理命令:** ``` # Method 1: Use 'su -' to become root (recommended for admin tasks) bastion@bastion:~$ su - Password: [enter root password] root@bastion:~# systemctl restart sshd root@bastion:~# apt update root@bastion:~# exit # Method 2: Run allowed commands with sudo (monitoring only) bastion@bastion:~$ sudo bastionstat bastion@bastion:~$ sudo systemctl status sshd ``` **安装后:** ``` # Correct login method (SSH with key) ssh -p 2222 bastion@your-bastion-ip # Allowed sudo commands work without password bastion@bastion:~$ sudo bastionstat bastion@bastion:~$ sudo systemctl status sshd # Works immediately - no password prompt # Administrative commands require root access bastion@bastion:~$ sudo systemctl restart sshd # ❌ This will ask for password (which doesn't exist) # Solution: Use 'su -' for admin tasks bastion@bastion:~$ su - Password: [root password] root@bastion:~# systemctl restart sshd # ✅ Works # Password login attempts will FAIL (by design) ssh -p 2222 -o PubkeyAuthentication=no bastion@your-bastion-ip # This will fail - password authentication is disabled # If you need root access (emergency only) # Use hosting provider console and login as root with the password you set ``` **为什么这样设计:** - **消除密码暴力破解攻击**:无密码 = 无法暴力破解 - **强制执行强身份验证**:SSH 密钥在密码学上比密码更强大 - **限制特权升级**:白名单 sudo 命令防止未经授权的 root 访问 - **最小权限原则**:堡垒机用户可以监控但不能修改系统 - **审计跟踪**:所有访问都与特定的 SSH 密钥绑定,通过 su 进行的 root 访问会被记录 - **合规性**:满足特权访问管理(职责分离)的安全要求 - **深度防御**:即使堡垒机帐户遭到破坏,攻击者也无法运行任意的 root 命令 - **紧急恢复**:通过控制台使用 root 密码提供最后的访问手段 **常见问题:** ``` # Issue: "sudo password doesn't work" # Solution: This is expected - bastion user has no password # Only whitelisted commands work with sudo - use 'su -' for admin tasks # Issue: "sudo ./script.sh asks for password" # Solution: Scripts in home directory are not whitelisted for sudo # Either: 1) Use 'su -' to run as root, OR # 2) Install script to /usr/local/bin/ and add to sudoers # Issue: "sudo systemctl restart fails" # Solution: Only 'status' and 'is-active' are allowed, not 'restart' # Use 'su -' for service management commands # Issue: "I need to set a password for bastion user" # Solution: Don't - this defeats the security model # If you absolutely need it, see security implications below ``` **启用密码的安全影响:** 如果您绝对必须启用密码身份验证(不推荐): ``` # As root (via console) passwd bastion # Set a password nano /etc/ssh/sshd_config # Change: PasswordAuthentication no → yes systemctl restart sshd # WARNING: This significantly reduces security by: # - Allowing password brute-force attacks # - Creating weaker authentication # - Violating bastion host best practices ``` ### SSH 文件系统保护 **ℹ️ 默认禁用以确保可用性** 从最新版本开始,SSH 服务上的 **ProtectSystem 默认被禁用**,以确保系统保持可管理和可用的状态。系统管理工作正常进行,不会出现只读文件系统的问题。 #### 当前默认行为(无 ProtectSystem) 默认情况下,SSH 服务**没有文件系统限制**,提供正常的 Linux 体验: ``` Filesystem Status in SSH Sessions (Default): ✅ Fully writable: All directories including /, /etc, /var, /usr, /boot, /tmp, /home ✅ Normal system administration without restrictions ✅ apt install/update works without issues ✅ No read-only filesystem errors ``` **为什么移除了 ProtectSystem:** - ❌ 在软件包安装期间导致只读文件系统错误 - ❌ 使系统管理变得不必要的复杂 - ❌ 需要控制台访问才能执行基本的维护任务 - ❌ 破坏了 apt、dpkg 和其他标准工具 - ✅ 安全性最好通过网络隔离、防火墙和访问控制来提供 **当前安全模型:** - ✅ 网络级保护(UFW 防火墙、fail2ban、端口限制) - ✅ 访问控制(仅限基于密钥的 SSH 身份验证,无密码登录) ✅ 监控和检测(Suricata IDS、auditd、全面日志记录) - ✅ 应用程序级沙箱(各个服务拥有自己的保护) - ✅ 可正确维护和更新的可用系统 #### 运行系统更新 **默认行为(无限制):** ``` # SSH in as bastion user ssh -p 2222 bastion@your-bastion # Switch to root su - Password: [root password] # Run updates normally - everything works! apt update apt upgrade -y apt autoremove exit ``` 一切在正常的 Linux 系统上按预期工作。 #### 可选:启用 ProtectSystem 以增强安全性 **⚠️ 警告:仅在您了解其后果的情况下启用!** 如果您想不顾可用性问题添加文件系统保护,可以手动启用它: ``` # 1. Edit SSH service configuration nano /etc/systemd/system/ssh.service.d/watchdog.conf # 2. Add ProtectSystem setting: [Service] Restart=on-failure RestartSec=5 StartLimitInterval=300 StartLimitBurst=5 OOMScoreAdjust=-500 Nice=-10 # Add one of these protection levels: ProtectSystem=full # Protects /usr and /boot only (recommended if enabling) # OR ProtectSystem=strict # Protects everything (requires console access for admin) ReadWritePaths=/var/log /var/run /run /var/spool /var/tmp /var/lib /tmp /home /var/cache /var/backups /var/mail /etc # 3. Save and reload systemctl daemon-reload systemctl restart ssh ``` **启用 ProtectSystem 的后果:** - ⚠️ 可能会导致“只读文件系统”错误 - ⚠️ 可能会破坏 apt、dpkg 和软件包安装 - ⚠️ 许多管理任务需要控制台访问 - ⚠️ 使系统更难维护和更新 - ✅ 提供额外的文件系统级保护 #### 安全理念 堡垒机实施了一种**分层安全方法**,而不依赖于 ProtectSystem: **深度防御:** 1. **网络层**:UFW 防火墙、fail2ban、Suricata IDS 2. **访问层**:仅限密钥的 SSH 身份验证,无密码登录,受限制的 sudo 3. **监控层**:全面的 auditd 规则,系统日志记录,警报 4. **应用层**:各个服务在适当的地方拥有自己的沙箱 **为什么这种方法更好:** - ✅ 在关键之处提供安全性(网络周边,访问控制) - ✅ 系统保持可用和可维护 - ✅ 能够快速响应安全事件 - ✅ 适当的监控和检测能力 - ✅ 没有意外的“只读文件系统”错误中断操作 **如果攻击者获得了 SSH 访问权限:** - 他们仍然需要获取 root 权限(auditd 会记录所有尝试) - 他们所有的操作都会被记录和监控 - fail2ban 将阻止重复的失败尝试 - Suricata IDS 将检测可疑模式 - 网络隔离限制了横向移动 这提供了有效的安全性,同时保持了可用且可维护的系统。 #### 高级监控 - **全面的审计日志**:跟踪所有用户活动 - **实时 SSH 监控**:实时监控 SSH 连接 - **网络入侵检测**:带有堡垒机特定规则的 Suricata IDS - **每小时安全检查**:自动监控可疑活动 - **每日安全报告**:所有活动的详细电子邮件报告 #### 电子邮件系统配置 - **外部 SMTP 支持**:通过 Amazon SES、Gmail 等服务进行可靠投递 - **本地邮件回退**:如果未配置 SMTP,则在本地存储通知 - **自动别名**:所有本地系统帐户重定向到您配置的电子邮件 - **安全通知**:通过电子邮件发送 Sudo 使用、登录失败和系统警报 #### 网络安全 - **限制性防火墙**:仅开放必要端口(SSH、DNS、NTP、HTTP/HTTPS) - **内部网络访问**:可配置对内部网络的访问 - **增强的 fail2ban**:针对暴力攻击的积极保护 - **流量监控**:网络活动记录和分析 #### 诊断和管理工具(始终安装) - **网络诊断**:nmap、ncat、socat、mtr、traceroute、tcpdump - **系统监控**:htop、iotop、atop、sysstat - **自定义命令**:`bastionstat`(系统状态)、`sshmon`(SSH 监控)、`bastionmail`(本地邮件阅读器) 注意:安全扫描工具(ClamAV、maldet、rkhunter、chkrootkit)是**可选的**,仅当通过环境变量明确启用时才会安装(请参阅上面的可选安全组件部分)。 ### 使用堡垒机 设置完成后,连接到您的堡垒机: ``` # Connect to bastion host ssh -p 2222 bastion@your-bastion-ip # Use built-in status command (requires root privileges for UFW/system access) sudo bastionstat # Monitor SSH activity in real-time (requires root privileges for auth.log access) sudo sshmon # Access internal servers through the bastion ssh -J bastion@your-bastion-ip:2222 user@internal-server # Create SSH tunnel for web access ssh -L 8080:internal-server:80 -p 2222 bastion@your-bastion-ip # Then access http://localhost:8080 in your browser # Read local mail (if using local delivery mode) bastionmail # Access Netdata monitoring (if installed) netdata-bastion ``` #### 堡垒机的可选 Netdata 集成 堡垒机可以选择包含 Netdata 监控以增强可见性: ``` # Enable Netdata during bastion setup by setting: export INSTALL_NETDATA=true # Or configure Netdata Cloud integration with environment variable: export NETDATA_CLAIM_TOKEN=your_claim_token ``` **堡垒机监控优势:** - SSH 连接跟踪和分析 - 用于安全分析的资源使用监控 - 网络流量与安全事件的关联 - 与集中监控仪表板集成 - 用于远程堡垒机监控的移动端访问 ### 安全注意事项 **重要的安全提示:** - 堡垒机应该是专用服务器(不运行其他应用程序) - 配置外部 SMTP 以实现可靠的安全通知投递 - 定期检查审计日志和安全报告 - 使用安全补丁保持堡垒机更新 - 监控网络流量模式是否存在异常 - 为堡垒机用户实施适当的访问控制 **网络架构:** - 将堡垒机放置在 DMZ 或公共子网中 - 仅限内部网络访问必要的端口 - 使用安全组/防火墙限制堡垒机访问 - 监控堡垒机和内部网络之间的所有流量 ### 自定义堡垒机配置 您可以通过编辑脚本变量来自定义堡垒机: ``` # Edit these variables in the script before deployment: USERNAME="bastion" # Bastion user account HOSTNAME="bastion" # Server hostname SSH_PORT="2222" # SSH port INTERNAL_NETWORK="10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" # Allowed internal networks ALLOWED_INTERNAL_PORTS="22,80,443,3306,5432" # Ports accessible on internal networks ``` 有关更高级的配置,请查看脚本中全面的审计规则和监控设置。 ### 独立数据库服务器 对于独立数据库服务器的部署,请使用启用了数据库组件的常规服务器设置: **设置步骤:** 1. **配置 `templates/defaults.env`**: # 启用数据库服务器 INSTALL_MARIADB=true INSTALL_POSTGRESQL=true # 可选 # 禁用应用服务器(用于独立数据库服务器) INSTALL_NGINX=false INSTALL_PHP=false INSTALL_NODEJS=false 2. **生成并部署**: ./scripts/generate-configs.sh ./scripts/deploy-unified.sh --host db-server-ip --identity ~/.ssh/id_ed25519 3. **可选:配置 vRack 私有网络**: # 在数据库服务器上,设置完成后 sudo ./scripts/configure-vrack-isolation.sh **主要特性:** - **自动调整性能**:根据可用 RAM 和 CPU 优化设置 - 独立服务器:MariaDB 分配 75% RAM,PostgreSQL 分配 50% - 混合服务器:MariaDB 分配 40% RAM,PostgreSQL 分配 20% - **安全强化**:限制 root 访问,生成强密码,配置防火墙 - **私有网络支持**:通过 `configure-vrack-isolation.sh` 可选集成 vRack - **生产就绪**:自动备份,健康监控,全面的文档 - **监控**:集成了带有 MySQL 和 PostgreSQL 的 go.d 收集器的 Netdata ## 应用程序部署 在设置好强化的基础服务器之后,您可以使用任一部署模式部署各种应用程序。您在 `defaults.env` 中对 `DEPLOYMENT_MODE` 的选择决定了应用程序的部署和管理方式。 ### 部署模式 #### 🐳 **Docker 模式** (`DEPLOYMENT_MODE=docker`) - 应用程序在带有 Docker/Docker Compose 的容器中运行 - Nginx 被配置为容器的反向代理 - 轻松扩展、隔离和管理 - 非常适合现代微服务架构 #### 🔧 **裸金属模式** (`DEPLOYMENT_MODE=baremetal`) - 应用程序直接在服务器上运行 - Nginx 提供静态文件并代理到本地服务 - 以最小的开销实现最大性能 - 非常适合单一应用程序或遗留系统 ### 支持的应用程序 PolyServer 基础支持部署: #### 🌐 **前端应用程序** - **Docker 模式**:在容器中运行 React/Next.js,使用 Nginx 反向代理 - **裸金属模式**:结合 PM2 运行 React/Next.js,使用 Nginx 提供静态文件 - **静态站点**:在两种模式下均使用优化的 Nginx 服务 #### 🔧 **后端服务** - **Docker 模式**:容器化的 PHP、Node.js、Python 应用程序 - **裸金属模式**:PHP-FPM,结合 PM2 运行的 Node.js,直接服务管理 - **API 服务**:在容器或直接部署中的 RESTful 和 GraphQL API #### 📊 **分析与监控** - **Docker 模式**:Metabase、Superset、Grafana 作为容器运行 - **裸金属模式**:结合 systemd 服务的直接安装 - **Matomo**:在任一模式下运行注重隐私的 Web 分析 #### 🗄️ **数据库系统** - **Docker 模式**:带有持久卷的 PostgreSQL、MySQL、Redis 容器 - **裸金属模式**:发挥全部性能的原生数据库安装 - **备份集成**:S3 备份在两种模式下均无缝工作 ### 部署示例 #### Docker 模式示例:容器化的 React 应用 ``` # 1. Set Docker mode in configuration echo "DEPLOYMENT_MODE=docker" >> templates/defaults.env # 2. Generate Docker-optimized configs ./scripts/generate-configs.sh # 3. Deploy configuration to server ./scripts/deploy-unified.sh --host server.example.com # 4. SSH to server and run server-setup.sh ssh root@server.example.com cd /opt/polyserver/config && sudo bash server-setup.sh # 5. Create application Docker Compose file cat > docker-compose.yml << EOF version: '3.8' services: app: image: my-react-app:latest container_name: react-app restart: unless-stopped ports: - "3000:3000" networks: - polyserver-network environment: - NODE_ENV=production networks: polyserver-network: external: true EOF # 5. Deploy application docker compose up -d ``` #### 裸金属模式示例:PM2 React 应用 ``` # 1. Set bare metal mode in configuration echo "DEPLOYMENT_MODE=baremetal" >> templates/defaults.env # 2. Generate bare metal optimized configs ./scripts/generate-configs.sh # 3. Deploy configuration to server ./scripts/deploy-unified.sh --host server.example.com # 4. SSH to server and run server-setup.sh ssh root@server.example.com cd /opt/polyserver/config && sudo bash server-setup.sh # 5. Deploy React application directly npm run build pm2 start ecosystem.config.js ``` ### 下一步 1. **选择部署模式**:根据您的需要在 Docker 或裸金属之间做出决定 2. **配置应用程序**:设置特定于应用程序的配置文件 3. **部署基础**:使用生成的配置部署强化的服务器 4. **部署应用程序**:遵循特定模式的部署模式 5. **监控和维护**:无论采用哪种部署模式,都使用内置的监控工具 ## DSGVO/GDPR 合规性 **⚠️ 可选**:本节仅与您需要遵守欧盟数据保护法规 (DSGVO/GDPR) 的情况有关。如果您不处理欧盟个人数据,请跳过此部分。 本仓库包含一个全面的 DSGVO/GDPR 合规工具包,通过提供以下内容帮助您满足数据保护要求: - 用于所需 GDPR 记录的**文档模板** - 用于处理数据泄露的**事件响应脚本** - 用于检查您设置的**合规性验证工具** - 用于 GDPR 权利(访问、删除等)的**数据主体请求处理器** ### 它的作用 DSGVO 合规工具包提供了即用型模板和工具,用于: 1. **第 30 条记录**:数据处理活动的文档(法律要求) 2. **数据泄露响应**:分步程序和自动取证收集 3. **数据主体请求**:处理访问、删除和可携带性请求 4. **保留策略**:记录您保留数据的时间及原因 5. **合规性验证**:自动检查您的 GDPR 合规状态 ### 可用的文档模板 位于 `templates/dsgvo/`: - **processing-activities-record.md**:第 30 条处理活动记录 - **processing_records.md.template**:详细的数据处理文档 - **retention_policy.md.template**:数据保留策略 - **deletion_procedures.md.template**:安全数据删除程序 - **subject_request_procedures.md.template**:数据主体请求处理 - **contacts.conf.template**:DPO 和数据控制者联系信息 ### 可用的合规性脚本 位于 `scripts/`: - **breach-response-checklist.sh**:交互式数据泄露响应指南 - **collect-forensics.sh**:自动取证证据收集 - **dsgvo-compliance-check.sh**:验证 GDPR 合规状态 - **data-subject-request.sh**:处理数据访问/删除请求 - **setup-dsgvo.sh**:在服务器上安装所有 DSGVO 文件 ### 何时何地进行设置 **重要提示**:DSGVO 工具包是在基础服务器设置完成**之后**安装在**服务器上**的。 #### 安装过程 1. **首先完成基础服务器设置**(上面的基础服务器设置流程中的步骤 1-4) 2. **将设置脚本复制到您的服务器**: # 从您的本地机器 scp -P 2222 scripts/setup-dsgvo.sh deploy@your-server-ip:/tmp/ 3. **通过 SSH 连接到您的服务器并运行设置**: # 连接到您的服务器 ssh -p 2222 deploy@your-server-ip # 运行 DSGVO 设置脚本(需要 sudo) sudo bash /tmp/setup-dsgvo.sh #### 安装了什么 设置脚本在服务器上安装文件: **配置文件** → `/etc/dsgvo/`: - `contacts.conf` - DPO 联系信息 - `data_inventory.json` - 已处理数据的清单 - `processing_records.md` - 处理活动记录 - `retention_policy.md` - 数据保留策略 - `deletion_procedures.md` - 删除程序 - `subject_request_procedures.md` - 主体请求处理 **脚本** → `/opt/polyserver/scripts/`: - `breach-response-checklist.sh` - 违规响应指南 - `collect-forensics.sh` - 取证收集 - `dsgvo-compliance-check.sh` - 合规性检查器 - `data-subject-request.sh` - 请求处理器 **日志目录** → `/var/log/`: - `/var/log/dsgvo/` - 合规性日志 - `/var/log/security/incidents/` - 安全事件日志 #### 安装后 1. **使用您组织的信息自定义模板**: # 编辑服务器上的模板 sudo nano /etc/dsgvo/contacts.conf sudo nano /etc/dsgvo/processing_records.md # ... 根据需要编辑其他文件 2. **根据需要使用合规工具**: # 检查合规状态 sudo /optolyserver/scripts/dsgvo-compliance-check.sh # 处理数据主体请求 sudo /opt/polyserver/scripts/data-subject-request.sh # 响应数据泄露 sudo /opt/polyserver/scripts/breach-response-checklist.sh ### 详细文档 有关 DSGVO 合规要求、程序和工具使用的完整信息,请参阅: - **[DSGVO.md](./DSGVO.md)**:包含违规程序和通知要求的主要合规指南 - **[DSGVO-TOOLS.md](./DSGVO-TOOLS.md)**:所有工具及其用法的详细概述 ## 基础服务器功能 PolyServer 基础提供了一套全面的安全、性能和合规性功能: ### 安全强化 #### 多层防御 - **UFW 防火墙**:具有最少开放端口的限制性防火墙 - **Fail2ban**:用于暴力破解防护的动态 IP 阻止 - **ModSecurity WAF**:带有 OWASP 核心规则集的 Web 应用程序防火墙 - **Suricata IDS**:网络入侵检测和防御 #### 系统安全 - **AppArmor**:应用程序的强制访问控制 - **审计框架**:全面的系统活动监控 - **文件完整性监控**:AIDE 用于检测未经授权的更改 - **可选恶意软件防护**:ClamAV 和 Linux Malware Detect(可配置) #### 访问控制 - **SSH 强化**:灵活的身份验证(基于密钥或密码),自定义端口 - **强身份验证**:强制执行强密码和访问策略 - **特权升级保护**:受限的 sudo 访问和监控 #### 电子邮件与通知系统 - **外部 SMTP 支持**:通过 Gmail、Amazon SES、Outlook 等进行可靠投递 - **本地邮件回退**:禁用 SMTP 时在本地存储通知 - **电子邮件别名**:所有本地系统帐户重定向到配置的电子邮件地址 - **安全通知**:针对恶意软件、rootkit、登录失败和系统事件的自动警报 - **Amazon SES 兼容性**:适当的发件人重写和 UTF-8 处理 ### 性能优化 #### 网络性能 - **Unbound DNS 缓存**:本地 DNS 解析器,改善响应时间 - **Nginx 优化**:高性能 Web 服务器配置 - **连接池**:优化的数据库和服务连接 #### 系统性能 - **资源监控**:实时系统资源跟踪 - **进程管理**:优化的服务配置 - **磁盘 I/O 优化**:高效的存储访问模式 ### 监控与日志记录 #### 实时监控 - **Netdata**:全面的系统性能监控 - **资源跟踪**:CPU、内存、磁盘和网络监控 - **健康检查**:自动化服务健康验证 #### 安全日志记录 - **集中式日志记录**:结构化的日志收集和分析 - **Logwatch**:每日系统活动报告 - **Logcheck**:针对安全事件的自动化日志分析 - **审计跟踪**:完整的系统活动审计 ## 基础服务器组件 ### 安全框架 PolyServer 基础包括: 1. 具有安全优先配置的**强化基础系统** 2. 结合 Netdata、审计日志和入侵检测的**全面监控** 3. **自动安全更新**和可选的恶意软件扫描 4. **DSGVO/GDPR 合规**工具和程序 5. 用于轻松自定义的**基于模板的配置** 6. 用于安全事件的**事件响应工具** ## 可选应用程序组件 PolyServer 使用基于配置的方法来安装组件。您可以通过在运行服务器设置之前在 `templates/defaults.env` 中设置标志来选择要安装的组件。 ### 组件配置 编辑 `templates/defaults.env` 以启用/禁用组件(除 Nginx、Docker 和 Git 外,其他默认均为 false): ``` # Web server (required for web applications) INSTALL_NGINX=true # Nginx web server # Application runtimes (install only what you need) INSTALL_PHP=false # PHP 8.4 with php-fpm (disable for Docker-only setups) INSTALL_NODEJS=false # Node.js LTS with npm # Databases (install only what you need) INSTALL_MARIADB=false # MariaDB/MySQL database server INSTALL_POSTGRESQL=false # PostgreSQL database server INSTALL_REDIS=false # Redis in-memory data store # Container platform INSTALL_DOCKER=true # Docker CE with docker-compose # Development tools INSTALL_GIT=true # Git version control ``` ### 🐳 **容器平台** - **带有安全优化的 Docker** (INSTALL_DOCKER=true) - 具有强化守护程序配置的容器运行时 - 具有日志记录限制的安全守护程序配置 - 用于增强安全性的用户命名空间重映射 - 存储驱动优化 (overlay2) - 资源限制和安全配置文件 ### 🌐 **Web 服务器** - **Nginx** (INSTALL_NGINX=true) - 高性能 HTTP 服务器和反向代理 - ModSecurity WAF 集成,带有 OWASP 核心规则集 - 包含安全强化配置 - 速率限制和 DDoS 保护 - SSL/TLS 优化 - 非常适合 Docker 反向代理设置或传统的 PHP 托管 ### 🐘 **数据库系统** - **MariaDB**:高性能兼容 MySQL 的数据库 - 安全安装,禁用远程 root 访问 - 基于可用 RAM/CPU 的性能优化 - 自动安全强化配置 - 资源感知:专用服务器分配 75% RAM,混合部署分配 40% - 自动备份和 Netdata 监控集成 - **PostgreSQL**:高级开源关系数据库 - 基于角色的访问控制,使用 scram-sha-256 身份验证 - SSL/TLS 加密支持(可配置) - 性能优化的配置模板 - SSD 优化的查询规划器设置 - 全面的日志记录和统计跟踪 - 可选的复制支持 - **配置模板**:有关优化配置,请参阅 `templates/postgresql/` #### 数据库配置架构 MariaDB 和 PostgreSQL 都使用**分层配置方法**,将基于模板的自定义与自动化的系统特定优化相结合: **配置层(按顺序加载):** 1. **基础配置**(来自您的模板) - MariaDB:`50-server.cnf`(由 `templates/mariadb/50-server.cnf.template` 生成) - PostgreSQL:`postgresql.conf`(由 `templates/postgresql/postgresql.conf.template` 生成) - 包含您自定义的安全设置、网络、日志记录和功能标志 2. **系统特定优化**(在安装期间自动生成) - MariaDB:`60-performance.cnf`(根据检测到的 CPU/RAM 自动创建) - PostgreSQL:`conf.d/99-polyserver-optimization.conf`(自动创建) - 仅覆盖性能关键设置(缓冲池、连接、工作线程) - 计算基于:总 RAM、CPU 核心数、是否与其他数据库共存 **安装过程:** 1. 软件包安装创建供应商默认值 2. 供应商默认值被备份(`.backup-YYYYMMDD-HHMMSS` 文件) 3. 您基于模板的配置从 `/opt/polyserver/config/` 安装(如果已部署) 4. 系统特定的优化层添加在顶层 5. 服务在激活的分层配置下启动 **优势:** - **定制化**:通过模板完全控制基础设置(安全性、行为、功能) - **优化**:自动硬件感知资源分配 - **灵活性**:优化仅覆盖性能设置,而不覆盖您的安全/网络配置 - **安全性**:在进行任何修改之前备份所有默认值 **资源分配示例(256GB RAM 服务器,32 个 CPU 核心):** - **主数据库**(仅 MariaDB):约 75% RAM(193GB 缓冲池) - **辅助设置**(MariaDB + PostgreSQL):MariaDB 获得约 75%(193GB),PostgreSQL 获得约 20%(51GB) - **工作线程**:自动扩展至 CPU 数量(32 核心 = 64-128 个工作线程) - **保留您的设置**:绑定地址、安全选项、日志配置保持不变 **查看活动配置:** ``` # MariaDB - see all loaded configs in order mysql -e "SHOW VARIABLES LIKE 'performance%';" # PostgreSQL - see effective configuration sudo -u postgres psql -c "SHOW ALL;" | grep shared_buffers ``` #### 私有网络的数据库用户配置 MariaDB 和 PostgreSQL 在安装时默认仅允许本地主机访问(MariaDB 为 `bind-address = 127.0.0.1`,PostgreSQL 为 `listen_addresses = 'localhost'`)。对于在独立机器或私有网络上部署应用服务器的生产环境,您需要适当配置数据库访问。 **选项 1:私有网络访问(推荐)** 如果使用私有网络(例如,OVH vRack、AWS VPC、私有 VLAN): 1. **配置 vRack 隔离**(用于 OVH vRack 私有网络): sudo ./scripts/configure-vrack-isolation.sh 此脚本会自动: - 为 vRack 网络接口配置 netplan - 更新 MariaDB/PostgreSQL 的绑定地址以监听 vRack 私有 IP - 配置特定接口的防火墙规则 - 创建 `/usr/local/bin/vrack-status` 验证脚本 - 在 `/root/VRACK-CONFIGURATION.md` 中生成全面的文档 配置完成后,使用以下命令验证状态: sudo /usr/local/bin/vrack-status 2. **创建受限于私有网络的数据库用户**: **MariaDB 示例**: # 以 root 身份连接(自动使用 /root/.my.cnf) mysql -- 创建数据库 CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建受限于私有网络的用户 CREATE USER 'myapp'@'10.0.%' IDENTIFIED BY 'secure_password_here'; -- 授予权限 GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'10.0.%'; FLUSH PRIVILEGES; **PostgreSQL 示例**: # 以 postgres 用户连接 sudo -u postgres psql -- 创建数据库 CREATE DATABASE myapp OWNER postgres; -- 创建用户 CREATE USER myapp WITH PASSWORD 'secure_password_here'; -- 授予权限 GRANT ALL PRIVILEGES ON DATABASE myapp TO myapp; 然后更新 `pg_hba.conf` 以允许私有网络访问: # 编辑 PostgreSQL 客户端身份验证 sudo nano /etc/postgresql/*/main/pg_hba.conf # 为私有网络添加行(例如 10.0.0.0/8) host myapp myapp 10.0.0.0/8 scram-sha-256 重启 PostgreSQL: sudo systemctl restart postgresql 3. **为私有网络访问配置防火墙**: **MariaDB (端口 3306)**: # 允许来自整个私有网络 sudo ufw allow from 10.0.0.0/8 to any port 3306 proto tcp comment 'MySQL from private network' # 或仅允许来自特定子网 sudo ufw allow from 10.0.1.0/24 to any port 3306 proto tcp comment 'MySQL from app servers' **PostgreSQL (端口 5432)**: # 允许来自整个私有网络 sudo ufw allow from 10.0.0.0/8 to any port 5432 proto tcp comment 'PostgreSQL from private network' # 或仅允许来自特定子网 sudo ufw allow from 10.0.1.0/24 to any port 5432 proto tcp comment 'PostgreSQL from app servers' **选项 2:特定 IP 地址访问** 适用于单一应用服务器或特定机器: **MariaDB**: ``` -- Create user for specific IP CREATE USER 'myapp'@'10.0.1.50' IDENTIFIED BY 'secure_password_here'; GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'10.0.1.50'; FLUSH PRIVILEGES; ``` **PostgreSQL pg_hba.conf**: ``` # Allow specific IP only host myapp myapp 10.0.1.50/32 scram-sha-256 ``` **防火墙**: ``` # MariaDB - allow from specific IP sudo ufw allow from 10.0.1.50 to any port 3306 proto tcp comment 'MySQL from app server' # PostgreSQL - allow from specific IP sudo ufw allow from 10.0.1.50 to any port 5432 proto tcp comment 'PostgreSQL from app server' ``` **常见 IP 范围模式**: - `'user'@'10.0.%'` - 所有 10.0.x.x 网络(例如,10.0.0.0/16) - `'user'@'10.0.1.%'` - 仅 10.0.1.x 子网(例如,10.0.1.0/24) - `'user'@'10.0.1.50'` - 仅限特定 IP - `'user'@'192.168.%'` - 所有 192.168.x.x 网络 - `'user'@'%'` - 所有 IP(不推荐,有安全风险!) **安全最佳实践**: - ✅ **使用私有网络**:永远不要将数据库直接暴露在公共互联网上 - ✅ **按 IP/网络限制**:始终将访问限制为特定的 IP 或私有子网 - ✅ **强密码**:使用 `openssl rand -base64 32` 生成安全密码 - ✅ **最小权限原则**:仅授予必要的权限 - ✅ **监控访问**:定期检查数据库日志(`/var/log/mysql/`、`/var/log/postgresql/`) - ❌ **避免**:`GRANT ALL PRIVILEGES ON *.* TO 'user'@'%'`(权限过大) **测试连通性**: 从应用服务器上: ``` # Test MariaDB connection mysql -h 10.0.1.10 -u myapp -p myapp # Test PostgreSQL connection psql -h 10.0.1.10 -U myapp -d myapp ``` **故障排除**: 1. 检查数据库是否正在监听正确的 IP:`ss -tlnp | grep -E '3306|5432'` 2. 检查防火墙规则:`sudo ufw status | grep -E '3306|5432'` 3. 检查数据库用户主机模式:`SELECT user, host FROM mysql.user;` (MariaDB) 4. 检查 pg_hba.conf 条目:`sudo cat /etc/postgresql/*/main/pg_hba.conf` 5. 查看数据库错误日志:`/var/log/mysql/error.log` 或 `/var/loggresql/*.log` ### 📦 **缓存和存储** - **Redis**:内存数据结构存储 - 带有身份验证的安全配置 - 内存优化设置 - 用于数据持久性的持久化配置 ### 🔧 **开发平台** #### **PHP 开发栈**(默认 INSTALL_PHP=false) - **带有 php-fpm 的 PHP 8.4**:带有 FastCGI 进程管理器的最新 PHP - 常用扩展:mysqli、pdo、curl、gd、mbstring、xml、zip、pgsql、redis - 启用 OPcache 以提高性能 - 安全强化(禁用危险函数) - **注意**:对于仅在 Docker 中运行应用程序的设置不需要 #### **Node.js 开发栈**(默认 INSTALL_NODEJS=false) - **Node.js LTS**:JavaScript 运行时 - 来自官方 NodeSource 仓库的最新 LTS 版本 - 包含 NPM 包管理器 - **注意**:考虑使用 PM2 进行生产进程管理(单独安装) ### 🔧 **开发工具**(默认 INSTALL_GIT=true) - **Git**:具有优化配置的版本控制 - 注重安全的默认配置 - 针对大型仓库的性能优化 - 与系统安全监控集成 ### 🖥️ **高级监控工具**(可选) - **serverstatus**:全面的服务器健康和状态报告 - **logmon**:针对不同日志类型(auth、security、system、nginx)的实时日志监控 - **servermail**:本地系统邮件和通知阅读器 ### 组件安装 所有组件均通过 `templates/defaults.env` 在运行设置脚本之前进行配置。每个组件的安装都包含: - **安全优先配置**:所有服务均按安全最佳实践进行配置 - **性能优化**:针对生产服务器环境进行调优 - **与监控集成**:自动与系统监控和日志记录集成 - **DSGVO 合规性**:在适用的地方记录数据处理程序 **配置示例:** **仅 Docker 反向代理**(最小设置): ``` INSTALL_NGINX=true INSTALL_DOCKER=true INSTALL_GIT=true # All others false ``` **传统 PHP 托管**: ``` INSTALL_NGINX=true INSTALL_PHP=true INSTALL_MARIADB=true INSTALL_REDIS=true INSTALL_GIT=true ``` **全栈 Node.js 开发**: ``` INSTALL_NGINX=true INSTALL_NODEJS=true INSTALL_POSTGRESQL=true INSTALL_REDIS=true INSTALL_DOCKER=true INSTALL_GIT=true ``` ## 更新和维护 定期更新对于安全性和功能性至关重要。本节为您的部署中所有组件的更新过程提供了全面的指导。 ### 更新计划建议 | 组件 | 自动更新 | 手动更新频率 | 优先级 | 指导 | |----------------------|-------------------|-------------------------|----------|---------------------------------------------------------------------| | Applications | 否 | 根据需要 | 高 | 遵循应用程序发行说明,先在预发布环境中测试 | | Docker Engine | 否 | 每季度 | 高 | `apt upgrade docker-ce`(仅限 Docker 模式) | | 容器镜像 | 否 | 每周 | 高 | `docker compose pull && docker compose up -d`(仅限 Docker 模式) | | Debian OS (安全) | 是 | - | 高 | 每晚自动应用,每周检查日志 | | Debian OS (完整) | 否 | 每月 | 中 | 在维护窗口期间应用 | | Nginx | 否 | 每半年 | 中 | 仅当有安全更新可用时 | | Netdata | 是 | - | 低 | 通过系统包管理器自动更新 | | ClamAV | 是 | - | 中 | 特征码每天更新,请在日志中验证 | | Linux Malware Detect | 是 | - | 中 | 特征码每天更新,每周检查日志 | | ModSecurity | 否 | 每季度 | 高 | 使用 `git pull` 更新 OWASP CRS 规则 | | Trivy | 是 | - | 中 | 扫描时更新数据库,请在日志中验证 | | Suricata | 否 | 每月 | 高 | 使用 ET Open 规则更新规则集 | | AppArmor | 否 | 重大更新后 | 中 | 在应用程序版本更改后复查 | | 审计框架 | 否 | 每季度 | 高 | 复查并更新规则以匹配系统更改 | | Unbound DNS | 否 | 每季度 | 低 | 从 IANA 更新根提示文件 | | RKHunter | 是 | 每月 | 高 | 数据库自动更新,属性数据库需要手动更新 | | chkrootkit | 否 | 每月 | 高 | 运行 `apt install --only-upgrade chkrootkit` | | AIDE | 否 | 每月 | 高 | 使用 `sudo aideinit` 更新数据库 | ### 更新应用程序 更新过程取决于您的部署模式: #### Docker 模式更新 对于容器化的应用程序: ``` # 1. Pull new container image docker pull my-app:latest # 2. Update using Docker Compose docker compose pull docker compose up -d # 3. Verify deployment docker compose ps docker compose logs app ``` #### 裸金属模式更新 对于直接部署的应用程序: ``` # 1. Stop application gracefully pm2 stop my-app # For Node.js apps systemctl stop my-app # For systemd services # 2. Update application code git pull origin main npm install --production # For Node.js composer install --no-dev # For PHP # 3. Restart application pm2 restart my-app systemctl start my-app # 4. Verify application is running pm2 status systemctl status my-app ``` #### 常规更新验证 无论采用哪种部署模式: 1. 检查应用程序 Web 界面的可访问性 2. 验证应用程序日志中是否存在错误 3. 测试核心功能 4. 在更新期间和之后监控系统资源 ### 更新 Debian 服务器 默认情况下自动安全更新已启用,但应定期进行手动的完整系统更新。请每月遵循以下步骤: ``` # Connect to your server ssh -p 2222 deploy@your-server-ip # Update package lists sudo apt update # Check available updates (review before applying) apt list --upgradable # Check automatic update logs cat /var/log/unattended-upgrades/unattended-upgrades.log # Apply all updates (during maintenance window) sudo apt upgrade -y # Reboot if kernel was updated [ -f /var/run/reboot-required ] && sudo reboot ``` #### 关于自动安全更新 服务器默认配置为启用自动安全更新: - 安全补丁会自动应用 - 如果需要,会在凌晨 2 点进行自动重启 - 每周清理旧的软件包 - 错误通知会发送给 root 用户 要修改此配置,请编辑以下文件: ``` sudo nano /etc/apt/apt.conf.d/20auto-upgrades # Update frequency sudo nano /etc/apt/apt.conf.d/50unattended-upgrades # Update behavior ``` 要禁用自动更新(不推荐): ``` sudo dpkg-reconfigure -plow unattended-upgrades # Select "No" when prompted ``` ### 更新 Nginx Nginx 的更新频率较低,但对安全性很重要: ``` # Check for Nginx updates sudo apt update apt list --upgradable | grep nginx # Update Nginx packages sudo apt install --only-upgrade nginx # Test configuration sudo nginx -t # Reload Nginx configuration sudo systemctl reload nginx ``` ### 更新 Netdata 监控 Netdata 在系统上原生安装,并通过系统包管理器自动更新: ``` # Check Netdata status sudo systemctl status netdata # Manual update (if needed) sudo apt update && sudo apt upgrade netdata # Restart Netdata after configuration changes sudo systemctl restart netdata ``` ### 更新验证 在完成任何更新后,验证所有系统是否正常运行: 1. 检查应用程序 Web 界面:`https://your-domain` 2. 验证监控:Netdata Cloud 仪表板 3. 检查应用程序容器是否正在运行:`docker ps`(如果使用 Docker) 4. 验证数据库备份是否仍在工作:`tail -f /opt/polyserver/backups/backup_*.log` 5. 检查系统日志是否存在错误:`sudo journalctl -xef` ## SSL 证书管理 Certbot 会自动管理 SSL 证书。初始证书是在首次部署期间获取的,续订则会自动处理。 ## 备份策略 此部署包含使用 S3 兼容对象存储(主)和可选块存储(辅)的全面备份策略。 ### 主要:用于备份的 S3 兼容对象存储 S3 兼容对象存储是推荐的备份解决方案,具有诸多优势: - **通用兼容性**:适用于任何 S3 兼容提供商(AWS S3、OVH、Cloudflare R2、MinIO 等) - **可从多台服务器访问**:可从任何区域的任何服务器访问 - **更高的耐用性**:数据通常采用擦除编码存储在多个可用区 - **无限容量**:无需管理卷大小或担心空间不足 - **版本控制支持**:维护备份的多个版本以提供更好的保护 - **生命周期策略**:自动保留和删除旧备份 - **不可变性选项**:防止备份被修改或删除以满足合规性 - **公司级存储**:可使用存储桶和前缀跨部门组织 **备份工具**:PolyServer 使用 **rclone** 进行 S3 备份——这是一款现代、可靠的工具,对 Cloudflare R2、OVH、AWS S3 等 S3 兼容提供商提供了出色的支持。 #### 支持的 S3 兼容提供商 备份系统适用于任何 S3 兼容的对象存储提供商: - **AWS S3**:Amazon 的对象存储服务 - **OVH 对象存储**:符合 GDPR 的欧洲提供商 - **Cloudflare R2**:零流出费用,全球分布 - **MinIO**:自托管的 S3 兼容存储 - **Backblaze B2**:具 S3 兼容性的高性价比存储 - **DigitalOcean Spaces**:简单、可扩展的对象存储 - **以及许多其他**:任何支持 S3 API 的提供商 #### 设置 S3 兼容对象存储 1. **在您的提供商处创建存储桶**: - 登录到您提供商的控制面板 - 导航到对象存储 / S3 部分 - 创建一个具有唯一名称的新存储桶(例如,`polyserver-backups`) - 选择靠近您服务器的区域以获得更好的性能 - 选择适当的存储类别(标准存储用于备份) 2. **创建访问凭证**: - 生成 S3 兼容的访问密钥(访问密钥 ID 和秘密密钥) - 安全地保存凭证 - **安全性**:应用最小权限原则——仅授予所需权限: - 列出存储桶内容 - 上传对象(写入备份) - 删除对象(清理旧备份) 3. **在环境文件中配置您的 S3 凭证**: # 在部署前编辑 templates/defaults.env nano templates/defaults.env # 配置 S3 兼容存储 S3_BUCKET=polyserver-backups S3_REGION=us-east-1 # 您的区域 S3_PREFIX=production # 用于组织的前缀(可选) S3_ACCESS_KEY_ID=your_access_key S3_SECRET_ACCESS_KEY=your_secret_key # 可选:S3 端点(非 AWS 提供商必填) # 示例: # OVH: S3_ENDPOINT=https://s3.gra.cloud.ovh.net # Cloudflare: S3_ENDPOINT=https://.r2.cloudflarestorage.com # MinIO: S3_ENDPOINT=https://minio.example.com # AWS S3: 留空(自动检测) # S3_ENDPOINT=https://s3.gra.cloud.ovh.net # 生成强大的备份加密密钥(强烈推荐) BACKUP_ENCRYPTION_KEY=$(openssl rand -base64 32) # 重要:也要将此加密密钥安全地存储在服务器之外 # 没有此密钥,加密的备份将无法恢复! 4. **S3 备份过程将根据配置的计划自动运行**(默认:每天凌晨 3:00)。 配置 S3 凭证后,服务器设置会自动: - 安装 **rclone** - 将备份脚本配置为使用 rclone - 设置每天凌晨 3:00 运行的 cron 任务 - 在 `/opt/polyserver/backups/s3backup.log` 创建备份日志 #### S3 备份的工作原理 了解备份工作流程: 1. **创建本地备份**:脚本在 `/opt/polyserver/backups/` 中创建本地备份 - 压缩来自 `DATA_DIR` 的数据(默认:`/opt/polyserver/data/`) - 创建带有时间戳的 tar.gz 文件:`application_YYYYMMDD_HHMMSS.tar.gz` 2. **加密**(如果设置了 `BACKUP_ENCRYPTION_KEY`): - 使用 AES-256-CBC 和 PBKDF2 加密备份 - 用加密版本替换原始文件 3. **上传到 S3**: - 使用 rclone 将备份上传到您的 S3 存储桶 - 上传至:`s3://${S3_BUCKET}/${S3_PREFIX}/application_YYYYMMDD_HHMMSS.tar.gz` 4. **清理**: - 移除超过 `LOCAL_RETENTION` 天的本地备份 - 移除超过 `S3_RETENTION` 天的 S3 备份 **重要提示**: - `/opt/polyserver/backups/` 目录存储本地备份和日志 - 它不是被备份内容的来源 - 来源在备份脚本中配置(默认:`/opt/polyserver/data/`) #### 备份什么内容 **重要提示**:备份脚本是**模板**,必须针对您的特定应用程序进行自定义。 默认情况下,备份脚本包括: - **基于文件的备份**:归档数据目录(`{{DEPLOY_DIR}}/data`) - **数据库示例**:针对 PostgreSQL、MySQL、SQLite 的注释示例 - **容器示例**:备份 Docker 容器的示例 - **加密**:可选的 AES-256-CBC 加密(使用您的加密密钥) **备份脚本的位置**: - `templates/scripts/backup.sh.template` - 本地/块存储备份 - `templates/scripts/s3backup.sh.template` - 带有加密的 S3 兼容存储备份 #### 自定义备份内容 在部署之前编辑备份脚本模板,以指定要备份的内容: ``` # Edit templates/scripts/s3backup.sh.template nano templates/scripts/s3backup.sh.template ``` **自定义示例**: **⚠️ 重要提示**:对于**多个数据库**,首先将它们转储到 `DATA_DIR`,然后归档所有内容。这确保所有数据库包含备份文件中而不会互相覆盖。 1. **备份 PostgreSQL 数据库**(使用 Unix 套接字 - 对本地最安全): # 将数据库转储到 DATA_DIR(临时) log "Backing up PostgreSQL databases" sudo -u postgres pg_dump database1 | gzip > "${DATA_DIR}/db_pg_database1_${TIMESTAMP}.sql.gz" sudo -u postgres pg_dump database2 | gzip > "${DATA_DIR}/db_pg_database2_${TIMESTAMP}.sql.gz" # 归档 DATA_DIR(包括文件 + 数据库转储) tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" -C "$DATA_DIR" . # 清理临时数据库转储(它们现在已在归档中) rm -f "${DATA_DIR}"/db_pg_*_${TIMESTAMP}.sql.gz **备选方法**(如果 Unix 套接字不起作用): - **使用 .pgpass 文件**:创建格式为 `localhost:5432:dbname:user:password` 的 `~/.pgpass`(chmod 600) - **使用环境变量**:`PGPASSWORD="${DB_PASSWORD}" pg_dump -h localhost -U user dbname` 2. **备份 MySQL/MariaDB 数据库**(使用 .my.cnf): # 将数据库转储到 DATA_DIR(临时) log "Backing up MySQL databases" mysqldump database1 | gzip > "${DATA_DIR}/db_mysql_database1_${TIMESTAMP}.sql.gz" mysqldump database2 | gzip > "${DATA_DIR}/db_mysql_database2_${TIMESTAMP}.sql.gz" # 归档 DATA_DIR(包括文件 + 数据库转储) tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" -C "$DATA_DIR" . # 清理临时数据库转储(它们现在已在归档中) rm -f "${DATA_DIR}"/db_mysql_*_${TIMESTAMP}.sql.gz **一次性设置 .my.cnf**: cat > ~/.my.cnf << EOF [client] user=root password=your_mysql_root_password EOF chmod 600 ~/.my.cnf 3. **包含 PostgreSQL + MySQL + 文件的完整示例**: # 备份 PostgreSQL 数据库 log "Backing up PostgreSQL databases" sudo -u postgres pg_dump metabase | gzip > "${DATA_DIR}/db_pg_metabase_${TIMESTAMP}.sql.gz" # 备份 MySQL 数据库 log "Backing up MySQL databases" mysqldump polypublisher | gzip > "${DATA_DIR}/db_mysql_polypublisher_${TIMESTAMP}.sql.gz" mysqldump warehouse | gzip > "${DATA_DIR}/db_mysql_warehouse_${TIMESTAMP}.sql.gz" # 归档 DATA_DIR 中的所有内容(文件 + 所有数据库转储) log "Creating backup archive" tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" -C "$DATA_DIR" . # 从 DATA_DIR 清理临时数据库转储 rm -f "${DATA_DIR}"/db_*_${TIMESTAMP}.sql.gz log "Backup completed: ${BACKUP_NAME}" **结果**:一个备份文件包含: - 来自 `DATA_DIR` 的所有文件 - PostgreSQL 数据库转储 - MySQL 数据库转储 **⚠️ 安全警告**:永远不要在备份脚本中硬编码密码! # ❌ 绝对不要这样做: mysqldump -u root -p'hardcoded_password' mydb # ✅ 始终这样做: # - 使用 .my.cnf 或 .pgpass 文件(chmod 600) # - 使用来自安全配置文件的环境变量 # - 尽可能使用 Unix 套接字 / 对等身份验证 4. **备份多个目录**: # 添加到脚本中: tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" \ /var/www/html \ /opt/myapp/data \ /opt/myapp/config 5. **备份 Docker 卷**: # 添加到脚本中: docker run --rm -v myapp_data:/data -v ${LOCAL_BACKUP_DIR}:/backup \ alpine tar -czf /backup/${BACKUP_NAME} /data 6. **自定义应用程序备份**: # 添加您应用程序的备份命令: /opt/myapp/bin/backup --output "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" 自定义后,重新生成配置: ``` ./scripts/generate-configs.sh ``` #### 数据库密码安全最佳实践 **在备份脚本中存储密码安全吗?** 不安全!以下是安全处理凭证的方法: **❌ 绝不要**: - 在脚本中直接硬编码密码 - 将密码存储在 git 跟踪的文件中 - 使用全局可读的凭证文件 - 将密码作为命令行参数传递(在进程列表中可见) **✅ 始终要**: 1. **使用专用的凭证文件**(.pgpass、.my.cnf): - 存储在用户的主目录中 - 将权限设置为 600(仅限所有者读写) - 不被 git 跟踪 2. **使用来自安全配置的环境变量**: - 存储在 `/opt/polyserver/config/defaults.env` 中(被 git 忽略) - 文件具有 640 权限(仅限所有者/组读取) - 脚本在备份前获取环境文件 3. **使用 Unix 套接字身份验证**: - PostgreSQL 对等身份验证 - MySQL/MariaDB auth_socket 插件 - 本地连接无需密码 4. **加密整个备份**: - 即使有人拿到了备份文件,数据库转储文件也是加密的 - 在 defaults.env 中使用 `BACKUP_ENCRYPTION_KEY` **安全设置示例**: ``` # 1. Store database password in defaults.env (git-ignored) echo "DB_PASSWORD=$(openssl rand -base64 32)" >> /opt/polyserver/config/defaults.env # 2. Create .pgpass file for PostgreSQL cat > ~/.pgpass << EOF localhost:5432:*:myapp_user:$(grep DB_PASSWORD /opt/polyserver/config/defaults.env | cut -d= -f2) EOF chmod 600 ~/.pgpass # 3. Create .my.cnf for MySQL/MariaDB cat > ~/.my.cnf << EOF [client] user=myapp_user password=$(grep DB_PASSWORD /opt/polyserver/config/defaults.env | cut -d= -f2) EOF chmod 600 ~/.my.cnf # 4. Now database backups work without exposing passwords sudo -u postgres pg_dump myapp_db | gzip > backup.sql.gz # PostgreSQL mysqldump myapp_db | gzip > backup.sql.gz # MySQL/MariaDB ``` **文件权限摘要**: ``` # Backup script (contains no passwords) -rwxr-x--- 1 deploy deploy /opt/polyserver/scripts/s3backup.sh # 750 # Environment file (contains passwords) -rw-r----- 1 deploy deploy /opt/polyserver/config/defaults.env # 640 # Credential files (contains passwords) -rw------- 1 deploy deploy ~/.pgpass # 600 -rw------- 1 deploy deploy ~/.my.cnf # 600 ``` #### 服务器设置完成后修改备份 **如果你的服务器已经部署完成**,并且你需要在备份中添加或移除文件: 1. **通过 SSH 连接到你的服务器**: ssh -p 2222 deploy@your-server-ip 2. **编辑服务器上的备份脚本**: # 对于 S3 备份(最常见) sudo nano /opt/polyserver/scripts/s3backup.sh # 或者对于本地/块存储备份 sudo nano /opt/polyserver/scripts/backup.sh 3. **修改备份部分**(大约在第 76–99 行): # 找到“Application-Specific Backup Logic”部分 # 示例:添加数据库备份 # 添加此行: pg_dump -h localhost -U myapp_user myapp_db | gzip > "${LOCAL_BACKUP_DIR}/db_${TIMESTAMP}.sql.gz" # 或者修改 tar 命令以包含/排除目录: tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" \ --exclude='/opt/myapp/cache' \ --exclude='/opt/myapp/temp' \ /opt/myapp/data \ /var/www/html 4. **保存文件** (Ctrl+O, Enter, Ctrl+X) 5. 在等待计划运行之前,**手动测试备份**: # 运行备份脚本以测试你的更改 sudo /opt/polyserver/scripts/s3backup.sh # 检查日志以验证其是否生效 tail -50 /opt/polyserver/backups/backup_*.log | tail -50 6. **可选:更新本地模板**以供未来部署使用: # 在你的本地机器上,更新模板以便未来的服务器具有相同的配置 nano templates/scripts/s3backup.sh.template # 进行与服务器上相同的更改 **常见修改**: - **添加目录**:在 tar 命令中添加另一行 - **排除目录**:在 tar 中使用 `--exclude='/path/to/exclude'` - **添加数据库备份**:取消注释或添加 pg_dump/mysqldump 命令 - **添加 Docker 容器备份**:添加 docker exec 命令 - **更改备份内容**:修改 tar 源目录 **重要提示**:直接在服务器上进行的更改在你重新部署时将丢失。要在多次部署之间保留更改,请同时更新本地的模板文件。 #### 备份计划与自动化 在 `templates/defaults.env` 中配置备份时间: ``` # Backup schedule (cron format) BACKUP_SCHEDULE="0 2 * * *" # Daily at 2 AM (default) # Other examples: # BACKUP_SCHEDULE="0 */6 * * *" # Every 6 hours # BACKUP_SCHEDULE="0 3 * * 0" # Weekly on Sunday at 3 AM # BACKUP_SCHEDULE="0 1 1 * *" # Monthly on 1st at 1 AM ``` 备份通过 cron 自动运行。要手动触发备份: ``` # On the server sudo /opt/polyserver/scripts/s3backup.sh ``` #### 备份保留与轮转 在 `templates/defaults.env` 中配置备份的保留时间: ``` # Retention settings (in days) BACKUP_RETENTION_DAYS=30 # Default: 30 days # Different retention for local vs S3 (optional): LOCAL_RETENTION=7 # Keep local backups for 7 days S3_RETENTION=90 # Keep S3 backups for 90 days (longer term) ``` **轮转工作原理**: 1. **自动清理**:超过保留期的旧备份会被自动删除 2. **本地备份**:使用 `find -mtime` 进行清理(基于文件修改时间) 3. **S3 备份**:使用 S3 API 进行清理(基于 LastModified 日期) 4. **保留检查**:在每次备份后运行,以移除旧文件 **示例保留策略**: ``` # Keep local backups short (save disk space) LOCAL_RETENTION=7 # Keep S3 backups longer (they're cheap) S3_RETENTION=90 # With daily backups: # - Local: ~7 backups on disk # - S3: ~90 backups in object storage ``` #### 备份加密 可以使用 AES-256-CBC 和 PBKDF2 密钥派生对备份进行加密: ``` # In templates/defaults.env: BACKUP_ENCRYPTION_KEY=$(openssl rand -base64 32) # Or set your own key: BACKUP_ENCRYPTION_KEY="your-strong-encryption-key-here" ``` **重要提示**:请在服务器外部安全地存储你的加密密钥!没有密钥,加密备份将无法恢复。 **如何解密并恢复加密备份**: ``` # 1. Download the encrypted backup from S3 (see Manual S3 Access section below) # 2. Decrypt the backup openssl enc -d -aes-256-cbc -pbkdf2 \ -in application_20231215_030000.tar.gz \ -out application_20231215_030000_decrypted.tar.gz \ -pass "pass:your-encryption-key" # 3. Extract to restore tar -xzf application_20231215_030000_decrypted.tar.gz -C /restore/location/ # 4. Verify the contents ls -lh /restore/location/ ``` **加密详情**: - **算法**:AES-256-CBC(密码分组链接模式下的 256 位高级加密标准) - **密钥派生**:PBKDF2(基于密码的密钥派生函数 2) - **盐值**:由 OpenSSL 自动添加以增强安全性 - **推荐密钥长度**:32 字节(256 位),以 base64 编码 **安全最佳实践**: 1. **单独存储密钥**:切勿仅将加密密钥存储在被备份的服务器上 2. **使用密码管理器**:将密钥存储在安全的密码管理器中(1Password、Bitwarden 等) 3. **记录密钥**:将其添加到你的灾难恢复文档中 4. **测试解密**:定期测试你是否能成功解密备份 5. **轮转密钥**:考虑每年轮换加密密钥并重新加密旧备份 #### 监控备份 检查备份状态和日志: ``` # View recent backup logs ls -lh /opt/polyserver/backups/*.log | tail -5 # View last backup log (for s3backup.sh) tail -50 /opt/polyserver/backups/s3backup.log # View all backup logs tail -100 /opt/polyserver/backups/backup_*.log # Count local backups ls -1 /opt/polyserver/backups/*.tar.gz 2>/dev/null | wc -l ``` 备份脚本会记录: - 备份创建时间和大小 - 加密状态(如果已启用) - 上传到 S3 的状态 - 清理操作(已删除的旧备份) - 遇到的任何错误 #### 使用 rclone 手动访问 S3 PolyServer 使用 rclone 进行 S3 备份。你可以手动使用 rclone 列出、下载、上传或挂载你的 S3 备份。 ##### 为手动访问配置 rclone 备份脚本使用环境变量进行 rclone 配置。你可以使用相同的方法进行手动访问: ``` # Source your environment file source /opt/polyserver/config/defaults.env # Configure rclone via environment variables (no config file needed) export RCLONE_CONFIG_S3BACKUP_TYPE=s3 export RCLONE_CONFIG_S3BACKUP_PROVIDER=Cloudflare # Or your provider export RCLONE_CONFIG_S3BACKUP_ACCESS_KEY_ID="${S3_ACCESS_KEY_ID}" export RCLONE_CONFIG_S3BACKUP_SECRET_ACCESS_KEY="${S3_SECRET_ACCESS_KEY}" export RCLONE_CONFIG_S3BACKUP_ENDPOINT="${S3_ENDPOINT}" export RCLONE_CONFIG_S3BACKUP_NO_CHECK_BUCKET=true # Now you can use rclone with the remote name "s3backup" ``` **替代方案**:创建一个持久的 rclone 配置文件: ``` # Create config directory mkdir -p ~/.config/rclone # Create config file cat > ~/.config/rclone/rclone.conf << EOF [s3backup] type = s3 provider = Cloudflare access_key_id = your_access_key_id secret_access_key = your_secret_access_key endpoint = https://your-account-id.r2.cloudflarestorage.com no_check_bucket = true EOF # Secure the config file chmod 600 ~/.config/rclone/rclone.conf ``` ##### 列出备份 ``` # List all backups in your bucket rclone ls s3backup:polydata/production/ # List with human-readable sizes rclone lsl s3backup:polydata/production/ # List only directories rclone lsd s3backup:polydata/ # Count total backups rclone ls s3backup:polydata/production/ | wc -l # Show total size rclone size s3backup:polydata/production/ ``` ##### 下载备份 ``` # Download a specific backup rclone copy s3backup:polydata/production/application_20231215_030000.tar.gz /restore/ # Download with progress indicator rclone copy s3backup:polydata/production/application_20231215_030000.tar.gz /restore/ --progress # Download all backups from a specific date rclone copy s3backup:polydata/production/ /restore/ --include "*20231215*.tar.gz" --progress # Download the latest backup LATEST=$(rclone lsl s3backup:polydata/production/ | tail -1 | awk '{print $NF}') rclone copy "s3backup:polydata/production/$LATEST" /restore/ --progress ``` ##### 上传备份 ``` # Upload a local backup to S3 rclone copy /opt/polyserver/backups/application_20231215_030000.tar.gz s3backup:polydata/production/ --progress # Upload multiple files rclone copy /opt/polyserver/backups/ s3backup:polydata/production/ --include "application_*.tar.gz" --progress # Sync entire backup directory (be careful - this deletes files not present locally) rclone sync /opt/polyserver/backups/ s3backup:polydata/production/ --progress ``` ##### 将 S3 挂载为文件系统 将你的 S3 存储桶挂载为本地目录以便于浏览: ``` # Install fuse (if not already installed) sudo apt-get install -y fuse3 # Create mount point mkdir -p /mnt/s3-backups # Mount the S3 bucket (foreground mode for testing) rclone mount s3backup:polydata/production/ /mnt/s3-backups --read-only # Mount in background (daemon mode) rclone mount s3backup:polydata/production/ /mnt/s3-backups --read-only --daemon # Now you can browse backups like local files ls -lh /mnt/s3-backups/ cd /mnt/s3-backups/ # Copy files normally cp /mnt/s3-backups/application_20231215_030000.tar.gz /restore/ # Unmount when done fusermount -u /mnt/s3-backups ``` **挂载选项**: ``` # Mount with caching for better performance rclone mount s3backup:polydata/production/ /mnt/s3-backups \ --read-only \ --daemon \ --vfs-cache-mode full \ --cache-dir /tmp/rclone-cache # Allow other users to access rclone mount s3backup:polydata/production/ /mnt/s3-backups \ --read-only \ --daemon \ --allow-other ``` ##### 检查备份完整性 ``` # Verify a backup exists and check its size rclone lsl s3backup:polydata/production/ | grep application_20231215_030000.tar.gz # Calculate checksum (MD5) rclone md5sum s3backup:polydata/production/application_20231215_030000.tar.gz # Compare local and remote file rclone check /opt/polyserver/backups/ s3backup:polydata/production/ # Dry-run to see what would be synced rclone sync /opt/polyserver/backups/ s3backup:polydata/production/ --dry-run ``` ##### 手动删除旧备份 ``` # Delete backups older than 90 days rclone delete s3backup:polydata/production/ --min-age 90d --include "application_*.tar.gz" # Delete a specific backup rclone delete s3backup:polydata/production/application_20231215_030000.tar.gz # Preview what would be deleted (dry-run) rclone delete s3backup:polydata/production/ --min-age 90d --include "application_*.tar.gz" --dry-run ``` ##### 完整恢复示例 以下是下载并恢复备份的完整示例: ``` # 1. List available backups echo "Available backups:" rclone ls s3backup:polydata/production/ | tail -10 # 2. Download the latest backup LATEST=$(rclone lsl s3backup:polydata/production/ | tail -1 | awk '{print $NF}') echo "Downloading: $LATEST" rclone copy "s3backup:polydata/production/$LATEST" /restore/ --progress # 3. Decrypt the backup (if encrypted) source /opt/polyserver/config/defaults.env openssl enc -d -aes-256-cbc -pbkdf2 \ -in "/restore/$LATEST" \ -out "/restore/${LATEST%.tar.gz}_decrypted.tar.gz" \ -pass "pass:${BACKUP_ENCRYPTION_KEY}" # 4. Extract the backup tar -xzf "/restore/${LATEST%.tar.gz}_decrypted.tar.gz" -C /opt/polyserver/data/ # 5. Set correct permissions sudo chown -R deploy:deploy /opt/polyserver/data/ sudo chmod -R 750 /opt/polyserver/data/ # 6. Restart your application sudo systemctl restart your-application echo "✅ Restore completed successfully!" ``` ##### rclone 技巧与窍门 **带宽限制**: ``` # Limit upload speed to 10MB/s rclone copy /backup/ s3backup:polydata/production/ --bwlimit 10M # Limit download speed rclone copy s3backup:polydata/production/backup.tar.gz /restore/ --bwlimit 5M ``` **并行传输**: ``` # Use multiple connections for faster transfers rclone copy /backup/ s3backup:polydata/production/ --transfers 10 --progress ``` **过滤**: ``` # Only files matching pattern rclone ls s3backup:polydata/production/ --include "application_202312*.tar.gz" # Exclude files rclone ls s3backup:polydata/production/ --exclude "*.log" # Files larger than 100MB rclone ls s3backup:polydata/production/ --min-size 100M # Files from last 7 days rclone ls s3backup:polydata/production/ --max-age 7d ``` **日志记录**: ``` # Verbose output for debugging rclone copy /backup/ s3backup:polydata/production/ -v # Very verbose (includes API calls) rclone copy /backup/ s3backup:polydata/production/ -vv # Log to file rclone copy /backup/ s3backup:polydata/production/ --log-file /var/log/rclone.log ``` #### 公司级存储的组织策略 对于公司级的对象存储策略,我们建议: 1. **为每个环境创建一个存储桶**或**使用前缀**: - 选项 A:单独的存储桶 (polyserver-prod, polyserver-dev) - 选项 B:带有前缀的单个存储桶 (production/, staging/, development/) 2. **在存储桶内使用前缀进行组织**: - `production/server1/` - `production/server2/` - `staging/` - `daily/`, `weekly/`, `monthly/` 3. **应用生命周期策略**以自动过期旧备份并管理成本 这种组织方式提供了清晰的隔离,同时优化了成本(大多数提供商根据使用的总存储量收费,而与组织方式无关)。 ### 可选:用于本地备份的块存储 块存储(额外的磁盘卷)可用作辅助备份位置,特别是当你需要快速的本地备份/恢复性能时。这仅仅是挂载到你的服务器上的额外存储,用于在本地存储备份文件。 **优势**: - **访问速度快**:本地磁盘 I/O 比网络传输更快 - **无出口费用**:读取备份没有带宽成本 - **设置简单**:像任何本地目录一样挂载和使用 **局限性**: - **单实例挂载**:一次只能附加到一台服务器 - **无地理冗余**:如果数据中心发生故障,数据将丢失 - **固定容量**:必须提前配置特定大小 - **手动迁移**:需要在服务器之间拆下/重新附加才能移动 #### 设置块存储(可选) 如果你的服务器附加了额外的块存储: 1. **识别块设备**: # 列出所有块设备 lsblk # 示例输出: # sdb 8:16 0 100G 0 disk <- 你的额外存储 2. **如果是新设备,请格式化块设备**(⚠️ 注意:这会擦除所有数据): # 将 /dev/sdb 替换为你的实际设备 sudo mkfs.ext4 /dev/sdb 3. **挂载存储**: # 创建挂载目录 sudo mkdir -p /mnt/backup # 添加到 fstab 以在启动时自动挂载 echo "/dev/sdb /mnt/backup ext4 defaults,noatime 0 2" | sudo tee -a /etc/fstab # 挂载设备 sudo mount /mnt/backup # 创建具有适当权限的备份目录 sudo mkdir -p /mnt/backup/backups sudo chown -R deploy:deploy /mnt/backup/backups sudo chmod 750 /mnt/backup/backups 4. **验证挂载**: df -h | grep "/mnt/backup" 5. **配置备份以使用该挂载**: # 编辑 templates/defaults.env nano templates/defaults.env # 设置备份挂载点 BACKUP_MOUNT=/mnt/backup 同时配置了 S3 兼容对象存储和本地块存储后,你将拥有一个强大的多层备份策略,结合了本地存储的速度和云存储的持久性与可访问性。 ## 服务器监控与安全 部署包含多个监控和安全系统,以确保你的应用程序得到良好保护和适当监控。 ### 防火墙配置 服务器受 UFW (Uncomplicated Firewall) 保护,这是 iptables 的用户友好界面: #### 默认防火墙规则 默认情况下,服务器配置了以下防火墙规则: ``` Status: active To Action From -- ------ ---- 2222/tcp ALLOW Anywhere # SSH (custom port for security) 80/tcp ALLOW Anywhere # HTTP (for redirects and Let's Encrypt) 443/tcp ALLOW Anywhere # HTTPS (primary access) ``` 所有其他传入流量默认被阻止,而所有传出流量都被允许。 #### 安全注意事项 - **SSH 端口**:使用非标准端口 2222 而不是 22,以减少自动化攻击 - **SSH 身份验证**:灵活的配置,支持基于密钥和基于密码的身份验证 - **无直接应用端口**:应用程序端口不直接暴露;只能通过 Nginx 代理访问 - **无公共监控**:Netdata 监控端口不公开访问(只能通过 SSH 隧道访问) - **最小攻击面**:只有基本服务暴露在互联网上 #### 修改防火墙规则 要在服务器上添加或修改防火墙规则: ``` # Allow a new service (example: temporary access to port 8080) sudo ufw allow 8080/tcp comment "Temporary development access" # Delete a rule (by line number) sudo ufw status numbered # List rules with numbers sudo ufw delete 3 # Delete rule number 3 # Temporarily disable firewall (not recommended in production) sudo ufw disable # Re-enable firewall sudo ufw enable ``` #### 速率限制 Nginx 配置包含速率限制,以防御暴力破解攻击: ``` # Rate limiting to prevent brute-force attacks limit_req_zone $binary_remote_addr zone=app_limit:10m rate=10r/s; location / { # Rate limiting with burst limit_req zone=app_limit burst=20 nodelay; ... } ``` 此配置: - 将每个 IP 地址限制为每秒 10 个请求 - 允许最多 20 个请求的突发 - 立即拒绝多余的请求 (nodelay) ### 审计框架 服务器配置了 Linux 审计框架,用于全面的系统活动监控: - **细粒度审计规则**:跟踪关键系统活动和更改 - **安全事件监控**:检测潜在的安全漏洞 - **集成报告**:带有可操作见解的每日审计报告 - **全面监控**:监控 30 多个关键系统领域 #### 监控领域 审计系统监控: 1. **文件系统更改**:检测对关键系统文件的修改 2. **用户活动**:监控用户管理和身份验证 3. **权限提升**:识别潜在的未授权提升尝试 4. **网络配置**:跟踪网络设置的更改 5. **应用程序配置**:监控对部署的更改 6. **Docker 访问**:检测对 Docker socket 的未授权访问 7. **关键命令使用**:监控潜在的危险命令 8. **DNS 查询**:提供 DNS 解析活动的可见性 9. **安全工具配置**:确保安全工具保持正确配置 10. **二进制文件修改**:检测对关键系统二进制文件的更改 #### 配置审计框架 可以通过编辑 defaults.env 文件来配置审计设置: ``` # Audit settings AUDIT_ENABLED=true AUDIT_LOG_RETENTION=90 AUDIT_BUFFER_SIZE=8192 AUDIT_FAILURE_MODE=1 AUDIT_RULES_IMMUTABLE=false # Set to true to make rules immutable (requires reboot to change) ``` #### 使用审计系统 ``` # View current audit rules sudo auditctl -l # View audit status sudo auditctl -s # Search audit logs for events (example: user modification events) sudo ausearch -k user_modify --start today -i # Generate a comprehensive report sudo ${DEPLOY_DIR}/scripts/audit-report.sh # View specific failure types (example: authentication failures) sudo ausearch --start today --end now | aureport --auth --summary -i # View executable usage summary sudo ausearch --start today --end now | aureport --executable --summary -i ``` #### 审计框架的优势 - **安全合规性**:有助于满足监管要求 - **违规检测**:对潜在安全事件的早期预警 - **取证分析**:为事件发生后的调查提供详细日志 - **问责制**:为所有系统更改建立清晰的审计跟踪 - **全面报告**:安全相关事件的每日摘要 ### Unbound DNS 缓存 服务器配置了 Unbound DNS 缓存以提高性能和安全性: - **本地 DNS 缓存**:减少重复 DNS 查询的延迟 - **性能提升**:更快的应用程序响应时间 - **安全优势**:防范基于 DNS 的攻击 - **DNSSEC 验证**:验证 DNS 响应未被篡改 - **大缓存容量**:为最小的 DNS 查询时间进行了优化 #### 配置 Unbound DNS 缓存 可以通过编辑 defaults.env 文件来配置 Unbound 设置: ``` # Unbound DNS cache settings UNBOUND_ENABLED=true UNBOUND_VERBOSITY=1 UNBOUND_CACHE_MIN_TTL=3600 UNBOUND_CACHE_MAX_TTL=86400 UNBOUND_MSG_CACHE_SIZE=128m UNBOUND_RRSET_CACHE_SIZE=256m UNBOUND_NEG_CACHE_SIZE=64m UNBOUND_LOG_QUERIES=no UNBOUND_LOG_REPLIES=no UNBOUND_LOG_SERVFAIL=yes UNBOUND_LOGFILE=/var/log/unbound.log UNBOUND_DNS_PRIMARY=8.8.8.8 UNBOUND_DNS_SECONDARY=1.1.1.1 ``` #### 检查 Unbound 状态 要检查 Unbound 是否正常工作: ``` # Check service status systemctl status unbound # Query the local DNS resolver dig @127.0.0.1 example.com # Check cache statistics unbound-control stats_noreset | grep cache ``` #### 使用 Unbound 的优势 - **提高性能**:缓存的 DNS 响应减少了延迟 - **防范 DNS 欺骗**:DNSSEC 验证 - **减少上游 DNS 负载**:缓存减少了对 ISP DNS 的查询 - **防范 DNS 中断**:如果上游 DNS 发生故障,缓存的响应仍然可用 - **DNS 隐私**:查询被整合,减少了对上游 DNS提供商的暴露 ### Netdata 监控 Netdata 提供实时性能监控,原生安装在你的 Debian 服务器上,并带有可选的 Cloud 集成,用于集中监控。 #### 访问 Netdata Netdata 配置为仅绑定到 localhost (127.0.0.1:19999) 以确保安全。通过以下方式访问它: **SSH 隧道(本地访问)**: ``` ssh -L 19999:localhost:19999 -p 2222 deploy@your-server-ip # Then visit http://localhost:19999 in your browser ``` **Netdata Cloud(集中监控)**: - **自动设置**:在你的环境中配置 `NETDATA_CLAIM_TOKEN` 以进行自动注册 - **手动设置**:使用服务器设置期间提供的详细说明 - **移动应用**:通过 Netdata Cloud 移动应用访问你的服务器 - **团队协作**:在团队成员之间共享仪表板、警报和见解 #### Netdata Cloud 集成 要在部署后设置 Netdata Cloud 集成: 1. **获取声明 Token**: - 在 [https://app.netdata.cloud](https://app.netdata.cloud) 注册/登录 - 创建新空间或选择现有空间 - 转到“Connect Nodes”并复制你的声明 token 2. **注册服务器**: # 连接到你的服务器 ssh -p 2222 deploy@your-server-ip # 将节点声明到 Netdata Cloud(token 是必需的,rooms 是可选的) sudo /opt/netdata/bin/netdata-claim.sh \ -token=YOUR_CLAIM_TOKEN \ -url=https://app.netdata.cloud 3. **访问集中式仪表板**: - 访问 [https://app.netdata.cloud](https://app.netdata.cloud) - 你的服务器将在 1-2 分钟内出现 #### Netdata Cloud 优势 - **集中监控**:所有服务器的单一仪表板 - **移动访问**:从任何地方监控你的基础设施 - **警报管理**:集中式警报和通知管理 - **多服务器关联**:跨服务器比较性能 - **团队协作**:分享见解并就事件进行协作 - **基础设施概览**:整个基础设施的高层级视图 #### 配置 Netdata 配置位于 `/etc/netdata/netdata.conf`,并在服务器设置期间自动配置以确保最佳安全性和性能。该配置包括来自你的模板变量的时区设置和针对安全性优化的设置。 ### 恶意软件防护 服务器可以配置互补的恶意软件检测系统(可选组件): **启用恶意软件防护组件:** ``` # Enable ClamAV antivirus (high resource usage) export INSTALL_CLAMAV=true # Enable Linux Malware Detect (medium resource usage) export INSTALL_MALDET=true # Enable rootkit detection tools (low resource usage) export INSTALL_RKHUNTER=true # Enable Suricata network intrusion detection (medium resource usage) export INSTALL_SURICATA=true ``` #### ClamAV 防病毒 ClamAV 提供传统的防病毒保护: - **每日扫描**:自动扫描关键目录 - **自动更新**:病毒定义每天更新 - **电子邮件警报**:如果检测到病毒,将发送通知 要手动运行 ClamAV 扫描: ``` sudo clamscan -r -i /home /opt/polyserver /var/www ``` 要更新病毒定义: ``` sudo freshclam ``` #### Linux 恶意软件检测 (maldet) maldet 针对托管环境中常见的基于 Web 的恶意软件提供专门保护: - **专注于 Web 的签名**:检测 PHP/Perl/Python/Shell 恶意软件、后门和 Web 漏洞利用 - **可选的 ClamAV 集成**:如果两者都启用,可以同时使用 maldet 和 ClamAV 签名 - **文件隔离**:隔离可疑文件以供审查 - **每日扫描**:自动扫描关键目录 - **电子邮件警报**:检测到威胁的详细报告 要手动运行 maldet 扫描: ``` # Scan specific directories sudo maldet --scan-all /home /opt/polyserver /var/www # View scan reports sudo maldet --report list # View specific report sudo maldet --report REPORT_ID # Update maldet signatures sudo maldet --update-sigs ``` ClamAV 和 maldet 的结合提供了针对传统和 Web 特定恶意软件威胁的全面保护。 ### Rootkit 检测 服务器同时使用 RKHunter 和 chkrootkit 来增强安全性: - **每日自动扫描**:两个工具每晚都会通过智能过滤进行扫描 - **电子邮件警报**:如果检测到可疑活动,将发送通知 - **基线比较**:在预期输出发生更改时发出警报 - **白名单过滤**:自动过滤已知的误报 **chkrootkit 智能白名单:** 该设置会自动过滤掉常见的误报: - Ruby gems `.document` 文件(来自 Debian 软件包) - fail2ban 测试固件文件 - 合法的数据包嗅探器(Suricata IDS、systemd-networkd 等) **日志文件:** - `/var/log/chkrootkit/log.raw` - 未过滤的扫描输出 - `/var/log/chkrootkit/log.today` - 过滤后的输出(已应用白名单) - `/var/log/chkrootkit/log.expected` - 用于比较的基线 **手动命令:** ``` # Using RKHunter sudo rkhunter --check --sk # Using chkrootkit sudo chkrootkit # View filtered output cat /var/log/chkrootkit/log.today # View raw output (before filtering) cat /var/log/chkrootkit/log.raw # Update chkrootkit baseline after verifying system state sudo cp /var/log/chkrootkit/log.today /var/log/chkrootkit/log.expected # Edit whitelist for custom exclusions sudo nano /etc/chkrootkit/whitelist.conf ``` **自定义白名单:** 编辑 `/etc/chkrootkit/whitelist.conf` 以添加: - **文件路径**:在新行中添加完整路径(例如,`/path/to/legitimate/file`) - **数据包嗅探器**:将进程名添加到 `WHITELIST_SNIFFERS` 变量中 **更新 RKHunter:** ``` # Update RKHunter database sudo rkhunter --update # Update RKHunter file properties database sudo rkhunter --propupd ``` **对于现有服务器:** 如果你有一台没有白名单功能的现有服务器,请运行升级脚本: ``` # Download and run the whitelist upgrade script sudo ./scripts/add-chkrootkit-whitelist.sh ``` 此脚本将: - 创建白名单配置 - 更新 chkrootkit 扫描脚本 - 运行带过滤的测试扫描 - 保留你现有的基线(如果有) **安全说明:** 虽然白名单过滤了已知的误报,但你需要保持谨慎——如果你遭到入侵,恶意软件可能会隐藏在白名单位置。因此: 1. **定期审查原始输出**:`cat /var/log/chkrootkit/log.raw` 2. **谨慎更新基线**:只有在验证系统状态后才能更新 3. **监控白名单更改**:白名单文件本身应该被 AIDE 监控 4. **与其他工具交叉验证**:同时使用 RKHunter、AIDE 和系统审计 ### 文件完整性监控 服务器配置了 AIDE(高级入侵检测环境)以检测未授权的文件修改: - **数据库初始化**:在设置期间创建初始文件校验和数据库 - **定期检查**:将当前文件与已知良好的数据库进行比较 - **通知**:在文件意外更改时发送警报 要手动检查文件完整性: ``` # Run AIDE check sudo aide.wrapper --check # Update AIDE database after legitimate changes sudo aide.wrapper --update ``` ### RAID 阵列监控 对于带有 RAID 阵列(使用 mdadm 的软件 RAID)的服务器,PolyServer 包含全面的监控工具: **已安装的监控工具:** - **nvme-cli**:NVMe 特定的健康监控和诊断 - **smartmontools**:适用于所有驱动器类型的 S.M.A.R.T. 磁盘健康监控 - **mdadm**:带有自动健康检查的软件 RAID 管理 **自动监控:** - **AUTOSCAN**:每日检查降级的阵列 - **AUTOCHECK**:每月冗余验证 - **电子邮件警报**:阵列降级或故障时发送通知 **检查 RAID 状态:** ``` # View RAID array status cat /proc/mdstat # Detailed array information sudo mdadm --detail /dev/md1 # Check all arrays sudo mdadm --examine --scan # NVMe drive health (if applicable) sudo nvme smart-log /dev/nvme0n1 sudo nvme smart-log /dev/nvme1n1 # SMART status for SATA/SAS drives sudo smartctl -a /dev/sda sudo smartctl -a /dev/sdb ``` **了解 mdadm 监控消息:** 系统定期运行 `mdmonitor-oneshot.service` 以检查阵列健康状况。你可能会看到如下消息: ``` mdadm: DeviceDisappeared event detected on md device /dev/md/md1 mdadm: NewArray event detected on md device /dev/md1 ``` 这些是来自启动时的**历史事件报告**,而不是实时故障。监控服务会扫描阵列的事件日志并报告其发现。这些消息会自动从 logcheck 中过滤掉,以减少噪音。 **真正的故障**会表现出不同的症状: - 阵列状态:`degraded` 而不是 `clean` - 缺少设备:`/proc/mdstat` 中是 `[U_]` 而不是 `[UU]` - 关于故障设备的电子邮件警报 ### Logcheck 系统监控 Logcheck 提供带有每日报告的服务器级日志分析,仔细过滤掉正常事件以突出潜在问题: - **服务器日志级别**:配置为显示与服务器相关的安全问题 - **每日报告**:仅汇总可疑日志条目(已过滤噪音) - **预配置的忽略模式**:常见例程操作(ClamAV、PostgreSQL、Netdata 等)会被自动过滤 - **同一收件人**:使用与 Logwatch 相同的电子邮件地址 #### Logcheck 工作原理 Logcheck 扫描系统日志,并通过电子邮件将不匹配忽略模式的条目发送给你。过滤按级别进行: ``` /etc/logcheck/ ├── logcheck.conf # Main configuration ├── ignore.d.paranoid/ # Minimal filtering (most alerts) ├── ignore.d.server/ # Moderate filtering (default) ← You are here └── ignore.d.workstation/ # Maximum filtering (fewest alerts) ``` 服务器使用 **"server"** 级别的过滤,在安全可见性和减少噪音之间取得了平衡。 #### 预配置的忽略模式 该设置会自动在 `/etc/logcheck/ignore.d.server/application-server-ignore` 中为日常操作创建忽略模式: **安全工具:** - ClamAV 数据库检查和 freshclam 更新 - Fail2ban 封禁/解封操作 - RKHunter 例行扫描 **数据库操作:** - PostgreSQL 检查点和自动清理 - MariaDB/MySQL 信息说明 **系统服务:** - Netdata 健康监控 - Systemd 会话管理 - SSH 成功身份验证 - Postfix 邮件投递 **网络:** - UFW 防火墙阻止(预期流量) - Docker 和容器操作 - Nginx 例行活动 #### 自定义忽略模式 如果你收到关于合法日常操作的警报,请添加自定义忽略模式: **创建自定义忽略文件:** ``` sudo nano /etc/logcheck/ignore.d.server/local-custom ``` **模式格式:**每一行都是一个正则表达式,匹配要忽略的日志条目。 **示例模式:** ``` # Ignore specific application messages ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ myapp\[[0-9]+\]: Normal operation message # Ignore cron job output ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ cron\[[0-9]+\]: \(root\) CMD \(/path/to/script\.sh\) # Ignore specific systemd service restarts ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ systemd\[[0-9]+\]: Started My Application Service\.$ # Support both syslog and ISO 8601 timestamp formats ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]+[+-][0-9]{4} [._[:alnum:]-]+ myapp\[[0-9]+\]: .* ``` **模式解析:** ``` ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ clamd\[[0-9]+\]: .* -> SelfCheck: Database status OK\.$ ``` ``` │ │ │ │ │ │ │ │ │ │ │ └─ Literal period (escaped) │ │ │ │ └─ Match the actual message │ │ │ └─ Process name with PID [number] │ │ └─ Hostname │ └─ Date/time (11 chars) └─ Start of line, 3 letters (Dec, Jan, etc.) ``` **创建模式的技巧:** 1. **从具体开始,然后再泛化:** # 太具体了(如果格式更改就会失效) Dec 13 05:01:59 server-1 clamd[123]: message # 更好(适用于任何日期/时间/主机名/PID) ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ clamd\[[0-9]+\]: message 2. **转义特殊的正则表达式字符:** `. [ ] ( ) $ ^ * + ?` # 错误:clamd[123]: message. # 正确:clamd\[[0-9]+\]: message\.$ 3. **对可变部分使用 `.*`:** ^\w{3} [ :0-9]{11} .* -> SelfCheck: Database status OK\.$ #### 测试忽略模式 在依赖新模式之前,请对其进行测试: ``` # Test mode - shows what would be sent without actually sending sudo logcheck -t # Debug mode - shows detailed pattern matching sudo logcheck -d # Test if a pattern matches a specific log line echo "Dec 13 05:01:59 server clamd[123]: SelfCheck: Database status OK." | \ grep -E "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ clamd\[[0-9]+\]: .* -> SelfCheck: Database status OK\.$" # View what logcheck would report right now sudo -u logcheck logcheck -t 2>&1 | less ``` #### 调整 Logcheck 频率 默认情况下,logcheck 每天运行一次。要更改频率: ``` # Edit the cron configuration sudo nano /etc/cron.d/logcheck # Change from daily to every 6 hours 0 */6 * * * logcheck if [ -x /usr/sbin/logcheck ]; then nice -n10 /usr/sbin/logcheck; fi # Or disable email and just check manually # Comment out the cron job and run manually when needed: sudo -u logcheck logcheck -t ``` #### 配置文件 要自定义其他 logcheck 设置: ``` sudo nano /etc/logcheck/logcheck.conf # Common settings: REPORTLEVEL="server" # Alert level: paranoid, server, or workstation SENDMAILTO="your@email.com" # Email recipient ATTACKSUBJECT="Security Alerts from \$HOSTNAME" ``` #### 查看活动过滤器 查看当前正在过滤日志的模式: ``` # List all ignore pattern files ls -la /etc/logcheck/ignore.d.server/ # View a specific pattern file cat /etc/logcheck/ignore.d.server/application-server-ignore # Count how many patterns are defined find /etc/logcheck/ignore.d.server/ -type f -exec wc -l {} + | tail -1 ``` #### 故障排除 **收到太多电子邮件?** 1. 检查报告的内容:`sudo logcheck -t` 2. 识别重复的消息 3. 为合法的日常操作创建忽略模式 4. 在部署前测试模式 **没有收到任何电子邮件?** 1. 检查 logcheck 是否正在运行:`systemctl status logcheck.timer`(如果使用 systemd 定时器) 2. 检查邮件日志:`sudo tail -50 /var/log/mail.log` 3. 验证电子邮件配置:`echo "test" | mail -s "Test" your@email.com` 4. 检查 logcheck 日志:`sudo grep logcheck /var/log/syslog` **模式不生效?** 1. 针对实际的日志条目进行测试 2. 检查隐藏字符或编码问题 3. 验证正则表达式语法(使用正则表达式测试器) 4. 确保 logcheck 可以读取模式文件:`sudo chmod 644 /etc/logcheck/ignore.d.server/local-custom` ### Logwatch 系统监控 Logwatch 通过电子邮件提供每日系统报告,汇总服务器活动和潜在问题。 #### 配置 Logwatch 可以在安装前通过编辑 server-setup.sh 脚本或之后通过编辑配置文件来配置 Logwatch 设置: ``` sudo nano /etc/logwatch/conf/logwatch.conf ``` 你可以修改的关键设置: ``` # Email to receive reports MailTo = your-email@example.com # Detail level (Low, Med, High) Detail = Med # Time range for reports Range = yesterday ``` Logwatch 配置为包含来自 lm_sensors 的硬件传感器信息,在每日报告中提供温度和其他硬件指标。 ### SSH 安全管理 PolyServer 提供全面的 SSH 安全性,具有灵活的身份验证选项: #### SSH 配置选项 **基于密钥的身份验证(推荐)** - 最安全的选项,自动禁用密码身份验证 - 如果提供了 `SSH_PUBLIC_KEY`,则在服务器设置期间自动配置 - 不允许密码身份验证 **密码身份验证(初始设置)** - 在设置期间 `SSH_PUBLIC_KEY` 为空时启用 - 允许使用密码进行初始访问 - 稍后可以转换为仅密钥身份验证 #### 管理 SSH 密钥 **向现有服务器添加 SSH 密钥:** ``` # Connect to your server ssh -p 2222 deploy@your-server-ip # Add your public key to authorized_keys echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG... your-email@example.com" >> ~/.ssh/authorized_keys # Set proper permissions chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh ``` **从密码身份验证转换为仅密钥身份验证:** ``` # After adding SSH keys, disable password authentication sudo /opt/polyserver/scripts/ssh-disable-password-auth.sh # This script will: # 1. Create a backup of current SSH config # 2. Ask for confirmation # 3. Test SSH configuration # 4. Restart SSH service # 5. Provide rollback instructions if needed ``` **测试 SSH 配置:** ``` # Test SSH config before applying changes sudo sshd -t # Check current authentication methods sudo sshd -T | grep -E "(PasswordAuthentication|PubkeyAuthentication)" # View SSH authentication logs sudo tail -f /var/log/auth.log ``` #### SSH 安全功能 - **自定义端口**:SSH 在端口 2222 上运行以减少自动化攻击 - **强密码**:仅使用现代加密算法 - **失败登录保护**:Fail2ban 自动阻止暴力破解尝试 - **用户限制**:仅允许 deploy 用户进行 SSH 访问 - **禁止 Root 访问**:出于安全原因禁用了 Root 录 - **连接限制**:最多 5 个会话,3 次身份验证尝试 #### SSH 故障排除 **如果被锁定在服务器之外:** ``` # If you have console access (VPS provider console) # 1. Access via provider's web console # 2. Edit SSH config to re-enable password auth temporarily: sudo nano /etc/ssh/sshd_config # Change: PasswordAuthentication yes sudo systemctl restart sshd # 3. Add SSH keys properly, then disable password auth again ``` **备份和恢复:** ``` # SSH config is automatically backed up during changes ls -la /etc/ssh/sshd_config.* # Restore from backup if needed sudo cp /etc/ssh/sshd_config.backup /etc/ssh/sshd_config sudo systemctl restart sshd ``` ### 自动安全更新 为了增强安全性,服务器配置了: - **自动安全补丁**:每晚应用关键更新 - **Fail2ban**:防御暴力破解攻击 - **UFW 防火墙**:最少的开放端口 (SSH、HTTP、HTTPS) - **SSH 加固**:具有灵活身份验证选项的安全配置 ### Nginx 安全配置 服务器包含全面的 Nginx 安全规则,可自动阻止常见攻击并减少日志噪音: #### 被阻止的内容 - **敏感文件**:`.git`、`.env`、`.htaccess`、备份文件、配置文件 - **文档**:README、CHANGELOG、LICENSE 文件 - **常见管理员路径**:`/wp-admin`、`/phpmyadmin`、`/admin` 等 - **CMS 路径**:WordPress、Drupal、Joomla、Magento 路径 - **开发路径**:`/test`、`/dev`、`/staging`、`/backup` 等 - **漏洞利用路径**:常见的 shell、后门和攻击工具路径 - **脚本文件**:`.php`、`.asp`、`.jsp` 文件(因应用程序而异) #### Bot 和扫描器防护 - **漏洞扫描器**:Nikto、SQLMap、Nessus、Burp Suite 等 - **不良 User-Agent**:空的代理、已知的 bot 模式 - **可疑查询**:XSS 尝试、SQL 注入、路径遍历 - **恶意 Referrer**:垃圾邮件和恶意引荐模式 #### 速率限制 - **身份验证**:登录端点 1 次请求/秒 - **API 端点**:常规 API 调用 10 次请求/秒 - **静态资产**:带缓存的 50 次请求/秒 - **常规流量**:10 次请求/秒基线 #### 安全优势 - **减少攻击面**:阻止 90% 以上的常见自动化攻击 - **干净的日志**:被阻止的请求不会生成日志条目 - **性能**:对被阻止的请求响应更快(返回 444) - **早期防御**:在攻击到达 ModSecurity 或应用程序之前将其阻止 #### 测试安全配置 你可以测试安全配置是否正常工作: ``` # Test blocking of sensitive files (should return connection closed) curl -I https://your-domain/.env curl -I https://your-domain/.git/config curl -I https://your-domain/README.md # Test blocking of admin paths (should return connection closed) curl -I https://your-domain/wp-admin/ curl -I https://your-domain/phpmyadmin/ # Test rate limiting (make multiple rapid requests) for i in {1..10}; do curl -I https://your-domain/api/session; done # Check nginx configuration is valid sudo nginx -t # View security-related logs (should see blocked requests) sudo tail -f /var/log/nginx/access.log | grep -E "(444|429)" ``` ### Web 应用防火墙 Nginx 服务器还包含 ModSecurity,这是一个强大的 Web 应用防火墙,可提供更深层次的内容检查: - **OWASP 核心规则集**:针对 OWASP Top 10 漏洞的基线保护 - **SQL 注入防御**:阻止请求中的恶意 SQL - **XSS 防护**:防止跨站脚本攻击 - **请求过滤**:阻止恶意负载和异常的请求模式 - **自定义规则**:特定于应用程序的例外,以减少误报 #### ModSecurity 配置 ModSecurity 在服务器设置期间自动配置,并在 `/etc/nginx/modsec/modsecurity.conf` 中带有特定于应用程序的规则: ``` # Check ModSecurity status sudo nginx -t # View ModSecurity logs sudo tail -f /var/log/nginx/modsec_audit.log ``` ### 容器安全 Docker 容器受到多层保护: - **Trivy 扫描器**:每日对所有容器镜像进行漏洞扫描 - **安全限制**:严格的资源限制以防止拒绝服务 - **无新特权**:防止容器内的权限提升 - **能力限制**:默认丢弃所有 Linux 能力 - **只读文件系统**:容器以只读根文件系统运行 - **非 Root 用户**:容器以非特权用户运行 #### 容器扫描 ``` # Run a manual container scan sudo /etc/cron.daily/trivy-scan # View recent scan reports ls -l /var/log/security/trivy/ ``` ### AppArmor 防护 AppArmor 为 Docker 容器提供强制访问控制: - **受限文件系统访问**:容器只能访问必要的文件 - **进程隔离**:限制系统调用和能力 - **拒绝危险操作**:防止挂载、内核模块加载 - **特定于应用程序的配置文件**:为应用程序需求量身定制的自定义配置文件 #### AppArmor 管理 ``` # Check AppArmor status sudo aa-status # See if profile is applied to container docker inspect --format='{{.AppArmorProfile}}' app ``` ### 网络入侵检测 Suricata 监控网络流量以发现恶意活动: - **实时流量分析**:检查所有传入和传出的数据包 - **特定于应用程序的规则**:针对应用程序 API 端点的自定义规则 - **攻击检测**:识别 SQL 注入、暴力破解和扫描尝试 - **警报**:记录潜在的安全事件以供审查 #### Suricata 日志 ``` # View detected alerts sudo cat /var/log/suricata/fast.log # More detailed event information sudo cat /var/log/suricata/eve.json ``` ### 带有 Fail2ban 的高级防火墙 除了基本的 UFW 防火墙外,系统还使用 Fail2ban 动态阻止恶意 IP 地址: #### Fail2ban 配置 Fail2ban 监控日志文件并阻止表现出恶意行为的 IP 地址。默认配置保护 SSH: ``` # Configure fail2ban for SSH cat > /etc/fail2ban/jail.local << EOF [sshd] enabled = true port = $SSH_PORT filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 EOF ``` 此配置: - 监控 SSH 身份验证日志 - 在 3 次失败尝试后封禁 IP 地址 - 封禁时间为 3600 秒(1 小时) #### 管理 Fail2ban ``` # View banned IPs sudo fail2ban-client status sshd # Manually ban an IP sudo fail2ban-client set sshd banip 123.45.67.89 # Manually unban an IP sudo fail2ban-client set sshd unbanip 123.45.67.89 # View fail2ban logs sudo tail -f /var/log/fail2ban.log ``` ### 特定于应用程序的加固 可以为应用程序配置安全加固的设置。例如,商业智能平台应包括: - **强密码策略**:要求复杂密码(12 个以上字符) - **会话超时**:不活动 8 小时后会话过期 - **登录保护**:5 次失败尝试后锁定帐户 - **禁用公共分享**:无公共仪表板或问题 - **禁用嵌入**:不嵌入外部应用程序 - **下载限制**:防止通过 CSV/Excel 窃取数据 - **高级权限**:启用细粒度的访问控制 - **TLS 验证**:对数据源进行严格的证书验证 - **JWT Token 安全**:增强的 Token 轮换和验证 #### 数据库加密 对于使用嵌入式数据库的部署,可以启用加密以保护静态数据。**这会加密你的应用程序数据库,包括用户数据和应用程序内容。** **要启用数据库加密:** 1. **生成一个强加密密钥**: # 生成一个 32 字节的 base64 编码密钥 openssl rand -base64 32 2. **将密钥添加到你的环境配置中**: # 编辑你的环境文件 nano /opt/polyserver/config/.env # 使用你生成的密钥添加此行 MB_ENCRYPTION_SECRET_KEY=your_generated_key_here 3. **重启应用程序**: # Docker 模式 docker compose restart app # 裸金属模式 sudo systemctl restart application **⚠️ 重要安全提示:** - **安全地存储加密密钥** – 没有它,你的数据库将无法解密 - **切勿丢失此密钥** – 没有它无法恢复加密数据 - **将密钥与数据库备份分开备份** - **使用密码管理器**或安全的密钥管理系统来存储它 #### 内容安全策略 通过 Nginx 实施了强大的内容安全策略: ``` Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src 'self' https://trusted-domains.com; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline'; font-src 'self'; frame-src 'self'; base-uri 'self'; ``` 此策略: - 将脚本限制为同源(带有应用程序所需的例外) - 将 API 连接限制为受信任的来源 - 防止加载未经授权的资源 - 缓解 XSS 和数据注入攻击 ## 事件响应工具 服务器附带了一套全面的预装工具,用于监控、诊断和事件响应: ### 系统监控工具 | 工具 | 用途 | 基本用法 | |---------|----------------------------------------------------|---------------| | htop | 带有 CPU/内存使用情况的交互式进程查看器 | `htop` | | iotop | I/O 监控,按进程显示磁盘读/写 | `sudo iotop` | | sysstat | 系统性能工具 (iostat, mpstat 等) | `iostat -x 2` | | atop | 高级系统和进程监视器 | `atop` | | bmon | 带宽监控和速率估算器 | `bmon` | ### 网络监控工具 | 工具 | 用途 | 基本用法 | |---------|--------------------------------------------------------|--------------------------------------------------------| | iftop | 显示接口上的带宽使用情况 | `sudo iftop -i eth0` | | nethogs | 按进程分组带宽 | `sudo nethogs eth0` | | tcpdump | 网络数据包分析器 | `sudo tcpdump -i eth0 host 1.2.3.4` | | ethtool | 显示或更改以太网设备设置 | `sudo ethtool eth0` | | iperf3 | 网络带宽测量 | `iperf3 -s` (服务器) 或 `iperf3 -c server_ip` (客户端) | | ncat | 用于跨网络读写的网络工具 | `nc -l 9999` 或 `nc server_ip 9999` | ### 网络诊断工具 | 工具 | 用途 | 基本用法 | |------------|------------------------------------------------|----------------------------------------------| | mtr | 结合 ping 和 traceroute 的网络诊断 | `mtr example.com` | | arp-scan | ARP 扫描和指纹识别工具 | `sudo arp-scan --interface=eth0 --localnet` | | dnsutils | DNS 实用程序 (dig, nslookup) | `dig example.com` 或 `nslookup example.com` | | net-tools | 传统网络工具 | `netstat -tuln` | | traceroute | 打印数据包到网络主机的路由 | `traceroute example.com` | | whois | 查询 whois 数据库 | `whois example.com` | | unbound | 本地 DNS 缓存服务器 | 使用 `systemctl status unbound` 检查状态 | ### 文件完整性工具 | 工具 | 用途 | 基本用法 | |---------|------------------------------------------------------|-----------------------------| | debsums | 根据 MD5 校验和验证已安装的软件包文件 | `sudo debsums -c` | | aide | 高级入侵检测环境 | `sudo aide.wrapper --check` | 要检查 Debian 软件包中修改过的文件: ``` # Check all installed packages sudo debsums -a # Check for modified configuration files sudo debsums -c ``` ### 事件响应参考 如果怀疑发生了安全事件: 1. **立即评估**: # 检查未授权的进程 sudo htop # 检查异常的网络连接 sudo netstat -tulanp # 检查未授权的用户 last 2. **网络调查**: # 识别异常的网络流量 sudo iftop -i eth0 # 捕获可疑流量 sudo tcpdump -i eth0 -w capture.pcap host suspicious_ip 3. **验证系统完整性**: # 检查修改过的系统文件 sudo aide.wrapper --check # 验证软件包完整性 sudo debsums -c # 扫描 rootkit sudo rkhunter --check --sk sudo chkrootkit 4. **如果需要,创建证据**: # 创建用于取证的磁盘镜像 sudo dd if=/dev/sda of=/path/to/external/disk.img bs=4M ## 维护与监控 ### 日志位置 #### 常见日志(两种模式) - 服务器日志:`/opt/polyserver/logs` - 备份日志:`/opt/polyserver/backups/backup_*.log` - Nginx 访问日志:`/var/log/nginx/access.log` - Nginx 错误日志:`/var/log/nginx/error.log` #### Docker 模式特有 - 容器日志:`docker compose logs` 或 `docker logs ` - 应用程序日志:可通过 Docker 日志驱动程序获取 #### 裸金属模式特有 - PM2 日志:`pm2 logs` 或 `/home/deploy/.pm2/logs/` - 应用程序日志:`/opt/polyserver/logs/` 或特定于应用程序的位置 - 系统日志:使用 `sudo journalctl -xe` 访问 - 病毒扫描日志:`/var/log/clamav/daily_scan.log` - 恶意软件检测日志:`/var/log/maldet/daily_scan.log` - Rootkit 扫描日志: - `/var/log/rkhunter/daily_scan.log` (RKHunter) - `/var/log/chkrootkit/daily_scan.log` (chkrootkit) - 文件完整性日志:`/var/log/aide/aide.log` - 审计日志:`/var/log/audit/audit.log` - 审计报告:`/var/log/audit/reports/audit-report-*.txt` - ModSecurity 日志:`/var/log/nginx/modsec_audit.log` - 容器安全:`/var/log/security/trivy/trivy-*.log` - Suricata IDS 日志: - `/var/log/suricata/fast.log` (仅警报) - `/var/suricata/eve.json` (详细事件) - 防火墙日志:`/var/log/ufw.log` - Fail2ban 日志:`/var/log/fail2ban.log` - AppArmor 日志:`/var/log/syslog`(使用 grep 查找 'apparmor') - Logcheck 报告:通过电子邮件发送 - Logwatch 报告:通过电子邮件发送并位于 `/var/log/logwatch/logwatch.log` - Unbound DNS 日志:`/var/log/unbound.log` - DSGVO/GDPR 日志: - `/var/log/dsgvo/subject_requests.log` - `/var/log/dsgvo/dsgvo_check_*.txt` - `/var/log/security/incidents/` ### 监控 #### 系统监控(两种模式) - Netdata 指标:可通过 Netdata Cloud 或安全的 SSH 隧道在 `http://localhost:19999` 获取 - 系统资源使用情况:`htop`、`iotop`、`atop` - 网络监控:`iftop`、`nethogs` #### Docker 模式监控 - 容器资源使用情况:`docker stats` - 容器健康状况:`docker compose ps` 和 `docker compose top` - 容器日志:`docker compose logs -f` - Docker 系统信息:`docker system df` 和 `docker system events` #### 裸金属模式监控 - 进程监控:`pm2 monit`(适用于 Node.js 应用) - 服务状态:`systemctl status ` - 特定于应用程序的监控:取决于应用程序类型 ### 维护任务 | 任务 | 频率 | 命令/描述 | |-------------------------------|----------------------|---------------------------------------------------------------------------------------| | 验证备份 | 每周 | `ls -la /opt/polyserver/backups` 并检查 S3 存储桶 | | 测试备份恢复 | 每月 | 遵循灾难恢复计划中的备份恢复过程 | | 清理旧日志 | 每月 | `find /opt/polyserver/logs -type f -mtime +30 -delete` | | 检查磁盘空间 | 每周 | `df -h` 以确保有足够的空间 | | 验证自动更新 | 每周 | `cat /var/log/unattended-upgrades/unattended-upgrades.log` | | 检查病毒扫描日志 | 每周 | `cat /var/log/clamav/daily_scan.log` | | 审查 rootkit 扫描 | 每周 | `cat /var/log/rkhunter/daily_scan.log /var/log/chkrootkit/log.today` | | 审查原始 chkrootkit 输出 | 每月 | `cat /var/log/chkrootkit/log.raw`(绕过白名单) | | 更新 chkrootkit 基线 | 系统更改后 | `sudo cp /var/log/chkrootkit/log.today /var/log/chkrootkit/log.expected` | | 检查文件完整性 | 每周 | `sudo aide.wrapper --check` | | 更新病毒特征 | 每月 | `sudo freshclam` | | 更新 rootkit 数据库 | 每月 | `sudo rkhunter --update` | | 更新 AIDE 数据库 | 每月 | `sudo aide.wrapper --update` | | 清理未使用的 Docker 镜像 | 每月 | `docker system prune -a`(仅限 Docker 模式) | | 更新容器镜像 | 每周 | `docker compose pull && docker compose up -d`(仅限 Docker 模式) | | 检查容器健康状况 | 每周 | `docker compose ps` 和 `docker compose logs`(仅限 Docker 模式) | | 手动安全扫描 | 每季度 | `sudo rkhunter --check --sk` 并审查输出 | | 检查失败的更新 | 每周 | `grep "ERROR" /var/log/unattended-upgrades/unattended-upgrades.log` | | 审查 Logcheck 报告 | 每周 | 检查电子邮件以获取 logcheck 报告 | | 审查 Logwatch 报告 | 每周 | 检查电子邮件或 `/var/log/logwatch/logwatch.log` | | 检查 DNS 缓存状态 | 每周 | `unbound-control stats_noreset \| grep cache` | | 更新 Unbound 根提示 | 每月 | `sudo wget -O /var/lib/unbound/root.hints https://www.internic.net/domain/named.root` | | 检查 maldet 报告 | 每周 | `sudo maldet --report list` | | 更新 maldet 签名 | 每周 | `sudo maldet --update-sigs` | | 审查审计报告 | 每日 | 检查电子邮件或 `/var/log/audit/reports/audit-report-*.txt` | | 检查审计状态 | 每周 | `sudo auditctl -s` | | 运行手动审计报告 | 每月 | `sudo /opt/polyserver/scripts/audit-report.sh` | | 检查防火墙状态 | 每周 | `sudo ufw status verbose` | | 审查 fail2ban 状态 | 每周 | `sudo fail2ban-client status` | | 检查被封禁的 IP | 每周 | `sudo fail2ban-client status sshd` | | 检查 AppArmor 状态 | 每周 | `sudo aa-status` | | 检查 ModSecurity 日志 | 每周 | `sudo cat /var/log/nginx/modsec_audit.log \| grep -i "attack"` | | 审查 Suricata 警报 | 每周 | `sudo cat /var/log/suricata/fast.log` | | 扫描容器镜像 | 每月 | `sudo /etc/cron.daily/trivy-scan` | | 运行 DSGVO 合规性检查 | 每月 | `sudo /opt/polyserver/scripts/dsgvo-compliance-check.sh` | | 检查 SSH 身份验证日志 | 每周 | `sudo grep "Failed password\|Accepted publickey" /var/log/auth.log` | | 审查 SSH 配置 | 每季度 | `sudo sshd -T \| grep -E "(PasswordAuthentication\|PubkeyAuthentication\|Port)"` | ### 灾难恢复测试 定期测试你从故障中恢复的能力: 1. 安排每季度的恢复演练 2. 在测试环境中练习从备份恢复 3. 记录恢复时间和遇到的任何问题 4. 根据发现更新恢复程序 ### 日志轮转与管理 PolyServer 包含全面的日志轮转,以防止磁盘空间问题并保持系统性能。所有日志都会自动轮转,并进行压缩和适当的保留。 #### 已配置的日志轮转 | 日志类别 | 轮转频率 | 保留时间 | 位置 | |------------------------|--------------------|---------------------|-------------------------------------------------| | **Web 服务器日志** | 每日 | 30 天 | `/var/log/nginx/*.log` | | **ModSecurity WAF** | 每日 | 14 天 (最大 100MB) | `/var/log/nginx/modsec_*.log` | | **安全扫描** | 每周 | 12 周 | `/var/log/{clamav,maldet,rkhunter,chkrootkit}/` | | **容器安全** | 每周 | 8 周 | `/var/log/security/trivy/*.log` | | **Docker 容器** | 每日 | 7 天 (最大 100MB) | `/var/lib/docker/containers/*/*.log` | | **应用程序日志** | 每日 | 30 天 | `/opt/polyserver/logs/*.log` | | **备份日志** | 每周 | 12 周 | `/opt/polyserver/backups/*.log` | | **审计日志** | 每周 | 10 周 (最大 50MB) | `/var/log/audit/audit.log` | | **Suricata IDS** | 每日 | 7 天 | `/var/log/suricata/*.log` | | **Netdata 监控** | 每日 | 14 天 | `/var/log/netdata/*.log` | | **Unbound DNS** | 每周 | 12 周 | `/var/log/unbound.log` | | **Fail2ban** | 每周 | 12 周 | `/var/log/fail2ban.log` | | **UFW 防火墙** | 每日 | 30 天 | `/var/log/ufw.log` | | **DSGVO/GDPR** | 每月 | 24 个月 | `/var/log/dsgvo/*.log` | | **安全事件** | 每月 | 36 个月 | `/var/log/security/incidents/*.log` | #### 日志轮转功能 - **压缩**:所有轮转的日志都会被压缩以节省磁盘空间 - **适当的权限**:轮转的日志保持适当的权限和所有权 - **服务集成**:日志轮转后服务会被正确地重新加载/重启 - **大小限制**:大型日志 (ModSecurity、Docker) 具有基于大小的轮转 - **合规性**:安全和 GDPR 日志具有延长的保留期以满足合规性要求 #### 手动日志轮转 ``` # Force rotation of all logs sudo logrotate -f /etc/logrotate.conf # Test log rotation configuration sudo logrotate -d /etc/logrotate.conf # Check log rotation status sudo cat /var/lib/logrotate/status ``` #### 监控磁盘使用情况 ``` # Check log directory sizes sudo du -sh /var/log/* | sort -h # Check PolyServer logs specifically sudo du -sh /opt/polyserver/{logs,backups} # Monitor disk space df -h /var/log ``` ### 高级网络流量监控 除了内置的监控工具外,系统还提供了使用 `tcpdump` 进行高级网络流量分析的功能。这在安全事件期间或进行流量分析时可能非常有价值。 #### 监控 DNS 流量 要监控和记录 DNS 查询以进行安全分析: ``` # Create log file with proper permissions sudo touch /var/log/dns_queries.log sudo chown root:root /var/log/dns_queries.log sudo chmod 644 /var/log/dns_queries.log # Start DNS monitoring in background (persists after logout) nohup sudo bash -c 'tcpdump -i any port 53 -n -l -C 100 -W 5 >> /var/log/dns_queries.log 2>&1' & # Check if monitoring is running pgrep -a tcpdump ``` 此配置: - 捕获所有 DNS 流量(端口 53) - 创建一个轮转日志(5 个文件,每个 100MB) - 即使你注销也会继续运行 #### 用于取证的完整数据包捕获 在安全事件期间,捕获完整的数据包数据可以提供关键的取证证据: ``` # Capture all traffic on primary interface to a pcap file sudo tcpdump -i eth0 -w /var/log/security/incident-$(date +%Y%m%d).pcap # For long-term monitoring with file rotation (new file every 5 minutes) nohup sudo tcpdump -i eth0 -w '/var/log/security/net_%Y%m%d_%H%M.pcap' -G 300 -W 12 > /dev/null 2>&1 & ``` 对于持续的长期监控,请设置带清理的轮转捕获: ``` # Set up directory sudo mkdir -p /var/log/security/netcapture sudo chmod 700 /var/log/security/netcapture # Start continuous capture with 5-minute rotation nohup sudo tcpdump -i eth0 -w '/var/log/security/netcapture/net_%Y%m%d_%H%M.pcap' -G 300 > /dev/null 2>&1 & # Add cron job to delete files older than 2 hours sudo crontab -e # Add this line: 0 * * * * find /var/log/security/netcapture -name "net_*.pcap" -mmin +120 -delete ``` #### 管理捕获进程 ``` # Find running tcpdump processes ps aux | grep tcpdump # Stop all tcpdump processes sudo pkill tcpdump # Stop a specific process by PID sudo kill 21678 # Monitor capture file growth ls -lh /var/log/security/netcapture/ # To leave shell while keeping capture running jobs # List jobs disown %1 # Disown job #1 # or disown -a # Disown all jobs ``` #### 针对性的流量监控 用于针对特定服务或可疑活动的监控: ``` # Monitor web traffic (HTTP/HTTPS) sudo tcpdump -i eth0 'tcp port 80 or tcp port 443' -w /var/log/security/web_traffic.pcap # Monitor traffic to a specific IP address sudo tcpdump -i eth0 host 192.168.1.100 -w /var/log/security/host_traffic.pcap # Monitor SSH traffic for intrusion attempts sudo tcpdump -i eth0 'tcp port 22' -w /var/log/security/ssh_traffic.pcap # Monitor database traffic (e.g., PostgreSQL) sudo tcpdump -i eth0 'tcp port 5432' -w /var/log/security/db_traffic.pcap ``` #### 分析捕获文件 可以使用 Wireshark 或命令行工具分析捕获的文件: ``` # Basic capture file statistics tcpdump -r capture.pcap | wc -l # Count packets tcpdump -r capture.pcap -n | head -20 # View first 20 packets # Extract HTTP request headers tcpdump -r capture.pcap -A | grep -i "host:" | sort | uniq -c | sort -rn # Find potential DNS exfiltration (unusually long DNS names) tcpdump -r capture.pcap -n port 53 | grep -E '[A-Za-z0-9]{30,}' # Extract IP conversations tcpdump -r capture.pcap -nn -q | awk '{print $3 " " $5}' | tr -d : | sort | uniq -c | sort -nr | head ``` #### 数据包捕获的安全最佳实践 1. **存储管理**:网络捕获增长迅速。请始终设置适当的轮转和清理。 2. **访问控制**:限制对数据包捕获文件的访问,因为它们可能包含敏感信息。 3. **针对性捕获**:在生产环境中,使用过滤器仅捕获相关流量并避免性能影响。 4. **内存使用**:在运行长时间捕获时监控系统资源,因为它们会消耗大量内存。 5. **数据保护**:考虑数据包捕获的隐私影响,并根据组织的数据政策进行处理。 ## 自定义部署 1. 编辑 `templates/` 目录中的模板文件 2. 修改 `templates/defaults.env` 以自定义你的服务器配置: - 设置 `DEPLOYMENT_MODE=baremetal` 进行直接应用程序部署 - 设置 `DEPLOYMENT_MODE=docker` 进行容器化应用程序部署 3. 运行 `./scripts/generate-configs.sh` 重新生成配置文件 4. 使用 `./scripts/deploy-unified.sh` 进行部署 ## 性能比较 | 方面 | Docker 模式 | 裸金属模式 | |----------------------|------------------------|------------------------| | **设置复杂性** | ⭐⭐⭐⭐⭐ 简单 | ⭐⭐⭐ 中等 | | **性能** | ⭐⭐⭐⭐ 良好 | ⭐⭐⭐⭐⭐ 优秀 | | **资源使用** | ⭐⭐⭐ 较高开销 | ⭐⭐⭐⭐⭐ 极低开销 | | **安全性** | ⭐⭐⭐⭐⭐ 相同 | ⭐⭐⭐⭐⭐ 相同 | | **维护** | ⭐⭐⭐⭐ 简单 | ⭐⭐⭐ 更复杂 | | **可扩展性** | ⭐⭐⭐⭐⭐ 优秀 | ⭐⭐⭐⭐ 良好 | | **隔离性** | ⭐⭐⭐⭐⭐ 优秀 | ⭐⭐⭐程级别 | | **部署** | ⭐⭐⭐⭐⭐ 容器镜像 | ⭐⭐⭐ 手动设置 | ### Docker 模式的优势: - **易于部署**:应用程序打包为容器镜像 - **完美的隔离**:每个应用程序都在自己的容器中 - **水平扩展**:轻松添加/移除容器实例 - **回滚能力**:快速回滚到以前的容器版本 - **环境一致性**:相同的容器可以在任何地方运行 - **资源限制**:每个应用程序内置 CPU/内存约束 ### 裸金属模式的优势: - **最大性能**:没有容器化开销 - **最少的资源使用**:直接硬件访问 - **更低的复杂性**:更少的移动部件 - **直接调试**:更容易排除故障 - **自定义优化**:完全控制系统配置 两种模式都提供相同的全面安全功能和监控能力。 ## 本地测试 在部署到生产环境之前,你可以使用 Docker 在本地测试 PolyServer 基础。这允许你验证配置、测试安全功能,并确保两种部署模式的一切都能正常工作。 ### 测试不同的部署模式 你可以通过编辑测试配置在本地测试两种部署模式: ``` # Test bare metal mode (default) echo "DEPLOYMENT_MODE=baremetal" > test-config/.env # Or test Docker mode echo "DEPLOYMENT_MODE=docker" > test-config/.env ``` ### 基于 Docker 的测试 1. **启动本地测试环境**: ./local-test-docker.sh 此脚本将: - 创建一个基于 Docker 的 PolyServer 测试环境 - 从模板生成配置文件 - 设置一个带有安全头的基本 Web 服务器 - 提供健康检查端点 - 为数据、日志和配置创建持久卷 2. **访问测试环境**: - Web 界面:`http://localhost:8080` - 健康检查:`http://localhost:8080/health` - 容器日志:`docker logs -f polyserver-test` - Zsh shell (root):`docker exec -it polyserver-test /bin/zsh` - Zsh shell (testuser):`docker exec -it -u testuser polyserver-test /bin/zsh` 3. **清理测试环境**: ./local-test-cleanup-docker.sh **安全地**仅移除 PolyServer 特定的测试容器、网络和卷。你的其他 Docker 资源将保持不变。 ### 测试内容 - **基本配置**:模板生成和配置文件创建 - **Web 服务器**:带有安全头和专业登陆页面的 Nginx 设置 - **目录结构**:PolyServer 基础目录布局 - **安全功能**:基本安全配置 - **健康监控**:服务健康检查端点 - **开发环境**:Oh My Zsh 带有实用插件和增强的 vim 配置 ### 测试 PolyServer 脚本 你可以直接在 Docker 容器中测试 PolyServer 脚本和功能: ``` # Access the container shell docker exec -it polyserver-test /bin/zsh # Test DSGVO compliance scripts cd /opt/polyserver/scripts ./dsgvo-compliance-check.sh # Test breach response procedures ./breach-response-checklist.sh # Test forensic collection ./collect-forensics.sh /tmp/test-evidence # Test data subject request handling ./data-subject-request.sh ``` ### 测试你的应用程序 一旦你为特定应用程序扩展了 PolyServer,你可以修改测试脚本以: - 测试特定于应用程序的配置 - 验证自定义模板和设置 - 测试应用程序部署过程 - 验证监控和安全集成 本地测试环境提供了一个安全的沙箱,以便在部署到生产服务器之前对配置进行试验。 ## CI/CD 与测试 PolyServer 包含通过 GitHub Actions 工作流进行的全面自动测试和验证,以确保代码质量、安全性和适当的功能。 ### 自动化测试工作流 #### 🔧 **服务器加固测试** (`test-server-hardening.yml`) 对 PolyServer 基础的全面测试: - **模板验证**:验证 shell 脚本语法和配置生成 - **矩阵测试**:并行测试 Docker 和裸金属部署模式 - **服务器加固**:在容器化环境中运行实际的 server-setup.sh 脚本 - **安全验证**:验证日志轮转、审计配置和 DSGVO 合规性 - **本地测试**:测试本地 Docker 测试工作流 **触发条件**:对 main 的 Pull request、推送到 main、对 templates/ 或 scripts/ 的更改 #### 🛡️ **安全扫描** (`security-scan.yml`) 多层安全验证: - **机密扫描**:使用 TruffleHog 检测暴露的凭证 - **漏洞扫描**:使用 Trivy 扫描容器镜像 - **依赖审计**:验证外部依赖项和供应链安全 - **代码质量**:ShellCheck 分析和配置验证 - **安全报告**:带有 PR 评论的自动化安全报告 **触发条件**:Pull request、每周计划(星期日 UTC 凌晨 2 点)、手动分派 #### 📚 **文档验证** (`docs-validation.yml`) 确保文档的质量和一致性: - **Markdown 验证**:语法检查和格式化 - **链接验证**:内部和外部链接验证 - **目录**:与实际文档结构的一致性 - **内容完整性**:所需章节和 DSGVO 文档 - **引用验证**:文档中的文件和目录引用 **触发条件**:对 *.md 文件的更改、对 main 的 Pull request ### 测试策略 #### 质量门禁 所有工作流必须通过,PR 才能合并到 main 分支: 1. ✅ 模板语法和配置生成 2. ✅ 两种部署模式下的服务器加固 3. ✅ 安全验证和合规性检查 4. ✅ 文档的一致性和完整性 #### 安全优先的方法 - 持续的漏洞扫描 - 机密检测和预防 - 供应链安全监控 - 代码质量强制执行 #### 自动化报告 - 安全扫描结果发布到 PR 评论 - 用于持续监控的每周安全报告 - 用于故障排除的详细测试构件 - 性能跟踪和优化 ### 在本地运行测试 #### 先决条件 ``` # Docker for container testing docker --version # ShellCheck for script validation shellcheck --version # Basic tools curl --version ``` #### 本地测试执行 ``` # Run full local testing suite ./local-test-docker.sh # Run specific template validation ./scripts/generate-configs.sh templates/defaults.env test-output/ # Validate shell scripts find scripts/ -name "*.sh" -exec shellcheck {} \; # Test both deployment modes echo "DEPLOYMENT_MODE=docker" > test.env cat templates/defaults.env >> test.env ./scripts/generate-configs.sh test.env test-docker/ ``` #### 手动安全检查 ``` # Check for secrets (requires TruffleHog) trufflehog git file://. --only-verified=false # Scan containers for vulnerabilities (requires Trivy) trivy image polyserver:test # Validate configuration files find templates/ -name "*.yml" -exec yamllint {} \; ``` ### 贡献指南 #### 对于贡献者 1. **在本地测试**:在提交 PR 之前运行本地测试 2. **审查安全性**:处理任何安全扫描警告 3. **更新文档**:确保文档反映更改 4. **遵循约定**:使用既定的编码和文档标准 #### 对于安全敏感的更改 1. **额外验证**:彻底测试安全配置 2. **审查依赖项**:审计任何新的外部依赖项 3. **文档化更改**:根据需要更新安全文档 4. **监控结果**:审查自动安全扫描结果 ### 工作流维护 CI/CD 工作流旨在: - **自我维护**:安全工具的自动更新 - **可扩展**:轻松添加新的测试和验证 - **高效**:并行执行和智能缓存 - **信息丰富**:清晰的报告和可操作的反馈 有关详细的工作流文档,请参阅 [`.github/README-WORKFLOW.md`](.github/README-WORKFLOW.md)。
标签:Bastion Host, Debian 13, DevSecOps, DSGVO合规, GDPR合规, GitHub Advanced Security, Linux服务器, Metaprompt, Nginx, OpenVAS, PE 加载器, PHP, React, Syscalls, Web应用部署, x64dbg, 上游代理, 企业级安全, 堡垒机, 子域名变形, 安全加固, 安全基线, 应用安全, 搜索引擎查询, 教学环境, 数据库服务器, 无线安全, 服务器配置, 测试用例, 系统加固, 自动化事件响应, 自动化运维, 请求拦截, 隐私合规