Аюулгүй байдал¶
Хамгаалалт нь «дараа наалдуулсан» биш, анхнаасаа шигтгэгдсэн. Энэ хуудас нь кодод хэрэгжсэн хяналтуудыг тоймлоно.
Нэвтрэлт ба session¶
| Хяналт | Дэлгэрэнгүй |
|---|---|
| eID-ээр л нэвтэрнэ | Цорын ганц интерактив нэвтрэлт нь eID (QR / App2App / РД push). Нууц үгийн гадаргуу огт байхгүй |
| JWT access + refresh | Refresh нь эргэлддэг (rotation); kind-claim хамгаалалттай |
| Гарах үеийн deny-list | Гарахад access token-ий jti үлдсэн TTL-ээр Redis-д ордог; middleware хүсэлт бүрд шалгана |
| Иргэний гэрчилгээ (PKI) | Нэвтрэлт дуусахад иргэний гэрчилгээ (DER) ирж, crypto/x509-оор задарч сериал / хүчинтэй хугацаа / issuer хадгалагдана |
| Google холболт | Зөвхөн холболт — тогтвортой subject баганаар түлхүүрлэнэ |
Нууц үг байхгүй гэдэг нь санамсаргүй биш
Нууц үгийн урсгал байхгүй тул HIBP / bcrypt / алдагдсан нууц үгийн шалгалт зэрэг хяналтууд хамааралгүй. Хуучин password/OTP usecase-ууд кодод үлдсэн ч route-д холбогдоогүй. Хэрэв хэзээ нэгэн цагт нууц үгийн зам нээвэл, HIBP шалгалтыг түүнээс өмнө холбох ёстой.
Өгөгдлийн давхарга¶
- Зөвхөн параметртэй query (pgx) — string concat байхгүй, ORM ашиглахгүй.
- Row-Level Security — хэрэглэгч тус бүрийн хүснэгт бүрд
ENABLEбаFORCE:users,organizations,organization_memberships,gov_*иргэний хүснэгтүүд,user_integrations. Бодлого нь гүйлгээ тус бүрдSET LOCAL-оор тавигдахapp.user_id/app.user_roleGUC-аар жолоодогдоно. - Identity байхгүй ⇒ 0 мөр (fail-closed) — санамсаргүй задралаас хамгаална.
RLS boot guard
Апп асахдаа өөрийн DB role-оо шалгадаг. Production дээр superuser эсвэл
BYPASSRLS эрхтэй бол асахаас татгалзана — эс бөгөөс RLS чимээгүйхэн
үйлчлэхгүй байх байсан. Хөгжүүлэлтэд зөвхөн анхааруулна.
Шинэ per-user хүснэгт нэмэх бүрд өөрийн бодлогыг нь заавал бич.
Нууцлал (шифрлэлт)¶
| Юу | Хэрхэн |
|---|---|
| Гуравдагч талын OAuth токен | Хадгалахын өмнө AES-256-GCM-ээр битүүмжилнэ (INTEGRATION_ENC_KEY) |
| Токен / session ID | crypto/rand; modulo bias-аас сэргийлэх rejection sampling |
| Super admin MFA (TOTP) | Мөн INTEGRATION_ENC_KEY-ээр шифрлэгдэнэ |
INTEGRATION_ENC_KEY-г хэзээ ч бүү сольж бич
Нэгэнт тавьсан түлхүүрийг өөрчилвөл өмнө шифрлэсэн бүх өгөгдөл эвдэрнэ. Deploy скрипт үүнийг зөвхөн байхгүй үед л нэг удаа бичдэг (idempotent).
Вэб / сүлжээний давхарга¶
- Security headers — CSP
default-src 'none', HSTS (prod),nosniff,X-Frame-Options: DENY, Referrer-Policy, Permissions-Policy, COOP/CORP/COEP. - CORS — хатуу origin жагсаалт;
*+ credentials хослолыг хэзээ ч зөвшөөрөхгүй. - Хүсэлтийн биеийн хязгаар — глобал хязгаар +
/authдээр 4 KiB. - Серверийн бүрэн timeout —
ReadHeader10с,Read30с,Write70с,Idle120с,MaxHeaderBytes16 KiB (slowloris / хэт том толгойн хамгаалалт). - Хүсэлтийн timeout — ерөнхийдөө 30с;
/ai/*нь 50с (Gemini-ийн TTS/STT ердийн үед 10–20с зарцуулдаг тул 30с-д багтахгүй байв). - Rate limiting —
/auth~5/мин,/ai/*~20/мин, нүүрийн нээлттэй чат/public/ai/chat~6/мин (IP тус бүрд). - Permissions-Policy —
camera=(), microphone=(self), geolocation=(). Микрофон нь ЗӨВХӨН энэ origin-д нээлттэй (AI-ийн дуут чатgetUserMediaдууддаг);microphone=()байхад хөтөч зөвшөөрөл асуулгүй шууд унагаадаг.
Frontend (BFF загвар)¶
Хөтөч зөвхөн ижил-origin /api/* route руу л ханддаг. Токенууд httpOnly
cookie-д амьдарч, клиентийн JS рүү хэзээ ч хүрдэггүй. Мутац хийх дуудалт бүр
x-gerege-csrf толгойтой явж, сервер тал checkOrigin-оор шалгана (давхар CSRF
хамгаалалт).
Аудит¶
Hash-гинжтэй, зөвхөн-нэмэх бүртгэл:
Бичигчид pg_advisory_xact_lock-оор дараалдаг; VerifyChain нь өөрчлөлтийг
илрүүлнэ. Зөвхөн админ уншина.
Эрхийн хяналт (RBAC)¶
Динамик role + permission каталог, 4 түвшин: superadmin → admin → manager →
user. Route-ууд RequirePermission / RequireAdmin middleware-ээр хамгаална.
Super admin нь админ хэрэглэгчдийг удирдах цорын ганц үүрэг бөгөөд API-аар
үүсдэггүй — зөвхөн DB / env-ээр томилогдоно.
Ажиллагааны хамгаалалт¶
Production дээр /metrics ба /swagger/doc.json нь bearer token-оор хаагдана
(тогтмол хугацааны харьцуулалт; таарахгүй бол 404). Лог нь Zap structured,
request-id-тай — нууц утга хэзээ ч логдохгүй.
ASVS замын зураг¶
| Түвшин | Байдал |
|---|---|
| L1 | ✅ HTTPS + HSTS, нууц үггүй нэвтрэлт, параметртэй query, headers, CORS, оролтын шалгалт, structured log, commit-д secret байхгүй. ⏳ container scan / govulncheck |
| L2 | ✅ rate limiting, refresh rotation, eID device-link (phishing-т тэсвэртэй), timeout, шифрлэсэн токен, hash-гинжтэй аудит. ⏳ WAF, төвлөрсөн SIEM, нөөцлөлт сэргээх тест, IR төлөвлөгөө |
| L3 | ◻ талбар түвшний PII шифрлэлт (KMS), mTLS, SLSA L3, гадаад pentest — энэ template-ийн хүрээнээс гадуур |
Мэдэгдэж буй дутагдал¶
- Интерактив Swagger UI — одоогоор зөвхөн түүхий spec-ийг
/swagger/doc.jsonдээр өгнө (Swagger Editor / Postman-д ачаална). - Дэлгэрэнгүй жагсаалт:
backend/docs/SECURITY.md.
Эмзэг байдал мэдээлэх
Аюулгүй байдлын алдаа олбол нийтийн issue үүсгэхийн оронд SECURITY.md-д заасан журмаар мэдэгдэнэ үү.