This guide covers your responsibilities as the operator. For what each deployment model puts in your infrastructure, see Deployment overview.
How we secure our own platform
Navigara runs an information security management system designed to conform to ISO/IEC 27001:2022, and aligned to SOC 2 and DORA. The recommendations on this page come from the same internal policies. In summary, our policies require:- Encryption everywhere. TLS 1.2 or higher for data in transit, AES-256 or equivalent at rest — including backups. MD5, SHA-1, and DES are not permitted.
- Identity as the perimeter. Unique named identities, single sign-on, and multi-factor authentication on all administrative access.
- Least privilege, with evidence. Access granted by role and business need, reviewed at least quarterly, and revoked the same business day when someone leaves.
- Secrets never in code. Credentials live in a secret manager and are injected at run time. A committed secret is handled as a security incident.
- Nothing reaches production unreviewed. Protected branches, an independent reviewer on every change, and automated deployment from the default branch only.
- Continuous scanning with fixed clocks. Static analysis, dependency scanning, and image scanning on every change, with remediation targets of 15 days for critical findings, 30 for high, 60 for medium, and 90 for low. An independent penetration test at least annually.
- Tested resilience. Encrypted backups with validated restores, infrastructure defined as code, and recovery testing at least annually.
Navigara is not ISO 27001 certified. The management system is designed to conform to the standard. Contact your account representative for our current policy set, security documentation, or a data processing agreement.
Hardening checklist
Work through this list before you put a deployment into production. “Regulated” marks controls we consider mandatory in banking, insurance, and other regulated environments.Which controls apply to your deployment model
Network boundaries
Navigara is designed to need no inbound network access apart from the user-facing web interface. Keep it that way. Publish only the reverse proxy. In the reference deployment, Caddy listens on ports 80 and 443. The backend and frontend bind to loopback only (127.0.0.1:8080, 127.0.0.1:9090, 127.0.0.1:3000), so they are reachable only through the proxy. Do not change these to 0.0.0.0.
Keep the instance off the public internet where you can. Publish it on an internal network, or behind your VPN or zero-trust proxy. Users reach it the same way they reach your other internal tools.
Block the operational routes at the proxy. The backend serves Prometheus metrics at /metrics and, when explicitly enabled, profiling at /debug/pprof/. Neither requires authentication, so neither should be reachable from the internet. Add this to your Caddyfile inside the site block, before the handle_path /api/* block:
127.0.0.1:8080/metrics instead.
Keep the security headers. The reference Caddyfile in Full on-premises sets HSTS, X-Frame-Options, X-Content-Type-Options, and Referrer-Policy. Add Permissions-Policy if your baseline requires it. Do not relax Access-Control-Allow-Origin beyond your own domain.
Declare your proxy ranges. Navigara reads the client IP from X-Forwarded-For only when the immediate peer is a trusted proxy. Without this, audit logs and rate limits record your load balancer instead of the real client.
Keep the rate limits on. Requests without credentials are limited per client IP, and authenticated requests per token. The defaults suit a single instance. Limits are counted per process, so the effective budget is the limit multiplied by the number of backend replicas — lower the values if you run more than one.
Control outbound traffic too. Navigara needs a small, fixed set of destinations. Allow those and deny the rest — see What leaves your network.
Identity and access
Use single sign-on. Connect Google or Microsoft Entra ID so that your identity provider enforces multi-factor authentication, conditional access, and offboarding. Configuration is in Integrations → Authentication. Leave password authentication off.ENABLE_PASSWORD_AUTH is false by default. Keep it that way unless you have no identity provider.
Keep the on-premises signup brake. DEPLOYMENT_MODE defaults to onprem. In this mode a person who authenticates through your identity provider but belongs to no organization is rejected and no organization is created for them. Access still requires an explicit invitation. Do not change this on a deployment reachable by a wide identity pool.
Assign the smallest role that works. Navigara separates platform roles from organization roles.
Grant
owner to no more than two people. Review the member list and the token list at least quarterly, and remove anyone who no longer needs access.
Sessions last seven days. Sign-out deletes the session immediately, and changing a password ends every other session for that user. Rely on your identity provider for shorter-lived control.
SCIM provisioning synchronizes directory identities and attributes so Navigara can attribute work correctly. It does not grant organization membership, and de-provisioning a user in your identity provider does not by itself remove their Navigara access. Remove the member in Navigara as part of offboarding. See SCIM provisioning.
Root admin access
Full on-premises deployments have a root administrator that you control with an Ed25519 key pair. The public key goes inADMIN_PUBLIC_KEY; the matching private key generates short-lived root login links. See Full on-premises → Generate root private key.
Root bypasses every permission check in every organization. Treat the private key as the most sensitive credential in the deployment.
1
Generate the key on a trusted workstation
Do not generate it on the application server. The server only ever needs the public half.
2
Store the private key in a vault
Put it in your secret manager, a hardware token, or a password manager with break-glass procedures. Restrict access to named administrators.
3
Keep login links short-lived
The reference script issues links that expire after 60 seconds. Keep that window. Generate a link when you need it, use it immediately, and do not store it.
4
Restrict the endpoint
Root login is verified by signature rather than by session, so the endpoint accepts requests from anywhere the instance is reachable. In regulated environments, limit it to your administrator networks at the proxy. Add this to your Caddyfile before the If another proxy sits in front of Caddy, use the
handle_path /api/* block:client_ip matcher instead of remote_ip so the rule tests the real client rather than the proxy.5
Monitor its use
Every root login writes a log record, and the resulting session is flagged as impersonated. Alert on these — see Logging, audit, and monitoring.
6
Rotate on personnel change
Generate a new key pair, replace
ADMIN_PUBLIC_KEY, and restart the backend. Destroy the old private key.Your key is not the only one this endpoint trusts. Read Navigara support access before you sign off on the deployment.
Navigara support access
We think you should know this before your security review finds it. Every Navigara build contains a Navigara-held public key, and the root login endpoint trusts it alongside yourADMIN_PUBLIC_KEY. Setting ADMIN_PUBLIC_KEY adds your key to the trusted set — it does not replace ours.
What it can do. A token signed with the matching private key establishes a session as a user on your instance. Your own key is restricted to the root account; ours is not, so it can establish a session as any existing user, and that session can read whatever that user can read. As root it bypasses every organization permission check, exactly as described in Root admin access. Assess it as an authentication and data-access path, because that is what it is.
What we use it for. Navigara staff use it to verify changes on instances we operate on a customer’s behalf, which is the great majority of its use. We do not use it to reach instances we do not run for you. That is a statement about how we work, not a technical limit — the controls below are the technical limits.
What limits it.
- A token is bound to your domain. It carries an audience claim that must match your deployment’s own hostname, so a token minted for one instance does not work on another.
- Every use is audited in your logs, not only ours. The record names the key that was used, who was impersonated, the client address, and the user agent. The resulting session is flagged as impersonated in the database.
- Reaching the endpoint requires network access to your instance. If we cannot reach it, we cannot use the key.
Turn it off in configuration
ADMIN_PUBLIC_KEY becomes the only key that can authenticate as root, and the backend logs the setting at boot so you can confirm it took effect. Licensing is unaffected.
This setting is not in Navigara 0.14.0. Check the changelog for the release that introduces it, and use the proxy rule below until you are running that release.
Enforce it at the proxy
A configuration flag is honored by our software. A proxy rule is enforced by yours. If you need a control you can verify independently, add one:- Restrict by source. Allow the endpoint only from your administrator networks, using the rule in Root admin access. Your administrators keep root access; nobody outside those ranges can reach the endpoint.
- Deny outright. Return 403 permanently, and lift the rule only for the window in which you need root access. This blocks your own root login too, which is the point — nothing can authenticate through it while the rule is in place.
API tokens
API tokens carry thenavigara_ prefix, are scoped to one organization, and are shown once at creation. Navigara stores only a hash.
Attach the narrowest role available for the job. Two write-only roles exist for integration tokens, and you should use them:
Rules to apply:
- One token per purpose. Separate the collector, AI tool ingestion, SCIM, and any scripts. A leak then affects one integration.
- Set an expiry. Tokens do not expire by default. Give each one a date and diarize the renewal.
- Rotate by replacement. Create the new token, move the consumer over, confirm it works, then delete the old one.
- Revoke on offboarding and on suspicion. Deleting a token takes effect immediately.
- Never put a token in a URL, a ticket, or a chat message. Deliver it through your secret manager.
Secrets management
Hold every secret in a secret manager — HashiCorp Vault, AWS Secrets Manager, Google Secret Manager, or Azure Key Vault — and inject it at run time. Do not commit secrets to source control, and do not bake them into images. For the reference Docker Compose deployment, render the.env file from your secret manager at deploy time, own it as root with mode 0600, and delete it when the host is decommissioned.
Rotate every secret on a defined schedule, and immediately if you suspect exposure.
PASSWORD_HASH_PEPPER is the exception — it cannot be rotated without resetting every password.
Git and issue-tracker credentials
Navigara reads your repositories and trackers with credentials you supply. These are usually the highest-value credentials in the integration, so scope them tightly. Prefer the GitHub App. For GitHub, the Navigara GitHub App issues short-lived installation tokens, scoped to the repositories you select. There is no long-lived token to store or rotate. See On-prem collector → Git provider authentication. Encrypt tokens end to end. When you run your own collector, encrypt each personal access token against the collector’s public key. Navigara stores only the ciphertext and can never read the token; the collector decrypts it in memory when it authenticates to the Git host. See Encrypted Git tokens. Grant read-only, minimum scopes. Navigara never writes to your repositories or trackers. The required scopes for each provider are listed in Integrations overview. Use a dedicated service account rather than a personal account, so access survives staff changes and is auditable. Rotate on a schedule. Mint the new token, encrypt it, paste it in, confirm a successful sync, then revoke the old one. The collector accepts multiple decryption keys at once, so key rotation needs no downtime — see Key rotation. Revoke on offboarding. If a departing engineer’s account issued a token, revoke it the same day.Collector hardening
The collector clones repositories, runs analysis, and streams results to the backend. It handles source code, so it deserves the same care as a build agent. It needs no inbound ports. The collector always dials out to the backend and holds the connection open. Do not publish any port for it. Its operations endpoint is off entirely unless you setOPS_PORT, and when you do it binds to 127.0.0.1 (OPS_BIND_ADDR). Widen that only if a scraper must reach it across the network, and restrict who can.
Put it on a private network. Place it in a private subnet with egress to your Git host, your tracker, your LLM endpoint, and the Navigara backend. Nothing else needs to reach it.
Turn TLS on whenever it leaves the host. COLLECTOR_TLS is only safe as false when the collector and backend share one host and one Docker bridge, as in the all-in-one deployment. The moment the collector moves to its own machine, set it:
WORK_DIR (default /tmp/git-analysis), and Git stores the credential for the remote inside each clone. Put WORK_DIR on an encrypted volume, and treat the host as one that holds source code and credentials.
Understand the cache setting. By default the collector deletes each clone after it finishes. Setting COLLECTOR_CACHE_REPOS=true keeps clones on disk to speed up later runs — which also means source code and credentials persist between jobs. Enable it only on an encrypted, access-controlled volume, and monitor disk usage.
Keep the provider guards closed. Two settings widen what a collector may reach. Both default to false.
Run one collector per trust boundary. If two parts of your organization must not see each other’s code, give them separate collectors with separate credentials rather than one shared collector.
Restrict the host. Run the containers as an unprivileged user, keep the base OS patched, and limit shell access to the platform team.
Database hardening
PostgreSQL holds everything: analysis results, connection credentials, and user records. It is the highest-value asset in the deployment.- Encrypt at rest. Enable storage encryption on your managed instance, or full-disk encryption if you run it yourself. Use AES-256 or equivalent.
- Require TLS. Keep
sslmode=requireinDATABASE_URL. Useverify-fullwith a pinned certificate authority where your baseline calls for it. - Use a least-privilege application user. Follow the grants in Full on-premises → Configure PostgreSQL. Never point
DATABASE_URLat a superuser. - Restrict the network path. Allow connections only from the application host’s address. Never expose port 5432 to the internet.
- Separate administrative access. Give database administrators their own named accounts, ideally through your cloud provider’s identity-based authentication rather than a shared password.
- Audit access. Log connections and administrative statements, and ship them to the same place as your other audit logs.
What leaves your network
Navigara makes a small, fixed set of outbound connections. Allow these and deny the rest.
A full on-premises deployment makes no connection to Navigara. License keys are verified offline, and there is no automatic update or telemetry channel.
The LLM endpoint is a processor
Commit analysis sends commit messages and the changed lines of code to the LLM endpoint that you configure. This is the one path on which code content leaves the deployment, and it goes to your provider, not to Navigara. For regulated deployments that use a hosted model:- Choose a region that matches your data residency obligations.
- Choose an endpoint with zero data retention and no training on your inputs, and get it in writing.
- Record the provider as a sub-processor in your record of processing, and put a data processing agreement in place.
Telemetry is off by default
A self-hosted deployment sends no telemetry unless you configure it. Leave these unset:Personal data and GDPR
Navigara does not process your customers’ data. It does process personal data about your employees and contractors, so GDPR applies. Plan for it before you go live.What Navigara holds
Your obligations as controller
In a self-hosted deployment you are the controller for this data and Navigara is not a processor at all — the data never reaches us. In Cloud SaaS and hybrid deployments Navigara acts as a processor on your instructions, under a data processing agreement. Either way, plan the following:1
Record the processing
Add Navigara to your record of processing activities. Identify your lawful basis — legitimate interest is the usual basis for engineering delivery analytics, and it requires a balancing test you can show.
2
Tell your engineers
Monitoring must be disclosed. State what is measured, why, and who can see it. We apply the same rule internally.
3
Assess the risk
Analytics about individual performance usually warrants a data protection impact assessment. Do it before rollout, not after.
4
Consult where required
In several jurisdictions, works councils or employee representatives must be consulted before performance-related monitoring begins.
5
List your sub-processors
Your LLM provider receives commit content. Your hosting provider holds the database. Both belong in your record, with agreements in place.
Minimize what you collect
- Analyze only the repositories you need. Every repository you add widens the data set.
- Leave AI prompt capture off.
TOOL_USAGE_EVENTS_CAPTUREisfalseby default. It records prompt and tool content, which is rarely necessary and greatly increases sensitivity. - Restrict who can read prompt content. Only organization owners hold that permission. Do not widen it.
- Keep exports controlled. Reports and summaries name individuals. Treat them as confidential.
Set retention
Retention is configured per data class. Set every value deliberately.
Expired sessions and password-reset tokens are removed automatically every day.
Analysis records are keyed to Git identities rather than to user accounts, so removing a person’s login does not remove the commit history attributed to them. Deleting an organization removes its analysis data. Plan how you will answer an erasure or access request before you go live — contact Navigara support to scope the procedure for your deployment.
Logging, audit, and monitoring
Keep the audit log on.AUDIT_LOG_ENABLED defaults to true. It writes one structured record per privileged operation, containing who acted, what they did, which resource, the outcome, and the client address. Request bodies are never logged.
Ship logs off the host. Forward container logs to your SIEM or log platform, and apply your standard retention there. Logs held only on the application host are lost when it is rebuilt.
Alert on these events:
Make client addresses trustworthy. Configure your edge proxy to overwrite inbound
X-Forwarded-For, and set TRUSTED_PROXY_CIDRS — otherwise a client can put any address in the audit trail.
Watch availability too. The backend exposes GET /health. The collector exposes /health and /health/ready, but only if you set OPS_PORT. A collector that stops connecting means analysis has stopped silently.
Backup and recovery
- Back up the database on a schedule that meets your recovery point objective. See Full on-premises → Backup and restore.
- Encrypt the backups with AES-256 or equivalent, and store them separately from the database.
- Restrict access to backups as tightly as to the database itself. A backup is a complete copy of every credential and record.
- Test a restore at least annually, into an isolated environment, and record the result. An untested backup is not a control.
- Record your own secrets. The database alone will not restore a deployment — you also need
.env, the collector private key, and the root admin key. Keep those in your secret manager, backed up independently. - Define your objectives. Internally we target 24 hours for both recovery time and recovery point. Set yours to match your own requirements.
Updates and patching
- Pin a version. Set
NAVIGARA_VERSIONexplicitly rather than tracking a floating tag, so that deployments are reproducible. - Mirror the images. Regulated environments should pull Navigara images into their own registry, scan them there, and deploy from the mirror. Override
BACKEND_IMAGE,COLLECTOR_IMAGE, andFRONTEND_IMAGEto point at it. - Patch on a clock. Apply our remediation targets, or your own if they are stricter: 15 days for critical findings, 30 for high, 60 for medium, 90 for low.
- Track releases. Watch the changelog for security-relevant changes. There is no automatic update — you decide when to upgrade.
- Back up before upgrading. Database migrations run automatically on startup.
- Patch the host too. The base operating system, Docker, PostgreSQL, and the reverse proxy are yours to keep current.

