Security Checklist
Run through this list before exposing your shop publicly, and review every quarter.
Network
- [ ] Firewall: only
:80,:443,:22inbound. Block all others (ufw default deny). - [ ] SSH on port
:22restricted to your IP, or moved to a non-standard port. - [ ] PostgreSQL bound to
localhostonly (listen_addresses = 'localhost'inpostgresql.conf). - [ ] Redis bound to
localhostonly and password-protected (requirepass). - [ ] No public access to
:9000,:3001,:8000â verify withnmapfrom outside.
TLS
- [ ] Valid certificate from Let's Encrypt or your CA on port
:443. - [ ] HTTP traffic redirects to HTTPS (
return 301 https://...in nginx). - [ ] HSTS header set (
Strict-Transport-Security: max-age=31536000; includeSubDomains). - [ ] TLS 1.2+ only â disable 1.0/1.1 in nginx
ssl_protocols. - [ ] Cert auto-renewal cron in place (
certbot renew --quiet).
SSH
- [ ] Password login disabled (
PasswordAuthentication no). - [ ] Root login disabled (
PermitRootLogin no) â usesudofrom a normal user. - [ ] Public-key auth only.
- [ ]
fail2baninstalled and active.
Secrets
- [ ] All
.env.localfiles have mode600, owned by the service user. - [ ]
JWT_SECRET,COOKIE_SECRET,REVALIDATE_SECRETare 64-char random. - [ ] DB password is 32+ characters, unique per instance.
- [ ] No secrets in git, in shell history, or in screenshots/issues.
- [ ] Stripe live keys live only on the production box. Test/sandbox keys for staging.
- [ ] License keys for installed plugins are encrypted in the DB (CarphaCom does this by default).
Application
- [ ] Admin user uses a 16+ character password from a generator.
- [ ] 2FA enabled on the admin panel (Settings â Security â 2FA).
- [ ] Inactive admin sessions time out after 30 days.
- [ ] Custom
admin_usersrows have only the permissions each user needs (least privilege). - [ ] Webhook signing secrets are rotated every 12 months.
Updates
- [ ] OS auto-updates security patches enabled (
unattended-upgrades). - [ ] CarphaCom platform auto-update for patch versions enabled.
- [ ] All plugins updated within 7 days of a release (subscribe to vendor changelogs).
- [ ] Quarterly review of installed plugins â uninstall anything unused.
Monitoring
- [ ] Daily backup runs and reports success (alert on failure).
- [ ] Disk usage alert at 80% of free space.
- [ ] PM2 process restart alerts (
pm2 install pm2-logrotate+ your monitoring). - [ ] Failed login attempt rate alert (block at 10 in 5 min from same IP).
- [ ] Uptime monitor against
https://shop.example.com/healthfrom outside.
Compliance (EU)
- [ ] Cookie consent banner active (install Cookie Consent plugin).
- [ ] Privacy policy + terms of service pages published.
- [ ] GDPR data export and deletion endpoints tested (Customers â [customer] â Export / Erase).
- [ ] If you process card data, your Stripe Elements integration keeps you in PCI-DSS SAQ-A scope (no card data ever touches your server).
Print this checklist, sign it, file it. Do it again every quarter.