// docs / baas security / clerk hardening
Λίστα ελέγχου ασφάλειας Clerk: 20 σημεία
Το Clerk χειρίζεται auth, sessions και organizations για την εφαρμογή σου — που σημαίνει ότι μια λανθασμένα ρυθμισμένη ενοποίηση Clerk είναι παράκαμψη auth, διάνυσμα session fixation ή διαδρομή διαρροής org. Αυτή η λίστα ελέγχου είναι ένας έλεγχος 20 σημείων σε keys, ρύθμιση session, webhooks, organizations, templates JWT και συνεχή παρακολούθηση. Τα εργαλεία κωδικοποίησης με ΤΝ συνδέουν το Clerk γρήγορα με λογικές προεπιλογές· αυτή η λίστα εντοπίζει τα στοιχεία που αφήνουν στο τραπέζι.
Για το υπόβαθρο γιατί οι εσφαλμένες ρυθμίσεις στο επίπεδο auth είναι αδυναμία των εργαλείων ΤΝ, δες Γιατί τα εργαλεία κωδικοποίησης με ΤΝ αφήνουν κενά ασφαλείας. Για την παράλληλη λίστα ελέγχου στο Auth0, δες Λίστα ελέγχου ασφάλειας Auth0.
Keys περιβάλλοντος και allowlist origin
Το Clerk εκδίδει δύο διακριτά keys ανά project. Το να τα μπερδέψεις ή να τα διαρρεύσεις είναι ο πρώτος τρόπος αποτυχίας.
- Χρησιμοποίησε το publishable key (
pk_live_*στην παραγωγή,pk_test_*στο dev) στον browser· χρησιμοποίησε το secret key (sk_live_*/sk_test_*) μόνο στον server. Το publishable key είναι ασφαλές στοNEXT_PUBLIC_CLERK_PUBLISHABLE_KEY· το secret key δεν πρέπει ποτέ να φέρει δημόσιο πρόθεμα env και ποτέ να μην εμφανιστεί σε client component. - Επαλήθευσε ότι η εφαρμογή παραγωγής χρησιμοποιεί
pk_live_*, όχιpk_test_*. Οι test instances επιτρέπουν μη επαληθευμένες διευθύνσεις email και απενεργοποιημένο MFA — η αποστολή test mode στην παραγωγή είναι παράκαμψη auth. - Ρύθμισε τα επιτρεπόμενα origins στο Clerk Dashboard. Settings → Domains → Allowed origins πρέπει να αναφέρει ακριβώς τον τομέα παραγωγής σου. Άδειες ή με wildcard λίστες origin επιτρέπουν στους επιτιθέμενους να φτιάχνουν παράνομα Clerk frontends που μιλούν με το backend σου.
- Ανανέωσε το secret key σε κάθε αποχώρηση ή υποψία διαρροής. Dashboard → API Keys → Reset. Το παλιό key ακυρώνεται· κάνε redeploy κώδικα από την πλευρά του server με τη νέα τιμή πριν την ανανέωση.
Ρύθμιση session
Η λήξη session και τα idle timeouts είναι η διαφορά ανάμεσα στο να είναι μια κλεμμένη session ένα συμβάν 10 λεπτών και ένα 30 ημερών.
- Όρισε το session inactivity timeout στα 30 λεπτά ή λιγότερο για εφαρμογές SaaS που χειρίζονται ευαίσθητα δεδομένα. Dashboard → Sessions → Inactivity timeout. Εφαρμογές banking-tier θα πρέπει να χρησιμοποιούν 5-10 λεπτά· standard SaaS 30-60 λεπτά· consumer apps 1-7 ημέρες. Η προεπιλογή είναι 7 ημέρες.
- Ενεργοποίησε την ανάκληση session σε αλλαγή κωδικού, αλλαγή email και εγγραφή MFA. Dashboard → Sessions → Revoke on. Αυτά είναι συμβάντα ασφαλείας που ξεκινούν από τον χρήστη· οι υπάρχουσες sessions σε άλλες συσκευές θα πρέπει να τερματίζονται.
- Επαλήθευσε τις sessions από την πλευρά του server σε κάθε προστατευμένη διαδρομή, όχι μόνο στην είσοδο. Στο Next.js:
const { userId } = await auth();σε server component / API route διαβάζει το JWT από το cookie και το επικυρώνει. Ποτέ μην εμπιστεύεσαι έναν έλεγχο μόνο cookie. - Όρισε
SameSite=Lax(προεπιλογή) ήStrictστο cookie session. Επαλήθευσε στο DevTools → Application → Cookies. ΤοSameSite=Noneείναι διάνυσμα CSRF — μη το χρησιμοποιείς ποτέ εκτός αν έχεις ρυθμίσει ρητά ένα setup auth μεταξύ τομέων.
Επαλήθευση webhook
Τα webhooks του Clerk πυροδοτούνται σε συμβάντα κύκλου ζωής χρήστη (created, updated, deleted, session.ended). Είναι ο μηχανισμός συγχρονισμού για τη βάση δεδομένων σου — και ένα πλαστογραφημένο webhook είναι μια πρωτογενής λειτουργία εγγραφής σε βάση δεδομένων.
- Επαλήθευσε την υπογραφή Svix σε κάθε webhook. Τα webhooks του Clerk υπογράφονται από το Svix. Χρησιμοποίησε
new Webhook(secret).verify(body, headers). Απόρριψε με401εάν η επαλήθευση αποτύχει. - Αποθήκευσε το webhook secret σε μεταβλητή περιβάλλοντος, ποτέ στον κώδικα. Το secret ανανεώνεται σε κάθε αναγέννηση Dashboard — το deploy σου πρέπει να το διαβάζει από env, όχι από σταθερά.
- Idempotency σε κάθε handler. Οι παραδόσεις webhook μπορούν να επαναληφθούν. Χρησιμοποίησε τον header
svix-idως primary key σε έναν πίνακαwebhook_eventsγια dedupe. Τύλιξε την αλλαγή κατάστασης και το insert idempotency στην ίδια transaction. - Στο
user.deleted, hard-delete ή ανωνυμοποίησε PII εντός 24 ωρών. Το GDPR / CCPA το απαιτούν. Έλεγξε τη διαδρομή διαγραφής: ποιοι πίνακες κρατούν τα δεδομένα αυτού του χρήστη; Χρησιμοποίησε FK ON DELETE CASCADE όπου μπορείς.
Organizations και δικαιώματα
Εάν χρησιμοποιείς Clerk Organizations, το όριο org είναι η απομόνωση tenant σου. Κάθε query από την πλευρά του server πρέπει να φιλτράρει με αυτό.
- Σε κάθε API route, διάβασε τόσο το
userIdόσο και τοorgIdαπό τοauth()και φίλτραρε queries βάσης δεδομένων και με τα δύο.WHERE org_id = $orgId AND user_id = $userId. Ποτέ μην εμπιστεύεσαι έναorg_idαπό το body του αιτήματος. - <strong>Use Clerk role checks for privileged operations, not boolean checks against the user object.</strong> <code>has({ role: 'org:admin' })</code> reads the role from the verified JWT. A user can spoof a boolean on a stale client object; they cannot spoof a JWT claim.
- Δοκίμασε διασταυρωμένη απομόνωση org με δύο πραγματικούς λογαριασμούς org. Δημιούργησε Org A, γέμισε δεδομένα, συνδέσου σε Org B σε άλλον browser, προσπάθησε να διαβάσεις τα δεδομένα του Org A μέσω του API. Η απάντηση πρέπει να είναι
403ή404.
Templates JWT και εξωτερικές ενοποιήσεις
Τα templates JWT προωθούν την ταυτότητα Clerk στο Supabase, Firebase και άλλες κατάντη υπηρεσίες. Λανθασμένα ρυθμισμένα templates μοιράζονται claims υπερβολικά ή εκθέτουν δεδομένα που δεν εννοούσες.
- Για κάθε template JWT, παράθεσε κάθε claim και επιβεβαίωσε ότι είναι απαραίτητο. Dashboard → JWT Templates. Ένα template που στέλνει
emailκαιphoneστο Supabase εκθέτει PII σε όποιον διαβάζει το JWT στον browser. - Όρισε μικρή λήξη σε templates JWT που χρησιμοποιούνται για κατάντη κλήσεις από την πλευρά του client. Τα 60 δευτερόλεπτα για κατάντη αιτήματα API είναι το πρότυπο. Τα JWTs με μεγαλύτερη διάρκεια κλέβονται και αναπαράγονται.
- Επαλήθευσε το claim audience (
aud) στην πλευρά λήψης. Τα Supabase, Firebase, κ.λπ. θα πρέπει να ελέγχουν ότι τοaudταιριάζει με τον αναμενόμενο identifier υπηρεσίας. Χωρίς αυτό, ένα JWT που εκδίδεται για την υπηρεσία A μπορεί να πιστοποιηθεί στην υπηρεσία B.
Λειτουργική παρακολούθηση
Το Auth είναι η πηγή logs με το υψηλότερο σήμα που έχεις. Παρακολούθησέ την.
- Συναγερμός σε αυξήσεις αποτυχημένων logins ανά IP / ανά λογαριασμό. Ποσοστό αποτυχίας 50× πάνω από το κανονικό είναι επίθεση credential stuffing. Το Clerk εκπέμπει αυτά τα συμβάντα σε webhooks· δρομολόγησέ τα στο SIEM σου.
- Τριμηνιαία επισκόπηση μεταβολής ρυθμίσεων session και instance. Οι προεπιλογές αλλάζουν καθώς το Clerk ενημερώνεται· οι «παλιές ρυθμίσεις» γίνονται σιωπηλά λάθος με τον χρόνο. Συγκρίνετε την εξαγωγή JSON του Dashboard με το τελευταίο γνωστό-καλό αντίγραφο.
Επόμενα βήματα
Τρέξε μια σάρωση FixVibe εναντίον του URL παραγωγής σου — ο έλεγχος baas.clerk-auth0 επισημαίνει publishable keys Clerk, test keys στην παραγωγή και πακεταρισμένα secret keys. Για την ισοδύναμη λίστα ελέγχου στο Auth0, δες Λίστα ελέγχου ασφάλειας Auth0. Για τη συνολική εικόνα σε όλους τους παρόχους BaaS, διάβασε Scanner εσφαλμένων ρυθμίσεων BaaS.
