logoDocs

EC2 服务器设置 TODO List

目标: 按照 consolidated-ec2-setup-ssh-tunnel.md 文档设置一台安全的、包含公开 Docker Registry 和内部服务的 AWS EC2 服务器。

负责人: [在此处填写负责人姓名] 截止日期: [在此处填写截止日期]

阶段 1: 基础 EC2 和安全设置

  • 初始化 EC2 实例:
    • 选择 Amazon Linux 2023 AMI
    • 选择实例类型 (e.g., t3a.large)
    • 创建新 SSH 密钥对 (.pem), 安全存储并设置权限 (chmod 400)
    • 配置网络 (VPC, 子网, 启用公有 IP)
    • 创建初始安全组 (initial-ssh-sg), 仅允许 TCP 22 从 "我的 IP"
    • 配置存储 (gp3, 30GB+, 加密)
    • 启动实例
    • 使用 ec2-user 和初始密钥对成功连接实例
  • 服务器安全加固:
    • 更新系统 (sudo dnf update -y)
    • 创建管理员用户 devadmin (adduser, passwd, usermod -aG wheel)
    • 为 devadmin 创建 .ssh 目录并设置权限 (mkdir, chmod 700, chown)
    • 将你自己的公钥添加到 /home/devadmin/.ssh/authorized_keys 并设置权限 (touch, chmod 600, chown, nano)
    • (关键测试) 从新终端使用 devadmin 和你的私钥成功 SSH 登录,并测试 sudo
    • (确认 devadmin 登录后) 编辑 /etc/ssh/sshd_config:
      • 修改 Port 为非标准端口 (e.g., 2222) -> 记下新端口
      • 设置 PermitRootLogin no
      • 设置 PasswordAuthentication no
      • 设置 PubkeyAuthentication yes
      • 设置 ChallengeResponseAuthentication no
      • (关键) 添加 AllowUsers devadmin
    • (关键测试) 验证 SSH 配置 (sshd -t) 并重启服务 (systemctl restart sshd)
    • (最终验证)
      • 保持 ec2-user 会话打开
      • 从新终端使用 devadmin、你的私钥和新端口成功 SSH 登录
      • 尝试使用 ec2-user 登录,确认失败
      • 关闭 ec2-user 会话
    • 配置 firewalld:
      • 启用并启动 firewalld (systemctl enable --now firewalld)

      • 移除默认 SSH 服务 (firewall-cmd --permanent --remove-service=ssh)

      • 添加规则允许新 SSH 端口从你的 IP:

        firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="你的公网IP/32" port port="你的SSH端口" protocol="tcp" accept'
      • 重新加载规则 (firewall-cmd --reload)

      • 检查规则 (firewall-cmd --list-all)

    • 安装并配置 fail2ban:
      • 安装 (dnf install fail2ban -y)
      • 创建 jail.local (cp jail.conf jail.local)
      • 编辑 jail.local, 在 [sshd] 下设置 enabled = true 和 port = 你的SSH端口
      • 启用并启动服务 (systemctl enable --now fail2ban)
      • 检查状态 (fail2ban-client status sshd)

