AWS-EC2EC2 服务器设置 TODO List
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: 最终审查
- 全面审查: 再次检查所有配置、安全组、防火墙规则、服务状态和访问权限。
- 安全扫描 (可选): 使用漏洞扫描工具检查服务器。
- 确认完成: 所有步骤完成且经过验证。