DiegoRSMachado/aws-ec2-mysql-implementacao

GitHub: DiegoRSMachado/aws-ec2-mysql-implementacao

一个在 AWS EC2 上安全部署 MySQL 数据库的教学实践项目,通过 SSH 隧道和最小权限配置避免数据库直接暴露在公网。

Stars: 0 | Forks: 0

# AWS EC2 + MySQL — 安全访问实施 **AWS EC2 (Ubuntu)** 实例上的 **MySQL 8** 数据库服务器,用于人力资源(HR)schema, 重点关注**安全的远程访问**(不将数据库暴露到互联网),应用程序用户 具备**最小权限**,且 schema 保持完整(参照完整性 + utf8mb4)。 学术/受监督实验室 (SENAC-DF)。 ## 核心安全决策:不暴露 3306 端口 常见的错误是在 Security Group 中开放 3306 端口用于远程访问。暴露在互联网上的 MySQL 是被 僵尸网络扫描最多的目标之一 (T1190)。正确的方法是通过 22 端口使用 **SSH 隧道** (该端口已为管理开放):MySQL 仅监听 `127.0.0.1`,并且 Workbench 的流量 **在 SSH 内部加密传输**。数据库端口永远不会公开。 | 项目 | 错误(常见) | 最佳实践(本文档) | |---|---|---| | Security Group 中的 3306 端口 | 对 `0.0.0.0/0` 开放 | **未开放** — 通过 SSH 隧道访问 | | MySQL 的 `bind-address` | `0.0.0.0` | `127.0.0.1` (loopback) | | 连接用户 | `root` | 具备最小权限的 `app_rh` | | Workbench 访问 | 直接连接 3306 的 TCP | **Standard TCP/IP over SSH** | ## Security Group (AWS) — 入站规则 | 端口 | 协议 | 来源 | 理由 | |---|---|---|---| | 22 | TCP | **您的 IP** (`x.x.x.x/32`),而不是 `0.0.0.0/0` | 管理 + SSH 隧道 | | 80/443 | TCP | 根据需要 | **仅在存在 Web 服务器时** — 本实验仅为数据库;如不使用请删除 | ## 文件 | 文件 | 功能 | |---|---| | `01_schema.sql` | 创建数据库/表(幂等、utf8mb4、FK、索引)并填充数据 | | `02_security_least_privilege.sql` | 创建具备最小权限的用户 `app_rh` | ## 对原 schema 的修正内容 - **`SET NAMES utf8mb4` + 数据库/表的 charset**:没有这个,重音字符会保存损坏 (`João` 会变成 `João`)— 该 bug 已在测试中确认。现在可以正确保存。 - **参照完整性**:创建了 `Departamentos` 表,并在 `Funcionarios.departamento_id` 上添加了 `FOREIGN KEY`。以前该列没有指向任何目标。 - **幂等性**:`CREATE ... IF NOT EXISTS` — 脚本可重复运行而不会报错。 - **在 FK 字段上使用 `ENGINE=InnoDB` + 索引**(这对于 joins 和 FK 本身至关重要)。 ## 如何使用 ### 1. 应用 schema(在服务器上,通过 SSH) ``` sudo mysql < 01_schema.sql ``` ### 2. 创建应用程序用户 ``` # 在运行前替换 placeholder 密码 sudo mysql < 02_security_least_privilege.sql ``` ### 3. 安全连接 MySQL Workbench(SSH 隧道) 在 Workbench 中,新建连接 → **Connection Method: Standard TCP/IP over SSH**: - **SSH Hostname:** `IP_PUBLICO_DA_EC2:22` - **SSH Username:** `ubuntu` (+ 您的 `.pem` 密钥) - **MySQL Hostname:** `127.0.0.1` · **MySQL Port:** `3306` - **Username:** `app_rh` Workbench 将打开 SSH 隧道并与 EC2 上的本地 MySQL 通信。绝对不会暴露 3306 端口。 ## 验证(已在真实引擎中测试) ``` -- Acentuação correta: SELECT nome FROM Funcionarios; -- João Silva, Maria Souza, Carlos Almeida -- Integridade referencial (deve falhar com ERROR 1452): INSERT INTO Funcionarios (nome, departamento_id) VALUES ('Teste', 999); -- Privilégios mínimos do usuário: SHOW GRANTS FOR 'app_rh'@'localhost'; -- só SELECT/INSERT/UPDATE/DELETE em Trabalho.* ``` ## 控制措施映射 | 向量 | ATT&CK | 控制措施 | |---|---|---| | 数据库暴露在互联网 | T1190 | 3306 端口关闭;通过 SSH 隧道访问 | | 滥用特权账户 | T1078 | 具备最小权限的 `app_rh` 用户 | | 数据库流量嗅探 | T1040 | 流量在 SSH 内加密 | ## 下一步 1. **在 MySQL 上启用 TLS** (`require_secure_transport=ON`),从而在隧道之外实现纵深防御。 2. **自动备份** (`mysqldump` + cron + 复制到启用版本控制的 S3)。 3. **审计** (MariaDB Audit Plugin / general_log) → 发送至 Wazuh 并检测 对 HR 数据库的异常访问(敏感数据:薪资)。 4. **凭证轮换**并使用 AWS Secrets Manager,而不是将密码存储在文件中。 **作者:** Diego Machado · Lab SENAC-DF · Cloud / Database Security
标签:AWS, DPI, EC2, IaC, SQL, 内存分配, 多线程, 数据库部署, 最小权限, 系统审计, 网络安全配置