Its my first Directus project and i'm going through it so I've put this together from what i've done so far.
I dont know if it will help others, but something like this as a living document could have been useful for me, maybe others?
What important things do you see that I missed and what did i got wrong? thank you 🙏
Directus Security Review
✅ Quick Checklist
CVE updates: Latest Directus Version Check
All critical env vars verified
Infrastructure security configured (rate limiting, HSTS, CORS)
Session security configured (secure cookies, timeouts)
Password security configured (Argon2, 2FA, complexity)
Access control roles defined (admin, editor, user, public)
Directus flows audited (emitEvents, $full permissions, error handling)
Frontend app security verified (input validation, XSS protection)
Security testing completed (infrastructure tests, penetration testing)
Compliance & documentation complete (policies, incident response)
Links
Access Control
Manage user and role permissions and policies for interacting with data in Directus.
Security & Limits
Configuration for access tokens, cookies, CSP, hashing, CORS, rate limiting, and request limits.
Security Best Practices Conversation
Discussion on GitHub around Security Best Practices Guide
Reporting Security Vulnerabilities
Report security vulnerabilities to the Directus team.
🔧 Directus Environment Variables
# Critical
SECRET=" [see 🔐 Generate Secret]"
PUBLIC_URL=" https://directus.url"
# Authentication
ACCESS_TOKEN_TTL=" 15m"
REFRESH_TOKEN_TTL=" 7d"
SESSION_COOKIE_SECURE=" true"
# Rate Limiting
RATE_LIMITER_ENABLED=" true"
RATE_LIMITER_POINTS=" 25"
RATE_LIMITER_DURATION=" 1"
RATE_LIMITER_STORE=" memory"
# CORS
CORS_ENABLED=" true"
CORS_ORIGIN=" https://your-app.url"
CORS_CREDENTIALS=" true"
# Security Headers
HSTS_ENABLED=" true"
🔐 Generate Secret
PowerShell:
[Convert ]::ToBase64String((1 .. 32 | ForEach-Object { Get-Random - Minimum 0 - Maximum 256 }))
Bash:
🧪 Testing
Rate Limiting (should see 429 after ~25 requests):
for i in {1..30}; do
curl -i https://directus.url/auth/login \
-X POST -H " Content-Type: application/json" \
-d ' {"email":"test@test.com","password":"wrong"}' | grep -E " HTTP|429"
sleep 0.2
done
Server Test:
https://www.ssllabs.com/
HSTS + Security Headers:
https://securityheaders.com/
CORS Test:
https://cors-test.codehappy.dev/
📋 Remaining Tasks
Password + Login Security (Directus Admin Dashboard Config)
Access Control / Role Configurations
System Collections
Field Permissions
Session Configuration
Directus Flows Security
Frontend App Security
Pen Testing
Compliance & Documentation
Documentation
Compliance
Its my first Directus project and i'm going through it so I've put this together from what i've done so far.
I dont know if it will help others, but something like this as a living document could have been useful for me, maybe others?
What important things do you see that I missed and what did i got wrong? thank you 🙏
Directus Security Review
✅ Quick Checklist
Links
Access Control
Manage user and role permissions and policies for interacting with data in Directus.
Security & Limits
Configuration for access tokens, cookies, CSP, hashing, CORS, rate limiting, and request limits.
Security Best Practices Conversation
Discussion on GitHub around Security Best Practices Guide
Reporting Security Vulnerabilities
Report security vulnerabilities to the Directus team.
🔧 Directus Environment Variables
🔐 Generate Secret
PowerShell:
Bash:
🧪 Testing
Rate Limiting (should see 429 after ~25 requests):
Server Test:
https://www.ssllabs.com/
HSTS + Security Headers:
https://securityheaders.com/
CORS Test:
https://cors-test.codehappy.dev/
📋 Remaining Tasks
Password + Login Security (Directus Admin Dashboard Config)
Access Control / Role Configurations
System Collections
Field Permissions
Session Configuration
Directus Flows Security
emitEvents: falseon data modification flows$fullpermissions usage auditedFrontend App Security
Pen Testing
Compliance & Documentation
Documentation
Compliance