SECURITY — WELIFE
Hardening 2026-07-24 (+ phase nợ Redis/MinIO/OTP/payments). Repo GitHub: private. Secrets local:
secrets/(gitignore).
Đã siết trong code
| Hạng mục | Hành vi |
|---|---|
| Boot guard | Production cấm OTP_DEV_CODE, JWT yếu, CORS_ORIGINS=*, admin phone thiếu flag |
| Helmet / CORS / body limit / exception filter | Bật |
| Swagger | Tắt mặc định trên production |
| OTP | Dev code chỉ non-prod; throttle; lockout theo SĐT (OTP_MAX_ATTEMPTS / OTP_LOCK_SEC); Redis bắt buộc prod |
| Logout / refresh | jti + rotate + Redis blacklist |
| Wallet topup/withdraw | ALLOW_INTERNAL_WALLET_CREDIT — production false |
| Payments | GET /payments/providers + MOCK/MoMo/VNPay init+return → credit ví (WP-PAY-01) |
| SMS OTP | SMS_PROVIDER=console|http|twilio |
| Expo | refresh-on-401 (mobile/driver/partner) |
| Health detail | non-prod public; prod /health/admin/* + ADMIN |
| Redis | Docker --requirepass · REDIS_URL=redis://:pass@host:port |
| MinIO | Bucket private (mc anonymous set none) · API trả presigned GET |
| Social / upload ảnh-video | WP-MEDIA-STRIP-01 — gỡ EXIF/GPS, nén JPEG ≤1920 / H.264 ≤1080 trước khi lưu MinIO |
| Docker ports | Postgres / Redis / MinIO bind 127.0.0.1 |
| Nginx | /docs comment sẵn |
| Gitignore | secrets, pem, keystore, … |
Checklist trước khi deploy
NODE_ENV=production— dùngapi/.env.production.examplenode scripts/gen-secrets.mjs→ dán JWT (+ Redis password)- Xóa
OTP_DEV_CODE CORS_ORIGINS=https://your-app,...ALLOW_INTERNAL_WALLET_CREDIT=falseSWAGGER_ENABLED=falseADMIN_PHONESchỉ vớiADMIN_BOOTSTRAP_ENABLED=true- Đổi Postgres / MinIO / Redis passwords
- Không publish
5432/6379/9000ra internet - HTTPS +
TRUST_PROXY=true
Local sau hardening này
# root .env + api/.env: REDIS_PASSWORD + REDIS_URL có password
npm run infra:up # recreate redis/minio
npm run api:dev
curl http://localhost:3000/api/v1/health
curl http://localhost:3000/api/v1/payments/providers
Production-like trên máy local
npm run api:prod:local
# → api/.env.production.local · NODE_ENV=production · WELIFE_PROD_LOCAL=true
# Chi tiết: docs/reports/LOCAL-PROD-LIKE-2026-08-11.md
Không ghi đè api/.env (dev). Không dùng WELIFE_PROD_LOCAL trên VPS.
Còn nợ (thật sự sau)
- MoMo/VNPay refund (WP-PAY-02) + IPN chữ ký MoMo đầy đủ production
- SMS provider thật trên prod (
http/twilio) — bỏOTP_DEV_CODE - Access-token blacklist (optional; TTL 15m đã ngắn)
Tài liệu
- 07-ENVIRONMENT.md
- LOCAL-TEST.md
- UBUNTU-DEPLOY.md
api/src/common/security/assert-secure-boot.tsscripts/gen-secrets.mjs