feat: centralize workflow credentials
This commit is contained in:
1 parent
b8ae0c625d
commit
070ae74efa
4 files changed
+72
-37
No files matched your search
@@ -3,11 +3,14 @@
|
|||||||
This inventory contains names and provenance only. It intentionally contains no
|
This inventory contains names and provenance only. It intentionally contains no
|
||||||
credential values or value hashes.
|
credential values or value hashes.
|
||||||
|
|
||||||
## Proposed authority
|
## Authority
|
||||||
|
|
||||||
Use one SOPS-encrypted `~/.config/yookr/credentials.yaml`, backed by the existing
|
Use one SOPS-encrypted `~/.config/yookr/credentials.yaml`, backed by the existing
|
||||||
mode-0600 user age identity. SOPS 3.13.3 and the identity are already present,
|
mode-0600 user age identity. SOPS 3.13.3 and the identity are already present,
|
||||||
and an encrypt/decrypt round trip passed on 2026-09-06.
|
and an exact encrypt/decrypt comparison passed on 2026-09-06. The user approved
|
||||||
|
this authority and an active-credentials-first migration. The directory is mode
|
||||||
|
0700 and the encrypted file is mode 0600; it remains outside Git and the Nix
|
||||||
|
store.
|
||||||
|
|
||||||
Keep the document hierarchical so operators can inspect and edit everything in
|
Keep the document hierarchical so operators can inspect and edit everything in
|
||||||
one place while callers extract only their own scalar values or subtree. Do not
|
one place while callers extract only their own scalar values or subtree. Do not
|
||||||
@@ -15,20 +18,19 @@ load the complete document into every repository environment. Public endpoints,
|
|||||||
queue names, bucket names, and other non-secret configuration remain with their
|
queue names, bucket names, and other non-secret configuration remain with their
|
||||||
normal owners.
|
normal owners.
|
||||||
|
|
||||||
Candidate top-level groups:
|
Top-level groups:
|
||||||
|
|
||||||
- `company-login`
|
- `company_login`
|
||||||
- `databases`
|
- `databases`
|
||||||
- `leafcloud`
|
- `leafcloud`
|
||||||
- `rabbitmq`
|
- `rabbitmq`
|
||||||
- `service-accounts`
|
- `applications`
|
||||||
- `third-party`
|
|
||||||
- `archive`
|
- `archive`
|
||||||
|
|
||||||
Do not migrate or remove source values until the user approves this authority.
|
Active credentials and ten archived credential sources have been migrated.
|
||||||
After approval, migrate active credentials first, verify each consumer, then
|
Archive membership does not imply inactivity, so their source namespaces are
|
||||||
handle archived credentials and delete redundant plaintext only with explicit
|
preserved. Delete redundant plaintext only with explicit approval after each
|
||||||
approval.
|
original consumer is verified.
|
||||||
|
|
||||||
## Active sources
|
## Active sources
|
||||||
|
|
||||||
@@ -38,12 +40,17 @@ approval.
|
|||||||
frontend source and is therefore client-visible, not a protectable secret.
|
frontend source and is therefore client-visible, not a protectable secret.
|
||||||
- `~/dev/work/yookr-data-science/.env`: WeatherAPI key.
|
- `~/dev/work/yookr-data-science/.env`: WeatherAPI key.
|
||||||
- `~/rabbitmq-creds-test`: test RabbitMQ username and password.
|
- `~/rabbitmq-creds-test`: test RabbitMQ username and password.
|
||||||
|
- `~/irristaud-openstack-creds`: Irristaud project EC2 credentials.
|
||||||
- `~/db-creds`: MySQL test/live and MongoDB test/live material.
|
- `~/db-creds`: MySQL test/live and MongoDB test/live material.
|
||||||
- `~/dev/work/yookr-api/http-client.private.env.json`: company email and
|
- `~/dev/work/yookr-api/http-client.private.env.json`: company email and
|
||||||
password used for API logins.
|
password used for API logins.
|
||||||
- `~/.local/share/db_ui/connections.json`: existing `traceability` connection.
|
- `~/.local/share/db_ui/connections.json`: existing `traceability` connection.
|
||||||
|
|
||||||
All credential-bearing active files above are mode 0600 after the audit.
|
All credential-bearing active files above are mode 0600 after the audit.
|
||||||
|
They remain in place pending consumer-by-consumer removal approval. The dashboard
|
||||||
|
backend's MySQL and MongoDB credentials do not match either named test/live pair,
|
||||||
|
so they are preserved separately instead of being assigned an environment by
|
||||||
|
assumption.
|
||||||
|
|
||||||
## Archived credential sources
|
## Archived credential sources
|
||||||
|
|
||||||
@@ -54,9 +61,25 @@ All credential-bearing active files above are mode 0600 after the audit.
|
|||||||
- Legacy data science and soil-moisture tools: company login credentials.
|
- Legacy data science and soil-moisture tools: company login credentials.
|
||||||
- `salemans`: CMI credentials.
|
- `salemans`: CMI credentials.
|
||||||
|
|
||||||
These files are now mode 0600. Preserve their provenance under `archive` until
|
These files are now mode 0600 and their selected credentials are preserved under
|
||||||
the user decides whether each credential is still valid; stale credentials
|
`archive`. The user is still cleaning the filesystem, so stale status must be
|
||||||
should be revoked instead of retained indefinitely.
|
decided per source; stale credentials should be revoked instead of retained
|
||||||
|
indefinitely.
|
||||||
|
|
||||||
|
## Verified consumers
|
||||||
|
|
||||||
|
- `yookr-workbench` decrypts once in memory and exports only its API login, four
|
||||||
|
database connections, Irristaud S3 credential, and test RabbitMQ credential.
|
||||||
|
- Central test API login and the read-only RabbitMQ overview passed.
|
||||||
|
- MySQL test/live `SELECT 1` and MongoDB test/live `ping` passed. The MongoDB
|
||||||
|
endpoints publish SRV rather than direct address records and therefore use
|
||||||
|
`mongodb+srv` URLs.
|
||||||
|
- The ephemeral `irristaud:` rclone remote found the sole `irristaud` container
|
||||||
|
and listed its six root entries. No object content was downloaded and no
|
||||||
|
rclone configuration was persisted.
|
||||||
|
|
||||||
|
Dadbod's four display names require activation of the pending Neovim
|
||||||
|
configuration and explicit authorization of the changed workbench `.envrc`.
|
||||||
|
|
||||||
## Excluded from migration
|
## Excluded from migration
|
||||||
|
|
||||||
@@ -76,8 +99,8 @@ credential is still active.
|
|||||||
|
|
||||||
## Immediate findings
|
## Immediate findings
|
||||||
|
|
||||||
- The discovered dashboard S3 credential can list eight Leafcloud containers but
|
- The dashboard S3 credential and the Irristaud project credential are distinct;
|
||||||
cannot see `irristaud`; a credential from the `irristaud` project is required.
|
the latter is now centralized and its read-only pilot passed.
|
||||||
- The generated Yookr OpenAPI document remains malformed, but direct requests use
|
- The generated Yookr OpenAPI document remains malformed, but direct requests use
|
||||||
the reviewed local contract and work independently.
|
the reviewed local contract and work independently.
|
||||||
- Management accepts an account-issued JWT only as the raw `Authorization` value,
|
- Management accepts an account-issued JWT only as the raw `Authorization` value,
|
||||||
|
|||||||
@@ -47,18 +47,19 @@ restarted Kitty and closed the user's terminal session.
|
|||||||
invocation-scoped test overview and queue listing passed. Test API login,
|
invocation-scoped test overview and queue listing passed. Test API login,
|
||||||
Yookr administrator read, rules read, aggregation login, and management health
|
Yookr administrator read, rules read, aggregation login, and management health
|
||||||
passed. Account login plus a raw-token management user read also passed.
|
passed. Account login plus a raw-token management user read also passed.
|
||||||
|
The approved user-key SOPS authority now contains active credentials and ten
|
||||||
|
provenance-preserving archive namespaces. Its workbench exports passed a test
|
||||||
|
API login, RabbitMQ overview, MySQL test/live `SELECT 1`, MongoDB test/live
|
||||||
|
`ping`, and read-only Irristaud object-storage listing.
|
||||||
|
|
||||||
## Active pilot gates
|
## Active pilot gates
|
||||||
|
|
||||||
These gates do not block work on each other.
|
These gates do not block work on each other.
|
||||||
|
|
||||||
- Configure one `rclone` S3 remote per Leafcloud project, starting with the
|
- Activate the pending Neovim configuration, explicitly authorize the changed
|
||||||
`irristaud` project and container. Use listing and download operations only;
|
workbench `.envrc`, and confirm Dadbod shows the four centralized test/live
|
||||||
uploads are out of scope. Project-scoped EC2 access and secret keys remain the
|
connections. Create a Marimo-to-HTML report only when a concrete cross-system
|
||||||
missing input.
|
investigation gives it durable value.
|
||||||
- Add the four named Dadbod connections after receiving MySQL test/live and
|
|
||||||
MongoDB test/live connection URIs. Create a Marimo-to-HTML report only when a
|
|
||||||
concrete cross-system investigation gives it durable value.
|
|
||||||
- Keep Bruno, DBeaver, and PIM clients until their separate pilots decide them.
|
- Keep Bruno, DBeaver, and PIM clients until their separate pilots decide them.
|
||||||
- Wait for a real Monday ticket before adding anything beyond native GitHub,
|
- Wait for a real Monday ticket before adding anything beyond native GitHub,
|
||||||
Herdr, Git, and worktree workflows. Issue 197 is selected, but this Codex
|
Herdr, Git, and worktree workflows. Issue 197 is selected, but this Codex
|
||||||
@@ -132,7 +133,8 @@ the fresh-shell GitHub read and restarted-Codex Context7 lookup must both work.
|
|||||||
- `yookr-workbench` starts with cross-system work only; isolation and additional
|
- `yookr-workbench` starts with cross-system work only; isolation and additional
|
||||||
tools wait for observed needs. Its one API environment catalogue covers the
|
tools wait for observed needs. Its one API environment catalogue covers the
|
||||||
Yookr, rules, aggregation, and management APIs; Kulala owns requests and
|
Yookr, rules, aggregation, and management APIs; Kulala owns requests and
|
||||||
Dadbod's native store owns named database connections.
|
Dadbod receives the four named database connections from the workbench's
|
||||||
|
SOPS-derived environment.
|
||||||
- The reviewed `yookr-api/openapi.yaml` remains the usable local contract. The
|
- The reviewed `yookr-api/openapi.yaml` remains the usable local contract. The
|
||||||
deployed generated document's dangling `ReadParameters` reference is accepted
|
deployed generated document's dangling `ReadParameters` reference is accepted
|
||||||
for now and does not block direct API requests.
|
for now and does not block direct API requests.
|
||||||
@@ -149,9 +151,10 @@ the fresh-shell GitHub read and restarted-Codex Context7 lookup must both work.
|
|||||||
- The fine-grained GitHub token and Context7 key stay in mode-0600 machine-local
|
- The fine-grained GitHub token and Context7 key stay in mode-0600 machine-local
|
||||||
files and are exposed only to their callers. Secrets do not enter Nix or broad
|
files and are exposed only to their callers. Secrets do not enter Nix or broad
|
||||||
process environments.
|
process environments.
|
||||||
- The value-free credential audit and proposed central SOPS authority are in
|
- The credential audit and approved central SOPS authority are in
|
||||||
[`credential-consolidation.md`](credential-consolidation.md). Do not migrate
|
[`credential-consolidation.md`](credential-consolidation.md). The authority is
|
||||||
plaintext sources until the user accepts the authority and migration order.
|
active, while original plaintext sources remain pending consumer-specific
|
||||||
|
verification and explicit removal approval.
|
||||||
- `sync/notes` is the single notebook owner. Daily notes, meetings, and raw
|
- `sync/notes` is the single notebook owner. Daily notes, meetings, and raw
|
||||||
transcripts have separate paths, and agents do not create issues or ingest
|
transcripts have separate paths, and agents do not create issues or ingest
|
||||||
transcripts automatically.
|
transcripts automatically.
|
||||||
@@ -172,7 +175,7 @@ the fresh-shell GitHub read and restarted-Codex Context7 lookup must both work.
|
|||||||
|
|
||||||
## Next step
|
## Next step
|
||||||
|
|
||||||
Agree on the proposed central SOPS credential authority, obtain Leafcloud S3
|
Activate the pending Neovim change, authorize the changed workbench `.envrc`,
|
||||||
credentials from the `irristaud` project, and resume issue 197 from a Codex
|
and confirm the four Dadbod names. Resume issue 197 from a Codex session launched
|
||||||
session launched inside Herdr. Then complete database/S3 access checks and the
|
inside Herdr, then complete one real cross-system investigation and the Herdr
|
||||||
real workbench and Herdr pilots without mutating company GitHub.
|
pilot without mutating company GitHub.
|
||||||
@@ -145,9 +145,12 @@ tooling may be changed, and `yookr-workbench` is the explicit source-code
|
|||||||
exception.
|
exception.
|
||||||
|
|
||||||
Credentials and `.env` files normally stay outside Git, the Nix store, and broad
|
Credentials and `.env` files normally stay outside Git, the Nix store, and broad
|
||||||
synchronization. The accepted `yookr-vpn.ovpn` is a narrow exception for Zenith
|
synchronization. Machine-local Yookr credentials use the approved user-key SOPS
|
||||||
and Polaris: keep it user-restricted and import it into NetworkManager without
|
authority at `~/.config/yookr/credentials.yaml`; callers expose only the fields
|
||||||
printing or committing its contents.
|
they need. Original plaintext sources remain until their consumers are verified
|
||||||
|
and removal is explicitly approved. The accepted `yookr-vpn.ovpn` is a narrow
|
||||||
|
exception for Zenith and Polaris: keep it user-restricted and import it into
|
||||||
|
NetworkManager without printing or committing its contents.
|
||||||
|
|
||||||
`yookr-data-science/conf/local/credentials.yml` is a separate application-owned
|
`yookr-data-science/conf/local/credentials.yml` is a separate application-owned
|
||||||
exception: Kedro resolves its named credential dataset through the conventional
|
exception: Kedro resolves its named credential dataset through the conventional
|
||||||
@@ -159,10 +162,10 @@ and build configurations, then provide an activation command.
|
|||||||
|
|
||||||
## Remaining pilots
|
## Remaining pilots
|
||||||
|
|
||||||
- Add workbench database connections and a Marimo report only for a real
|
- Activate and visually confirm the workbench's four SOPS-derived Dadbod
|
||||||
cross-system investigation.
|
connections. Add a Marimo report only for a real cross-system investigation.
|
||||||
- Configure one read-only-use rclone S3 remote per Leafcloud project, beginning
|
- Add another ephemeral read-only rclone remote only when credentials for a new
|
||||||
with listing and downloading from the `irristaud` container; do not upload.
|
Leafcloud project become available. Irristaud listing has passed; do not upload.
|
||||||
- Use the reviewed local Yookr OpenAPI contract while the accepted malformed
|
- Use the reviewed local Yookr OpenAPI contract while the accepted malformed
|
||||||
generated test document remains deployed.
|
generated test document remains deployed.
|
||||||
- Run the complete Herdr notification, fallback-agent, and safe worktree pilot
|
- Run the complete Herdr notification, fallback-agent, and safe worktree pilot
|
||||||
|
|||||||
@@ -87,6 +87,12 @@ require("lz.n").load({
|
|||||||
vim.g.db_ui_execute_on_save = 0
|
vim.g.db_ui_execute_on_save = 0
|
||||||
vim.g.db_ui_disable_mappings = 1
|
vim.g.db_ui_disable_mappings = 1
|
||||||
vim.g.db_ui_show_help = 0
|
vim.g.db_ui_show_help = 0
|
||||||
|
vim.g.dbs = {
|
||||||
|
["MySQL — TEST"] = vim.env.YOOKR_MYSQL_TEST_DATABASE_URL,
|
||||||
|
["MySQL — LIVE"] = vim.env.YOOKR_MYSQL_LIVE_DATABASE_URL,
|
||||||
|
["MongoDB — TEST"] = vim.env.YOOKR_MONGODB_TEST_DATABASE_URL,
|
||||||
|
["MongoDB — LIVE"] = vim.env.YOOKR_MONGODB_LIVE_DATABASE_URL,
|
||||||
|
}
|
||||||
if vim.env.DATABASE_URL and vim.env.DATABASE_URL ~= "" then
|
if vim.env.DATABASE_URL and vim.env.DATABASE_URL ~= "" then
|
||||||
vim.g.db = vim.env.DATABASE_URL
|
vim.g.db = vim.env.DATABASE_URL
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in new issue
Block a user