@sebastienrousseau/dotfiles 0.2.520 → 0.2.521
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/LICENSE-APACHE +190 -0
- package/LICENSE-MIT +21 -0
- package/README.md +43 -37
- package/install.sh +76 -10
- package/package.json +7 -7
- package/tools/README.md +49 -0
- package/tools/ci/install-chezmoi-verified.sh +68 -0
- package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
- package/docs/AI.md +0 -179
- package/docs/ARCHITECTURE.md +0 -117
- package/docs/CNAME +0 -1
- package/docs/CONFIG_STRATEGY.md +0 -124
- package/docs/COPYRIGHT +0 -7
- package/docs/ECOSYSTEM.md +0 -220
- package/docs/GOLD-STANDARD-AUDIT.md +0 -352
- package/docs/GOVERNANCE.md +0 -98
- package/docs/MAINTAINERS.md +0 -41
- package/docs/MINIMUM-TOOLCHAIN.md +0 -100
- package/docs/NAMING_CONVENTIONS.md +0 -102
- package/docs/OPENCODE.md +0 -127
- package/docs/README.md +0 -84
- package/docs/STRUCTURE.md +0 -102
- package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
- package/docs/adr/ADR-002-shell-performance.md +0 -130
- package/docs/adr/ADR-003-security-first.md +0 -158
- package/docs/adr/ADR-004-cli-architecture.md +0 -171
- package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
- package/docs/adr/ADR-006-shell-selection.md +0 -124
- package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
- package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
- package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
- package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
- package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
- package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
- package/docs/adr/README.md +0 -40
- package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
- package/docs/architecture/ARCHITECTURE.md +0 -20
- package/docs/architecture/INTEROP.md +0 -44
- package/docs/architecture/REPO_LAYOUT.md +0 -241
- package/docs/architecture/WALKTHROUGH.md +0 -86
- package/docs/architecture/fleet-deployment.md +0 -77
- package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
- package/docs/archive/LEGACY_ROADMAP.md +0 -6
- package/docs/archive/MILESTONE_v0.2.493.md +0 -47
- package/docs/archive/PLAN.md +0 -199
- package/docs/archive/REPO_AUDIT.md +0 -31
- package/docs/articles/.pages +0 -6
- package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
- package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
- package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
- package/docs/articles/index.md +0 -36
- package/docs/guides/INSTALL.md +0 -144
- package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +0 -121
- package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
- package/docs/guides/THEMING.md +0 -230
- package/docs/guides/TROUBLESHOOTING.md +0 -176
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
- package/docs/index.md +0 -132
- package/docs/interop/A2A.md +0 -39
- package/docs/interop/POWERSHELL.md +0 -102
- package/docs/manual/00-introduction.md +0 -89
- package/docs/manual/01-concepts/01-architecture.md +0 -138
- package/docs/manual/01-concepts/02-trust-model.md +0 -183
- package/docs/manual/01-concepts/03-theme-engine.md +0 -186
- package/docs/manual/01-concepts/04-fleet.md +0 -148
- package/docs/manual/01-concepts/05-self-healing.md +0 -204
- package/docs/manual/02-tutorials/01-first-install.md +0 -197
- package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
- package/docs/manual/02-tutorials/03-create-profile.md +0 -244
- package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
- package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
- package/docs/manual/03-reference/01-dot-cli.md +0 -475
- package/docs/manual/03-reference/02-config-files.md +0 -265
- package/docs/manual/03-reference/03-environment.md +0 -124
- package/docs/manual/03-reference/04-templates.md +0 -190
- package/docs/manual/03-reference/05-feature-flags.md +0 -187
- package/docs/manual/04-cookbook/01-recipes.md +0 -285
- package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
- package/docs/manual/04-cookbook/03-faq.md +0 -175
- package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
- package/docs/manual/05-appendices/B-security-checklist.md +0 -85
- package/docs/manual/05-appendices/C-glossary.md +0 -40
- package/docs/manual/05-appendices/D-bibliography.md +0 -58
- package/docs/manual/05-appendices/E-license.md +0 -38
- package/docs/manual/_toc.yml +0 -58
- package/docs/manual/command-index.md +0 -175
- package/docs/manual/concept-index.md +0 -170
- package/docs/manual/index.md +0 -66
- package/docs/migration/README.md +0 -81
- package/docs/migration/from-bare-git-repo.md +0 -156
- package/docs/migration/from-gnu-stow.md +0 -165
- package/docs/migration/from-plain-chezmoi.md +0 -148
- package/docs/migration/from-yadm.md +0 -187
- package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
- package/docs/operations/ATTESTATION.md +0 -44
- package/docs/operations/CI_CADENCE.md +0 -107
- package/docs/operations/CI_COMPOSITES.md +0 -156
- package/docs/operations/COMPLETIONS.md +0 -123
- package/docs/operations/COVERAGE.md +0 -204
- package/docs/operations/DRIFT.md +0 -107
- package/docs/operations/HARD_AUDIT_2026.md +0 -631
- package/docs/operations/MAINTENANCE.md +0 -63
- package/docs/operations/MANIFEST.md +0 -127
- package/docs/operations/MIGRATION.md +0 -109
- package/docs/operations/OPERATIONS.md +0 -188
- package/docs/operations/PERFORMANCE.md +0 -133
- package/docs/operations/PERFORMANCE_BUDGETS.md +0 -196
- package/docs/operations/REGISTRY.md +0 -90
- package/docs/operations/RELEASE_PIPELINE.md +0 -128
- package/docs/operations/RELIABILITY.md +0 -122
- package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
- package/docs/operations/ROADMAP.md +0 -10
- package/docs/operations/ROADMAP_2026.md +0 -7
- package/docs/operations/ROADMAP_V0_2_503.md +0 -10
- package/docs/operations/TESTING.md +0 -216
- package/docs/operations/TRACEABILITY.md +0 -44
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
- package/docs/operations/VERSION_SYNC.md +0 -393
- package/docs/packaging.md +0 -222
- package/docs/reference/ALIASES.md +0 -131
- package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
- package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
- package/docs/reference/FEATURE-MATRIX.md +0 -646
- package/docs/reference/FEATURES.md +0 -66
- package/docs/reference/FONTS.md +0 -112
- package/docs/reference/POWERSHELL_PARITY.md +0 -82
- package/docs/reference/PROFILES.md +0 -69
- package/docs/reference/SCREENSHOTS.md +0 -121
- package/docs/reference/SCRIPTS.md +0 -71
- package/docs/reference/SUPPORT_MATRIX.md +0 -80
- package/docs/reference/THEMES.md +0 -117
- package/docs/reference/TOOLS.md +0 -110
- package/docs/reference/UTILS.md +0 -243
- package/docs/registry.json +0 -6
- package/docs/schema/dot-env-v1.json +0 -110
- package/docs/schema/dot-registry-v1.json +0 -33
- package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
- package/docs/security/AUDIT_BYPASS.md +0 -103
- package/docs/security/AUTOMATION_SECRETS.md +0 -26
- package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
- package/docs/security/CI_PINNING.md +0 -129
- package/docs/security/COMMIT_SIGNING.md +0 -138
- package/docs/security/COMPLIANCE.md +0 -458
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
- package/docs/security/DISCLOSURE.md +0 -130
- package/docs/security/ENCRYPTION.md +0 -57
- package/docs/security/FMEA.md +0 -159
- package/docs/security/FUZZING.md +0 -209
- package/docs/security/HISTORY_FILTERING.md +0 -132
- package/docs/security/INCIDENT_RESPONSE.md +0 -579
- package/docs/security/INSTALL_VERIFICATION.md +0 -122
- package/docs/security/KEYS.md +0 -49
- package/docs/security/KEY_ROTATION.md +0 -303
- package/docs/security/MCP_POLICY.md +0 -78
- package/docs/security/POLICY_RELEASES.md +0 -37
- package/docs/security/README.md +0 -28
- package/docs/security/SCORECARD.md +0 -195
- package/docs/security/SECRETS.md +0 -158
- package/docs/security/SECURITY.md +0 -45
- package/docs/security/SECURITY_CHECKLIST.md +0 -55
- package/docs/security/SHELL_EXEMPTIONS.md +0 -145
- package/docs/security/SOUP_REGISTER.md +0 -36
- package/docs/security/THREAT_MODEL.md +0 -130
- package/docs/security/VERIFICATION_VALIDATION.md +0 -228
- package/docs/security/VERIFY_RELEASE.md +0 -201
- package/docs/security/security-pubkey.asc +0 -15
- package/docs/stylesheets/extra.css +0 -444
- package/docs/themes/README.md +0 -10
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
- package/docs/themes/hero-shot.svg +0 -78
- package/scripts/README.md +0 -123
- package/scripts/ci/check-copyright-headers.sh +0 -8
- package/scripts/ci/check-shell-preamble.sh +0 -8
- package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
- package/scripts/demo/record.sh +0 -43
- package/scripts/diagnostics/a2a-conformance.sh +0 -163
- package/scripts/diagnostics/alias-governance.sh +0 -165
- package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
- package/scripts/diagnostics/aliases-manifest.sh +0 -77
- package/scripts/diagnostics/attest-verify.sh +0 -147
- package/scripts/diagnostics/benchmark.sh +0 -408
- package/scripts/diagnostics/conflicts.sh +0 -73
- package/scripts/diagnostics/doctor-unified.sh +0 -43
- package/scripts/diagnostics/doctor.sh +0 -797
- package/scripts/diagnostics/drift-dashboard.sh +0 -203
- package/scripts/diagnostics/health.sh +0 -656
- package/scripts/diagnostics/history-analysis.sh +0 -86
- package/scripts/diagnostics/mcp-doctor.sh +0 -582
- package/scripts/diagnostics/perf.sh +0 -453
- package/scripts/diagnostics/scorecard.sh +0 -120
- package/scripts/diagnostics/secret-governance.sh +0 -65
- package/scripts/diagnostics/security-score.sh +0 -467
- package/scripts/diagnostics/smoke-test.sh +0 -88
- package/scripts/diagnostics/snapshot.sh +0 -90
- package/scripts/diagnostics/verify.sh +0 -108
- package/scripts/diagnostics/verify_state.sh +0 -73
- package/scripts/diagnostics/version-locks.sh +0 -94
- package/scripts/diagnostics/workstation-attestation.sh +0 -212
- package/scripts/dot/commands/agent.sh +0 -535
- package/scripts/dot/commands/agents.sh +0 -352
- package/scripts/dot/commands/ai.sh +0 -600
- package/scripts/dot/commands/aliases.sh +0 -277
- package/scripts/dot/commands/appearance.sh +0 -110
- package/scripts/dot/commands/completion.sh +0 -171
- package/scripts/dot/commands/core.sh +0 -217
- package/scripts/dot/commands/diagnostics.sh +0 -265
- package/scripts/dot/commands/env-emit.sh +0 -203
- package/scripts/dot/commands/fleet.sh +0 -711
- package/scripts/dot/commands/init.sh +0 -185
- package/scripts/dot/commands/lint.sh +0 -208
- package/scripts/dot/commands/manual.sh +0 -169
- package/scripts/dot/commands/meta.sh +0 -438
- package/scripts/dot/commands/patterns.sh +0 -55
- package/scripts/dot/commands/registry.sh +0 -455
- package/scripts/dot/commands/restore.sh +0 -232
- package/scripts/dot/commands/secrets.sh +0 -296
- package/scripts/dot/commands/security.sh +0 -102
- package/scripts/dot/commands/tools.sh +0 -570
- package/scripts/dot/data/alias-deprecations.tsv +0 -2
- package/scripts/dot/powershell/Dot.psm1 +0 -319
- package/scripts/fonts/install-nerd-fonts.sh +0 -75
- package/scripts/fonts/patch-fonts.sh +0 -36
- package/scripts/git-hooks/install.sh +0 -12
- package/scripts/git-hooks/pre-commit +0 -12
- package/scripts/git-hooks/pre-commit-audit.sh +0 -146
- package/scripts/git-hooks/pre-push +0 -105
- package/scripts/git-hooks/prepare-commit-msg +0 -29
- package/scripts/lib/secrets_provider.sh +0 -200
- package/scripts/nvim/headless-upgrade.lua +0 -81
- package/scripts/ops/ai-setup.sh +0 -71
- package/scripts/ops/bundle.sh +0 -104
- package/scripts/ops/chaos.sh +0 -50
- package/scripts/ops/chezmoi-apply.sh +0 -333
- package/scripts/ops/chezmoi-diff.sh +0 -16
- package/scripts/ops/chezmoi-remove.sh +0 -46
- package/scripts/ops/chezmoi-update.sh +0 -67
- package/scripts/ops/heal-chezmoi.sh +0 -87
- package/scripts/ops/heal-system.sh +0 -129
- package/scripts/ops/heal-tools.sh +0 -297
- package/scripts/ops/heal.sh +0 -223
- package/scripts/ops/post-apply-repair.sh +0 -107
- package/scripts/ops/prewarm.sh +0 -128
- package/scripts/ops/release.sh +0 -262
- package/scripts/ops/rollback.sh +0 -613
- package/scripts/ops/setup.sh +0 -138
- package/scripts/ops/teleport.sh +0 -34
- package/scripts/qa/check-feature-matrix.sh +0 -296
- package/scripts/qa/check-version-consistency.sh +0 -12
- package/scripts/qa/coverage-baseline.sh +0 -61
- package/scripts/qa/docs-coverage.sh +0 -118
- package/scripts/qa/examples-coverage.sh +0 -94
- package/scripts/qa/powershell-contract.ps1 +0 -95
- package/scripts/qa/reliability-audit.sh +0 -139
- package/scripts/qa/scorecard-snapshot.sh +0 -128
- package/scripts/qa/traceability-coverage.sh +0 -124
- package/scripts/qa/validate-examples.sh +0 -90
- package/scripts/qa/wsl-contract.sh +0 -12
- package/scripts/secrets/age-init.sh +0 -82
- package/scripts/secrets/create-secrets-file.sh +0 -46
- package/scripts/secrets/encrypt-ssh-key.sh +0 -44
- package/scripts/security/backup.sh +0 -58
- package/scripts/security/check-disclosure-key-expiry.sh +0 -111
- package/scripts/security/dns-doh.sh +0 -52
- package/scripts/security/encryption-check.sh +0 -55
- package/scripts/security/enforce-policies.sh +0 -552
- package/scripts/security/firewall.sh +0 -91
- package/scripts/security/lock-configs.sh +0 -67
- package/scripts/security/lock-screen.sh +0 -56
- package/scripts/security/manage-secrets.sh +0 -429
- package/scripts/security/ssh-cert.sh +0 -204
- package/scripts/security/telemetry-kill.sh +0 -51
- package/scripts/security/usb-safety.sh +0 -52
- package/scripts/theme/apply-gnome-theme.sh +0 -333
- package/scripts/theme/extract-heic-frames.sh +0 -115
- package/scripts/theme/extract-theme.py +0 -1020
- package/scripts/theme/install-boot-logo.sh +0 -63
- package/scripts/theme/install-catppuccin-themes.sh +0 -371
- package/scripts/theme/install-cursors.sh +0 -26
- package/scripts/theme/install-file-icons.sh +0 -27
- package/scripts/theme/install-grub-theme.sh +0 -62
- package/scripts/theme/install-lock-icon.sh +0 -31
- package/scripts/theme/merge-wallpaper.sh +0 -146
- package/scripts/theme/rebuild-themes.sh +0 -603
- package/scripts/theme/switch.sh +0 -476
- package/scripts/theme/wallpaper-rotate.sh +0 -137
- package/scripts/theme/wallpaper-sync.sh +0 -690
- package/scripts/tools/cmatrix.sh +0 -22
- package/scripts/tools/detect-collisions.py +0 -103
- package/scripts/tools/emoji-picker.sh +0 -49
- package/scripts/tools/figlet-banner.sh +0 -19
- package/scripts/tools/log-rotate.sh +0 -31
- package/scripts/tools/lolcat-wrap.sh +0 -20
- package/scripts/tools/pipes.sh +0 -49
- package/scripts/tuning/linux.sh +0 -186
- package/scripts/tuning/macos.sh +0 -56
- package/scripts/uninstall.sh +0 -86
- package/scripts/verify-release-versions +0 -156
- package/scripts/version-sync.sh +0 -714
- package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
- package/templates/chezmoi-data/mac-m1.toml.example +0 -16
- package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
- package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
- package/templates/projects/go/.github/workflows/ci.yml +0 -31
- package/templates/projects/go/README.md +0 -7
- package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
- package/templates/projects/go/go.mod +0 -3
- package/templates/projects/go/go.sum +0 -0
- package/templates/projects/molecule/README.md +0 -7
- package/templates/projects/molecule/converge.yml +0 -7
- package/templates/projects/molecule/molecule.yml +0 -16
- package/templates/projects/node/.github/workflows/ci.yml +0 -30
- package/templates/projects/node/README.md +0 -7
- package/templates/projects/node/package-lock.json +0 -12
- package/templates/projects/node/package.json +0 -10
- package/templates/projects/node/src/index.js +0 -3
- package/templates/projects/packer/README.md +0 -15
- package/templates/projects/packer/main.pkr.hcl +0 -15
- package/templates/projects/python/.github/workflows/ci.yml +0 -34
- package/templates/projects/python/README.md +0 -7
- package/templates/projects/python/pyproject.toml +0 -25
- package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
- package/templates/projects/python/tests/test_basic.py +0 -3
package/docs/security/SECRETS.md
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
{% raw %}
|
|
5
|
-
|
|
6
|
-
# Secrets Management
|
|
7
|
-
|
|
8
|
-
Provider-agnostic secrets via `dot secrets`. Supports macOS Keychain, `pass`, and age-encrypted local storage.
|
|
9
|
-
|
|
10
|
-
## Providers
|
|
11
|
-
|
|
12
|
-
Provider selection is controlled by `.chezmoidata.toml`:
|
|
13
|
-
|
|
14
|
-
```toml
|
|
15
|
-
[secrets.policy]
|
|
16
|
-
provider = "auto" # auto | macos-keychain | pass | plain-enc
|
|
17
|
-
auto_load = true
|
|
18
|
-
|
|
19
|
-
[secrets.buckets]
|
|
20
|
-
ai = ["GEMINI_API_KEY", "CLAUDE_API_KEY", "OPENAI_API_KEY"]
|
|
21
|
-
infra = ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "GITHUB_TOKEN"]
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
`auto` resolves in this order:
|
|
25
|
-
|
|
26
|
-
1. `macos-keychain` on macOS
|
|
27
|
-
2. `pass` when available
|
|
28
|
-
3. `plain-enc` fallback (age-encrypted local store)
|
|
29
|
-
|
|
30
|
-
## Commands
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
# Bootstrap age key for chezmoi encrypted files
|
|
34
|
-
dot secrets-init
|
|
35
|
-
|
|
36
|
-
# Optional: create encrypted secrets file for chezmoi
|
|
37
|
-
dot secrets-create
|
|
38
|
-
dot secrets edit
|
|
39
|
-
|
|
40
|
-
# Managed secret store
|
|
41
|
-
dot secrets set GEMINI_API_KEY
|
|
42
|
-
dot secrets get GEMINI_API_KEY --raw
|
|
43
|
-
dot secrets list
|
|
44
|
-
dot secrets provider
|
|
45
|
-
|
|
46
|
-
# Emit export lines for a bucket
|
|
47
|
-
dot secrets load ai
|
|
48
|
-
|
|
49
|
-
# Load into current shell session
|
|
50
|
-
eval "$(dot env load ai)"
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Shell Auto-Load
|
|
54
|
-
|
|
55
|
-
When `auto_load = true`, shell startup can load configured buckets automatically via `dot env load <bucket>`.
|
|
56
|
-
|
|
57
|
-
Environment toggles:
|
|
58
|
-
|
|
59
|
-
- `DOTFILES_SECRETS_PROVIDER`
|
|
60
|
-
- `DOTFILES_SECRETS_AUTO_LOAD`
|
|
61
|
-
- `DOTFILES_SECRETS_BUCKET_NAMES`
|
|
62
|
-
|
|
63
|
-
## Governance
|
|
64
|
-
|
|
65
|
-
A pre-commit hook runs:
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
scripts/diagnostics/secret-governance.sh
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
It blocks staged commits when likely secret patterns are found. In strict mode it also blocks exact matches against managed secret values.
|
|
72
|
-
|
|
73
|
-
## SSH Key Encryption
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
dot ssh-key ~/.ssh/id_ed25519
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
This creates a local encrypted file, which you can add to chezmoi with `chezmoi add --encrypt` if needed.
|
|
80
|
-
|
|
81
|
-
## External Secrets Backends
|
|
82
|
-
|
|
83
|
-
Chezmoi natively supports external secret managers as template functions. Configure the backend in `.chezmoidata.toml`:
|
|
84
|
-
|
|
85
|
-
```toml
|
|
86
|
-
secrets_backend = "age" # age, 1password, bitwarden, pass, vault
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 1Password
|
|
90
|
-
|
|
91
|
-
Requires the [1Password CLI](https://developer.1password.com/docs/cli/) (`op`).
|
|
92
|
-
|
|
93
|
-
```toml
|
|
94
|
-
# .chezmoidata.toml
|
|
95
|
-
secrets_backend = "1password"
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
Use in templates:
|
|
99
|
-
|
|
100
|
-
```text
|
|
101
|
-
{{ onepassword "my-secret" "vault-name" }}
|
|
102
|
-
{{ onepasswordRead "op://vault/item/field" }}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### Bitwarden
|
|
106
|
-
|
|
107
|
-
Requires the [Bitwarden CLI](https://bitwarden.com/help/cli/) (`bw`).
|
|
108
|
-
|
|
109
|
-
```toml
|
|
110
|
-
# .chezmoidata.toml
|
|
111
|
-
secrets_backend = "bitwarden"
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Use in templates:
|
|
115
|
-
|
|
116
|
-
```text
|
|
117
|
-
{{ bitwarden "item" "my-login" }}
|
|
118
|
-
{{ bitwardenFields "item" "my-login" }}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### HashiCorp Vault
|
|
122
|
-
|
|
123
|
-
Requires the [Vault CLI](https://developer.hashicorp.com/vault/docs/commands) (`vault`).
|
|
124
|
-
|
|
125
|
-
```toml
|
|
126
|
-
# .chezmoidata.toml
|
|
127
|
-
secrets_backend = "vault"
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
Use in templates:
|
|
131
|
-
|
|
132
|
-
```text
|
|
133
|
-
{{ vault "secret/data/my-secret" }}
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### pass (Password Store)
|
|
137
|
-
|
|
138
|
-
Requires [pass](https://www.passwordstore.org/).
|
|
139
|
-
|
|
140
|
-
```toml
|
|
141
|
-
# .chezmoidata.toml
|
|
142
|
-
secrets_backend = "pass"
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
Use in templates:
|
|
146
|
-
|
|
147
|
-
```text
|
|
148
|
-
{{ pass "my-secret" }}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
See the [chezmoi documentation](https://www.chezmoi.io/user-guide/password-managers/) for full details on each backend.
|
|
152
|
-
|
|
153
|
-
## Security Notes
|
|
154
|
-
|
|
155
|
-
- **Never commit** `~/.config/chezmoi/key.txt` to version control.
|
|
156
|
-
- **Avoid shell history exposure** — use `dot secrets set` which prompts securely.
|
|
157
|
-
- **Rotate credentials** on a regular schedule.
|
|
158
|
-
{% endraw %}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Security
|
|
6
|
-
|
|
7
|
-
How dotfiles handles security and system modifications.
|
|
8
|
-
|
|
9
|
-
## Core Principles
|
|
10
|
-
|
|
11
|
-
- **Opt-In Only** — No hardening applies unless `DOTFILES_*` variables are set to `1`.
|
|
12
|
-
- **Local Logging** — All actions log to `~/.local/share/dotfiles.log`. No telemetry.
|
|
13
|
-
- **No Hidden Sudo** — Sudo requests only for package managers. Never cached indefinitely.
|
|
14
|
-
|
|
15
|
-
## Hardening
|
|
16
|
-
|
|
17
|
-
| Feature | Env Var | Action (macOS) | Action (Linux) |
|
|
18
|
-
|---|---|---|---|
|
|
19
|
-
| Firewall | `DOTFILES_FIREWALL` | Enables `socketfilterfw` + Stealth Mode | Configures UFW |
|
|
20
|
-
| Telemetry | `DOTFILES_TELEMETRY` | Disables Diagnostic plists | Disables `whoopsie`/`apport` |
|
|
21
|
-
| DNS-over-HTTPS | `DOTFILES_DOH` | Browser-level settings | Configures `resolvectl` |
|
|
22
|
-
| Idle Security | `DOTFILES_LOCK` | Sets screensaver idle time | Sets GNOME/KDE idle-delay |
|
|
23
|
-
|
|
24
|
-
## Secrets
|
|
25
|
-
|
|
26
|
-
The dotfiles use **age** for encryption.
|
|
27
|
-
|
|
28
|
-
- **Initialization**: `dot secrets-init` creates a key at `~/.config/chezmoi/key.txt`.
|
|
29
|
-
- **Storage**: Secrets are stored as `.age` encrypted files.
|
|
30
|
-
- **Protection**: Private keys aren't committed to the repo.
|
|
31
|
-
|
|
32
|
-
## SSH Certificates
|
|
33
|
-
|
|
34
|
-
Short-lived SSH certificates reduce the blast radius of key compromise.
|
|
35
|
-
|
|
36
|
-
- **Issue**: `dot ssh-cert issue [--ttl 16h] [--principal user]`
|
|
37
|
-
- **Status**: `dot ssh-cert status` — checks certificate validity and expiry
|
|
38
|
-
- **Revoke**: `dot ssh-cert revoke` — revokes active certificates
|
|
39
|
-
- **Backends**: `step-ca` (Smallstep) and local CA key (`ssh-keygen`)
|
|
40
|
-
- **Default TTL**: 16 hours (override via `SSH_CERT_TTL` environment variable)
|
|
41
|
-
- **CA URL**: Set `SSH_CERT_CA_URL` for `step-ca` integration
|
|
42
|
-
|
|
43
|
-
## Reporting a Vulnerability
|
|
44
|
-
|
|
45
|
-
If you discover a security vulnerability, don't open a public issue. Follow the instructions in the Security Policy.
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Security Release Checklist
|
|
6
|
-
|
|
7
|
-
Use this checklist before cutting any new release (e.g., `v0.x.x`) to ensure supply-chain integrity.
|
|
8
|
-
|
|
9
|
-
## 1. Supply Chain & Installer
|
|
10
|
-
|
|
11
|
-
- [ ] **Pinned Version**: Update `install.sh` `VERSION` variable to match the release tag.
|
|
12
|
-
- [ ] **Docs Sync**: Ensure `README.md` and `.github/PULL_REQUEST_TEMPLATE.md` installer URLs point to the new tag (not `main`).
|
|
13
|
-
- [ ] **Clean Build**: Verify `install.sh` does not curl random scripts from third parties without pinning.
|
|
14
|
-
- [ ] **SOUP Register**: Review [SOUP_REGISTER.md](SOUP_REGISTER.md) and confirm all active external components have an owner and validation path.
|
|
15
|
-
|
|
16
|
-
## 2. Secrets & Leak Prevention
|
|
17
|
-
|
|
18
|
-
- [ ] **SSH Keys**: Scan `dot_ssh/` to ensure no private keys (`id_rsa`, `id_ed25519`) are committed.
|
|
19
|
-
- [ ] **Env Vars**: Check for hardcoded API tokens in `dot_config/` (use `age` encryption or environment variables instead).
|
|
20
|
-
- [ ] **Git History**: Run `git secrets` or similar to scan for accidental commits of credentials.
|
|
21
|
-
|
|
22
|
-
## 3. Platform Safety
|
|
23
|
-
|
|
24
|
-
- [ ] **WSL Check**: Verify `install.sh` detects WSL and does not try to install systemd services or macOS defaults.
|
|
25
|
-
- [ ] **Root usage**: Ensure no script requires `sudo` unnecessarily (Principle of Least Privilege).
|
|
26
|
-
|
|
27
|
-
## 4. Toolchain
|
|
28
|
-
|
|
29
|
-
- [ ] **Binary Integrity**: Check that `dot_local/bin/` scripts are pure shell/executable and match expected checksums (no binary blobs).
|
|
30
|
-
- [ ] **Dependency Scan**: Run `npm audit` / `cargo audit` if applicable (currently Node.js legacy is removed).
|
|
31
|
-
|
|
32
|
-
## 5. MCP (Model Context Protocol) Hardening
|
|
33
|
-
|
|
34
|
-
- [ ] **Launcher Policy**: Verify `dot mcp` shows only allowlisted launchers (`npx`, `node`, `uvx`).
|
|
35
|
-
- [ ] **Filesystem Scope**: Ensure no MCP server has broad access (`/`, `/home`, `/Users`).
|
|
36
|
-
- [ ] **Default Profile**: Confirm only the `strict-local` server set is enabled by default.
|
|
37
|
-
- [ ] **Token Validation**: Confirm required API tokens are set (`GITHUB_TOKEN`, `BRAVE_API_KEY`).
|
|
38
|
-
- [ ] **Arg Policy**: No wildcard (`*`) or `--unsafe` arguments in MCP server configs.
|
|
39
|
-
- [ ] **Env Placeholders**: All `${VAR}` references in MCP config have corresponding environment variables.
|
|
40
|
-
|
|
41
|
-
Run `dot mcp --strict --json` to validate all MCP server configurations and capture an audit artifact.
|
|
42
|
-
|
|
43
|
-
## 6. Release Attestation
|
|
44
|
-
|
|
45
|
-
- [ ] **SBOM Generation**: Verify `dotfiles-sbom.spdx.json` is generated in release workflow.
|
|
46
|
-
- [ ] **Attestation Signing**: Confirm `actions/attest-build-provenance` signs the release artifacts.
|
|
47
|
-
- [ ] **Attestation Verification**: Verify with `gh attestation verify <artifact> --repo sebastienrousseau/dotfiles`.
|
|
48
|
-
- [ ] **Branch Protection**: Ensure `security-attestation` is a required status check on main.
|
|
49
|
-
- [ ] **Automation Keying**: Confirm `ACTIONS_BOT_SIGNING_KEY` exists and matches the signer in `dot_config/git/allowed_signers`.
|
|
50
|
-
|
|
51
|
-
## 7. Final Verification
|
|
52
|
-
|
|
53
|
-
- [ ] **Docker Test**: Run `docker build -f Dockerfile.test .` to verify clean install.
|
|
54
|
-
- [ ] **Doctor**: Run `dot doctor` locally.
|
|
55
|
-
- [ ] **MCP Check**: Run `dot mcp` to verify MCP configuration.
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Shell Preamble Exemptions
|
|
6
|
-
|
|
7
|
-
Every bash script in this repo must include `set -euo pipefail` (or
|
|
8
|
-
`set -eu` for POSIX `sh`) within its first 50 lines. The rule is
|
|
9
|
-
enforced by
|
|
10
|
-
[`tools/ci/check-shell-preamble.sh`](https://github.com/sebastienrousseau/dotfiles/blob/main/tools/ci/check-shell-preamble.sh),
|
|
11
|
-
wired into `pre-commit` and the `reusable-shell-lint.yml` CI job.
|
|
12
|
-
Tests pin the contract under
|
|
13
|
-
[`tests/unit/security/test_shell_preamble_lint.sh`](https://github.com/sebastienrousseau/dotfiles/blob/main/tests/unit/security/test_shell_preamble_lint.sh).
|
|
14
|
-
|
|
15
|
-
## Why the preamble is mandatory
|
|
16
|
-
|
|
17
|
-
`set -e` fails the script on the first error. `set -u` rejects
|
|
18
|
-
reads of unset variables. `set -o pipefail` propagates the exit
|
|
19
|
-
code of the last failing command in a pipeline rather than only the
|
|
20
|
-
final command's. Together they convert silent failures into loud
|
|
21
|
-
ones — which is the only way to catch them.
|
|
22
|
-
|
|
23
|
-
Real example from this repo's history: `executable_dot-load-benchmark`
|
|
24
|
-
shipped with only `set -e`. A failing pipeline (e.g. `cmd | grep`)
|
|
25
|
-
where `grep` succeeded would still report success even when `cmd`
|
|
26
|
-
crashed. The full triple catches this. The benchmark was upgraded
|
|
27
|
-
in commit 970b631d under #854.
|
|
28
|
-
|
|
29
|
-
## Exemption categories
|
|
30
|
-
|
|
31
|
-
Two kinds of files legitimately can't enforce the preamble locally:
|
|
32
|
-
|
|
33
|
-
### 1. Sourced libraries
|
|
34
|
-
|
|
35
|
-
Files loaded via `source` / `.` into a caller's shell context. The
|
|
36
|
-
caller already has `set -euo pipefail`; the library inherits it.
|
|
37
|
-
Adding `set -e` locally would persist after the library returns and
|
|
38
|
-
break the caller's own error-handling logic.
|
|
39
|
-
|
|
40
|
-
These files must carry a comment header in their first 15 lines:
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
# Sourced by <parent>.sh; inherits set -euo pipefail.
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
The lint accepts files with this marker regardless of preamble
|
|
47
|
-
state. Current adopters:
|
|
48
|
-
|
|
49
|
-
| Path | Sourced by |
|
|
50
|
-
|---|---|
|
|
51
|
-
| `dot_config/shell/00-core-paths.sh.tmpl` | shell init (zsh/bash/fish) |
|
|
52
|
-
| `dot_config/shell/05-core-safety.sh` | shell init |
|
|
53
|
-
| `dot_config/shell/10-secrets.sh` | shell init |
|
|
54
|
-
| `dot_config/shell/40-fzf-defaults.sh.tmpl` | shell init |
|
|
55
|
-
| `dot_config/shell/40-ls-colors.sh` | shell init |
|
|
56
|
-
| `dot_config/shell/50-logic-functions-core.sh.tmpl` | shell init + fish bridge |
|
|
57
|
-
| `dot_config/shell/50-logic-functions.sh.tmpl` | shell init + fish bridge |
|
|
58
|
-
| `dot_config/shell/51-logic-functions-extra.sh.tmpl` | shell init (lazy) |
|
|
59
|
-
| `dot_config/shell/90-ux-aliases.sh.tmpl` | shell init + fish bridge |
|
|
60
|
-
| `dot_config/shell/91-ux-aliases-lazy.sh.tmpl` | shell init (lazy) |
|
|
61
|
-
| `scripts/dot/lib/bento.sh` | dot CLI commands |
|
|
62
|
-
| `scripts/dot/lib/log.sh` | dot CLI + diagnostics |
|
|
63
|
-
| `scripts/dot/lib/platform.sh` | dot CLI commands |
|
|
64
|
-
| `scripts/dot/lib/ui.sh` | dot CLI + diagnostics + ops |
|
|
65
|
-
| `scripts/dot/lib/utils.sh` | dot CLI |
|
|
66
|
-
| `scripts/ops/heal-chezmoi.sh` | `scripts/ops/heal.sh` |
|
|
67
|
-
| `scripts/ops/heal-system.sh` | `scripts/ops/heal.sh` |
|
|
68
|
-
| `scripts/ops/heal-tools.sh` | `scripts/ops/heal.sh` |
|
|
69
|
-
|
|
70
|
-
### 2. Bulk-sourced fragments (path-skipped)
|
|
71
|
-
|
|
72
|
-
Three directories contain hundreds of alias / function / PATH
|
|
73
|
-
snippets that are sourced into the shell. Annotating each one
|
|
74
|
-
individually would be 300+ marker comments with no extra signal.
|
|
75
|
-
The lint skips them by path:
|
|
76
|
-
|
|
77
|
-
| Path | Contents |
|
|
78
|
-
|---|---|
|
|
79
|
-
| `.chezmoitemplates/aliases/**/*.aliases.sh` | alias definitions sourced into the user's shell. |
|
|
80
|
-
| `.chezmoitemplates/functions/**` | shell-function definitions sourced into the user's shell. |
|
|
81
|
-
| `.chezmoitemplates/paths/**` | `PATH=…:$PATH` snippets concatenated by the shell init. |
|
|
82
|
-
|
|
83
|
-
### 3. Test scripts (path-skipped)
|
|
84
|
-
|
|
85
|
-
`tests/**` — every file under the test tree is invoked through
|
|
86
|
-
`tests/framework/test_runner.sh` which manages shell options for its
|
|
87
|
-
children. The runner itself has the full preamble; children that
|
|
88
|
-
source the framework inherit it.
|
|
89
|
-
|
|
90
|
-
### 4. Explicit opt-outs
|
|
91
|
-
|
|
92
|
-
Init fragments and completion scripts that must NOT carry their own
|
|
93
|
-
preamble (e.g., `dot_local/bin/executable_dot_completion`, a zsh
|
|
94
|
-
completion sourced into the interactive shell) can carry an
|
|
95
|
-
explicit marker:
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
# preamble:skip — opt-out for completion / init fragments.
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
The lint accepts these. Use sparingly.
|
|
102
|
-
|
|
103
|
-
## Adding a new exemption
|
|
104
|
-
|
|
105
|
-
When you need to mark a new file:
|
|
106
|
-
|
|
107
|
-
1. **Decide whether it's actually sourced or executed.** If a user
|
|
108
|
-
ever invokes it directly (chmod +x + `./file.sh`), add the
|
|
109
|
-
preamble. If it's only ever `source`d, mark it.
|
|
110
|
-
|
|
111
|
-
2. **Pick the right marker.**
|
|
112
|
-
- Sourced library: `# Sourced by <caller>; inherits set -euo pipefail.`
|
|
113
|
-
- Completion / init fragment: `# preamble:skip — <why>.`
|
|
114
|
-
|
|
115
|
-
3. **Run the checker:**
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
./tools/ci/check-shell-preamble.sh path/to/file.sh
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
Exit 0 = lint passes.
|
|
122
|
-
|
|
123
|
-
4. **If you're adding a new entire directory of fragments**
|
|
124
|
-
(rare — alias buckets, plugin trees), edit the path-skip rule
|
|
125
|
-
in `tools/ci/check-shell-preamble.sh` and document it in this
|
|
126
|
-
page's "Bulk-sourced fragments" table above.
|
|
127
|
-
|
|
128
|
-
## CI integration
|
|
129
|
-
|
|
130
|
-
- **Pre-commit hook** (`config/pre-commit-config.yaml` →
|
|
131
|
-
`shell-preamble-check`): blocks `git commit` if a staged shell
|
|
132
|
-
file fails the lint.
|
|
133
|
-
- **CI** (`.github/workflows/reusable-shell-lint.yml`): runs the
|
|
134
|
-
full-repo scan on every PR.
|
|
135
|
-
|
|
136
|
-
A change to either the checker or the marker convention must update
|
|
137
|
-
this page in the same PR.
|
|
138
|
-
|
|
139
|
-
## References
|
|
140
|
-
|
|
141
|
-
- `tools/ci/check-shell-preamble.sh` — the lint.
|
|
142
|
-
- `tests/unit/security/test_shell_preamble_lint.sh` — contract test.
|
|
143
|
-
- `config/pre-commit-config.yaml` (`shell-preamble-check` hook).
|
|
144
|
-
- `.github/workflows/reusable-shell-lint.yml` — CI invocation.
|
|
145
|
-
- Issue [#854](https://github.com/sebastienrousseau/dotfiles/issues/854).
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# SOUP Register
|
|
6
|
-
|
|
7
|
-
## Purpose
|
|
8
|
-
|
|
9
|
-
Controlled inventory for software of unknown pedigree used by the dotfiles platform.
|
|
10
|
-
|
|
11
|
-
## Active components
|
|
12
|
-
|
|
13
|
-
| Component | Source | Version control | Verification path | Owner | Status |
|
|
14
|
-
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
15
|
-
| Homebrew installer | `raw.githubusercontent.com/Homebrew/install` | Moving upstream script, gated by `HOMEBREW_INSTALLER_SHA256` | SHA-256 in [package_managers.sh](https://github.com/sebastienrousseau/dotfiles/blob/main/install/lib/package_managers.sh) | Repo maintainer | Conditional |
|
|
16
|
-
| Chezmoi installer | `get.chezmoi.io` | Pinned by `CHEZMOI_INSTALLER_SHA256` when used | SHA-256 in `install/lib/chezmoi.sh` | Repo maintainer | Controlled |
|
|
17
|
-
| GitHub Actions marketplace actions | GitHub Marketplace | Full commit SHA pinning | Workflow `uses:` pins | Repo maintainer | Controlled |
|
|
18
|
-
| Grype container | `anchore/grype` | Pinned tag in workflow | Container tag in [security-enhanced.yml](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/workflows/security-enhanced.yml) | Repo maintainer | Controlled |
|
|
19
|
-
| Trivy container | `aquasec/trivy` | Pinned tag in workflow | Container tag in [security-enhanced.yml](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/workflows/security-enhanced.yml) | Repo maintainer | Controlled |
|
|
20
|
-
| Checkov action | GitHub Marketplace | Full commit SHA pinning | Workflow `uses:` pin | Repo maintainer | Controlled |
|
|
21
|
-
| Nix inputs | GitHub flakes | Locked in [flake.lock](https://github.com/sebastienrousseau/dotfiles/blob/main/flake.lock) | `narHash` and revision lock | Repo maintainer | Controlled |
|
|
22
|
-
| GitHub release metadata queries | GitHub API | Discovery only, not release validation | `update-deps.yml` query path | Repo maintainer | Monitored |
|
|
23
|
-
|
|
24
|
-
## Validation record
|
|
25
|
-
|
|
26
|
-
1. Record version or commit SHA.
|
|
27
|
-
2. Record checksum, signature, or attestation method.
|
|
28
|
-
3. Record workflow or script that consumes the component.
|
|
29
|
-
4. Record owner and review date.
|
|
30
|
-
5. Reject moving inputs in production or release paths unless checksum-gated.
|
|
31
|
-
|
|
32
|
-
## Exit criteria
|
|
33
|
-
|
|
34
|
-
- No unsigned automation commits.
|
|
35
|
-
- No unverified executable download in installer or release path.
|
|
36
|
-
- Every SOUP item has owner, version control method, and validation record.
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Threat Model
|
|
6
|
-
|
|
7
|
-
Security analysis of the dotfiles distribution. Covers trust boundaries, threat actors, attack surfaces, and mitigations.
|
|
8
|
-
|
|
9
|
-
## Trust Boundary
|
|
10
|
-
|
|
11
|
-
The primary trust boundary is the **local machine**. Dotfiles are deployed to and executed on the user's own system. All configuration files, scripts, and templates run with the user's privileges.
|
|
12
|
-
|
|
13
|
-
```text
|
|
14
|
-
┌─────────────────────────────────────────────────┐
|
|
15
|
-
│ Local Machine (trusted zone) │
|
|
16
|
-
│ ┌─────────────────┐ ┌──────────────────────┐ │
|
|
17
|
-
│ │ ~/.dotfiles/ │ │ ~/.config/ (deployed)│ │
|
|
18
|
-
│ │ (source repo) │──│ Shell configs, nvim │ │
|
|
19
|
-
│ └─────────────────┘ └──────────────────────┘ │
|
|
20
|
-
│ │
|
|
21
|
-
│ ┌─────────────────┐ ┌──────────────────────┐ │
|
|
22
|
-
│ │ ~/.local/bin/ │ │ ~/.cache/shell/ │ │
|
|
23
|
-
│ │ (user scripts) │ │ (cached eval output) │ │
|
|
24
|
-
│ └─────────────────┘ └──────────────────────┘ │
|
|
25
|
-
└─────────────────────────────────────────────────┘
|
|
26
|
-
│
|
|
27
|
-
─────┼──────── Trust boundary ────────
|
|
28
|
-
│
|
|
29
|
-
┌─────────────────────────────────────────────────┐
|
|
30
|
-
│ External (untrusted zone) │
|
|
31
|
-
│ GitHub (repo hosting), Homebrew, Nix, │
|
|
32
|
-
│ Zinit plugins, Neovim plugins, npm, pip │
|
|
33
|
-
└─────────────────────────────────────────────────┘
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Threat Actors
|
|
37
|
-
|
|
38
|
-
| Actor | Motivation | Capability |
|
|
39
|
-
|-------|-----------|------------|
|
|
40
|
-
| Supply chain attacker | Inject malicious code via dependency | Compromise upstream packages (Homebrew, npm, Zinit plugins) |
|
|
41
|
-
| Secrets harvester | Steal API keys, SSH keys, tokens | Scrape git history, shell history, env vars |
|
|
42
|
-
| Privilege escalation | Gain root access | Exploit `sudo` aliases, writable scripts in PATH |
|
|
43
|
-
| Network attacker | Intercept credentials | MITM on install scripts, curl-pipe-bash |
|
|
44
|
-
|
|
45
|
-
## Attack Surfaces
|
|
46
|
-
|
|
47
|
-
### 1. Shell Startup Scripts
|
|
48
|
-
|
|
49
|
-
**Risk:** Malicious code in sourced files executes with user privileges on every shell start.
|
|
50
|
-
|
|
51
|
-
**Mitigations:**
|
|
52
|
-
|
|
53
|
-
- All shell scripts pass `shellcheck --severity=error`
|
|
54
|
-
- `set -euo pipefail` enforced in all operational scripts
|
|
55
|
-
- `eval` usage hardened with process substitution (`. /dev/stdin`)
|
|
56
|
-
- Input validation on dynamic function generation
|
|
57
|
-
- `DOTFILES_ULTRA_FAST=1` bypasses all non-core sourcing
|
|
58
|
-
|
|
59
|
-
### 2. Secrets Exposure
|
|
60
|
-
|
|
61
|
-
**Risk:** API keys, tokens, and SSH keys leaked via git history, shell history, or environment.
|
|
62
|
-
|
|
63
|
-
**Mitigations:**
|
|
64
|
-
|
|
65
|
-
- [Gitleaks](https://github.com/gitleaks/gitleaks) pre-commit hook blocks secrets in commits
|
|
66
|
-
- Atuin `history_filter` excludes sensitive patterns
|
|
67
|
-
- Age encryption for local secret storage
|
|
68
|
-
- `dot secrets set` uses secure prompts (no shell history)
|
|
69
|
-
- `.gitignore` excludes `key.txt`, `.env`, credential files
|
|
70
|
-
|
|
71
|
-
### 3. Supply Chain Dependencies
|
|
72
|
-
|
|
73
|
-
**Risk:** Compromised upstream packages injected into the toolchain.
|
|
74
|
-
|
|
75
|
-
**Mitigations:**
|
|
76
|
-
|
|
77
|
-
- Nix Flakes provide reproducible, pinned dependencies
|
|
78
|
-
- Zinit plugin versions pinned (`ver"0.8.0"`)
|
|
79
|
-
- Neovim plugin versions locked via `lazy-lock.json`
|
|
80
|
-
- `install.sh` uses HTTPS for all downloads
|
|
81
|
-
- Homebrew formula integrity via bottle checksums
|
|
82
|
-
|
|
83
|
-
### 4. Path Manipulation
|
|
84
|
-
|
|
85
|
-
**Risk:** Attacker places malicious binary in a PATH directory that shadows legitimate tools.
|
|
86
|
-
|
|
87
|
-
**Mitigations:**
|
|
88
|
-
|
|
89
|
-
- PATH construction is deterministic (template-generated)
|
|
90
|
-
- `~/.local/bin` is user-controlled and checked for writability
|
|
91
|
-
- No world-writable directories in PATH
|
|
92
|
-
- `prependpath` function validates directory existence
|
|
93
|
-
|
|
94
|
-
### 5. Template Injection
|
|
95
|
-
|
|
96
|
-
**Risk:** Chezmoi template variables could inject shell code if not properly quoted.
|
|
97
|
-
|
|
98
|
-
**Mitigations:**
|
|
99
|
-
|
|
100
|
-
- Template variables come from `.chezmoidata.toml` (user-controlled)
|
|
101
|
-
- No external/network data used in templates
|
|
102
|
-
- Template validation via `chezmoi apply --dry-run` in CI
|
|
103
|
-
|
|
104
|
-
### 6. Cached Eval Files
|
|
105
|
-
|
|
106
|
-
**Risk:** Stale or tampered cache files in `~/.cache/shell/` sourced at startup.
|
|
107
|
-
|
|
108
|
-
**Mitigations:**
|
|
109
|
-
|
|
110
|
-
- `_cached_eval` validates cache against binary mtime
|
|
111
|
-
- Cache files are user-owned (0644)
|
|
112
|
-
- Cache directory is under `$XDG_CACHE_HOME` (user-controlled)
|
|
113
|
-
- Cache can be cleared with `rm -rf ~/.cache/shell/`
|
|
114
|
-
|
|
115
|
-
## Residual Risks
|
|
116
|
-
|
|
117
|
-
| Risk | Likelihood | Impact | Status |
|
|
118
|
-
|------|-----------|--------|--------|
|
|
119
|
-
| Zinit plugin compromise | Low | High | Mitigated by version pinning |
|
|
120
|
-
| Shell history leak | Medium | Medium | Mitigated by Atuin filter |
|
|
121
|
-
| Stale Nix closure | Low | Low | Accepted (manual `nix flake update`) |
|
|
122
|
-
| macOS Keychain access | Low | Medium | Accepted (OS-level protection) |
|
|
123
|
-
|
|
124
|
-
## Recommendations
|
|
125
|
-
|
|
126
|
-
1. Run `gitleaks detect` before every push (pre-commit hook enforced)
|
|
127
|
-
2. Rotate secrets on a 90-day schedule
|
|
128
|
-
3. Audit `lazy-lock.json` diffs when updating Neovim plugins
|
|
129
|
-
4. Pin Homebrew versions for security-critical tools
|
|
130
|
-
5. Use `DOTFILES_ULTRA_FAST=1` in CI to minimize attack surface
|