diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index dba7d38..186496f 100755 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -68,13 +68,15 @@ docker compose up -d backend-api backend-scheduler frontend ``` **Gitea users:** -| User | Role | Password | -|------|------|----------| -| `tien` | Admin | *riêng* | -| `hanlap` | Owner repo | `***REMOVED***` | -| `nguyendao` | Write | `***REMOVED***` | -| `tulinh` | Write | `***REMOVED***` | -| `namcunguyen` | Write | `***REMOVED***` | +| User | Role | +|------|------| +| `tien` | Admin | +| `hanlap` | Owner repo | +| `nguyendao` | Write | +| `tulinh` | Write | +| `namcunguyen` | Write | + +> ⚠️ **2026-07-03 — Security incident**: mật khẩu của các user trên từng bị lưu ở dạng plaintext ngay trong bảng này và đã bị commit vào git. Toàn bộ mật khẩu đã cần được rotate — xem [SECURITY_INCIDENT_GITEA_CREDENTIALS.md](SECURITY_INCIDENT_GITEA_CREDENTIALS.md) để biết chi tiết xử lý và tình trạng hiện tại. **Không bao giờ lưu mật khẩu/secret trong file tài liệu** — dùng password manager hoặc secret vault. **Nginx config:** `/opt/ai-agent/nginx/conf.d/hermes.conf` (bind mount vào nginx_proxy) diff --git a/SECURITY_INCIDENT_GITEA_CREDENTIALS.md b/SECURITY_INCIDENT_GITEA_CREDENTIALS.md new file mode 100644 index 0000000..613c9d1 --- /dev/null +++ b/SECURITY_INCIDENT_GITEA_CREDENTIALS.md @@ -0,0 +1,91 @@ +# Security Incident — Gitea passwords leaked via ARCHITECTURE.md + +> **Phát hiện:** 2026-07-03, trong quá trình review toàn bộ dự án. +> **Mức độ:** Nghiêm trọng — mật khẩu thật ở dạng plaintext, đã nằm trong lịch sử git của repo dùng chung. +> **Trạng thái:** ⏳ Chưa xử lý — cần bạn (người có quyền admin Gitea) thực hiện các bước dưới đây. + +--- + +## 1. Việc gì đã xảy ra + +Commit `c734e3d` ("docs: thêm Gitea + Infrastructure vào kiến trúc hệ thống") đã thêm vào `ARCHITECTURE.md` một bảng liệt kê mật khẩu thật của 4 tài khoản Gitea: + +| User | Role | +|------|------| +| `hanlap` | Owner repo | +| `nguyendao` | Write | +| `tulinh` | Write | +| `namcunguyen` | Write | + +File này nằm trong repo private `hanlap/trading-portal` tại `git.dangloica.org`, đã được push lên `origin/master`. Bảng mật khẩu đã được gỡ khỏi phiên bản mới nhất của file (xem commit sửa `ARCHITECTURE.md` kèm theo đánh giá này), **nhưng giá trị cũ vẫn còn nguyên trong lịch sử git** — bất kỳ ai có quyền đọc repo (hoặc từng clone repo về máy, kể cả sau khi bị thu hồi quyền) đều có thể lấy lại mật khẩu bằng `git log -p` hoặc `git show c734e3d`. + +## 2. Vì sao mình không tự xử lý toàn bộ + +- **Rotate mật khẩu**: cần đăng nhập vào Gitea (`git.dangloica.org`) với quyền admin — mình không có quyền truy cập hệ thống đó. +- **Rewrite lịch sử git** (xoá hẳn secret khỏi mọi commit cũ): đây là thao tác phá huỷ lịch sử dùng chung. Sau khi rewrite, tất cả 5 người (`tien`, `hanlap`, `nguyendao`, `tulinh`, `namcunguyen`) đều phải re-clone hoặc reset cứng lại repo local — nếu ai đó đang có commit chưa push dựa trên history cũ, họ sẽ mất hoặc phải rebase thủ công rất phức tạp. Đây là quyết định cần bạn xác nhận và thông báo trước cho cả team, không phải việc nên tự động thực hiện. + +## 3. Việc cần làm — theo thứ tự ưu tiên + +### Bước 1 — Rotate mật khẩu (làm ngay, không cần chờ bước 2) + +Đây là bước **quan trọng nhất**. Một khi mật khẩu cũ bị vô hiệu hoá, giá trị còn sót trong lịch sử git chỉ còn là dữ liệu chết — không cần rewrite lịch sử một cách gấp gáp nữa. + +1. Đăng nhập Gitea bằng tài khoản `tien` (admin). +2. Vào **Admin Panel → Users**, hoặc yêu cầu từng người tự đổi mật khẩu qua **Settings → Account**. +3. Đổi mật khẩu cho cả 4 tài khoản: `hanlap`, `nguyendao`, `tulinh`, `namcunguyen`. +4. Khuyến nghị đổi luôn mật khẩu của `tien` (dù không bị lộ trực tiếp) — vệ sinh bảo mật tốt cho tài khoản admin. +5. Nếu bất kỳ ai trong 4 người dùng lại mật khẩu đã lộ ở nơi khác (email, hệ thống nội bộ khác...), **nhắc họ đổi luôn ở những nơi đó** — thói quen dùng lại mật khẩu là rủi ro thực tế phổ biến nhất sau một vụ lộ như thế này. +6. Nếu Gitea hỗ trợ, bật 2FA cho các tài khoản có quyền ghi vào repo. + +### Bước 2 — Quyết định có rewrite lịch sử git hay không + +Hai lựa chọn, đánh đổi rõ ràng: + +**Lựa chọn A — Không rewrite (đơn giản, đủ dùng sau khi đã rotate)** +Giữ nguyên lịch sử, chấp nhận rằng commit cũ vẫn chứa mật khẩu *đã bị vô hiệu hoá*. Rủi ro còn lại gần như bằng 0 miễn là bước 1 đã hoàn tất và không ai dùng lại các mật khẩu đó ở nơi khác. + +**Lựa chọn B — Rewrite lịch sử (triệt để hơn, nhưng gây gián đoạn team)** +Dùng [`git filter-repo`](https://github.com/newren/git-filter-repo) (khuyến nghị hơn BFG vì được git chính thức giới thiệu): + +```bash +# Cài đặt (một lần) +pip install git-filter-repo + +# Backup trước khi làm bất cứ điều gì +git clone --mirror https://git.dangloica.org/hanlap/trading-portal.git trading-portal-backup.git + +# Trong bản clone đang làm việc, xoá nội dung nhạy cảm khỏi mọi commit +cd trading-portal +git filter-repo --path ARCHITECTURE.md --invert-paths --force # nếu chấp nhận xoá hẳn file khỏi lịch sử +# HOẶC — chỉ thay thế các chuỗi mật khẩu cụ thể bằng "***REMOVED***" trong mọi commit +# thay vì xoá cả file. Lấy nguyên văn 4 mật khẩu từ commit c734e3d (`git show c734e3d:ARCHITECTURE.md`) +# và điền vào file thay-thế cục bộ (KHÔNG commit file này!), mỗi dòng dạng `mật_khẩu==>***REMOVED***`: +git filter-repo --replace-text /path/to/local-only-passwords-to-redact.txt + +# Sau khi kiểm tra kỹ, force-push +git push origin --force --all +git push origin --force --tags +``` + +Sau khi force-push, **thông báo ngay cho cả 4 người còn lại**: họ phải chạy (không được `git pull` bình thường vì sẽ tạo merge conflict với history cũ): + +```bash +git fetch origin +git reset --hard origin/master +``` + +hoặc đơn giản nhất là xoá bản clone cũ và clone lại từ đầu. + +## 4. Khuyến nghị dài hạn + +- Không bao giờ lưu secret (mật khẩu, API key, token) trong file `.md`/doc — dùng password manager (Bitwarden, 1Password...) hoặc secret vault (Vault, Doppler...) và chỉ ghi *cách lấy* secret trong tài liệu, không ghi giá trị thật. +- Cân nhắc thêm hook `pre-commit` chạy [gitleaks](https://github.com/gitleaks/gitleaks) hoặc [trufflehog](https://github.com/trufflesecurity/trufflehog) để chặn commit chứa secret trước khi nó vào lịch sử git. + +## 5. Trạng thái xử lý + +| Việc | Trạng thái | +|---|---| +| Gỡ bảng mật khẩu khỏi ARCHITECTURE.md (bản hiện tại) | ✅ Đã làm (2026-07-03, cùng đợt review này) | +| Rotate mật khẩu 4 tài khoản Gitea | ⏳ Chờ bạn thực hiện trên Gitea | +| Quyết định rewrite lịch sử git | ⏳ Chờ bạn quyết định (Lựa chọn A hoặc B ở trên) | +| Bật 2FA cho các tài khoản ghi | ⏳ Chờ bạn thực hiện |