This Access Control Policy defines the requirements and procedures for managing access to Cashuary systems, infrastructure, and data. It governs how identities are authenticated, how permissions are assigned and reviewed, and how non-human credentials are managed across the platform.
This policy applies to all personnel, service accounts, and automated systems that interact with Cashuary infrastructure, source code repositories, cloud services, third-party provider dashboards, and production databases. It supplements the Information Security Policy (ISP-2026-001) and should be read in conjunction with it.
Access to all systems, data, and infrastructure is granted on a need-to-know basis following the principle of least privilege. Every identity — whether human or machine — receives only the minimum permissions required to perform its designated function.
The following table details the access control mechanisms for each infrastructure system used by Cashuary, including the specific controls enforced and the capabilities available to authorized personnel.
| System | Access Control | MFA Required | Authorized Capabilities |
|---|---|---|---|
| GitHub (Source Code) | Role-based, branch protection rules | Yes |
Org owners: manage repository settings, branch protection, and team membership.
Members: push to feature branches, open pull requests, review code. No direct push to
main or production.
|
| Railway (Infrastructure) | Team-based access, environment isolation | Yes | Admins: manage services, environment variables, deployments, and database access. Members: view deployment status and logs. Environment variables are scoped per environment (production, staging, PR preview). |
| Google Cloud Platform | IAM roles, service account key rotation | Yes | Project owners: manage IAM policies, OAuth consent screens, and service accounts. Editors: configure APIs and credentials. Service accounts: scoped to specific APIs (Calendar only) with domain-wide delegation. |
| Plaid Dashboard | Restricted to authorized personnel | Yes | View and manage bank integrations, webhook configurations, API keys, and sandbox settings. Access limited to the CEO. |
| Stripe Dashboard | Restricted to authorized personnel | Yes | View and manage Financial Connections settings, API keys, and webhook endpoints. Access limited to the CEO. |
| Sentry (Error Monitoring) | Team-based access | Yes | Admins: manage project settings, integrations, and alert rules. Members: view and resolve issues, manage issue assignments. |
| PostgreSQL Database | No direct access; managed via Railway with connection string rotation | N/A (no direct access) | No human users have direct database access. All database operations are performed through the application layer. Connection strings are managed by Railway and rotated automatically. |
The application's administrative panel is disabled by default in production and requires an explicit opt-in via environment configuration. When enabled, administrative endpoints are protected by a minimum 32-character secret token validated using timing-safe comparison to prevent timing attacks. Administrative endpoints are additionally rate-limited to 50 requests per 15-minute window.
End users authenticate exclusively via Google OAuth 2.0, which provides:
calendar.events scope needed to create and manage
transaction events.
httpOnly, secure (in
production), and sameSite=lax flags
All infrastructure systems (GitHub, Railway, Google Cloud, Plaid, Stripe) require multi-factor authentication for human access. Service-to-service authentication uses API keys and secrets stored as encrypted environment variables, never committed to source code.
Cashuary uses role-based access control (RBAC) across all infrastructure platforms to enforce the principle of least privilege. The following tables detail the roles, their permissions, and current assignments.
| Role | Permissions |
|---|---|
| Organization Owner | Full repository administration, manage branch protection rules, configure GitHub Apps and integrations, manage team membership, access billing and audit logs. |
| Member |
Clone repositories, push to feature branches, create and review pull requests. Cannot
push to main or production (enforced by branch protection
and pre-commit hooks).
|
Branch protection: The main and production
branches require pull request reviews before merging. Direct pushes are blocked by both
GitHub branch protection rules and local pre-commit/pre-push hooks.
| Role | Permissions |
|---|---|
| Admin | Manage services, configure environment variables, trigger deployments, access database connection strings, manage team membership and billing. |
| Member | View deployment status, view logs, view service configuration. Cannot modify environment variables or trigger manual deployments. |
Environment isolation: Production, staging, and PR preview environments have separate environment variable sets. PR preview environments inherit from the staging base environment with sandbox credentials and use isolated database instances.
| Role | Permissions |
|---|---|
| Project Owner | Full project administration, manage IAM policies, configure OAuth consent screens, create and manage service accounts, enable/disable APIs. |
| Editor | Configure API settings, manage OAuth credentials, view audit logs. Cannot modify IAM policies or delete projects. |
| Service Account |
Scoped to specific APIs only (Google Calendar). Domain-wide delegation is limited to
the calendar and calendar.events scopes. No access to other
GCP services or user data beyond calendar operations.
|
Project separation: Development/staging (cashuary-dev) and
production (cashuary-prod) use entirely separate GCP projects with distinct
OAuth client IDs, service accounts, and consent screen configurations.
Cashuary conducts quarterly access reviews to ensure that all access grants remain appropriate and that the principle of least privilege is maintained. The review process is as follows:
When a team member's role changes or they leave the organization, the following de-provisioning steps are executed immediately:
Cashuary uses several non-human credentials for machine-to-machine authentication with third-party services. All non-human credentials follow strict security controls:
calendar and calendar.events — no access to
email, drive, or other Google services.
GOOGLE_SA_KEY_JSON), never committed to source code.
STRIPE_SECRET_KEY) scoped per Railway
deployment environment.
STRIPE_PUBLISHABLE_KEY) are exposed to the client for
Stripe.js initialization but grant no data access on their own.
SENTRY_AUTH_TOKEN).
All infrastructure access is authenticated through Google Workspace (@cashuary.com) with organization-wide MFA enforcement. Google Workspace serves as the centralized identity provider for all personnel.
All infrastructure services (GitHub, Railway, Google Cloud Platform, Sentry, Plaid Dashboard) are accessed using @cashuary.com Google Workspace identities. MFA is enforced at the IdP level via Google Workspace 2-Step Verification (set to “Enforced” for the organization).
Upon employee departure, suspending or deleting their Google Workspace account immediately revokes OAuth-based access to all connected services. Railway and GCP access is tied to Google identity; GitHub access is revoked by removing the user from the organization. Service account keys are rotated independently.
Access to all infrastructure systems is reviewed quarterly by the Security Officer. Reviews verify that only authorized personnel have access, that permissions follow least privilege, and that no stale accounts or excessive permissions exist. Review findings are documented and remediated within 30 days.
Every API request requires a valid, authenticated session. No endpoint trusts implicit network location or prior authentication state. Session tokens are httpOnly, Secure, SameSite=lax cookies with 7-day expiry. CSRF protection via double-submit cookie pattern is enforced on all mutation routes.
All data access enforces ownership verification — users can only access their own financial data. Database queries include user ID scoping. Admin endpoints require a separate secret token and are disabled by default in production.
The application database has no public endpoint and is accessible only via Railway’s private network. All external traffic is served over HTTPS with HSTS preload (max-age 1 year). Rate limiting is applied to all API, auth, webhook, and admin routes.
Authentication failures (missing sessions, rejected admin tokens) are logged as structured security events and forwarded to Sentry for alerting. Request-level logging captures method, URL, status code, and latency for all traffic. Unhandled errors are captured by Sentry with user context for incident response.
| Version | Date | Author | Description |
|---|---|---|---|
| 1.0 | March 10, 2026 | Harvey Multani | Initial release — extracted from Information Security Policy (ISP-2026-001) sections 3 and 4, with expanded RBAC, access review, and non-human credential documentation. |
| 1.1 | March 11, 2026 | Harvey Multani | Added Section 11: Centralized Identity and Access Management — centralized IdP, service access via Google identity, de-provisioning procedures, and periodic access review requirements. |
| 1.2 | March 11, 2026 | Harvey Multani | Added Section 12: Zero Trust Access Architecture — always-verify auth model, least-privilege data access, network isolation, and continuous monitoring. |
This Access Control Policy has been reviewed and approved by the undersigned on behalf of HM Services Consulting Inc.