Profile matrix¶
What each [security].profile checks when a service starts, and what satisfies
each check. Verify a file against it with
gdsgate config check.
| Cell | Meaning |
|---|---|
| required, refused at start | The service exits until the setting is in place. |
| refused if set | The service exits while the setting is present. |
| warning at start | The service logs a warning and starts. |
| doctor warning | Only gdsgate doctor reports it. |
| not checked | Nothing reports it. |
The unset column is a file with no [security].profile. A refusal lists
every failed check at once.
Compare¶
dev |
pilot |
production |
|
|---|---|---|---|
| For | one machine, development, tests | a first real deployment, a pilot with real users | the deployment you run long term |
| Store | SQLite or PostgreSQL | PostgreSQL | PostgreSQL |
| Registration listener | cleartext allowed | TLS (enroll_cert_file) |
TLS |
| Nodes register at | http:// or https:// |
https:// only |
https:// only |
| Proxy client port | any | TLS | TLS |
| Connectors, Proxy, agent host | may run without an enrolled identity | enrolled identity required | enrolled identity required |
gdsgate all (one process) |
allowed | refused | refused |
Identity provider ([oidc]) |
optional | optional | required; allow_insecure_http refused |
Keyrings (control_keyring, audit_keyring) |
optional | optional; one file for both: warning | required, two distinct files, readable by the service account only |
| Keys across replicas and sealed rows | not checked | not checked | every replica holds the same keys, and every key a sealed row names |
Audit export ([audit].export_path) |
not checked | warning at start | warning at start |
| Moving up | pilot: store, TLS, enrollment |
production: IdP, keyrings |
Each row names checks from the table below; the table has the exact rule and the fix.
Checks¶
| Check | Role | dev |
pilot |
production |
|---|---|---|---|---|
profile-declared |
every role | warning at start | not checked | not checked |
all-in-one |
all-in-one | not checked | refused if set | refused if set |
store-postgres |
Authority | not checked | required, refused at start | required, refused at start |
registration-tls |
Authority | not checked | required, refused at start | required, refused at start |
enroll-endpoint-tls |
Proxy, connector, agent host | not checked | refused if set | refused if set |
proxy-public-tls |
Proxy | not checked | required, refused at start | required, refused at start |
proxy-internal-mtls |
Proxy | not checked | required, refused at start | required, refused at start |
connector-enrolled |
Connector | not checked | required, refused at start | required, refused at start |
agent-host-enrolled |
Agent host | not checked | required, refused at start | required, refused at start |
audit-export |
Authority | not checked | warning at start | warning at start |
keyrings-named |
Authority | not checked | not checked | required, refused at start |
keyrings-distinct |
Authority | not checked | warning at start | refused if set |
key-file-access |
Authority | not checked | not checked | refused if set |
oidc-provider |
Authority | not checked | not checked | required, refused at start |
oidc-plain-http |
Authority; Proxy with the clientless browser entry | doctor warning | doctor warning | refused if set |
replica-keyrings |
Authority | not checked | not checked | refused if set |
sealed-row-keys |
Authority | not checked | not checked | refused if set |
open-secret-file |
every service | warning at start | warning at start | warning at start |
legacy-key-paths |
Authority | warning at start | warning at start | warning at start |
profile-declared¶
- Setting:
[security].profile - Satisfy:
[security].profile = "production","pilot"or"dev";setup prepare --security-profile. - Reference: Reference
- unset: doctor warning (
devis warning at start)
all-in-one¶
- Setting:
gdsgate all(Authority, Proxy and connector in one process) - Satisfy: Run
gdsgate authority,gdsgate proxyandgdsgate connectoras separate services. - Reference: Reference
store-postgres¶
- Setting:
store_urlnames PostgreSQL (unset orsqlite://is SQLite) - Satisfy:
store_url = "postgres://gdsgate@db/gdsgate", password instore_password_file;setup prepare --store-url. - Reference: Reference
registration-tls¶
- Setting: Registration listener TLS:
[authority].enroll_cert_fileandenroll_key_file - Satisfy:
[authority].enroll_cert_fileandenroll_key_file;setup prepare --enroll-cert --enroll-key. - Reference: Reference
enroll-endpoint-tls¶
- Setting:
[enroll].endpointscheme ishttp:// - Satisfy:
[enroll].endpoint = "https://...", and[authority].enroll_cert_fileon the Authority;setup prepare --enroll-cert. - Reference: Reference
proxy-public-tls¶
- Setting: Client-facing TLS: a
[proxy].public_cert_filepair, or an enrolled identity - Satisfy:
[proxy].public_cert_fileandpublic_key_file, or[enroll];setup prepare --tls-cert --tls-key. - Reference: Reference
proxy-internal-mtls¶
- Setting: Connector-facing mutual TLS: an enrolled identity
- Satisfy:
[enroll].endpointand a one-time token ([enroll].token, orGDSGATE_ENROLL_TOKENin the environment or inproxy.envbeside the configuration), or an identity already instate_dir. - Reference: Reference
connector-enrolled¶
- Setting: Connector enrolled identity
- Satisfy:
[enroll].endpointand a one-timetoken, or an identity already instate_dir. - Reference: Reference
agent-host-enrolled¶
- Setting: Agent host enrolled identity
- Satisfy:
[enroll].endpointand a one-timetoken, or an identity already instate_dir. - Reference: Reference
audit-export¶
- Setting:
[audit].export_path - Satisfy:
[audit].export_path = "/var/lib/gdsgate/authority/audit.jsonl"(Windows:%ProgramData%\gdsgate\state\authority\audit.jsonl), shipped by a log collector. - Reference: Reference
keyrings-named¶
- Setting:
[security.integrity].control_keyringandaudit_keyringboth set - Satisfy:
gdsgate authority init --profile production, orsetup prepare; existing key files:gdsgate authority keys migrate-legacy. - Reference: Reference
keyrings-distinct¶
- Setting: The two keyrings name one file
- Satisfy:
[security.integrity]control_keyring = "/etc/gdsgate/control.keys",audit_keyring = "/etc/gdsgate/audit.keys". - Reference: Reference
key-file-access¶
- Setting: A keyring or an existing
[audit].*_key_pathfile owned by another account or readable beyond the service - Satisfy: Owner
rootor the service account; mode0640with groupgdsgate, or0600. - Reference: Reference
oidc-provider¶
- Setting:
[oidc].issuerand[oidc].client_id - Satisfy:
[oidc].issuer = "https://idp.example/realms/gdsgate",client_id = "gdsgate";setup prepare --oidc-issuer --oidc-client-id. - Reference: Reference
oidc-plain-http¶
- Setting:
[oidc].allow_insecure_http = true(a lab or dev provider) - Satisfy:
[oidc].allow_insecure_http = falseand anhttps://issuer. - Reference: Reference
replica-keyrings¶
- Setting: Authority replicas hold different keys, and rows are sealed under the difference (checked against the store)
- Satisfy: The same keyrings on every replica;
gdsgate authority keys status. - Reference: Reference
sealed-row-keys¶
- Setting: The newest sealed row of a table names a key no keyring here holds (checked against the store)
- Satisfy: The keyring that holds the key; for a lost key
gdsgate authority keys accept-loss. - Reference: Reference
open-secret-file¶
- Setting: A secret file the configuration names is readable beyond its owner and the service group
- Satisfy:
chmod 640with groupgdsgate, orchmod 600. - Reference: Reference
legacy-key-paths¶
- Setting: Any of the five
[audit].*_key_pathparameters set - Satisfy:
gdsgate authority keys migrate-legacy, then name the keyrings. - Reference: Reference
gdsgate config check runs every check above except the two checked against
the store (replica-keyrings, sealed-row-keys), which run after Authority
opens the store.
Not checked by any profile¶
| Setting | pilot |
production |
How to satisfy |
|---|---|---|---|
Step-up MFA ([mfa.webauthn]) |
optional | recommended | [mfa]; policies that require webauthn_satisfied. |
High availability ([ha]) |
optional | recommended: two or more Authority instances | [ha]; needs a PostgreSQL store_url. |
Session recording off the connector host ([recording]) |
optional | recommended | [recording]. |
Client-facing certificate from a public CA ([proxy].public_cert_file) |
optional | recommended | Without it clients trust the cluster CA through gdsgate connect. [proxy]. |
Metrics and health ([telemetry].metrics_listen) |
optional | recommended | [telemetry]. |
Example¶
A pilot Authority that passes every check:
store_url = "postgres://gdsgate@db.example.com/gdsgate"
store_password_file = "/etc/gdsgate/store.password"
[security]
profile = "pilot"
[authority]
enroll_cert_file = "/etc/gdsgate/enroll.pem"
enroll_key_file = "/etc/gdsgate/enroll.key"
[audit]
export_path = "/var/lib/gdsgate/authority/audit.jsonl"
For production add:
[security.integrity]
control_keyring = "/etc/gdsgate/control.keys"
audit_keyring = "/etc/gdsgate/audit.keys"
[oidc]
issuer = "https://idp.example.com/realms/gdsgate"
client_id = "gdsgate"
gdsgate config check /etc/gdsgate/authority.toml --role authority
gdsgate config check /etc/gdsgate/authority.toml --role authority --profile production
Symptoms¶
| Symptom | Cause | What to do |
|---|---|---|
refusing to start: followed by a list, each item with a fix: line |
One or more required or refused if set cells above |
Apply every fix: line; gdsgate config check <FILE> --role <ROLE> prints the same list with the key path of each. |
`store_url` is unset: state is kept in a local SQLite file |
store-postgres |
Set store_url to a postgres:// URL. |
`[authority].enroll_cert_file` is unset |
registration-tls |
Set enroll_cert_file and enroll_key_file. |
`[enroll].endpoint` is `http://...`: the provision token crosses it in cleartext |
enroll-endpoint-tls |
Write the endpoint as https://; the Authority needs enroll_cert_file. |
the client-facing listener has no TLS |
proxy-public-tls |
Set [proxy].public_cert_file and public_key_file, or enrol the Proxy. |
`[security.integrity].control_keyring` names no keyring |
keyrings-named |
gdsgate authority init --profile production, or gdsgate authority keys migrate-legacy for existing key files. |
`[oidc].issuer` and `[oidc].client_id` are unset |
oidc-provider |
Set both. |
`[audit].export_path` is unset in the log, service running |
audit-export |
Set export_path; the warning does not stop the service. |
`gdsgate all`: Authority, Proxy and connector in one process |
all-in-one |
Run the three roles as separate services, or set profile = "dev". |