@sebastienrousseau/dotfiles 0.2.519 → 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 +200 -0
- package/LICENSE-APACHE +190 -0
- package/{LICENSE → LICENSE-MIT} +1 -1
- package/README.md +1172 -166
- package/install.sh +77 -11
- package/package.json +8 -8
- 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/CNAME +0 -1
- package/docs/CONFIG_STRATEGY.md +0 -124
- package/docs/COPYRIGHT +0 -7
- package/docs/GOVERNANCE.md +0 -98
- package/docs/MAINTAINERS.md +0 -41
- 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 -117
- 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/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 -450
- 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 -155
- package/docs/manual/concept-index.md +0 -168
- package/docs/manual/index.md +0 -66
- 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/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 -43
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
- package/docs/operations/VERSION_SYNC.md +0 -393
- 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/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 -242
- 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 -114
- 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 -138
- package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
- package/scripts/diagnostics/aliases-manifest.sh +0 -77
- package/scripts/diagnostics/benchmark.sh +0 -408
- package/scripts/diagnostics/conflicts.sh +0 -73
- package/scripts/diagnostics/doctor-unified.sh +0 -39
- package/scripts/diagnostics/doctor.sh +0 -751
- package/scripts/diagnostics/drift-dashboard.sh +0 -202
- package/scripts/diagnostics/health.sh +0 -623
- 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 -119
- 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 -187
- package/scripts/dot/commands/agent.sh +0 -485
- package/scripts/dot/commands/agents.sh +0 -336
- package/scripts/dot/commands/ai.sh +0 -587
- package/scripts/dot/commands/aliases.sh +0 -277
- package/scripts/dot/commands/appearance.sh +0 -110
- package/scripts/dot/commands/completion.sh +0 -134
- 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 -688
- 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 -333
- package/scripts/dot/commands/patterns.sh +0 -55
- package/scripts/dot/commands/registry.sh +0 -419
- 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 -556
- 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 -185
- 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 -63
- 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 -604
- package/scripts/ops/setup.sh +0 -138
- package/scripts/ops/teleport.sh +0 -34
- package/scripts/qa/check-version-consistency.sh +0 -124
- package/scripts/qa/coverage-baseline.sh +0 -61
- package/scripts/qa/docs-coverage.sh +0 -112
- 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 -117
- package/scripts/qa/validate-examples.sh +0 -27
- 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 -335
- 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 -742
- 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 -544
- package/scripts/theme/switch.sh +0 -449
- 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/version-sync.sh +0 -654
- 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
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
#
|
|
5
|
-
# scripts/security/check-disclosure-key-expiry.sh
|
|
6
|
-
#
|
|
7
|
-
# Reads the disclosure public key from `docs/security/security-pubkey.asc`,
|
|
8
|
-
# parses its expiry, and exits non-zero when the remaining lifetime is
|
|
9
|
-
# below threshold. Closes the R3 audit N2 finding (no automated alert
|
|
10
|
-
# for the 2029-05-15 expiry).
|
|
11
|
-
#
|
|
12
|
-
# Two thresholds:
|
|
13
|
-
# --warn-days N Emit a `::warning::` if expiry is < N days away.
|
|
14
|
-
# Default 90.
|
|
15
|
-
# --fail-days N Exit 1 (CI failure) if expiry is < N days away.
|
|
16
|
-
# Default 30.
|
|
17
|
-
#
|
|
18
|
-
# Usage:
|
|
19
|
-
# bash scripts/security/check-disclosure-key-expiry.sh
|
|
20
|
-
# bash scripts/security/check-disclosure-key-expiry.sh --warn-days 180 --fail-days 60
|
|
21
|
-
#
|
|
22
|
-
# Designed to run from `.github/workflows/verify-gpg-wkd.yml` on the
|
|
23
|
-
# weekly schedule, and from a maintainer's local pre-release sanity
|
|
24
|
-
# check. Does NOT require network — reads the in-repo .asc only.
|
|
25
|
-
|
|
26
|
-
set -euo pipefail
|
|
27
|
-
|
|
28
|
-
WARN_DAYS=90
|
|
29
|
-
FAIL_DAYS=30
|
|
30
|
-
|
|
31
|
-
while [[ $# -gt 0 ]]; do
|
|
32
|
-
case "$1" in
|
|
33
|
-
--warn-days)
|
|
34
|
-
WARN_DAYS="$2"
|
|
35
|
-
shift 2
|
|
36
|
-
;;
|
|
37
|
-
--fail-days)
|
|
38
|
-
FAIL_DAYS="$2"
|
|
39
|
-
shift 2
|
|
40
|
-
;;
|
|
41
|
-
-h | --help)
|
|
42
|
-
sed -n '5,25p' "${BASH_SOURCE[0]}"
|
|
43
|
-
exit 0
|
|
44
|
-
;;
|
|
45
|
-
*)
|
|
46
|
-
echo "Unknown arg: $1" >&2
|
|
47
|
-
exit 2
|
|
48
|
-
;;
|
|
49
|
-
esac
|
|
50
|
-
done
|
|
51
|
-
|
|
52
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
53
|
-
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
54
|
-
ASC="$REPO_ROOT/docs/security/security-pubkey.asc"
|
|
55
|
-
|
|
56
|
-
if [[ ! -f "$ASC" ]]; then
|
|
57
|
-
echo "::error::no public key at $ASC" >&2
|
|
58
|
-
exit 2
|
|
59
|
-
fi
|
|
60
|
-
|
|
61
|
-
if ! command -v gpg >/dev/null 2>&1; then
|
|
62
|
-
echo "::warning::gpg not installed — cannot verify key expiry" >&2
|
|
63
|
-
exit 0
|
|
64
|
-
fi
|
|
65
|
-
|
|
66
|
-
# Import into a throwaway keyring so we don't pollute the user's real one.
|
|
67
|
-
GNUPGHOME="$(mktemp -d -t dot-disclosure-key.XXXXXX)"
|
|
68
|
-
export GNUPGHOME
|
|
69
|
-
chmod 700 "$GNUPGHOME"
|
|
70
|
-
trap 'rm -rf "$GNUPGHOME"' EXIT
|
|
71
|
-
|
|
72
|
-
# gpg can emit harmless warnings ("keyboxd older than us", "gpg-agent
|
|
73
|
-
# IPC failed" in fresh GNUPGHOME, etc.) and exit non-zero under
|
|
74
|
-
# `set -e` even when the import itself succeeded. Verify success by
|
|
75
|
-
# checking the err log for the literal `imported: N` (N >= 1) line
|
|
76
|
-
# rather than trusting gpg's exit code.
|
|
77
|
-
gpg --batch --import "$ASC" >/dev/null 2>"$GNUPGHOME/import.err" || true
|
|
78
|
-
if ! grep -qE '^gpg:[[:space:]]*imported: [1-9]' "$GNUPGHOME/import.err"; then
|
|
79
|
-
echo "::error::gpg import failed for $ASC" >&2
|
|
80
|
-
cat "$GNUPGHOME/import.err" >&2
|
|
81
|
-
exit 2
|
|
82
|
-
fi
|
|
83
|
-
|
|
84
|
-
# `--with-colons` field 7 of the `pub:` line is the expiry in Unix
|
|
85
|
-
# seconds; 0 means no expiry.
|
|
86
|
-
expires=$(gpg --with-colons --fingerprint 2>/dev/null | awk -F: '/^pub:/{print $7; exit}')
|
|
87
|
-
|
|
88
|
-
if [[ -z "$expires" || "$expires" == "0" ]]; then
|
|
89
|
-
echo "::warning::disclosure key has no expiry — set one per docs/security/KEY_ROTATION.md" >&2
|
|
90
|
-
exit 0
|
|
91
|
-
fi
|
|
92
|
-
|
|
93
|
-
now=$(date -u +%s)
|
|
94
|
-
remaining_days=$(((expires - now) / 86400))
|
|
95
|
-
|
|
96
|
-
expires_date=$(date -u -r "$expires" '+%Y-%m-%d' 2>/dev/null || date -u -d "@$expires" '+%Y-%m-%d' 2>/dev/null || echo "(date format unknown)")
|
|
97
|
-
|
|
98
|
-
echo "Disclosure key expires: $expires_date ($remaining_days days from now)"
|
|
99
|
-
echo " warn threshold: $WARN_DAYS days"
|
|
100
|
-
echo " fail threshold: $FAIL_DAYS days"
|
|
101
|
-
|
|
102
|
-
if ((remaining_days < FAIL_DAYS)); then
|
|
103
|
-
echo "::error::Disclosure key expires in $remaining_days days. Rotate now per docs/security/KEY_ROTATION.md." >&2
|
|
104
|
-
exit 1
|
|
105
|
-
fi
|
|
106
|
-
|
|
107
|
-
if ((remaining_days < WARN_DAYS)); then
|
|
108
|
-
echo "::warning::Disclosure key expires in $remaining_days days. Schedule rotation per docs/security/KEY_ROTATION.md." >&2
|
|
109
|
-
fi
|
|
110
|
-
|
|
111
|
-
exit 0
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
set -euo pipefail
|
|
5
|
-
|
|
6
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
-
# shellcheck source=../../lib/dot/ui.sh
|
|
8
|
-
# shellcheck disable=SC1091
|
|
9
|
-
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
10
|
-
# shellcheck source=../../lib/dot/platform.sh
|
|
11
|
-
# shellcheck disable=SC1091
|
|
12
|
-
source "$SCRIPT_DIR/../../lib/dot/platform.sh"
|
|
13
|
-
|
|
14
|
-
DRY_RUN=0
|
|
15
|
-
for arg in "$@"; do
|
|
16
|
-
case "$arg" in --dry-run | -n) DRY_RUN=1 ;; esac
|
|
17
|
-
done
|
|
18
|
-
_run_cmd() {
|
|
19
|
-
if [[ "$DRY_RUN" -eq 1 ]]; then ui_info "[dry-run]" "$*"; else "$@"; fi
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
ui_init
|
|
23
|
-
ui_header "DNS-over-HTTPS"
|
|
24
|
-
|
|
25
|
-
if [[ "$DRY_RUN" -eq 1 ]]; then
|
|
26
|
-
ui_info "Mode" "dry-run (no changes will be made)"
|
|
27
|
-
elif [ "${DOTFILES_DOH:-}" != "1" ]; then
|
|
28
|
-
ui_warn "DoH" "disabled by default"
|
|
29
|
-
ui_info "Re-run" "DOTFILES_DOH=1"
|
|
30
|
-
exit 1
|
|
31
|
-
fi
|
|
32
|
-
|
|
33
|
-
case "$(dot_platform_id)" in
|
|
34
|
-
linux | wsl)
|
|
35
|
-
if command -v resolvectl >/dev/null; then
|
|
36
|
-
ui_info "Enabling" "systemd-resolved DoH (Cloudflare)"
|
|
37
|
-
_run_cmd sudo resolvectl dns-over-https on
|
|
38
|
-
_run_cmd sudo resolvectl dns 1.1.1.1 1.0.0.1
|
|
39
|
-
else
|
|
40
|
-
ui_err "systemd-resolved" "not detected"
|
|
41
|
-
exit 1
|
|
42
|
-
fi
|
|
43
|
-
;;
|
|
44
|
-
macos)
|
|
45
|
-
ui_info "Configure" "DoH in your browser"
|
|
46
|
-
exit 0
|
|
47
|
-
;;
|
|
48
|
-
*)
|
|
49
|
-
ui_err "Unsupported OS" "DoH config"
|
|
50
|
-
exit 1
|
|
51
|
-
;;
|
|
52
|
-
esac
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
set -euo pipefail
|
|
5
|
-
|
|
6
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
-
# shellcheck source=../../lib/dot/ui.sh
|
|
8
|
-
# shellcheck disable=SC1091
|
|
9
|
-
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
10
|
-
# shellcheck source=../../lib/dot/platform.sh
|
|
11
|
-
# shellcheck disable=SC1091
|
|
12
|
-
source "$SCRIPT_DIR/../../lib/dot/platform.sh"
|
|
13
|
-
|
|
14
|
-
ui_init
|
|
15
|
-
ui_header "Encryption Check"
|
|
16
|
-
|
|
17
|
-
case "$(dot_platform_id)" in
|
|
18
|
-
macos)
|
|
19
|
-
if command -v fdesetup >/dev/null; then
|
|
20
|
-
status=$(fdesetup status || true)
|
|
21
|
-
echo "$status"
|
|
22
|
-
echo "$status" | grep -qi "FileVault is On" && {
|
|
23
|
-
ui_ok "FileVault" "On"
|
|
24
|
-
exit 0
|
|
25
|
-
}
|
|
26
|
-
ui_warn "FileVault" "appears to be off"
|
|
27
|
-
exit 1
|
|
28
|
-
else
|
|
29
|
-
ui_err "fdesetup" "not found"
|
|
30
|
-
exit 1
|
|
31
|
-
fi
|
|
32
|
-
;;
|
|
33
|
-
linux | wsl)
|
|
34
|
-
if command -v lsblk >/dev/null; then
|
|
35
|
-
lsblk_output=$(lsblk -f)
|
|
36
|
-
if command -v rg >/dev/null; then
|
|
37
|
-
if echo "$lsblk_output" | rg -i "crypto|luks" >/dev/null; then
|
|
38
|
-
ui_ok "LUKS" "encrypted block device detected"
|
|
39
|
-
exit 0
|
|
40
|
-
fi
|
|
41
|
-
else
|
|
42
|
-
if echo "$lsblk_output" | grep -Ei "crypto|luks" >/dev/null; then
|
|
43
|
-
ui_ok "LUKS" "encrypted block device detected"
|
|
44
|
-
exit 0
|
|
45
|
-
fi
|
|
46
|
-
fi
|
|
47
|
-
ui_warn "LUKS" "no crypto volume detected"
|
|
48
|
-
exit 1
|
|
49
|
-
fi
|
|
50
|
-
;;
|
|
51
|
-
*)
|
|
52
|
-
ui_err "Unsupported OS" "encryption check"
|
|
53
|
-
exit 1
|
|
54
|
-
;;
|
|
55
|
-
esac
|
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
# Security Policy Enforcement Script
|
|
5
|
-
# This script enforces security policies across the dotfiles repository
|
|
6
|
-
|
|
7
|
-
set -euo pipefail
|
|
8
|
-
|
|
9
|
-
# Script configuration
|
|
10
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
|
-
readonly SCRIPT_DIR
|
|
12
|
-
REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
13
|
-
readonly REPO_ROOT
|
|
14
|
-
readonly POLICIES_DIR="${REPO_ROOT}/.github/security-policies"
|
|
15
|
-
readonly LOG_FILE="${REPO_ROOT}/.security-audit.log"
|
|
16
|
-
|
|
17
|
-
# shellcheck source=../../lib/dot/ui.sh
|
|
18
|
-
# shellcheck disable=SC1091
|
|
19
|
-
source "${SCRIPT_DIR}/../../lib/dot/ui.sh"
|
|
20
|
-
ui_init
|
|
21
|
-
|
|
22
|
-
# Logging function (also writes to log file)
|
|
23
|
-
log() {
|
|
24
|
-
local level="$1"
|
|
25
|
-
shift
|
|
26
|
-
local message="$*"
|
|
27
|
-
local timestamp
|
|
28
|
-
timestamp=$(date -u '+%Y-%m-%d %H:%M:%S UTC')
|
|
29
|
-
echo "[${timestamp}] [${level}] ${message}" | tee -a "${LOG_FILE}"
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
# Error handling
|
|
33
|
-
error_exit() {
|
|
34
|
-
log "ERROR" "$1"
|
|
35
|
-
exit 1
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
# Check if required tools are installed
|
|
39
|
-
check_dependencies() {
|
|
40
|
-
log "INFO" "Checking dependencies..."
|
|
41
|
-
|
|
42
|
-
local missing_tools=()
|
|
43
|
-
|
|
44
|
-
# Required tools
|
|
45
|
-
local tools=("opa" "gitleaks" "shellcheck" "grep" "find")
|
|
46
|
-
|
|
47
|
-
for tool in "${tools[@]}"; do
|
|
48
|
-
if ! command -v "$tool" &>/dev/null; then
|
|
49
|
-
missing_tools+=("$tool")
|
|
50
|
-
fi
|
|
51
|
-
done
|
|
52
|
-
|
|
53
|
-
if [[ ${#missing_tools[@]} -gt 0 ]]; then
|
|
54
|
-
error_exit "Missing required tools: ${missing_tools[*]}"
|
|
55
|
-
fi
|
|
56
|
-
|
|
57
|
-
log "INFO" "All dependencies satisfied"
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
# Scan for hardcoded secrets
|
|
61
|
-
scan_secrets() {
|
|
62
|
-
log "INFO" "Scanning for hardcoded secrets..."
|
|
63
|
-
|
|
64
|
-
local violations=0
|
|
65
|
-
|
|
66
|
-
# Run gitleaks
|
|
67
|
-
if gitleaks detect --source="${REPO_ROOT}" --config="${REPO_ROOT}/config/gitleaks.toml" --no-git >/dev/null 2>&1; then
|
|
68
|
-
log "INFO" "✅ No secrets detected by gitleaks"
|
|
69
|
-
else
|
|
70
|
-
log "WARN" "❌ Potential secrets detected by gitleaks"
|
|
71
|
-
violations=$((violations + 1))
|
|
72
|
-
fi
|
|
73
|
-
|
|
74
|
-
# Manual pattern checks
|
|
75
|
-
local secret_patterns=(
|
|
76
|
-
'password\s*=\s*["\047][^"\047]*["\047]'
|
|
77
|
-
'token\s*=\s*["\047][^"\047]*["\047]'
|
|
78
|
-
'secret\s*=\s*["\047][^"\047]*["\047]'
|
|
79
|
-
'key\s*=\s*["\047][^"\047]*["\047]'
|
|
80
|
-
'AKIA[0-9A-Z]{16}' # AWS Access Key
|
|
81
|
-
'[0-9a-f]{32,}' # Potential hash/token
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
for pattern in "${secret_patterns[@]}"; do
|
|
85
|
-
if grep -r -E -i "${pattern}" "${REPO_ROOT}" \
|
|
86
|
-
--exclude-dir=".git" \
|
|
87
|
-
--exclude="*.log" \
|
|
88
|
-
--exclude="enforce-policies.sh" \
|
|
89
|
-
--exclude="environment-template.env" >/dev/null 2>&1; then
|
|
90
|
-
log "WARN" "❌ Potential hardcoded credential pattern found: ${pattern}"
|
|
91
|
-
violations=$((violations + 1))
|
|
92
|
-
fi
|
|
93
|
-
done
|
|
94
|
-
|
|
95
|
-
if [[ $violations -eq 0 ]]; then
|
|
96
|
-
log "INFO" "✅ No hardcoded secrets detected"
|
|
97
|
-
fi
|
|
98
|
-
|
|
99
|
-
return $violations
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
# Check file permissions
|
|
103
|
-
check_file_permissions() {
|
|
104
|
-
log "INFO" "Checking file permissions..."
|
|
105
|
-
|
|
106
|
-
local violations=0
|
|
107
|
-
|
|
108
|
-
# Check for overly permissive files
|
|
109
|
-
while IFS= read -r -d '' file; do
|
|
110
|
-
if [[ -f "$file" ]]; then
|
|
111
|
-
local perms
|
|
112
|
-
perms=$(stat -c %a "$file" 2>/dev/null || stat -f %OLp "$file")
|
|
113
|
-
if [[ $perms -gt 755 ]]; then
|
|
114
|
-
log "WARN" "❌ Overly permissive file: ${file} (${perms})"
|
|
115
|
-
violations=$((violations + 1))
|
|
116
|
-
fi
|
|
117
|
-
fi
|
|
118
|
-
done < <(find "${REPO_ROOT}" -type f -not -path "*/.git/*" -print0)
|
|
119
|
-
|
|
120
|
-
# Check for executable text files
|
|
121
|
-
local text_extensions=("md" "txt" "json" "yaml" "yml" "toml")
|
|
122
|
-
|
|
123
|
-
for ext in "${text_extensions[@]}"; do
|
|
124
|
-
while IFS= read -r -d '' file; do
|
|
125
|
-
if [[ -x "$file" ]]; then
|
|
126
|
-
log "WARN" "❌ Executable text file: ${file}"
|
|
127
|
-
violations=$((violations + 1))
|
|
128
|
-
fi
|
|
129
|
-
done < <(find "${REPO_ROOT}" -name "*.${ext}" -executable -not -path "*/.git/*" -print0)
|
|
130
|
-
done
|
|
131
|
-
|
|
132
|
-
if [[ $violations -eq 0 ]]; then
|
|
133
|
-
log "INFO" "✅ File permissions are appropriate"
|
|
134
|
-
fi
|
|
135
|
-
|
|
136
|
-
return $violations
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
# Validate shell scripts
|
|
140
|
-
validate_shell_scripts() {
|
|
141
|
-
log "INFO" "Validating shell scripts..."
|
|
142
|
-
|
|
143
|
-
local violations=0
|
|
144
|
-
|
|
145
|
-
while IFS= read -r -d '' script; do
|
|
146
|
-
if ! shellcheck "$script" >/dev/null 2>&1; then
|
|
147
|
-
log "WARN" "❌ ShellCheck violations in: ${script}"
|
|
148
|
-
violations=$((violations + 1))
|
|
149
|
-
fi
|
|
150
|
-
done < <(find "${REPO_ROOT}" -name "*.sh" -not -path "*/.git/*" -print0)
|
|
151
|
-
|
|
152
|
-
if [[ $violations -eq 0 ]]; then
|
|
153
|
-
log "INFO" "✅ All shell scripts pass validation"
|
|
154
|
-
fi
|
|
155
|
-
|
|
156
|
-
return $violations
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
# Check environment variable usage
|
|
160
|
-
check_environment_variables() {
|
|
161
|
-
log "INFO" "Checking environment variable usage..."
|
|
162
|
-
|
|
163
|
-
local violations=0
|
|
164
|
-
|
|
165
|
-
# Look for unprotected variable assignments
|
|
166
|
-
while IFS= read -r -d '' file; do
|
|
167
|
-
# Skip binary files and specific files
|
|
168
|
-
if file "$file" | grep -q "text" && [[ ! "$file" =~ \.(log|env)$ ]]; then
|
|
169
|
-
# Check for variables that should use default patterns
|
|
170
|
-
if grep -E '^[A-Z_]+=.+$' "$file" >/dev/null 2>&1; then
|
|
171
|
-
# Check if they use proper defaulting
|
|
172
|
-
if ! grep -E '\$\{[A-Z_]+:-[^}]*\}' "$file" >/dev/null 2>&1; then
|
|
173
|
-
local suspicious_vars
|
|
174
|
-
suspicious_vars=$(grep -E '^[A-Z_]+=.+$' "$file" | head -3)
|
|
175
|
-
if [[ -n "$suspicious_vars" ]]; then
|
|
176
|
-
log "WARN" "❌ Potential hardcoded variables in ${file}: ${suspicious_vars}"
|
|
177
|
-
violations=$((violations + 1))
|
|
178
|
-
fi
|
|
179
|
-
fi
|
|
180
|
-
fi
|
|
181
|
-
fi
|
|
182
|
-
done < <(find "${REPO_ROOT}" -type f -not -path "*/.git/*" -not -path "*/.github/security-policies/*" -print0)
|
|
183
|
-
|
|
184
|
-
if [[ $violations -eq 0 ]]; then
|
|
185
|
-
log "INFO" "✅ Environment variable usage is appropriate"
|
|
186
|
-
fi
|
|
187
|
-
|
|
188
|
-
return $violations
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
# Validate OPA policies
|
|
192
|
-
validate_policies() {
|
|
193
|
-
log "INFO" "Validating OPA policies..."
|
|
194
|
-
|
|
195
|
-
if [[ ! -f "${POLICIES_DIR}/security.rego" ]]; then
|
|
196
|
-
log "WARN" "❌ Security policy file not found"
|
|
197
|
-
return 1
|
|
198
|
-
fi
|
|
199
|
-
|
|
200
|
-
if opa test "${POLICIES_DIR}" >/dev/null 2>&1; then
|
|
201
|
-
log "INFO" "✅ OPA policies are valid"
|
|
202
|
-
return 0
|
|
203
|
-
else
|
|
204
|
-
log "WARN" "❌ OPA policy validation failed"
|
|
205
|
-
return 1
|
|
206
|
-
fi
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
# Check for sensitive files
|
|
210
|
-
check_sensitive_files() {
|
|
211
|
-
log "INFO" "Checking for sensitive files..."
|
|
212
|
-
|
|
213
|
-
local violations=0
|
|
214
|
-
local sensitive_patterns=(
|
|
215
|
-
"*.key"
|
|
216
|
-
"*.pem"
|
|
217
|
-
"*.p12"
|
|
218
|
-
"*.pfx"
|
|
219
|
-
"*.jks"
|
|
220
|
-
"*.keystore"
|
|
221
|
-
".env"
|
|
222
|
-
".env.*"
|
|
223
|
-
"credentials.json"
|
|
224
|
-
"service-account.json"
|
|
225
|
-
"id_rsa"
|
|
226
|
-
"id_dsa"
|
|
227
|
-
"id_ecdsa"
|
|
228
|
-
"id_ed25519"
|
|
229
|
-
)
|
|
230
|
-
|
|
231
|
-
for pattern in "${sensitive_patterns[@]}"; do
|
|
232
|
-
while IFS= read -r -d '' file; do
|
|
233
|
-
# Skip allowed files
|
|
234
|
-
if [[ ! "$file" =~ (environment-template\.env|\.pub$) ]]; then
|
|
235
|
-
log "WARN" "❌ Sensitive file detected: ${file}"
|
|
236
|
-
violations=$((violations + 1))
|
|
237
|
-
fi
|
|
238
|
-
done < <(find "${REPO_ROOT}" -name "${pattern}" -not -path "*/.git/*" -print0)
|
|
239
|
-
done
|
|
240
|
-
|
|
241
|
-
if [[ $violations -eq 0 ]]; then
|
|
242
|
-
log "INFO" "✅ No sensitive files detected"
|
|
243
|
-
fi
|
|
244
|
-
|
|
245
|
-
return $violations
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
# Generate security report
|
|
249
|
-
generate_report() {
|
|
250
|
-
local total_violations="$1"
|
|
251
|
-
local report_file="${REPO_ROOT}/security-report.md"
|
|
252
|
-
|
|
253
|
-
log "INFO" "Generating security report..."
|
|
254
|
-
|
|
255
|
-
cat >"${report_file}" <<EOF
|
|
256
|
-
# Security Policy Enforcement Report
|
|
257
|
-
|
|
258
|
-
**Generated:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')
|
|
259
|
-
**Repository:** $(basename "${REPO_ROOT}")
|
|
260
|
-
**Total Violations:** ${total_violations}
|
|
261
|
-
|
|
262
|
-
## Security Checks Performed
|
|
263
|
-
|
|
264
|
-
- ✅ Secrets scanning (gitleaks + manual patterns)
|
|
265
|
-
- ✅ File permissions validation
|
|
266
|
-
- ✅ Shell script analysis (shellcheck)
|
|
267
|
-
- ✅ Environment variable usage check
|
|
268
|
-
- ✅ OPA policy validation
|
|
269
|
-
- ✅ Sensitive files detection
|
|
270
|
-
|
|
271
|
-
## Security Score
|
|
272
|
-
|
|
273
|
-
$(if [[ $total_violations -eq 0 ]]; then echo "🟢 **PASSED** - No security violations detected"; else echo "🔴 **FAILED** - ${total_violations} violations detected"; fi)
|
|
274
|
-
|
|
275
|
-
## Recommendations
|
|
276
|
-
|
|
277
|
-
1. Review any flagged violations in the audit log
|
|
278
|
-
2. Update hardcoded values to use environment variables
|
|
279
|
-
3. Ensure proper file permissions (644 for files, 755 for executables)
|
|
280
|
-
4. Use the provided environment template for configuration
|
|
281
|
-
5. Run this script regularly as part of your development workflow
|
|
282
|
-
|
|
283
|
-
## Next Steps
|
|
284
|
-
|
|
285
|
-
- Fix any identified violations
|
|
286
|
-
- Run \`scripts/security/enforce-policies.sh\` again to verify fixes
|
|
287
|
-
- Consider setting up automated policy enforcement in CI/CD
|
|
288
|
-
|
|
289
|
-
---
|
|
290
|
-
*This report was generated by the automated security policy enforcement system.*
|
|
291
|
-
EOF
|
|
292
|
-
|
|
293
|
-
log "INFO" "Security report generated: ${report_file}"
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
# Main execution
|
|
297
|
-
main() {
|
|
298
|
-
log "INFO" "Starting security policy enforcement..."
|
|
299
|
-
|
|
300
|
-
# Initialize log file
|
|
301
|
-
echo "# Security Audit Log - $(date -u '+%Y-%m-%d %H:%M:%S UTC')" >"${LOG_FILE}"
|
|
302
|
-
|
|
303
|
-
check_dependencies
|
|
304
|
-
|
|
305
|
-
local total_violations=0
|
|
306
|
-
|
|
307
|
-
# Run all checks
|
|
308
|
-
scan_secrets || total_violations=$((total_violations + $?))
|
|
309
|
-
check_file_permissions || total_violations=$((total_violations + $?))
|
|
310
|
-
validate_shell_scripts || total_violations=$((total_violations + $?))
|
|
311
|
-
check_environment_variables || total_violations=$((total_violations + $?))
|
|
312
|
-
validate_policies || total_violations=$((total_violations + 1))
|
|
313
|
-
check_sensitive_files || total_violations=$((total_violations + $?))
|
|
314
|
-
|
|
315
|
-
# Generate report
|
|
316
|
-
generate_report "$total_violations"
|
|
317
|
-
|
|
318
|
-
# Final result
|
|
319
|
-
if [[ $total_violations -eq 0 ]]; then
|
|
320
|
-
ui_ok "All security checks passed"
|
|
321
|
-
log "INFO" "Security policy enforcement completed successfully"
|
|
322
|
-
exit 0
|
|
323
|
-
else
|
|
324
|
-
ui_err "$total_violations violations" "Security policy enforcement failed"
|
|
325
|
-
ui_warn "Details" "Check ${LOG_FILE}"
|
|
326
|
-
ui_warn "Report" "Review security-report.md"
|
|
327
|
-
log "ERROR" "Security policy enforcement failed with ${total_violations} violations"
|
|
328
|
-
exit 1
|
|
329
|
-
fi
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
# Script entry point
|
|
333
|
-
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
334
|
-
main "$@"
|
|
335
|
-
fi
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
## Configure system firewall with secure defaults.
|
|
5
|
-
##
|
|
6
|
-
## Enables firewall with deny-by-default policy and minimal exceptions.
|
|
7
|
-
## Requires explicit opt-in via DOTFILES_FIREWALL=1 to prevent accidental
|
|
8
|
-
## lockouts.
|
|
9
|
-
##
|
|
10
|
-
## # Usage
|
|
11
|
-
## DOTFILES_FIREWALL=1 dot firewall
|
|
12
|
-
##
|
|
13
|
-
## # Dependencies
|
|
14
|
-
## - macOS: socketfilterfw (built-in)
|
|
15
|
-
## - Linux: ufw (Uncomplicated Firewall)
|
|
16
|
-
##
|
|
17
|
-
## # Platform Notes
|
|
18
|
-
## ### Platform: macOS
|
|
19
|
-
## - Enables Application Firewall via socketfilterfw
|
|
20
|
-
## - Enables stealth mode (no ICMP responses)
|
|
21
|
-
## - Allows signed applications
|
|
22
|
-
##
|
|
23
|
-
## ### Platform: Linux
|
|
24
|
-
## - Configures UFW with deny incoming / allow outgoing
|
|
25
|
-
## - Allows OpenSSH to prevent lockout
|
|
26
|
-
## - Requires ufw package installed
|
|
27
|
-
##
|
|
28
|
-
## # Security
|
|
29
|
-
## **Requires sudo.** All changes logged to dotfiles.log.
|
|
30
|
-
##
|
|
31
|
-
## # Side Effects
|
|
32
|
-
## - Modifies system firewall rules
|
|
33
|
-
## - May block existing connections
|
|
34
|
-
##
|
|
35
|
-
## # Idempotency
|
|
36
|
-
## Safe to run repeatedly. Applies same rules each time.
|
|
37
|
-
|
|
38
|
-
set -euo pipefail
|
|
39
|
-
|
|
40
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
41
|
-
# shellcheck source=../../lib/dot/ui.sh
|
|
42
|
-
# shellcheck disable=SC1091
|
|
43
|
-
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
44
|
-
# shellcheck source=../../lib/dot/platform.sh
|
|
45
|
-
# shellcheck disable=SC1091
|
|
46
|
-
source "$SCRIPT_DIR/../../lib/dot/platform.sh"
|
|
47
|
-
|
|
48
|
-
DRY_RUN=0
|
|
49
|
-
for arg in "$@"; do
|
|
50
|
-
case "$arg" in --dry-run | -n) DRY_RUN=1 ;; esac
|
|
51
|
-
done
|
|
52
|
-
_run_cmd() {
|
|
53
|
-
if [[ "$DRY_RUN" -eq 1 ]]; then ui_info "[dry-run]" "$*"; else "$@"; fi
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
ui_init
|
|
57
|
-
ui_header "Firewall"
|
|
58
|
-
|
|
59
|
-
if [[ "$DRY_RUN" -eq 1 ]]; then
|
|
60
|
-
ui_info "Mode" "dry-run (no changes will be made)"
|
|
61
|
-
elif [ "${DOTFILES_FIREWALL:-}" != "1" ]; then
|
|
62
|
-
ui_warn "Firewall" "disabled by default"
|
|
63
|
-
ui_info "Re-run" "DOTFILES_FIREWALL=1"
|
|
64
|
-
exit 1
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
|
-
case "$(dot_platform_id)" in
|
|
68
|
-
macos)
|
|
69
|
-
ui_info "Enabling" "macOS firewall"
|
|
70
|
-
_run_cmd sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
|
|
71
|
-
_run_cmd sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsigned on
|
|
72
|
-
_run_cmd sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsignedapp on
|
|
73
|
-
_run_cmd sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on
|
|
74
|
-
;;
|
|
75
|
-
linux | wsl)
|
|
76
|
-
if command -v ufw >/dev/null; then
|
|
77
|
-
ui_info "Enabling" "UFW"
|
|
78
|
-
_run_cmd sudo ufw default deny incoming
|
|
79
|
-
_run_cmd sudo ufw default allow outgoing
|
|
80
|
-
_run_cmd sudo ufw allow OpenSSH
|
|
81
|
-
_run_cmd sudo ufw --force enable
|
|
82
|
-
else
|
|
83
|
-
ui_err "ufw" "not installed; re-run after install"
|
|
84
|
-
exit 1
|
|
85
|
-
fi
|
|
86
|
-
;;
|
|
87
|
-
*)
|
|
88
|
-
ui_err "Unsupported OS" "firewall setup"
|
|
89
|
-
exit 1
|
|
90
|
-
;;
|
|
91
|
-
esac
|