This document describes Pillar2OS's information security programme: the policies, procedures and technical controls we operate. It is intended for enterprise procurement teams, DPOs, and security reviewers conducting vendor due diligence. We maintain and review this document quarterly.
| Class | Examples | Handling requirements |
|---|---|---|
| Highly Confidential | Customer tax/financial data; GloBE computation inputs; GIR filing data; authentication secrets (TOTP seeds, password hashes) | Encrypted at rest (AES-256) and in transit (TLS 1.2+); strictly need-to-know access; never logged in plaintext; deleted per DPA/contract terms |
| Confidential | Customer names; email addresses; audit logs; subscription/billing information | Encrypted in transit; access restricted by role; retained per Privacy Policy; not shared with third parties without DPA |
| Internal | Platform configuration; infrastructure details; deployment scripts; internal documentation | Accessible only to Pillar2OS employees and contractors with appropriate role; not published externally |
| Public | Marketing site content; public documentation; this Security Protocol | No restrictions on distribution |
| Control | Implementation | Status |
|---|---|---|
| Principle of least privilege | Users are assigned the minimum role required: Viewer, Preparer, Reviewer, Admin. Admin role requires 2FA. Roles are assigned per-organisation and cannot escalate across tenants. | ✓ Implemented |
| Multi-factor authentication | TOTP (Time-based One-Time Password) 2FA available to all users. Enforced for admin accounts. Brute-force protection: account locked after 5 failed 2FA attempts per session token. | ✓ Implemented |
| Session management | JWT tokens held in HttpOnly, Secure, SameSite=Lax cookies. Session lifetime: 24 hours. Tokens are not accessible to JavaScript. Magic links are single-use and expire in 15 minutes. | ✓ Implemented |
| Admin verification | All admin API endpoints verify the requesting user's identity against the database (JWT claim + DB record cross-check). No dev bypass paths exist in production. | ✓ Implemented |
| Tenant isolation | Every database query is scoped by org_id. The tenant is resolved at the API boundary via authenticated context and cannot be overridden by user input. Cross-tenant access is architecturally prevented. |
✓ Implemented |
| Password security | Passwords hashed with bcrypt, cost factor ≥ 12. Automatic rehashing to higher cost factors on login. Common passwords rejected. Minimum 10 characters. | ✓ Implemented |
| Internal access | Production database access is restricted to named Pillar2OS engineers via private network. No external access without VPN/bastion. All access is logged. | ✓ Implemented |
| Layer | Algorithm / Standard | Details |
|---|---|---|
| Transport encryption | TLS 1.2 minimum, TLS 1.3 preferred | HSTS enforced in production (max-age=63072000; includeSubDomains; preload). TLS 1.0 and 1.1 disabled. |
| Data at rest | AES-256 | Applied to all persistent storage including database volumes and backups. |
| Password hashing | bcrypt | Cost factor ≥ 12. Salted per-password. Automatic upgrade on login. |
| Session tokens | JWT (HS256) | Signed with a 256-bit server secret. Delivered as HttpOnly cookies. Not transmitted in URL parameters. |
| TOTP secrets | HOTP/TOTP (RFC 6238) | 32-byte secrets generated with cryptographically secure RNG. Stored encrypted at rest. QR codes generated client-side only (no server-side SVG). |
| Random token generation | secrets.token_urlsafe(48) |
Used for magic links, password reset tokens. 48 bytes = 384 bits of entropy. |
| Control | Implementation | Status |
|---|---|---|
| XSS prevention | React's default escaping for all dynamic content. DOMPurify sanitisation applied wherever dangerouslySetInnerHTML is used. Server-side HTML generation uses Python's html.escape() for all user-derived strings. |
✓ Implemented |
| Content Security Policy | CSP applied to all shared audit report views. Security headers applied globally: X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy. |
✓ Implemented |
| SQL injection prevention | All database access via SQLAlchemy ORM with parameterised queries. No raw SQL string construction from user input. | ✓ Implemented |
| Path traversal prevention | File-writing operations validated against an explicit allowlist of directories. .. and absolute paths rejected. |
✓ Implemented |
| CORS | Explicit allowlist of origins. * wildcard is not used with credentials. Configured in app/config.py. |
✓ Implemented |
| Rate limiting | API rate limits applied to all authentication endpoints. 2FA verification limited to 5 attempts per session token. Magic link requests limited per email address. | ✓ Implemented |
| Secrets in transit | Dev-mode tokens and debug URLs are excluded from production API responses. Sensitive values are never returned in production API responses. | ✓ Implemented |
vellum-backend (pip) and vellum-frontend (npm), running weekly scans every Monday.To report a security vulnerability in Pillar2OS, email security@pillar2os.com. We aim to acknowledge reports within 48 hours and to provide an initial assessment within 5 business days. We follow responsible disclosure and will coordinate a fix timeline with the reporter before public disclosure.
| Event type | Logged fields | Retention |
|---|---|---|
| Authentication events | Timestamp, user email, IP address, action (login/logout/2FA/magic-link/password-reset), outcome | 7 years |
| Data access | Timestamp, user identity, organisation, action, resource type, resource ID | 7 years |
| Data modification | Timestamp, user identity, organisation, field changed, before/after values (for critical fields) | 7 years |
| Role changes | Timestamp, actor, affected user, previous role, new role, method | 7 years |
| Admin actions | Timestamp, admin user identity, action type, payload summary | 7 years |
| Application errors | Timestamp, error type, stack trace, request path (no user data in error logs) | 90 days |
Audit logs are append-only and cannot be modified by application users. Access to raw logs is restricted to named Pillar2OS engineers. Customers can access their own audit trail within the platform under Settings → Audit Log.
To report a security incident: security@pillar2os.com. For urgent incidents, prefix the subject line with [P1 URGENT].
All sub-processors are assessed for security posture before engagement. Assessment criteria include:
The current sub-processor list is published in the DPA. Customers will be notified at least 14 days before any new sub-processor is added, with the right to object.
Infrastructure hosting credentials are rotated quarterly or immediately on personnel change. Shared credentials are not used.
| Measure | Implementation | Target |
|---|---|---|
| Database backups | Automated daily backups with point-in-time recovery. Backups encrypted at rest. Stored in a separate region from primary data. | RPO: 24 hours |
| Recovery time | Documented runbook for restoring the platform from backup. Recovery tested quarterly. | RTO: 4 hours |
| Infrastructure redundancy | Platform deployed across multiple availability zones. Application is stateless; horizontal scaling is supported. | 99.9% uptime target |
| Disaster recovery plan | Documented recovery procedures covering data centre failure, data corruption, and complete service restoration. Tested annually. | ✓ In place |
| Framework / Regulation | Status | Notes |
|---|---|---|
| UK GDPR / Data Protection Act 2018 | ✓ Compliant | Privacy Policy, DPA, and data subject rights procedures in place. |
| EU GDPR | ✓ Compliant | EU SCCs used for any EEA customer data transfer to sub-processors outside EEA. |
| UK PECR | ✓ Compliant | Only strictly-necessary cookies used; no consent banner required. |
| ISO 27001 | In progress | Controls aligned to ISO 27001:2022. Formal certification planned for 2027. |
| SOC 2 Type II | Planned | SOC 2 assessment planned to commence in 2027. Available to enterprise customers on request when complete. |
| Document owner | Ilumis Limited t/a Pillar2OS |
| Review frequency | Quarterly, or immediately following any material security incident or significant change to the platform |
| Enquiries | security@pillar2os.com |
| Related documents | Security Trust Centre · Privacy Policy · Data Processing Agreement |