logoDocs

服务器操作、日志与安全规范

包含服务器操作手册 (SOP)、操作日志记录规范以及 SSH 密钥和凭证管理守则。

文档、规范与日志

为了确保服务器的稳定运行和可维护性,建立清晰的文档、遵循标准的操作规范以及记录关键操作至关重要。

核心文档与信息

  1. 服务器配置文档 (initialize-aws-ec2-based-server.mdx): 作为服务器配置和架构的核心指南,应保持最新状态。记录所有关键配置、安装的服务、使用的端口、管理员用户名 (devadmin) 等。建议使用版本控制系统 (如 Git) 管理此文档。
  2. 网络架构图: 绘制清晰的网络拓扑图,展示 EC2 实例、ALB、安全组、VPC、子网以及它们之间的流量路径和端口。
  3. 备份与恢复计划: 详细记录备份策略(包括备份内容、频率、保留期、存储位置)和详细的恢复步骤。定期测试恢复流程以确保其有效性。
  4. 应急联系人: 明确记录负责此服务器维护和处理紧急情况的人员及其联系方式。

服务器操作手册 (SOP)

制定标准操作流程 (Standard Operating Procedures) 以规范常见任务,减少错误并提高效率。

  1. SSH 访问:

    • 密钥获取: 新管理员加入时,需生成新的 ED25519 或 RSA 4096 密钥对。公钥需由现有管理员添加到 /home/devadmin/.ssh/authorized_keys 文件中。
    • 连接: 必须使用 -i 指定私钥文件,并通过指定的非标准 SSH 端口 (<你的SSH端口>) 连接。
      ssh -i <你的私钥文> -p <你的SSH端> devadmin@<服务器IP>
    • SSH Tunnel 使用:
      • 明确需要访问哪个内部服务 (如 MongoDB, Redis, UI)。
      • 使用 -L <本地端口>:127.0.0.1:<远程服务端口> 建立隧道。
      • 仅在需要访问时保持隧道开启,完成后立即关闭 (Ctrl+C)。
      • 严禁通过隧道暴露不必要的服务或端口。
    • 权限: devadmin 用户拥有 sudo 权限,操作时务必谨慎。非必要不切换到 root 用户。
  2. 服务部署与更新:

    • 代码部署: 推荐使用 Git 进行版本控制。通过 SSH 将代码克隆或拉取到服务器指定目录。
    • Docker 服务更新:
      • 拉取新镜像: docker pull <镜像名>:<标签>
      • 停止并移除旧容器: docker compose -f <compose文件> downdocker stop <容器名> && docker rm <容器名>
      • 使用 Compose 启动: docker compose -f <compose文件> up -d
      • 验证: 检查容器日志 (docker logs <容器名>) 和服务状态。
    • 系统更新: 定期执行 sudo dnf update -y (或使用自动化脚本)。更新后注意检查核心服务是否正常运行。
  3. 日志查看与分析:

    • 系统日志: /var/log/messages, /var/log/secure (SSH 登录等安全事件)。
    • 服务日志: journalctl -u <服务名> (例如 journalctl -u sshd, journalctl -u firewalld, journalctl -u fail2ban, journalctl -u docker)。
    • Docker 容器日志: docker logs <容器名或ID>
    • 应用日志: 根据应用配置查看,通常位于应用目录下或 /var/log/<应用名>
    • 自动化脚本日志: /var/log/auto_update.log, /var/log/docker_cleanup.log 等。
  4. 故障排查:

    • 检查服务状态: systemctl status <服务名>, docker ps -a
    • 检查网络连接: ping, traceroute, ss -tulnp (查看监听端口)。
    • 检查防火墙规则: sudo firewall-cmd --list-all (Firewalld), AWS 控制台安全组规则。
    • 检查资源使用: top, htop, df -h (磁盘空间), free -h (内存)。
    • 分析相关日志: 根据故障现象定位并分析相关日志文件。
  5. 安全事件响应:

    • 发现异常: 监控系统告警、检查 Fail2Ban 状态 (sudo fail2ban-client status sshd)、审查安全日志。
    • 隔离: 如有必要,修改安全组规则,暂时阻止可疑 IP 的访问。
    • 分析: 确定攻击来源、方式和影响范围。
    • 修复: 修复漏洞、清除恶意软件、修改受影响的凭证。
    • 记录: 详细记录事件过程、分析结果和处理措施。