阶段 2: 软件安装与配置

  • (可选) 自定义 Shell (PWSH 7):
    • 安装 PowerShell (dnf install powershell -y)
    • (可选) 设置为 devadmin 的默认 Shell (chsh)
  • 安装 Docker & Docker Compose:
    • 安装 Docker (dnf install docker -y)
    • 启动并启用 Docker 服务 (systemctl start/enable docker)
    • 将 devadmin 添加到 docker 组 (usermod -aG docker devadmin)
    • 注销并重新登录 devadmin 使组成员身份生效
    • 验证 Docker 命令无需 sudo (docker ps)
    • 验证 Docker Compose (docker compose version)
  • 配置 Docker Registry (公开):
    • 安装 httpd-tools (dnf install httpd-tools -y)

    • 创建 Nginx 认证目录和文件:

      mkdir -p /etc/docker_registry/auth
      htpasswd -c /etc/docker_registry/auth/registry.passwd registry_user

      -> 记下 registry_user 和密码

    • 创建 Nginx 配置文件 (/etc/docker_registry/nginx.conf), 监听 8080, 配置 auth_basic, 代理到 docker-registry-backend:5000

    • 创建 docker-compose-registry.yml 文件 (包含 docker-registry-backend 和 nginx-proxy 服务, nginx-proxy 暴露 0.0.0.0:8080:8080)

    • 启动 Registry 服务 (docker compose -f docker-compose-registry.yml up -d)

  • 配置内部服务 (SSH Tunnel):
    • 创建 docker-compose-internal.yml 文件
    • 添加 registry-ui 服务, 暴露 127.0.0.1:8081:80
    • 添加 mongodb 服务, 暴露 127.0.0.1:27017:27017, 设置 MONGO_INITDB_ROOT_USERNAME / PASSWORD -> 记下 MongoDB 用户名/密码
    • 添加 redis 服务, 暴露 127.0.0.1:6379:6379, 设置 --requirepass -> 记下 Redis 密码
    • 添加 postgres 服务, 暴露 127.0.0.1:5432:5432, 设置 POSTGRES_PASSWORD/USER/DB -> 记下 PostgreSQL 用户名/密码/数据库名
    • 在 docker-compose-internal.yml 中定义所需的数据卷 (mongo_data, redis_data, postgres_data)
    • 在 docker-compose-internal.yml 中定义 internal-services-net 网络 (driver: bridge)
    • (如果 registry-ui 需要访问 registry-net) 在 docker-compose-internal.yml 中定义外部网络 registry-net (external: true) 并连接 registry-ui
    • 启动内部服务 (docker compose -f docker-compose-internal.yml up -d)
  • 配置 NodeJS & PNPM:
    • 安装 nvm 并配置 shell
    • 安装 NodeJS LTS (nvm install --lts) 并设置默认
    • 安装 pnpm (npm install -g pnpm)
  • 配置 Python & UV:
    • 安装 pyenv 依赖
    • 安装 pyenv 并配置 shell
    • 安装所需 Python 版本 (pyenv install 3.11.7)
    • 安装 uv (curl ... | sh)
    • 确认项目中使用虚拟环境 (uv venv 或 python -m venv)
  • (可选) 配置管理面板 (e.g., Cockpit/Portainer):
    • 安装面板
    • 配置防火墙/安全组仅允许你的 IP 访问面板端口 (e.g., 9090/9443)
    • 考虑通过 SSH 隧道访问面板以增强安全性

阶段 3: AWS 基础设施 (Registry 相关)

  • 配置 ACM:
    • 为 registry.yourdomain.com (和根域) 请求公共证书
    • 完成 DNS 或电子邮件验证
  • 配置 ELB (ALB):
    • 创建 ALB (registry-alb, Internet-facing, 公共子网)
    • 创建 ALB 安全组 (alb-registry-public-sg), 允许公网访问 TCP 443 (和 80)
    • 创建目标组 (tg-registry-http), 协议 HTTP, 端口 8080, 注册 EC2 实例
    • 配置 HTTPS 监听器 (443), 使用 ACM 证书, 转发到 tg-registry-http
    • (可选) 配置 HTTP 监听器 (80), 重定向到 HTTPS
  • 配置 EC2 安全组 (精细化):
    • 确认 EC2 实例安全组 (dev-server-sg)
    • 仅允许你的SSH端口从你的IP地址/32
    • 仅允许 TCP 8080 从 ALB安全组ID
    • 移除/确认没有其他不必要的入站规则 (特别是针对 8081, 27017, 6379, 5432 的公网或 ALB 规则)
  • 配置 Route 53:
    • 创建 A 类型别名记录 registry.yourdomain.com 指向 registry-alb
    • 移除/确认没有 ui.registry, mongo, redis, pg 指向 ALB 的记录

阶段 4: 访问、维护和文档

  • 测试 SSH Tunnel 访问:
    • 按照开发者指南尝试连接 Registry UI, MongoDB, Redis, PostgreSQL
  • 配置自动运维脚本:
    • 创建并测试系统更新脚本 (auto_update.sh) 并添加到 cron
    • 创建并测试 Docker 清理脚本 (docker_cleanup.sh) 并添加到 cron
    • 创建并测试数据库备份脚本并添加到 cron, 确保备份存储在安全位置 (如 S3):
      • PostgreSQL (使用 pg_dump, 连接 127.0.0.1)
      • MongoDB (使用 mongodump, 连接 127.0.0.1)
      • Redis (复制 RDB/AOF 文件)
    • 配置日志轮转 (logrotate)
    • (推荐) 配置 CloudWatch 监控和告警
  • 整理文档和操作规范:
    • 更新本文档 (consolidated-ec2-setup-ssh-tunnel.md) 中的所有占位符和实际配置
    • 使用密码管理器安全存储所有凭证
    • (可选) 绘制网络图
    • 记录备份和恢复流程
    • 建立变更管理流程
    • 编写或完善操作规范 (SOP)

阶段 5: 最终审查

  • 全面审查: 再次检查所有配置、安全组、防火墙规则、服务状态和访问权限。
  • 安全扫描 (可选): 使用漏洞扫描工具检查服务器。
  • 确认完成: 所有步骤完成且经过验证。