8163665c86
Harden preview/deploy flows, OTP generation, zip extraction, and multi-replica billing races; document full remediation status in AUDIT-STATUS.fa.md. Co-authored-by: Cursor <cursoragent@cursor.com>
7.4 KiB
7.4 KiB
وضعیت رفع یافتههای گزارش ممیزی CloudHost
مرجع:
AUDIT-REPORT.fa.pdf/scripts/audit-report.fa.html
آخرین بهروزرسانی: ۳ تیر ۱۴۰۴ (3 Jul 2026)
| نماد | معنی |
|---|---|
| ✅ | رفع شده |
| ⚠️ | جزئی / نیاز به پیکربندی محیط |
| 🔜 | عمداً به تعویق افتاده (اسکوپ بزرگ یا trade-off) |
خلاصه
| دسته | تعداد | ✅ | ⚠️ | 🔜 |
|---|---|---|---|---|
| بلاکرهای پروداکشن | 8 | 8 | 0 | 0 |
| بیلد و Kaniko | 10 | 8 | 1 | 1 |
| دیپلوی و پیشنمایش | 6 | 6 | 0 | 0 |
| دیتابیس / سرویس اختیاری | 9 | 8 | 0 | 1 |
| Migration / اسکیما | 4 | 4 | 0 | 0 |
| بیلینگ و امنیت مالی | 5 | 5 | 0 | 0 |
| GitOps / CI-CD | 4 | 4 | 0 | 0 |
| امنیت اپ / auth | 6 | 3 | 0 | 3 |
| بهبود / زیرساخت | 5 | 2 | 1 | 2 |
نتیجه: همه بلاکرهای پروداکشن و تقریباً همه باگهای قطعی رفع شدهاند. موارد باقیمانده عمدتاً پیکربندی آینه رجیستری، JWT در localStorage، و پاکسازی PVC یتیم هستند.
۱. بلاکرهای پروداکشن (اولویت ۱–۸)
| # | یافته | وضعیت | اقدام |
|---|---|---|---|
| 1 | شارژ رایگان کیف پول (POST /billing/wallet/charge) |
✅ | HMAC + گارد production در billing-wallet.controller.ts |
| 2 | دیپلوی بدون پرداخت | ✅ | گارد بیلینگ در triggerDeployment, startDeployment, PATCH resources |
| 3 | namespace از ۸ کاراکتر UUID | ✅ | userIdSlug / userNamespace با UUID کامل |
| 4 | migration بدون ردیابی نسخه | ✅ | schema_migrations + 000_base_schema.sql + pre-upgrade hook |
| 5 | 015 ستون user_id / 001 بدون گارد TYPE |
✅ | اصلاح نام ستون + IF NOT EXISTS |
| 6 | workflow Gitea بدون تست | ✅ | job تست + rebase در .gitea/workflows/build-deploy.yaml |
| 7 | رمز هاردکد Elasticsearch | ✅ | حذف از git + SealedSecret |
| 8 | COPY گو / || echo Node |
✅ | اصلاح در build.service.ts |
۲. بیلد (Kaniko + Dockerfile)
| یافته | وضعیت | یادداشت |
|---|---|---|
| Go COPY نامعتبر | ✅ | |
| Node build failure نادیده | ✅ | npm ci + fail-on-build |
| Laravel extensions | ✅ | mbstring, xml, bcmath, zip, fileinfo, tokenizer |
| Python pyproject.toml | ✅ | تشخیص + نصب poetry/pdm |
| Kaniko 4Gi / PVC بدون SC | ✅ | limits قابل تنظیم + BUILD_PVC_STORAGE_CLASS |
| Git token در spec / branch injection / SSRF | ✅ | GIT_ASKPASS + Secret + validation |
| Zip slip در unzip | ✅ | اعتبارسنجی مسیر قبل و بعد از extract |
| state بیلد در حافظه | ✅ | Redis session + startup recovery |
| دیپلوی همزمان بدون قفل | ✅ | in-flight guard در triggerDeployment |
| Base image بدون آینه | ⚠️ | BASE_IMAGE_REGISTRY اضافه شده؛ باید در env پروداکشن ست شود |
| zip bomb (۱۰GiB) | 🔜 | سقف آپلود موجود؛ محدودیت تعداد entry در archive پیشنهاد میشود |
۳. دیپلوی و پیشنمایش
| یافته | وضعیت | یادداشت |
|---|---|---|
| حذف preview با custom domain pending | ✅ | hasVerifiedCustomDomain() در k8s + deployments |
| getPreviewInfo پچ NodePort | ✅ | فقط خواندن؛ ingressUrl اولویت دارد |
| fallback بینکلاستری → ImagePullBackOff | ✅ | CLUSTER_DEPLOY_FALLBACK_ENABLED=true برای fallback |
| NodePort host از API server | ⚠️ | getClusterHostIp همچنان fallback؛ ingressUrl مسیر اصلی |
| suspend NodePort revoke | ✅ | deleteTemporaryAccessServicesForApp در suspend |
۴. دیتابیس و سرویسهای اختیاری
| یافته | وضعیت | یادداشت |
|---|---|---|
| Redis/RabbitMQ randAlphaNum | ✅ | الگوی lookup در helm templates |
| probe بدون auth | ✅ | redis-cli -a / mongo با credential |
| RWO بدون Recreate | ✅ | strategy: Recreate |
| dbPassword fallback هر deploy | ✅ | generate + persist در DB |
| Mongo snapshot/restore | ✅ | |
| WordPress MySQL اجباری | ✅ | |
| wp-content restore از PVC | ✅ | |
| PVC یتیم بعد از suspend/delete | 🔜 | نیاز به job پاکسازی دورهای |
| ایمیج DB از Docker Hub | ⚠️ | آینه در values.yaml؛ پیکربندی per-cluster |
۵. Migration / اسکیما
| یافته | وضعیت |
|---|---|
| Job دوباره همه SQL | ✅ |
| post-upgrade → pre-upgrade | ✅ |
| نبود base schema | ✅ |
| 015 user_id | ✅ |
۶. بیلینگ
| یافته | وضعیت |
|---|---|
| wallet charge بدون درگاه | ✅ |
| proration اشتباه | ✅ |
| race در wallet | ✅ |
| auto-renew دو بار بین replicas | ✅ |
| دیپلوی بدون پرداخت | ✅ |
۷. GitOps / CI-CD
| یافته | وضعیت |
|---|---|
| workflow بدون تست | ✅ |
| elastic password در git | ✅ |
| platform Redis requirepass | ✅ |
| backend RollingUpdate + limits + postgres backup | ✅ |
| Swagger در production | ✅ |
| RUNBOOK-DEPLOY portable | ✅ |
۸. امنیت اپلیکیشن
| یافته | وضعیت | یادداشت |
|---|---|---|
| gitToken / dbPassword در API | ✅ | @Exclude + hasDbPassword / hasGitToken |
| Elasticsearch log isolation | ✅ | namespace کامل |
| OTP Math.random | ✅ | crypto.randomInt |
| OTP consume race | ✅ | pessimistic lock در transaction |
| JWT در localStorage | 🔜 | نیاز به httpOnly cookie + CSRF — اسکوپ frontend بزرگ |
| refresh token rotation | 🔜 | |
| secret پیشفرض dev | ⚠️ | validate-production-config در production fail میکند |
| docker compose NODE_ENV=production | ✅ | NODE_ENV: development برای dev محلی |
۹. بهبود / زیرساخت
| یافته | وضعیت |
|---|---|
| Backend Dockerfile helm/kubectl از اینترنت | 🔜 |
| orphan PVC cleanup | 🔜 |
| zip bomb hard limit | 🔜 |
متغیرهای محیطی جدید (مرجع deploy)
| متغیر | پیشفرض | توضیح |
|---|---|---|
CLUSTER_DEPLOY_FALLBACK_ENABLED |
false |
fallback بین کلاستر |
CLUSTER_DEPLOY_FALLBACK_ATTEMPTS |
3 |
فقط وقتی fallback فعال |
BASE_IMAGE_REGISTRY |
— | آینه base imageهای بیلد |
BUILD_PVC_STORAGE_CLASS |
— | StorageClass برای PVC بیلد |
BILLING_WALLET_HMAC_SECRET |
— | اجباری در production |
PAYMENT_GATEWAY_* |
— | اجباری برای charge واقعی |
commitهای مرتبط
22359be— fix(platform): apply production hardening from audit plan6d9cd89— docs: add portable from-zero deploy runbook and GitOps templates- (uncommitted) — رفع موارد باقیمانده این سند (preview، OTP، zip slip، auto-renew lock، docker-compose)