操作日志 (Change & Action Log)

维护一份清晰的操作日志对于追踪变更、审计和故障排查至关重要。

  1. 记录内容:

    • 时间: 操作发生的精确时间 (UTC 或服务器本地时间,需注明)。
    • 操作人: 执行操作的管理员 (devadmin)。
    • 操作类型: 例如:配置变更、软件安装/更新、服务启动/停止、用户管理、安全事件处理、故障排查。
    • 操作详情: 具体执行的命令、修改的文件、变更的内容摘要。
    • 变更原因: 为什么进行此操作(例如:部署新功能、修复 Bug、安全加固、响应告警)。
    • 影响范围: 变更可能影响的服务或系统组件。
    • 回滚计划 (如适用): 如果操作失败,如何恢复到之前的状态。
    • 结果: 操作是否成功,是否有预期之外的影响。
  2. 记录方式:

    • 专用日志文件: 在服务器上维护一个文本文件 (例如 /var/log/admin_actions.log),严格控制访问权限。
      # 示例记录
      echo "$(date '+%Y-%m-%d %H:%M:%S %Z') - devadmin - 配置变更 - 修改 /etc/ssh/sshd_config,将 ClientAliveInterval 改为 600 - 原因: 延长 SSH 空闲超时 - 影响: SSH 服务 - 回滚: 修改回 300 并重启 sshd - 结果: 成功" | sudo tee -a /var/log/admin_actions.log
    • 版本控制系统 (Git): 如果服务器配置 (如 /etc 下的文件, Docker Compose 文件等) 通过 Git 管理,可以将操作详情记录在 Commit Message 中。
    • 项目管理工具/Wiki: 对于复杂的变更或项目,可以在 JIRA, Confluence 或类似工具中记录。
  3. 频率: 所有对系统配置、关键服务、安全设置、用户权限的非自动化更改都应记录。日常的、自动化的任务(如 Cron 执行的脚本)只需记录其初始配置和重大修改。

密钥管理守则

SSH 密钥是访问服务器的主要凭证,必须严格管理。

  1. 密钥生成:

    • 推荐算法: 使用 ED25519RSA 4096
      ssh-keygen -t ed25519 -C "your_email@example.com"
      # 或者
      ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    • 密码保护: 强烈建议为私钥设置强密码 (passphrase)。
  2. 私钥存储与保护 (本地):

    • 存储位置: 通常存储在本地用户的 ~/.ssh/ 目录下。
    • 权限: 私钥文件权限必须设置为 600400 (chmod 600 ~/.ssh/id_ed25519)。
    • 物理安全: 保护存储私钥的设备安全,防止丢失或被盗。
    • 禁止共享: 绝对禁止与他人共享私钥文件或将其上传到任何公共或共享存储(包括代码仓库)。
  3. 公钥管理 (服务器端):

    • 文件: 公钥存储在服务器的 /home/devadmin/.ssh/authorized_keys 文件中。
    • 权限: .ssh 目录权限为 700authorized_keys 文件权限为 600。所有权必须是 devadmin:devadmin
    • 添加: 新增公钥时,仔细核对,确保没有多余空格或换行。
    • 移除: 当管理员离开或不再需要访问权限时,立即authorized_keys 文件中移除其公钥。
  4. 密钥轮换:

    • 定期 (例如每年) 生成新的密钥对,并将新的公钥添加到服务器,移除旧的公钥。虽然 SSH 密钥本身不易被破解,但轮换有助于降低因私钥意外泄露带来的长期风险。
  5. 凭证管理工具:

    • 对于其他服务密码 (如数据库密码、API 密钥等),应使用安全的密码管理器 (如 KeePassXC, 1Password, Bitwarden) 或 AWS Secrets Manager / Parameter Store 进行存储和管理。
    • 严禁在代码、配置文件、文档或操作日志中硬编码或明文存储任何密码或私钥。