Clone
1
Security
Gitea edited this page 2026-08-12 09:47:32 +00:00

Security modes

aptly itself has no authentication — upstream explicitly warns against putting the REST API directly on the internet. This repo solves that with an nginx sidecar (Compose: its own container; Helm: a second container in the same pod, aptly only listens on 127.0.0.1).

The four presets

security.preset Read (apt clients) Read auth Write (/api/) Write auth
open on no on no
publicRead (default) on no on yes
authenticated on yes on yes
readOnly on no off (404) —

open is the "completely unsecured" option you asked for — one line, no confirmation gate:

security:
  preset: open

Health probes (/api/ready, /api/healthy) are reachable without credentials in every mode — otherwise Kubernetes/Compose could never recognize the instance as healthy.

Every cell individually reachable

security.read.* and security.write.* explicitly override the preset:

security:
  preset: authenticated
  read:
    requireAuth: false   # = publicRead, just spelled out explicitly

The Ingress split (Helm) — what it actually does

ingress:
  mode: split
  api:
    enabled: true
    host: aptly-api.example.com

This creates two Ingress objects (different host, different annotations/TLS/ingressClass possible) — but both point at the same Service. nginx itself does not check which host a request arrived on; /api/ is reachable through both hosts, as long as security.write.enabled allows it. The split is therefore a pure Ingress/DNS feature (e.g. a separate certificate or a WAF only on the API host), not a hard network separation. For real isolation: security.write.inClusterOnly: true (then renders no API Ingress at all — an honest implementation, not an nginx trick) or a networkPolicy.

The CIDR pitfall

security:
  write:
    allowCIDRs: ["10.42.0.0/16"]

Behind an Ingress controller, $remote_addr in nginx is the controller's pod IP, not the real client — allowCIDRs without trustedProxies then matches practically everyone. Set security.trustedProxies to your Ingress controller's CIDR (enables X-Forwarded-For evaluation), or use a networkPolicy for real L3 restriction. If trustedProxies is missing while allowCIDRs is set, the chart renders a # WARNING line directly into the nginx config.

Unsigned

aptly:
  gpg:
    enabled: false

Sets gpg_disable_sign: true in the aptly config and Signing.Skip: true in every publish call the reconcile job makes — both are needed; aptly's publish API takes its own signing parameter per call and ignores the global config flag (empirically verified). The client then needs [trusted=yes] instead of signed-by=.