If you run OpenTaco on a shared server, or within a network that hosts other services, those services may be vulnerable to exploitation by proxy or other means.
This is a non-exhaustive list of security considerations when running the self-hosted version of OpenTaco. For deployment options, see Self-hosting with Docker Compose.
Credential security
Prefer short-lived credentials over static keys. Digger supports OIDC-based authentication for both AWS and GCP, which eliminates the need to store long-lived access keys as CI secrets.
Use aws-role-to-assume with id-token: write permissions instead of AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY.See AWS: Authenticate with OIDC for setup. Use Workload Identity Federation with a service account binding instead of a service account key file.See GCP: Federated OIDC access for setup.
For multi-account setups, assign per-project IAM roles so each project only has access to its own infrastructure:
projects:
- name: prod
dir: prod
aws_role_to_assume:
state: "arn:aws:iam::ACCOUNT_ID:role/digger-state-prod"
command: "arn:aws:iam::ACCOUNT_ID:role/digger-apply-prod"
aws_role_region: us-east-1
See Project-level roles and Segregate cloud accounts.
Terraform supports data blocks and external providers that can execute arbitrary code inside your CI runner. A contributor with write access to your Terraform code could use this to exfiltrate CI environment variables, including cloud credentials. Mitigate by enforcing OIDC (short-lived credentials) and restricting who can merge Terraform changes.
Access control
Control who can trigger applies and under what conditions.
Apply requirements gate applies on PR state. For production projects, require both approval and an up-to-date branch:
projects:
- name: prod
dir: prod
apply_requirements: [mergeable, approved, undiverged]
See Apply requirements for all options.
CODEOWNERS ensures the right team reviews changes before Digger allows an apply. Since Digger checks GitHubâs mergeability status before applying, CODEOWNERS enforcement requires no additional Digger configuration â only a branch protection rule on your default branch with âRequire review from Code Ownersâ enabled.
See Codeowners integration.
Auth methods for the self-hosted orchestrator backend â use JWT auth (via Frontegg) for production. Basic auth is convenient for testing but not recommended for production workloads.
See Auth methods.
RBAC for Terraform state access is available in the state management backend when using S3 storage. Scope permissions to specific directories using resource paths like dev/* or myapp/prod.
See RBAC.
Secret handling
Prevent sensitive values from appearing in Terraform plan output and PR comments using filter_regex:
workflows:
default:
plan:
filter_regex: "((?i)secret:\\s\"?)[^\"]+"
steps:
- init
- plan
Any match is replaced with <REDACTED> in logs and PR comments. See Masking sensitive values.
Kubernetes
When deploying with Helm, do not set secret values inline in your chart values file for production deployments. Pre-create Kubernetes secrets and reference them:
# values-opentaco.yaml
ui:
useExistingSecret: true
existingSecretName: ui-secrets
Create the secrets from your env files:
kubectl create secret generic ui-secrets \
--from-env-file=helm-charts/secrets-example/ui.env \
-n opentaco --dry-run=client -o yaml | kubectl apply -f -
Use the External Secrets Operator or your organizationâs preferred secret lifecycle tool (Vault, AWS Secrets Manager, etc.) to manage rotation.
Keep the opentaco and traefik namespaces isolated. The platform reference chart is a quickstart baseline â it is not a production-hardening blueprint.