@wazir-dev/cli 1.0.0
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/AGENTS.md +111 -0
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +101 -0
- package/LICENSE +21 -0
- package/README.md +314 -0
- package/assets/composition-engine.mmd +34 -0
- package/assets/demo-script.sh +17 -0
- package/assets/logo-dark.svg +14 -0
- package/assets/logo.svg +14 -0
- package/assets/pipeline.mmd +39 -0
- package/assets/record-demo.sh +51 -0
- package/docs/README.md +51 -0
- package/docs/adapters/context-mode.md +60 -0
- package/docs/concepts/architecture.md +87 -0
- package/docs/concepts/artifact-model.md +60 -0
- package/docs/concepts/composition-engine.md +36 -0
- package/docs/concepts/indexing-and-recall.md +160 -0
- package/docs/concepts/observability.md +41 -0
- package/docs/concepts/roles-and-workflows.md +59 -0
- package/docs/concepts/terminology-policy.md +27 -0
- package/docs/getting-started/01-installation.md +78 -0
- package/docs/getting-started/02-first-run.md +102 -0
- package/docs/getting-started/03-adding-to-project.md +15 -0
- package/docs/getting-started/04-host-setup.md +15 -0
- package/docs/guides/ci-integration.md +15 -0
- package/docs/guides/creating-skills.md +15 -0
- package/docs/guides/expertise-module-authoring.md +15 -0
- package/docs/guides/hook-development.md +15 -0
- package/docs/guides/memory-and-learnings.md +34 -0
- package/docs/guides/multi-host-export.md +15 -0
- package/docs/guides/troubleshooting.md +101 -0
- package/docs/guides/writing-custom-roles.md +15 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
- package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
- package/docs/readmes/INDEX.md +99 -0
- package/docs/readmes/features/expertise/README.md +171 -0
- package/docs/readmes/features/exports/README.md +222 -0
- package/docs/readmes/features/hooks/README.md +103 -0
- package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
- package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
- package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
- package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
- package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
- package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
- package/docs/readmes/features/hooks/session-start.md +119 -0
- package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
- package/docs/readmes/features/roles/README.md +157 -0
- package/docs/readmes/features/roles/clarifier.md +152 -0
- package/docs/readmes/features/roles/content-author.md +190 -0
- package/docs/readmes/features/roles/designer.md +193 -0
- package/docs/readmes/features/roles/executor.md +184 -0
- package/docs/readmes/features/roles/learner.md +210 -0
- package/docs/readmes/features/roles/planner.md +182 -0
- package/docs/readmes/features/roles/researcher.md +164 -0
- package/docs/readmes/features/roles/reviewer.md +184 -0
- package/docs/readmes/features/roles/specifier.md +162 -0
- package/docs/readmes/features/roles/verifier.md +215 -0
- package/docs/readmes/features/schemas/README.md +178 -0
- package/docs/readmes/features/skills/README.md +63 -0
- package/docs/readmes/features/skills/brainstorming.md +96 -0
- package/docs/readmes/features/skills/debugging.md +148 -0
- package/docs/readmes/features/skills/design.md +120 -0
- package/docs/readmes/features/skills/prepare-next.md +109 -0
- package/docs/readmes/features/skills/run-audit.md +159 -0
- package/docs/readmes/features/skills/scan-project.md +109 -0
- package/docs/readmes/features/skills/self-audit.md +176 -0
- package/docs/readmes/features/skills/tdd.md +137 -0
- package/docs/readmes/features/skills/using-skills.md +92 -0
- package/docs/readmes/features/skills/verification.md +120 -0
- package/docs/readmes/features/skills/writing-plans.md +104 -0
- package/docs/readmes/features/tooling/README.md +320 -0
- package/docs/readmes/features/workflows/README.md +186 -0
- package/docs/readmes/features/workflows/author.md +181 -0
- package/docs/readmes/features/workflows/clarify.md +154 -0
- package/docs/readmes/features/workflows/design-review.md +171 -0
- package/docs/readmes/features/workflows/design.md +169 -0
- package/docs/readmes/features/workflows/discover.md +162 -0
- package/docs/readmes/features/workflows/execute.md +173 -0
- package/docs/readmes/features/workflows/learn.md +167 -0
- package/docs/readmes/features/workflows/plan-review.md +165 -0
- package/docs/readmes/features/workflows/plan.md +170 -0
- package/docs/readmes/features/workflows/prepare-next.md +167 -0
- package/docs/readmes/features/workflows/review.md +169 -0
- package/docs/readmes/features/workflows/run-audit.md +191 -0
- package/docs/readmes/features/workflows/spec-challenge.md +159 -0
- package/docs/readmes/features/workflows/specify.md +160 -0
- package/docs/readmes/features/workflows/verify.md +177 -0
- package/docs/readmes/packages/README.md +50 -0
- package/docs/readmes/packages/ajv.md +117 -0
- package/docs/readmes/packages/context-mode.md +118 -0
- package/docs/readmes/packages/gray-matter.md +116 -0
- package/docs/readmes/packages/node-test.md +137 -0
- package/docs/readmes/packages/yaml.md +112 -0
- package/docs/reference/configuration-reference.md +159 -0
- package/docs/reference/expertise-index.md +52 -0
- package/docs/reference/git-flow.md +43 -0
- package/docs/reference/hooks.md +87 -0
- package/docs/reference/host-exports.md +50 -0
- package/docs/reference/launch-checklist.md +172 -0
- package/docs/reference/marketplace-listings.md +76 -0
- package/docs/reference/release-process.md +34 -0
- package/docs/reference/roles-reference.md +77 -0
- package/docs/reference/skills.md +33 -0
- package/docs/reference/templates.md +29 -0
- package/docs/reference/tooling-cli.md +94 -0
- package/docs/truth-claims.yaml +222 -0
- package/expertise/PROGRESS.md +63 -0
- package/expertise/README.md +18 -0
- package/expertise/antipatterns/PROGRESS.md +56 -0
- package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
- package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
- package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
- package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
- package/expertise/antipatterns/backend/index.md +24 -0
- package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
- package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
- package/expertise/antipatterns/code/async-antipatterns.md +622 -0
- package/expertise/antipatterns/code/code-smells.md +1186 -0
- package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
- package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
- package/expertise/antipatterns/code/index.md +27 -0
- package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
- package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
- package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
- package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
- package/expertise/antipatterns/design/dark-patterns.md +1121 -0
- package/expertise/antipatterns/design/index.md +22 -0
- package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
- package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
- package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
- package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
- package/expertise/antipatterns/frontend/index.md +23 -0
- package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
- package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
- package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
- package/expertise/antipatterns/index.md +31 -0
- package/expertise/antipatterns/performance/index.md +20 -0
- package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
- package/expertise/antipatterns/performance/premature-optimization.md +623 -0
- package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
- package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
- package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
- package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
- package/expertise/antipatterns/process/index.md +23 -0
- package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
- package/expertise/antipatterns/security/index.md +20 -0
- package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
- package/expertise/antipatterns/security/security-theater.md +843 -0
- package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
- package/expertise/architecture/PROGRESS.md +70 -0
- package/expertise/architecture/data/caching-architecture.md +671 -0
- package/expertise/architecture/data/data-consistency.md +574 -0
- package/expertise/architecture/data/data-modeling.md +536 -0
- package/expertise/architecture/data/event-streams-and-queues.md +634 -0
- package/expertise/architecture/data/index.md +25 -0
- package/expertise/architecture/data/search-architecture.md +663 -0
- package/expertise/architecture/data/sql-vs-nosql.md +708 -0
- package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
- package/expertise/architecture/decisions/build-vs-buy.md +616 -0
- package/expertise/architecture/decisions/index.md +23 -0
- package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
- package/expertise/architecture/decisions/technology-selection.md +616 -0
- package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
- package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
- package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
- package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
- package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
- package/expertise/architecture/distributed/index.md +25 -0
- package/expertise/architecture/distributed/saga-pattern.md +797 -0
- package/expertise/architecture/foundations/architectural-thinking.md +460 -0
- package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
- package/expertise/architecture/foundations/design-principles-solid.md +649 -0
- package/expertise/architecture/foundations/domain-driven-design.md +719 -0
- package/expertise/architecture/foundations/index.md +25 -0
- package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
- package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
- package/expertise/architecture/index.md +34 -0
- package/expertise/architecture/integration/api-design-graphql.md +638 -0
- package/expertise/architecture/integration/api-design-grpc.md +804 -0
- package/expertise/architecture/integration/api-design-rest.md +892 -0
- package/expertise/architecture/integration/index.md +25 -0
- package/expertise/architecture/integration/third-party-integration.md +795 -0
- package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
- package/expertise/architecture/integration/websockets-realtime.md +791 -0
- package/expertise/architecture/mobile-architecture/index.md +22 -0
- package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
- package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
- package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
- package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
- package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
- package/expertise/architecture/patterns/event-driven.md +797 -0
- package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
- package/expertise/architecture/patterns/index.md +27 -0
- package/expertise/architecture/patterns/layered-architecture.md +736 -0
- package/expertise/architecture/patterns/microservices.md +753 -0
- package/expertise/architecture/patterns/modular-monolith.md +692 -0
- package/expertise/architecture/patterns/monolith.md +626 -0
- package/expertise/architecture/patterns/plugin-architecture.md +735 -0
- package/expertise/architecture/patterns/serverless.md +780 -0
- package/expertise/architecture/scaling/database-scaling.md +615 -0
- package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
- package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
- package/expertise/architecture/scaling/index.md +24 -0
- package/expertise/architecture/scaling/multi-tenancy.md +800 -0
- package/expertise/architecture/scaling/stateless-design.md +787 -0
- package/expertise/backend/embedded-firmware.md +625 -0
- package/expertise/backend/go.md +853 -0
- package/expertise/backend/index.md +24 -0
- package/expertise/backend/java-spring.md +448 -0
- package/expertise/backend/node-typescript.md +625 -0
- package/expertise/backend/python-fastapi.md +724 -0
- package/expertise/backend/rust.md +458 -0
- package/expertise/backend/solidity.md +711 -0
- package/expertise/composition-map.yaml +443 -0
- package/expertise/content/foundations/content-modeling.md +395 -0
- package/expertise/content/foundations/editorial-standards.md +449 -0
- package/expertise/content/foundations/index.md +24 -0
- package/expertise/content/foundations/microcopy.md +455 -0
- package/expertise/content/foundations/terminology-governance.md +509 -0
- package/expertise/content/index.md +34 -0
- package/expertise/content/patterns/accessibility-copy.md +518 -0
- package/expertise/content/patterns/index.md +24 -0
- package/expertise/content/patterns/notification-content.md +433 -0
- package/expertise/content/patterns/sample-content.md +486 -0
- package/expertise/content/patterns/state-copy.md +439 -0
- package/expertise/design/PROGRESS.md +58 -0
- package/expertise/design/disciplines/dark-mode-theming.md +577 -0
- package/expertise/design/disciplines/design-systems.md +595 -0
- package/expertise/design/disciplines/index.md +25 -0
- package/expertise/design/disciplines/information-architecture.md +800 -0
- package/expertise/design/disciplines/interaction-design.md +788 -0
- package/expertise/design/disciplines/responsive-design.md +552 -0
- package/expertise/design/disciplines/usability-testing.md +516 -0
- package/expertise/design/disciplines/user-research.md +792 -0
- package/expertise/design/foundations/accessibility-design.md +796 -0
- package/expertise/design/foundations/color-theory.md +797 -0
- package/expertise/design/foundations/iconography.md +795 -0
- package/expertise/design/foundations/index.md +26 -0
- package/expertise/design/foundations/motion-and-animation.md +653 -0
- package/expertise/design/foundations/rtl-design.md +585 -0
- package/expertise/design/foundations/spacing-and-layout.md +607 -0
- package/expertise/design/foundations/typography.md +800 -0
- package/expertise/design/foundations/visual-hierarchy.md +761 -0
- package/expertise/design/index.md +32 -0
- package/expertise/design/patterns/authentication-flows.md +474 -0
- package/expertise/design/patterns/content-consumption.md +789 -0
- package/expertise/design/patterns/data-display.md +618 -0
- package/expertise/design/patterns/e-commerce.md +1494 -0
- package/expertise/design/patterns/feedback-and-states.md +642 -0
- package/expertise/design/patterns/forms-and-input.md +819 -0
- package/expertise/design/patterns/gamification.md +801 -0
- package/expertise/design/patterns/index.md +31 -0
- package/expertise/design/patterns/microinteractions.md +449 -0
- package/expertise/design/patterns/navigation.md +800 -0
- package/expertise/design/patterns/notifications.md +705 -0
- package/expertise/design/patterns/onboarding.md +700 -0
- package/expertise/design/patterns/search-and-filter.md +601 -0
- package/expertise/design/patterns/settings-and-preferences.md +768 -0
- package/expertise/design/patterns/social-and-community.md +748 -0
- package/expertise/design/platforms/desktop-native.md +612 -0
- package/expertise/design/platforms/index.md +25 -0
- package/expertise/design/platforms/mobile-android.md +825 -0
- package/expertise/design/platforms/mobile-cross-platform.md +983 -0
- package/expertise/design/platforms/mobile-ios.md +699 -0
- package/expertise/design/platforms/tablet.md +794 -0
- package/expertise/design/platforms/web-dashboard.md +790 -0
- package/expertise/design/platforms/web-responsive.md +550 -0
- package/expertise/design/psychology/behavioral-nudges.md +449 -0
- package/expertise/design/psychology/cognitive-load.md +1191 -0
- package/expertise/design/psychology/error-psychology.md +778 -0
- package/expertise/design/psychology/index.md +22 -0
- package/expertise/design/psychology/persuasive-design.md +736 -0
- package/expertise/design/psychology/user-mental-models.md +623 -0
- package/expertise/design/tooling/open-pencil.md +266 -0
- package/expertise/frontend/angular.md +1073 -0
- package/expertise/frontend/desktop-electron.md +546 -0
- package/expertise/frontend/flutter.md +782 -0
- package/expertise/frontend/index.md +27 -0
- package/expertise/frontend/native-android.md +409 -0
- package/expertise/frontend/native-ios.md +490 -0
- package/expertise/frontend/react-native.md +1160 -0
- package/expertise/frontend/react.md +808 -0
- package/expertise/frontend/vue.md +1089 -0
- package/expertise/humanize/domain-rules-code.md +79 -0
- package/expertise/humanize/domain-rules-content.md +67 -0
- package/expertise/humanize/domain-rules-technical-docs.md +56 -0
- package/expertise/humanize/index.md +35 -0
- package/expertise/humanize/self-audit-checklist.md +87 -0
- package/expertise/humanize/sentence-patterns.md +218 -0
- package/expertise/humanize/vocabulary-blacklist.md +105 -0
- package/expertise/i18n/PROGRESS.md +65 -0
- package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
- package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
- package/expertise/i18n/advanced/complex-scripts.md +30 -0
- package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
- package/expertise/i18n/advanced/testing-i18n.md +28 -0
- package/expertise/i18n/content/content-adaptation.md +23 -0
- package/expertise/i18n/content/locale-specific-formatting.md +23 -0
- package/expertise/i18n/content/machine-translation-integration.md +28 -0
- package/expertise/i18n/content/translation-management.md +29 -0
- package/expertise/i18n/foundations/date-time-calendars.md +67 -0
- package/expertise/i18n/foundations/i18n-architecture.md +272 -0
- package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
- package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
- package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
- package/expertise/i18n/foundations/string-externalization.md +236 -0
- package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
- package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
- package/expertise/i18n/index.md +38 -0
- package/expertise/i18n/platform/backend-i18n.md +31 -0
- package/expertise/i18n/platform/flutter-i18n.md +148 -0
- package/expertise/i18n/platform/native-android-i18n.md +36 -0
- package/expertise/i18n/platform/native-ios-i18n.md +36 -0
- package/expertise/i18n/platform/react-i18n.md +103 -0
- package/expertise/i18n/platform/web-css-i18n.md +81 -0
- package/expertise/i18n/rtl/arabic-specific.md +175 -0
- package/expertise/i18n/rtl/hebrew-specific.md +149 -0
- package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
- package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
- package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
- package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
- package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
- package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
- package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
- package/expertise/i18n/rtl/rtl-typography.md +160 -0
- package/expertise/index.md +113 -0
- package/expertise/index.yaml +216 -0
- package/expertise/infrastructure/cloud-aws.md +597 -0
- package/expertise/infrastructure/cloud-gcp.md +599 -0
- package/expertise/infrastructure/cybersecurity.md +816 -0
- package/expertise/infrastructure/database-mongodb.md +447 -0
- package/expertise/infrastructure/database-postgres.md +400 -0
- package/expertise/infrastructure/devops-cicd.md +787 -0
- package/expertise/infrastructure/index.md +27 -0
- package/expertise/performance/PROGRESS.md +50 -0
- package/expertise/performance/backend/api-latency.md +1204 -0
- package/expertise/performance/backend/background-jobs.md +506 -0
- package/expertise/performance/backend/connection-pooling.md +1209 -0
- package/expertise/performance/backend/database-query-optimization.md +515 -0
- package/expertise/performance/backend/index.md +23 -0
- package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
- package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
- package/expertise/performance/foundations/caching-strategies.md +489 -0
- package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
- package/expertise/performance/foundations/index.md +24 -0
- package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
- package/expertise/performance/foundations/memory-management.md +964 -0
- package/expertise/performance/foundations/performance-budgets.md +1314 -0
- package/expertise/performance/index.md +31 -0
- package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
- package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
- package/expertise/performance/infrastructure/index.md +22 -0
- package/expertise/performance/infrastructure/load-balancing.md +1081 -0
- package/expertise/performance/infrastructure/observability.md +1079 -0
- package/expertise/performance/mobile/index.md +23 -0
- package/expertise/performance/mobile/mobile-animations.md +544 -0
- package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
- package/expertise/performance/mobile/mobile-network.md +452 -0
- package/expertise/performance/mobile/mobile-rendering.md +599 -0
- package/expertise/performance/mobile/mobile-startup-time.md +505 -0
- package/expertise/performance/platform-specific/flutter-performance.md +647 -0
- package/expertise/performance/platform-specific/index.md +22 -0
- package/expertise/performance/platform-specific/node-performance.md +1307 -0
- package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
- package/expertise/performance/platform-specific/react-performance.md +1403 -0
- package/expertise/performance/web/bundle-optimization.md +1239 -0
- package/expertise/performance/web/image-and-media.md +636 -0
- package/expertise/performance/web/index.md +24 -0
- package/expertise/performance/web/network-optimization.md +1133 -0
- package/expertise/performance/web/rendering-performance.md +1098 -0
- package/expertise/performance/web/ssr-and-hydration.md +918 -0
- package/expertise/performance/web/web-vitals.md +1374 -0
- package/expertise/quality/accessibility.md +985 -0
- package/expertise/quality/evidence-based-verification.md +499 -0
- package/expertise/quality/index.md +24 -0
- package/expertise/quality/ml-model-audit.md +614 -0
- package/expertise/quality/performance.md +600 -0
- package/expertise/quality/testing-api.md +891 -0
- package/expertise/quality/testing-mobile.md +496 -0
- package/expertise/quality/testing-web.md +849 -0
- package/expertise/security/PROGRESS.md +54 -0
- package/expertise/security/agentic-identity.md +540 -0
- package/expertise/security/compliance-frameworks.md +601 -0
- package/expertise/security/data/data-encryption.md +364 -0
- package/expertise/security/data/data-privacy-gdpr.md +692 -0
- package/expertise/security/data/database-security.md +1171 -0
- package/expertise/security/data/index.md +22 -0
- package/expertise/security/data/pii-handling.md +531 -0
- package/expertise/security/foundations/authentication.md +1041 -0
- package/expertise/security/foundations/authorization.md +603 -0
- package/expertise/security/foundations/cryptography.md +1001 -0
- package/expertise/security/foundations/index.md +25 -0
- package/expertise/security/foundations/owasp-top-10.md +1354 -0
- package/expertise/security/foundations/secrets-management.md +1217 -0
- package/expertise/security/foundations/secure-sdlc.md +700 -0
- package/expertise/security/foundations/supply-chain-security.md +698 -0
- package/expertise/security/index.md +31 -0
- package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
- package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
- package/expertise/security/infrastructure/container-security.md +721 -0
- package/expertise/security/infrastructure/incident-response.md +1295 -0
- package/expertise/security/infrastructure/index.md +24 -0
- package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
- package/expertise/security/infrastructure/network-security.md +1337 -0
- package/expertise/security/mobile/index.md +23 -0
- package/expertise/security/mobile/mobile-android-security.md +1218 -0
- package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
- package/expertise/security/mobile/mobile-data-storage.md +1265 -0
- package/expertise/security/mobile/mobile-ios-security.md +1401 -0
- package/expertise/security/mobile/mobile-network-security.md +1520 -0
- package/expertise/security/smart-contract-security.md +594 -0
- package/expertise/security/testing/index.md +22 -0
- package/expertise/security/testing/penetration-testing.md +1258 -0
- package/expertise/security/testing/security-code-review.md +1765 -0
- package/expertise/security/testing/threat-modeling.md +1074 -0
- package/expertise/security/testing/vulnerability-scanning.md +1062 -0
- package/expertise/security/web/api-security.md +586 -0
- package/expertise/security/web/cors-and-headers.md +433 -0
- package/expertise/security/web/csrf.md +562 -0
- package/expertise/security/web/file-upload.md +1477 -0
- package/expertise/security/web/index.md +25 -0
- package/expertise/security/web/injection.md +1375 -0
- package/expertise/security/web/session-management.md +1101 -0
- package/expertise/security/web/xss.md +1158 -0
- package/exports/README.md +17 -0
- package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
- package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
- package/exports/hosts/claude/.claude/agents/designer.md +55 -0
- package/exports/hosts/claude/.claude/agents/executor.md +55 -0
- package/exports/hosts/claude/.claude/agents/learner.md +51 -0
- package/exports/hosts/claude/.claude/agents/planner.md +53 -0
- package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
- package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
- package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
- package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
- package/exports/hosts/claude/.claude/commands/author.md +42 -0
- package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
- package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
- package/exports/hosts/claude/.claude/commands/design.md +44 -0
- package/exports/hosts/claude/.claude/commands/discover.md +37 -0
- package/exports/hosts/claude/.claude/commands/execute.md +48 -0
- package/exports/hosts/claude/.claude/commands/learn.md +38 -0
- package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
- package/exports/hosts/claude/.claude/commands/plan.md +39 -0
- package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
- package/exports/hosts/claude/.claude/commands/review.md +40 -0
- package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
- package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
- package/exports/hosts/claude/.claude/commands/specify.md +38 -0
- package/exports/hosts/claude/.claude/commands/verify.md +37 -0
- package/exports/hosts/claude/.claude/settings.json +34 -0
- package/exports/hosts/claude/CLAUDE.md +19 -0
- package/exports/hosts/claude/export.manifest.json +38 -0
- package/exports/hosts/claude/host-package.json +67 -0
- package/exports/hosts/codex/AGENTS.md +19 -0
- package/exports/hosts/codex/export.manifest.json +38 -0
- package/exports/hosts/codex/host-package.json +41 -0
- package/exports/hosts/cursor/.cursor/hooks.json +16 -0
- package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
- package/exports/hosts/cursor/export.manifest.json +38 -0
- package/exports/hosts/cursor/host-package.json +42 -0
- package/exports/hosts/gemini/GEMINI.md +19 -0
- package/exports/hosts/gemini/export.manifest.json +38 -0
- package/exports/hosts/gemini/host-package.json +41 -0
- package/hooks/README.md +18 -0
- package/hooks/definitions/loop_cap_guard.yaml +21 -0
- package/hooks/definitions/post_tool_capture.yaml +24 -0
- package/hooks/definitions/pre_compact_summary.yaml +19 -0
- package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
- package/hooks/definitions/protected_path_write_guard.yaml +19 -0
- package/hooks/definitions/session_start.yaml +19 -0
- package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
- package/hooks/loop-cap-guard +17 -0
- package/hooks/post-tool-lint +36 -0
- package/hooks/protected-path-write-guard +17 -0
- package/hooks/session-start +41 -0
- package/llms-full.txt +2355 -0
- package/llms.txt +43 -0
- package/package.json +79 -0
- package/roles/README.md +20 -0
- package/roles/clarifier.md +42 -0
- package/roles/content-author.md +63 -0
- package/roles/designer.md +55 -0
- package/roles/executor.md +55 -0
- package/roles/learner.md +51 -0
- package/roles/planner.md +53 -0
- package/roles/researcher.md +43 -0
- package/roles/reviewer.md +54 -0
- package/roles/specifier.md +47 -0
- package/roles/verifier.md +71 -0
- package/schemas/README.md +24 -0
- package/schemas/accepted-learning.schema.json +20 -0
- package/schemas/author-artifact.schema.json +156 -0
- package/schemas/clarification.schema.json +19 -0
- package/schemas/design-artifact.schema.json +80 -0
- package/schemas/docs-claim.schema.json +18 -0
- package/schemas/export-manifest.schema.json +20 -0
- package/schemas/hook.schema.json +67 -0
- package/schemas/host-export-package.schema.json +18 -0
- package/schemas/implementation-plan.schema.json +19 -0
- package/schemas/proposed-learning.schema.json +19 -0
- package/schemas/research.schema.json +18 -0
- package/schemas/review.schema.json +29 -0
- package/schemas/run-manifest.schema.json +18 -0
- package/schemas/spec-challenge.schema.json +18 -0
- package/schemas/spec.schema.json +20 -0
- package/schemas/usage.schema.json +102 -0
- package/schemas/verification-proof.schema.json +29 -0
- package/schemas/wazir-manifest.schema.json +173 -0
- package/skills/README.md +40 -0
- package/skills/brainstorming/SKILL.md +77 -0
- package/skills/debugging/SKILL.md +50 -0
- package/skills/design/SKILL.md +61 -0
- package/skills/dispatching-parallel-agents/SKILL.md +128 -0
- package/skills/executing-plans/SKILL.md +70 -0
- package/skills/finishing-a-development-branch/SKILL.md +169 -0
- package/skills/humanize/SKILL.md +123 -0
- package/skills/init-pipeline/SKILL.md +124 -0
- package/skills/prepare-next/SKILL.md +20 -0
- package/skills/receiving-code-review/SKILL.md +123 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +108 -0
- package/skills/run-audit/SKILL.md +197 -0
- package/skills/scan-project/SKILL.md +41 -0
- package/skills/self-audit/SKILL.md +153 -0
- package/skills/subagent-driven-development/SKILL.md +154 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +102 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/tdd/SKILL.md +23 -0
- package/skills/using-git-worktrees/SKILL.md +163 -0
- package/skills/using-skills/SKILL.md +95 -0
- package/skills/verification/SKILL.md +22 -0
- package/skills/wazir/SKILL.md +463 -0
- package/skills/writing-plans/SKILL.md +30 -0
- package/skills/writing-skills/SKILL.md +157 -0
- package/skills/writing-skills/anthropic-best-practices.md +122 -0
- package/skills/writing-skills/persuasion-principles.md +50 -0
- package/templates/README.md +20 -0
- package/templates/artifacts/README.md +10 -0
- package/templates/artifacts/accepted-learning.md +19 -0
- package/templates/artifacts/accepted-learning.template.json +12 -0
- package/templates/artifacts/author.md +74 -0
- package/templates/artifacts/author.template.json +19 -0
- package/templates/artifacts/clarification.md +21 -0
- package/templates/artifacts/clarification.template.json +12 -0
- package/templates/artifacts/execute-notes.md +19 -0
- package/templates/artifacts/implementation-plan.md +21 -0
- package/templates/artifacts/implementation-plan.template.json +11 -0
- package/templates/artifacts/learning-proposal.md +19 -0
- package/templates/artifacts/next-run-handoff.md +21 -0
- package/templates/artifacts/plan-review.md +19 -0
- package/templates/artifacts/proposed-learning.template.json +12 -0
- package/templates/artifacts/research.md +21 -0
- package/templates/artifacts/research.template.json +12 -0
- package/templates/artifacts/review-findings.md +19 -0
- package/templates/artifacts/review.template.json +11 -0
- package/templates/artifacts/run-manifest.template.json +8 -0
- package/templates/artifacts/spec-challenge.md +19 -0
- package/templates/artifacts/spec-challenge.template.json +11 -0
- package/templates/artifacts/spec.md +21 -0
- package/templates/artifacts/spec.template.json +12 -0
- package/templates/artifacts/verification-proof.md +19 -0
- package/templates/artifacts/verification-proof.template.json +11 -0
- package/templates/examples/accepted-learning.example.json +14 -0
- package/templates/examples/author.example.json +152 -0
- package/templates/examples/clarification.example.json +15 -0
- package/templates/examples/docs-claim.example.json +8 -0
- package/templates/examples/export-manifest.example.json +7 -0
- package/templates/examples/host-export-package.example.json +11 -0
- package/templates/examples/implementation-plan.example.json +17 -0
- package/templates/examples/proposed-learning.example.json +13 -0
- package/templates/examples/research.example.json +15 -0
- package/templates/examples/research.example.md +6 -0
- package/templates/examples/review.example.json +17 -0
- package/templates/examples/run-manifest.example.json +9 -0
- package/templates/examples/spec-challenge.example.json +14 -0
- package/templates/examples/spec.example.json +21 -0
- package/templates/examples/verification-proof.example.json +21 -0
- package/templates/examples/wazir-manifest.example.yaml +65 -0
- package/templates/task-definition-schema.md +99 -0
- package/tooling/README.md +20 -0
- package/tooling/src/adapters/context-mode.js +50 -0
- package/tooling/src/capture/command.js +376 -0
- package/tooling/src/capture/store.js +99 -0
- package/tooling/src/capture/usage.js +270 -0
- package/tooling/src/checks/branches.js +50 -0
- package/tooling/src/checks/brand-truth.js +110 -0
- package/tooling/src/checks/changelog.js +231 -0
- package/tooling/src/checks/command-registry.js +36 -0
- package/tooling/src/checks/commits.js +102 -0
- package/tooling/src/checks/docs-drift.js +103 -0
- package/tooling/src/checks/docs-truth.js +201 -0
- package/tooling/src/checks/runtime-surface.js +156 -0
- package/tooling/src/cli.js +116 -0
- package/tooling/src/command-options.js +56 -0
- package/tooling/src/commands/validate.js +320 -0
- package/tooling/src/doctor/command.js +91 -0
- package/tooling/src/export/command.js +77 -0
- package/tooling/src/export/compiler.js +498 -0
- package/tooling/src/guards/loop-cap-guard.js +52 -0
- package/tooling/src/guards/protected-path-write-guard.js +67 -0
- package/tooling/src/index/command.js +152 -0
- package/tooling/src/index/storage.js +1061 -0
- package/tooling/src/index/summarizers.js +261 -0
- package/tooling/src/loaders.js +18 -0
- package/tooling/src/project-root.js +22 -0
- package/tooling/src/recall/command.js +225 -0
- package/tooling/src/schema-validator.js +30 -0
- package/tooling/src/state-root.js +40 -0
- package/tooling/src/status/command.js +71 -0
- package/wazir.manifest.yaml +135 -0
- package/workflows/README.md +19 -0
- package/workflows/author.md +42 -0
- package/workflows/clarify.md +38 -0
- package/workflows/design-review.md +46 -0
- package/workflows/design.md +44 -0
- package/workflows/discover.md +37 -0
- package/workflows/execute.md +48 -0
- package/workflows/learn.md +38 -0
- package/workflows/plan-review.md +42 -0
- package/workflows/plan.md +39 -0
- package/workflows/prepare-next.md +37 -0
- package/workflows/review.md +40 -0
- package/workflows/run-audit.md +41 -0
- package/workflows/spec-challenge.md +41 -0
- package/workflows/specify.md +38 -0
- package/workflows/verify.md +37 -0
|
@@ -0,0 +1,1171 @@
|
|
|
1
|
+
# Database Security
|
|
2
|
+
|
|
3
|
+
> Comprehensive security guidance for database deployments, access control, query safety,
|
|
4
|
+
> and breach prevention across PostgreSQL, MongoDB, MySQL, Redis, and cloud-managed services.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. Threat Landscape
|
|
9
|
+
|
|
10
|
+
### 1.1 The Scale of Exposed Databases
|
|
11
|
+
|
|
12
|
+
Databases remain one of the most targeted assets in any infrastructure. The attack surface
|
|
13
|
+
is enormous and growing:
|
|
14
|
+
|
|
15
|
+
- **MongoDB**: Over 213,000 internet-exposed MongoDB instances identified via Shodan (2025).
|
|
16
|
+
Of these, 3,100+ were accessible without any authentication. Nearly 45.6% of unauthenticated
|
|
17
|
+
instances had already been compromised and wiped, with ransom notes left behind.
|
|
18
|
+
(Source: Flare Security 2026 research, BleepingComputer)
|
|
19
|
+
- **Elasticsearch**: Routinely found exposed on Shodan with no authentication enabled.
|
|
20
|
+
The default installation has no security enabled, making every deployment a potential breach.
|
|
21
|
+
- **Redis**: Approximately 330,000 Redis instances exposed to the internet, with ~60,000
|
|
22
|
+
having no authentication configured. 57% of cloud environments install Redis as container
|
|
23
|
+
images, many without proper security hardening. (Source: Wiz Research)
|
|
24
|
+
- **PostgreSQL/MySQL**: Less commonly exposed directly, but cloud misconfigurations
|
|
25
|
+
(security groups set to 0.0.0.0/0) remain a frequent finding in penetration tests.
|
|
26
|
+
|
|
27
|
+
### 1.2 Real-World Breaches
|
|
28
|
+
|
|
29
|
+
**Microsoft (2019) -- 250 Million Support Records**
|
|
30
|
+
Five Elasticsearch servers containing 250 million Customer Service and Support records
|
|
31
|
+
were left accessible to anyone with a web browser -- no password or authentication needed.
|
|
32
|
+
The data spanned 14 years (2005-2019) and included email addresses, IP addresses, customer
|
|
33
|
+
locations, and descriptions of support cases, some marked confidential. Root cause: a
|
|
34
|
+
misconfiguration of security rules for an internal database. Discovered by Bob Diachenko
|
|
35
|
+
(Comparitech). (Source: Comparitech, WeLiveSecurity)
|
|
36
|
+
|
|
37
|
+
**Shanghai Police / Alibaba Cloud (2022) -- 1 Billion Records**
|
|
38
|
+
A hacker offered to sell data from a Shanghai police database containing personal information
|
|
39
|
+
on approximately 1 billion Chinese citizens -- names, addresses, national ID numbers, phone
|
|
40
|
+
numbers, and criminal records. The data was hosted on Alibaba Cloud and had been publicly
|
|
41
|
+
accessible via an unsecured backdoor link since at least April 2021. The breach was caused
|
|
42
|
+
by a misconfigured cloud server that did not require a password. The asking price: 10 Bitcoin
|
|
43
|
+
(~$200,000). (Source: The Register, TechCrunch, CNN)
|
|
44
|
+
|
|
45
|
+
**National Public Data (2024) -- 2.9 Billion Records**
|
|
46
|
+
Approximately 2.9 billion data records exposed, impacting 1.3 billion individuals. Exposed
|
|
47
|
+
data included full names, addresses, dates of birth, Social Security numbers, phone numbers,
|
|
48
|
+
and email addresses. One of the largest breaches in U.S. history. (Source: multiple reports)
|
|
49
|
+
|
|
50
|
+
**Snowflake Cloud Breaches (2024)**
|
|
51
|
+
Snowflake was involved in multiple major corporate data breaches, including attacks on AT&T
|
|
52
|
+
and Ticketmaster, attributed to threat actor UNC5537. Attackers exploited stolen credentials
|
|
53
|
+
and the absence of multi-factor authentication on Snowflake customer accounts.
|
|
54
|
+
|
|
55
|
+
**MongoBleed CVE-2025-14847**
|
|
56
|
+
A high-severity vulnerability in MongoDB's zlib-based network compression. Unauthenticated
|
|
57
|
+
attackers could leak sensitive information from server memory. Over 87,000 potentially
|
|
58
|
+
vulnerable instances were exposed at time of disclosure. Public PoC exploit code was released
|
|
59
|
+
shortly after. (Source: Resecurity, Arctic Wolf, Akamai)
|
|
60
|
+
|
|
61
|
+
### 1.3 Common Attack Vectors
|
|
62
|
+
|
|
63
|
+
| Vector | Description | Impact |
|
|
64
|
+
|--------|-------------|--------|
|
|
65
|
+
| Exposed management ports | DB port open to internet (5432, 3306, 27017, 6379) | Full data access |
|
|
66
|
+
| Default/weak credentials | Factory defaults or common passwords | Complete takeover |
|
|
67
|
+
| SQL injection | Malicious SQL via application layer | Data theft, modification |
|
|
68
|
+
| Privilege escalation | Exploiting overprivileged accounts | Lateral movement |
|
|
69
|
+
| Credential stuffing | Reused passwords from other breaches | Account takeover |
|
|
70
|
+
| Insider threat | Malicious or compromised insiders | Data exfiltration |
|
|
71
|
+
| Unencrypted backups | Backup files without encryption | Offline data theft |
|
|
72
|
+
| Memory disclosure | Vulnerabilities like MongoBleed | Credential/data leakage |
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 2. Core Security Principles
|
|
77
|
+
|
|
78
|
+
### 2.1 Least Privilege
|
|
79
|
+
|
|
80
|
+
Every database account should have the minimum permissions required for its function:
|
|
81
|
+
|
|
82
|
+
- **Application accounts**: SELECT, INSERT, UPDATE, DELETE on specific tables only.
|
|
83
|
+
Never GRANT ALL PRIVILEGES. Never use the superuser/root account for application connections.
|
|
84
|
+
- **Migration accounts**: Temporary elevated privileges, revoked after migration completes.
|
|
85
|
+
- **Monitoring accounts**: Read-only access to system catalogs and statistics views.
|
|
86
|
+
- **Backup accounts**: Read-only with pg_dump/mongodump privileges, no write access.
|
|
87
|
+
- **Human operators**: Individual named accounts, never shared credentials.
|
|
88
|
+
|
|
89
|
+
### 2.2 Network Isolation
|
|
90
|
+
|
|
91
|
+
- Databases must never be directly accessible from the public internet.
|
|
92
|
+
- Place databases in private subnets with no public IP addresses.
|
|
93
|
+
- Use security groups / firewall rules to allow connections only from application servers.
|
|
94
|
+
- Use VPN or SSH tunnels for administrative access.
|
|
95
|
+
- Enable VPC peering or private endpoints for cloud-managed databases.
|
|
96
|
+
|
|
97
|
+
### 2.3 Encryption
|
|
98
|
+
|
|
99
|
+
**At rest:**
|
|
100
|
+
- Enable Transparent Data Encryption (TDE) or filesystem-level encryption.
|
|
101
|
+
- Encrypt all backup files. Use AES-256 as the minimum standard.
|
|
102
|
+
- Encrypt WAL/binlog files.
|
|
103
|
+
|
|
104
|
+
**In transit:**
|
|
105
|
+
- Require TLS 1.2+ for all database connections. Reject plaintext connections.
|
|
106
|
+
- Use strong cipher suites. Disable SSLv3, TLS 1.0, TLS 1.1.
|
|
107
|
+
- Verify server certificates from clients (sslmode=verify-full for PostgreSQL).
|
|
108
|
+
|
|
109
|
+
### 2.4 Authentication
|
|
110
|
+
|
|
111
|
+
- Use strong password hashing: SCRAM-SHA-256 (PostgreSQL), caching_sha2_password (MySQL).
|
|
112
|
+
- Never use MD5 or plaintext password storage.
|
|
113
|
+
- Enforce password complexity and rotation policies.
|
|
114
|
+
- Use certificate-based authentication where possible.
|
|
115
|
+
- Enable multi-factor authentication for administrative access.
|
|
116
|
+
|
|
117
|
+
### 2.5 Audit Logging
|
|
118
|
+
|
|
119
|
+
- Log all authentication attempts (success and failure).
|
|
120
|
+
- Log all DDL operations (CREATE, ALTER, DROP).
|
|
121
|
+
- Log all privilege changes (GRANT, REVOKE).
|
|
122
|
+
- Log data access to sensitive tables.
|
|
123
|
+
- Ship logs to a centralized, tamper-resistant logging system (SIEM).
|
|
124
|
+
|
|
125
|
+
### 2.6 Parameterized Queries
|
|
126
|
+
|
|
127
|
+
- Never construct SQL via string concatenation.
|
|
128
|
+
- Use prepared statements or parameterized queries exclusively.
|
|
129
|
+
- ORMs should be configured to use parameterized queries by default.
|
|
130
|
+
- Input validation is a secondary defense, not a replacement.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 3. Implementation Patterns
|
|
135
|
+
|
|
136
|
+
### 3.1 PostgreSQL Security Hardening
|
|
137
|
+
|
|
138
|
+
**pg_hba.conf -- Host-Based Authentication:**
|
|
139
|
+
|
|
140
|
+
```conf
|
|
141
|
+
# TYPE DATABASE USER ADDRESS METHOD
|
|
142
|
+
|
|
143
|
+
# Reject all by default -- explicit entries only
|
|
144
|
+
# Local connections: require scram-sha-256
|
|
145
|
+
local all all scram-sha-256
|
|
146
|
+
|
|
147
|
+
# Application server subnet only -- require SSL + scram
|
|
148
|
+
hostssl appdb app_user 10.0.1.0/24 scram-sha-256
|
|
149
|
+
|
|
150
|
+
# Admin access from bastion only -- require SSL + cert
|
|
151
|
+
hostssl all admin_user 10.0.0.5/32 cert
|
|
152
|
+
|
|
153
|
+
# Deny everything else
|
|
154
|
+
host all all 0.0.0.0/0 reject
|
|
155
|
+
host all all ::/0 reject
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Key pg_hba.conf rules:**
|
|
159
|
+
- Never use `trust` method for any remote connection.
|
|
160
|
+
- Never allow `0.0.0.0/0` for any database/user combination.
|
|
161
|
+
- Use `hostssl` instead of `host` to enforce TLS.
|
|
162
|
+
- Be specific: name exact databases and users, not `all`.
|
|
163
|
+
|
|
164
|
+
**postgresql.conf security settings:**
|
|
165
|
+
|
|
166
|
+
```conf
|
|
167
|
+
# Authentication
|
|
168
|
+
password_encryption = 'scram-sha-256'
|
|
169
|
+
|
|
170
|
+
# SSL/TLS
|
|
171
|
+
ssl = on
|
|
172
|
+
ssl_cert_file = '/etc/ssl/certs/server.crt'
|
|
173
|
+
ssl_key_file = '/etc/ssl/private/server.key'
|
|
174
|
+
ssl_ca_file = '/etc/ssl/certs/ca.crt'
|
|
175
|
+
ssl_min_protocol_version = 'TLSv1.2'
|
|
176
|
+
|
|
177
|
+
# Connection limits
|
|
178
|
+
max_connections = 100
|
|
179
|
+
superuser_reserved_connections = 3
|
|
180
|
+
|
|
181
|
+
# Logging
|
|
182
|
+
log_connections = on
|
|
183
|
+
log_disconnections = on
|
|
184
|
+
log_statement = 'ddl'
|
|
185
|
+
log_line_prefix = '%m [%p] %q%u@%d '
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Row-Level Security (RLS):**
|
|
189
|
+
|
|
190
|
+
```sql
|
|
191
|
+
-- Enable RLS on sensitive table
|
|
192
|
+
ALTER TABLE customer_data ENABLE ROW LEVEL SECURITY;
|
|
193
|
+
|
|
194
|
+
-- Force RLS even for table owner
|
|
195
|
+
ALTER TABLE customer_data FORCE ROW LEVEL SECURITY;
|
|
196
|
+
|
|
197
|
+
-- Policy: users can only see their own organization's data
|
|
198
|
+
CREATE POLICY org_isolation ON customer_data
|
|
199
|
+
USING (org_id = current_setting('app.current_org_id')::int);
|
|
200
|
+
|
|
201
|
+
-- Policy: read-only access for analysts
|
|
202
|
+
CREATE POLICY analyst_read ON customer_data
|
|
203
|
+
FOR SELECT
|
|
204
|
+
TO analyst_role
|
|
205
|
+
USING (classification != 'top_secret');
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Least-privilege role setup:**
|
|
209
|
+
|
|
210
|
+
```sql
|
|
211
|
+
-- Create application role with minimal permissions
|
|
212
|
+
CREATE ROLE app_user WITH LOGIN PASSWORD 'use-secrets-manager'
|
|
213
|
+
CONNECTION LIMIT 20
|
|
214
|
+
VALID UNTIL '2025-12-31';
|
|
215
|
+
|
|
216
|
+
-- Grant only necessary table permissions
|
|
217
|
+
GRANT CONNECT ON DATABASE appdb TO app_user;
|
|
218
|
+
GRANT USAGE ON SCHEMA public TO app_user;
|
|
219
|
+
GRANT SELECT, INSERT, UPDATE ON customers, orders TO app_user;
|
|
220
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_user;
|
|
221
|
+
|
|
222
|
+
-- Explicitly deny dangerous operations
|
|
223
|
+
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
|
|
224
|
+
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC;
|
|
225
|
+
|
|
226
|
+
-- Read-only monitoring role
|
|
227
|
+
CREATE ROLE monitor_user WITH LOGIN PASSWORD 'use-secrets-manager';
|
|
228
|
+
GRANT CONNECT ON DATABASE appdb TO monitor_user;
|
|
229
|
+
GRANT USAGE ON SCHEMA public TO monitor_user;
|
|
230
|
+
GRANT SELECT ON pg_stat_activity, pg_stat_statements TO monitor_user;
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### 3.2 MongoDB Access Control and Authentication
|
|
234
|
+
|
|
235
|
+
```javascript
|
|
236
|
+
// mongod.conf -- security configuration
|
|
237
|
+
// security:
|
|
238
|
+
// authorization: enabled
|
|
239
|
+
// javascriptEnabled: false
|
|
240
|
+
// net:
|
|
241
|
+
// tls:
|
|
242
|
+
// mode: requireTLS
|
|
243
|
+
// certificateKeyFile: /etc/ssl/mongodb.pem
|
|
244
|
+
// CAFile: /etc/ssl/ca.pem
|
|
245
|
+
// bindIp: 10.0.1.10 # NEVER use 0.0.0.0
|
|
246
|
+
|
|
247
|
+
// Create admin user (do this BEFORE enabling authorization)
|
|
248
|
+
db.createUser({
|
|
249
|
+
user: "admin",
|
|
250
|
+
pwd: passwordPrompt(), // interactive prompt, never hardcode
|
|
251
|
+
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
// Create application user with minimal privileges
|
|
255
|
+
db.createUser({
|
|
256
|
+
user: "app_service",
|
|
257
|
+
pwd: passwordPrompt(),
|
|
258
|
+
roles: [
|
|
259
|
+
{ role: "readWrite", db: "appdb" },
|
|
260
|
+
],
|
|
261
|
+
mechanisms: ["SCRAM-SHA-256"] // enforce strong auth
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// Create read-only analytics user
|
|
265
|
+
db.createUser({
|
|
266
|
+
user: "analyst",
|
|
267
|
+
pwd: passwordPrompt(),
|
|
268
|
+
roles: [{ role: "read", db: "appdb" }],
|
|
269
|
+
mechanisms: ["SCRAM-SHA-256"]
|
|
270
|
+
});
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
**Critical MongoDB security settings:**
|
|
274
|
+
- Always enable `authorization: enabled` in mongod.conf.
|
|
275
|
+
- Set `bindIp` to specific internal addresses, never `0.0.0.0`.
|
|
276
|
+
- Disable JavaScript execution (`javascriptEnabled: false`) unless required.
|
|
277
|
+
- Require TLS for all connections.
|
|
278
|
+
- Disable the HTTP status interface and REST API in production.
|
|
279
|
+
|
|
280
|
+
### 3.3 Connection Pooling Security
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
// Secure connection pool configuration (Node.js/Knex example)
|
|
284
|
+
const knex = require('knex')({
|
|
285
|
+
client: 'pg',
|
|
286
|
+
connection: {
|
|
287
|
+
host: process.env.DB_HOST, // from environment/secrets
|
|
288
|
+
port: 5432,
|
|
289
|
+
user: process.env.DB_USER,
|
|
290
|
+
password: process.env.DB_PASSWORD, // from secrets manager
|
|
291
|
+
database: process.env.DB_NAME,
|
|
292
|
+
ssl: {
|
|
293
|
+
rejectUnauthorized: true, // CRITICAL: verify server cert
|
|
294
|
+
ca: fs.readFileSync('/etc/ssl/certs/db-ca.crt'),
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
pool: {
|
|
298
|
+
min: 2,
|
|
299
|
+
max: 10,
|
|
300
|
+
acquireTimeoutMillis: 30000,
|
|
301
|
+
idleTimeoutMillis: 60000,
|
|
302
|
+
// Validate connections before use
|
|
303
|
+
afterCreate: (conn, done) => {
|
|
304
|
+
conn.query('SELECT 1', (err) => done(err, conn));
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### 3.4 Migration Security
|
|
311
|
+
|
|
312
|
+
- Run migrations with a dedicated migration user that has DDL privileges.
|
|
313
|
+
- Revoke DDL privileges from the migration user after deployment.
|
|
314
|
+
- Review all migration SQL for destructive operations before execution.
|
|
315
|
+
- Never store migration credentials in source code.
|
|
316
|
+
- Log all migration executions with timestamps and operator identity.
|
|
317
|
+
|
|
318
|
+
### 3.5 Backup Encryption
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
# PostgreSQL encrypted backup
|
|
322
|
+
pg_dump -h localhost -U backup_user appdb \
|
|
323
|
+
| gpg --symmetric --cipher-algo AES256 \
|
|
324
|
+
--passphrase-file /etc/backup/passphrase \
|
|
325
|
+
> /backups/appdb_$(date +%Y%m%d).sql.gpg
|
|
326
|
+
|
|
327
|
+
# MongoDB encrypted backup
|
|
328
|
+
mongodump --uri="mongodb://backup_user:$PASS@10.0.1.10:27017/appdb" \
|
|
329
|
+
--ssl --sslCAFile=/etc/ssl/ca.pem \
|
|
330
|
+
--archive \
|
|
331
|
+
| gpg --symmetric --cipher-algo AES256 \
|
|
332
|
+
--passphrase-file /etc/backup/passphrase \
|
|
333
|
+
> /backups/appdb_$(date +%Y%m%d).archive.gpg
|
|
334
|
+
|
|
335
|
+
# Verify backup integrity
|
|
336
|
+
gpg --decrypt /backups/appdb_$(date +%Y%m%d).sql.gpg | head -5
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 4. Vulnerability Catalog
|
|
342
|
+
|
|
343
|
+
### V-01: Default Credentials
|
|
344
|
+
|
|
345
|
+
**Risk**: Critical | **CVSS**: 9.8
|
|
346
|
+
**Description**: Database installed with factory-default or empty passwords.
|
|
347
|
+
**Affected**: All databases. Redis historically shipped with no password required.
|
|
348
|
+
MongoDB before 4.0 did not enable authentication by default.
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
# VULNERABLE: Redis with no authentication
|
|
352
|
+
redis-server # starts with no password
|
|
353
|
+
|
|
354
|
+
# SECURE: Redis with strong authentication
|
|
355
|
+
# redis.conf
|
|
356
|
+
requirepass "$(openssl rand -base64 32)"
|
|
357
|
+
# Redis 6+ ACL system
|
|
358
|
+
user app_user on >strong_password ~app:* +get +set +del -@admin
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### V-02: Overprivileged Application Accounts
|
|
362
|
+
|
|
363
|
+
**Risk**: High | **CVSS**: 8.1
|
|
364
|
+
**Description**: Application connects as superuser or with ALL PRIVILEGES.
|
|
365
|
+
|
|
366
|
+
```sql
|
|
367
|
+
-- VULNERABLE
|
|
368
|
+
GRANT ALL PRIVILEGES ON *.* TO 'app'@'%';
|
|
369
|
+
|
|
370
|
+
-- SECURE
|
|
371
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app'@'10.0.1.%';
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### V-03: Unencrypted Connections
|
|
375
|
+
|
|
376
|
+
**Risk**: High | **CVSS**: 7.5
|
|
377
|
+
**Description**: Database traffic transmitted in plaintext, vulnerable to MITM.
|
|
378
|
+
|
|
379
|
+
```python
|
|
380
|
+
# VULNERABLE: No SSL verification
|
|
381
|
+
conn = psycopg2.connect(host="db.example.com", sslmode="prefer")
|
|
382
|
+
|
|
383
|
+
# SECURE: Full SSL verification
|
|
384
|
+
conn = psycopg2.connect(
|
|
385
|
+
host="db.example.com",
|
|
386
|
+
sslmode="verify-full",
|
|
387
|
+
sslrootcert="/etc/ssl/certs/db-ca.crt"
|
|
388
|
+
)
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
### V-04: Exposed Management Ports
|
|
392
|
+
|
|
393
|
+
**Risk**: Critical | **CVSS**: 9.8
|
|
394
|
+
**Description**: Database ports (5432, 3306, 27017, 6379) accessible from internet.
|
|
395
|
+
|
|
396
|
+
```hcl
|
|
397
|
+
# VULNERABLE: Terraform security group
|
|
398
|
+
resource "aws_security_group_rule" "db" {
|
|
399
|
+
type = "ingress"
|
|
400
|
+
from_port = 5432
|
|
401
|
+
to_port = 5432
|
|
402
|
+
cidr_blocks = ["0.0.0.0/0"] # Open to entire internet
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
# SECURE: Restrict to application subnet
|
|
406
|
+
resource "aws_security_group_rule" "db" {
|
|
407
|
+
type = "ingress"
|
|
408
|
+
from_port = 5432
|
|
409
|
+
to_port = 5432
|
|
410
|
+
source_security_group_id = aws_security_group.app.id
|
|
411
|
+
}
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
### V-05: Missing Audit Logs
|
|
415
|
+
|
|
416
|
+
**Risk**: Medium | **CVSS**: 5.3
|
|
417
|
+
**Description**: No logging of database operations, making breach detection impossible.
|
|
418
|
+
Without audit logs, organizations cannot detect unauthorized access, satisfy compliance
|
|
419
|
+
requirements, or perform forensic analysis after an incident.
|
|
420
|
+
|
|
421
|
+
### V-06: Unencrypted Backups
|
|
422
|
+
|
|
423
|
+
**Risk**: High | **CVSS**: 7.5
|
|
424
|
+
**Description**: Database backups stored as plaintext files. If backup storage is
|
|
425
|
+
compromised, all data is immediately readable. Backups often contain more sensitive
|
|
426
|
+
data than the live database (historical records, deleted data).
|
|
427
|
+
|
|
428
|
+
### V-07: SQL Injection Bypass at DB Level
|
|
429
|
+
|
|
430
|
+
**Risk**: Critical | **CVSS**: 9.8
|
|
431
|
+
**Description**: Even with application-level parameterized queries, stored procedures
|
|
432
|
+
or dynamic SQL within the database can be vulnerable.
|
|
433
|
+
|
|
434
|
+
```sql
|
|
435
|
+
-- VULNERABLE: Dynamic SQL in stored procedure
|
|
436
|
+
CREATE FUNCTION search_users(search_term TEXT) RETURNS SETOF users AS $$
|
|
437
|
+
BEGIN
|
|
438
|
+
RETURN QUERY EXECUTE 'SELECT * FROM users WHERE name = ''' || search_term || '''';
|
|
439
|
+
END;
|
|
440
|
+
$$ LANGUAGE plpgsql;
|
|
441
|
+
|
|
442
|
+
-- SECURE: Parameterized dynamic SQL
|
|
443
|
+
CREATE FUNCTION search_users(search_term TEXT) RETURNS SETOF users AS $$
|
|
444
|
+
BEGIN
|
|
445
|
+
RETURN QUERY EXECUTE 'SELECT * FROM users WHERE name = $1' USING search_term;
|
|
446
|
+
END;
|
|
447
|
+
$$ LANGUAGE plpgsql;
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### V-08: Excessive Data Retention
|
|
451
|
+
|
|
452
|
+
**Risk**: Medium | **CVSS**: 5.0
|
|
453
|
+
**Description**: Storing more data than necessary increases breach impact. PII and
|
|
454
|
+
sensitive data kept indefinitely without business justification violates GDPR and
|
|
455
|
+
increases liability.
|
|
456
|
+
|
|
457
|
+
### V-09: Connection String Leakage
|
|
458
|
+
|
|
459
|
+
**Risk**: High | **CVSS**: 8.1
|
|
460
|
+
**Description**: Database credentials exposed in source code, logs, error messages,
|
|
461
|
+
or environment dumps.
|
|
462
|
+
|
|
463
|
+
```python
|
|
464
|
+
# VULNERABLE: Credentials in source code
|
|
465
|
+
DATABASE_URL = "postgresql://admin:SuperSecret123@db.prod.internal:5432/app"
|
|
466
|
+
|
|
467
|
+
# SECURE: Credentials from secrets manager
|
|
468
|
+
import boto3
|
|
469
|
+
client = boto3.client('secretsmanager')
|
|
470
|
+
secret = client.get_secret_value(SecretId='prod/db/credentials')
|
|
471
|
+
DATABASE_URL = json.loads(secret['SecretString'])['url']
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### V-10: Missing Connection Limits
|
|
475
|
+
|
|
476
|
+
**Risk**: Medium | **CVSS**: 5.3
|
|
477
|
+
**Description**: No per-user or per-application connection limits, allowing a single
|
|
478
|
+
compromised service to exhaust all database connections (denial of service).
|
|
479
|
+
|
|
480
|
+
### V-11: Stale User Accounts
|
|
481
|
+
|
|
482
|
+
**Risk**: Medium | **CVSS**: 6.5
|
|
483
|
+
**Description**: Former employee or decommissioned service accounts still active.
|
|
484
|
+
Regular access reviews are mandatory.
|
|
485
|
+
|
|
486
|
+
### V-12: Unrestricted COPY/LOAD Operations
|
|
487
|
+
|
|
488
|
+
**Risk**: High | **CVSS**: 7.5
|
|
489
|
+
**Description**: PostgreSQL COPY TO/FROM and MySQL LOAD DATA can read/write server
|
|
490
|
+
filesystem. Must be restricted to superuser or specific roles.
|
|
491
|
+
|
|
492
|
+
### V-13: Enabled Debug Features in Production
|
|
493
|
+
|
|
494
|
+
**Risk**: Medium | **CVSS**: 5.0
|
|
495
|
+
**Description**: MongoDB JavaScript evaluation, Redis DEBUG commands, PostgreSQL
|
|
496
|
+
`log_statement = 'all'` exposing query parameters in logs.
|
|
497
|
+
|
|
498
|
+
### V-14: Missing Row-Level Security
|
|
499
|
+
|
|
500
|
+
**Risk**: High | **CVSS**: 7.5
|
|
501
|
+
**Description**: Multi-tenant applications relying solely on application logic for
|
|
502
|
+
data isolation. A single bug in the WHERE clause exposes all tenants' data.
|
|
503
|
+
|
|
504
|
+
### V-15: Weak TLS Configuration
|
|
505
|
+
|
|
506
|
+
**Risk**: Medium | **CVSS**: 5.9
|
|
507
|
+
**Description**: Database accepting TLS 1.0/1.1, weak cipher suites, or not verifying
|
|
508
|
+
client certificates when required.
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
## 5. Security Checklist
|
|
513
|
+
|
|
514
|
+
### Network & Access
|
|
515
|
+
|
|
516
|
+
- [ ] Database ports not accessible from public internet
|
|
517
|
+
- [ ] Security groups restrict access to application subnets only
|
|
518
|
+
- [ ] VPN or bastion host required for administrative access
|
|
519
|
+
- [ ] Private subnets with no public IP for database instances
|
|
520
|
+
- [ ] DNS resolution for database endpoints uses private DNS
|
|
521
|
+
|
|
522
|
+
### Authentication & Authorization
|
|
523
|
+
|
|
524
|
+
- [ ] No default or empty passwords on any database account
|
|
525
|
+
- [ ] Each application/service has its own dedicated database account
|
|
526
|
+
- [ ] Superuser/root accounts disabled or restricted to local access only
|
|
527
|
+
- [ ] Password hashing uses SCRAM-SHA-256 (PostgreSQL) or caching_sha2_password (MySQL)
|
|
528
|
+
- [ ] Application accounts have SELECT/INSERT/UPDATE/DELETE only on required tables
|
|
529
|
+
- [ ] DDL privileges (CREATE/ALTER/DROP) restricted to migration/admin accounts
|
|
530
|
+
- [ ] Connection limits set per user role
|
|
531
|
+
- [ ] Account expiration dates set for temporary/contractor access
|
|
532
|
+
- [ ] Regular access reviews performed (quarterly minimum)
|
|
533
|
+
- [ ] Service accounts cannot perform interactive login
|
|
534
|
+
|
|
535
|
+
### Encryption
|
|
536
|
+
|
|
537
|
+
- [ ] TLS 1.2+ required for all connections (reject plaintext)
|
|
538
|
+
- [ ] Server certificates verified by clients (sslmode=verify-full)
|
|
539
|
+
- [ ] Data encrypted at rest (TDE, filesystem encryption, or cloud KMS)
|
|
540
|
+
- [ ] Backup files encrypted with AES-256
|
|
541
|
+
- [ ] WAL/binlog encryption enabled
|
|
542
|
+
- [ ] Encryption keys rotated on defined schedule
|
|
543
|
+
|
|
544
|
+
### Monitoring & Logging
|
|
545
|
+
|
|
546
|
+
- [ ] Authentication attempts logged (success and failure)
|
|
547
|
+
- [ ] DDL operations logged
|
|
548
|
+
- [ ] Privilege changes logged (GRANT/REVOKE)
|
|
549
|
+
- [ ] Sensitive table access logged (pgAudit or equivalent)
|
|
550
|
+
- [ ] Logs shipped to centralized SIEM
|
|
551
|
+
- [ ] Alerting configured for suspicious patterns (brute force, bulk exports)
|
|
552
|
+
- [ ] Log retention meets compliance requirements (90+ days)
|
|
553
|
+
|
|
554
|
+
### Backup & Recovery
|
|
555
|
+
|
|
556
|
+
- [ ] Automated backups configured and tested
|
|
557
|
+
- [ ] Backup restoration tested at least quarterly
|
|
558
|
+
- [ ] Backup files encrypted and stored in separate security zone
|
|
559
|
+
- [ ] Point-in-time recovery (PITR) enabled
|
|
560
|
+
- [ ] Backup credentials differ from application credentials
|
|
561
|
+
|
|
562
|
+
---
|
|
563
|
+
|
|
564
|
+
## 6. Tools & Automation
|
|
565
|
+
|
|
566
|
+
### 6.1 pgAudit (PostgreSQL)
|
|
567
|
+
|
|
568
|
+
pgAudit provides detailed session and object audit logging via PostgreSQL's standard
|
|
569
|
+
logging facility. It goes beyond standard logging by capturing the details of what
|
|
570
|
+
happened while the database was satisfying a request, not just what was requested.
|
|
571
|
+
|
|
572
|
+
```sql
|
|
573
|
+
-- Install pgAudit
|
|
574
|
+
CREATE EXTENSION pgaudit;
|
|
575
|
+
|
|
576
|
+
-- Configure in postgresql.conf
|
|
577
|
+
-- pgaudit.log = 'write, ddl, role'
|
|
578
|
+
-- pgaudit.log_catalog = off
|
|
579
|
+
-- pgaudit.log_relation = on
|
|
580
|
+
|
|
581
|
+
-- Object-level auditing for sensitive tables
|
|
582
|
+
ALTER TABLE financial_records SET (pgaudit.log = 'read, write');
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
Key capabilities:
|
|
586
|
+
- Session-level logging (all statements by specific users).
|
|
587
|
+
- Object-level logging (all access to specific tables).
|
|
588
|
+
- Compliance-ready output format for PCI-DSS, SOC2, HIPAA.
|
|
589
|
+
- Integrates with PostgreSQL 14-18.
|
|
590
|
+
- Source: https://www.pgaudit.org/
|
|
591
|
+
|
|
592
|
+
### 6.2 MongoDB Audit Log
|
|
593
|
+
|
|
594
|
+
```yaml
|
|
595
|
+
# mongod.conf audit configuration
|
|
596
|
+
auditLog:
|
|
597
|
+
destination: file
|
|
598
|
+
format: JSON
|
|
599
|
+
path: /var/log/mongodb/audit.json
|
|
600
|
+
filter: '{
|
|
601
|
+
atype: {
|
|
602
|
+
$in: [
|
|
603
|
+
"authenticate", "createUser", "dropUser",
|
|
604
|
+
"grantRolesToUser", "revokeRolesFromUser",
|
|
605
|
+
"createCollection", "dropCollection",
|
|
606
|
+
"createDatabase", "dropDatabase"
|
|
607
|
+
]
|
|
608
|
+
}
|
|
609
|
+
}'
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
MongoDB Enterprise and Atlas provide built-in audit logging for authentication events,
|
|
613
|
+
CRUD operations, and schema changes. For Community Edition, use mongoaudit
|
|
614
|
+
(https://github.com/stampery/mongoaudit) for security scanning.
|
|
615
|
+
|
|
616
|
+
### 6.3 Database Vulnerability Scanners
|
|
617
|
+
|
|
618
|
+
| Tool | Database | Type | Key Features |
|
|
619
|
+
|------|----------|------|-------------|
|
|
620
|
+
| **pgaudit_analyze** | PostgreSQL | Audit analysis | Parse and analyze pgAudit logs |
|
|
621
|
+
| **mongoaudit** | MongoDB | Security scanner | Configuration audit, vulnerability detection |
|
|
622
|
+
| **mysqltuner** | MySQL | Security + perf | Privilege analysis, security recommendations |
|
|
623
|
+
| **redis-check** | Redis | Security audit | Auth check, exposure analysis |
|
|
624
|
+
| **Qualys** | All | Commercial | Compliance scanning, vulnerability assessment |
|
|
625
|
+
| **DbProtect** | All | Commercial | Real-time monitoring, access control |
|
|
626
|
+
| **DataSunrise** | All | Commercial | Activity monitoring, data masking, firewall |
|
|
627
|
+
|
|
628
|
+
### 6.4 Connection Security Testing
|
|
629
|
+
|
|
630
|
+
```bash
|
|
631
|
+
# Test PostgreSQL TLS configuration
|
|
632
|
+
openssl s_client -connect db.example.com:5432 -starttls postgres
|
|
633
|
+
|
|
634
|
+
# Verify minimum TLS version
|
|
635
|
+
psql "sslmode=verify-full sslrootcert=/etc/ssl/ca.crt host=db.example.com" \
|
|
636
|
+
-c "SHOW ssl_min_protocol_version;"
|
|
637
|
+
|
|
638
|
+
# Test MongoDB TLS
|
|
639
|
+
openssl s_client -connect db.example.com:27017
|
|
640
|
+
|
|
641
|
+
# Check Redis authentication
|
|
642
|
+
redis-cli -h db.example.com --tls --cert /etc/ssl/client.crt \
|
|
643
|
+
--key /etc/ssl/client.key --cacert /etc/ssl/ca.crt ping
|
|
644
|
+
|
|
645
|
+
# Scan for exposed database ports (internal audit only)
|
|
646
|
+
nmap -sV -p 5432,3306,27017,6379,9200,9300 target_subnet/24
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
### 6.5 Automated Security Monitoring
|
|
650
|
+
|
|
651
|
+
```yaml
|
|
652
|
+
# Prometheus alerting rules for database security
|
|
653
|
+
groups:
|
|
654
|
+
- name: database_security
|
|
655
|
+
rules:
|
|
656
|
+
- alert: DatabaseAuthFailureSpike
|
|
657
|
+
expr: rate(pg_stat_activity_count{state="authentication_failure"}[5m]) > 10
|
|
658
|
+
for: 2m
|
|
659
|
+
labels:
|
|
660
|
+
severity: critical
|
|
661
|
+
annotations:
|
|
662
|
+
summary: "Possible brute-force attack on database"
|
|
663
|
+
|
|
664
|
+
- alert: DatabaseConnectionFromUnknownIP
|
|
665
|
+
expr: pg_stat_activity_client_addr != "10.0.1.0/24"
|
|
666
|
+
for: 0m
|
|
667
|
+
labels:
|
|
668
|
+
severity: critical
|
|
669
|
+
annotations:
|
|
670
|
+
summary: "Database connection from unexpected network"
|
|
671
|
+
|
|
672
|
+
- alert: HighVolumeDataRead
|
|
673
|
+
expr: rate(pg_stat_user_tables_seq_tup_read[5m]) > 100000
|
|
674
|
+
for: 5m
|
|
675
|
+
labels:
|
|
676
|
+
severity: warning
|
|
677
|
+
annotations:
|
|
678
|
+
summary: "Abnormally high sequential scan volume - possible exfiltration"
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
---
|
|
682
|
+
|
|
683
|
+
## 7. Platform-Specific Guidance
|
|
684
|
+
|
|
685
|
+
### 7.1 PostgreSQL
|
|
686
|
+
|
|
687
|
+
**Authentication**: Use SCRAM-SHA-256 exclusively. Never use `trust` or `md5`.
|
|
688
|
+
Configure pg_hba.conf with explicit entries per database/user/network.
|
|
689
|
+
|
|
690
|
+
**Row-Level Security**: Essential for multi-tenant applications. Always use
|
|
691
|
+
`FORCE ROW LEVEL SECURITY` to apply policies even to table owners.
|
|
692
|
+
|
|
693
|
+
**Extensions security**: Audit all installed extensions. Restrict `CREATE EXTENSION`
|
|
694
|
+
to superusers. Disable untrusted language handlers (PL/Python, PL/Perl) unless required.
|
|
695
|
+
|
|
696
|
+
**COPY command**: Restrict server-side COPY TO/FROM to superuser. Application users
|
|
697
|
+
should use `\copy` (client-side) instead.
|
|
698
|
+
|
|
699
|
+
### 7.2 MongoDB
|
|
700
|
+
|
|
701
|
+
**Authentication**: Always enable `authorization: enabled`. Use SCRAM-SHA-256.
|
|
702
|
+
Consider X.509 certificate authentication for service-to-service communication.
|
|
703
|
+
|
|
704
|
+
**Network binding**: Set `bindIp` to specific internal IPs. The default `bindIpAll`
|
|
705
|
+
is dangerous in any non-development environment.
|
|
706
|
+
|
|
707
|
+
**JavaScript**: Disable with `javascriptEnabled: false` unless your application
|
|
708
|
+
requires server-side JavaScript execution (rare).
|
|
709
|
+
|
|
710
|
+
**Field-Level Encryption**: MongoDB 4.2+ supports Client-Side Field Level Encryption
|
|
711
|
+
(CSFLE) for encrypting sensitive fields before they reach the server. Use this for
|
|
712
|
+
PII, payment data, and health records.
|
|
713
|
+
|
|
714
|
+
**MongoBleed mitigation (CVE-2025-14847)**: Upgrade to patched versions immediately.
|
|
715
|
+
Block public access to port 27017. Disable network compression if not required.
|
|
716
|
+
|
|
717
|
+
### 7.3 MySQL
|
|
718
|
+
|
|
719
|
+
**Authentication plugins**: Use `caching_sha2_password` (default in MySQL 8.0+).
|
|
720
|
+
Enable `component_validate_password` for password policy enforcement.
|
|
721
|
+
|
|
722
|
+
**Secure installation**: Always run `mysql_secure_installation` which removes
|
|
723
|
+
anonymous accounts, disables remote root login, removes test database.
|
|
724
|
+
|
|
725
|
+
**Binary log encryption**: Enable `binlog_encryption = ON` to encrypt binary logs.
|
|
726
|
+
Enable `innodb_redo_log_encrypt = ON` and `innodb_undo_log_encrypt = ON`.
|
|
727
|
+
|
|
728
|
+
**LOAD DATA LOCAL**: Disable with `local_infile = 0` to prevent client-initiated
|
|
729
|
+
file reads from the server filesystem.
|
|
730
|
+
|
|
731
|
+
```ini
|
|
732
|
+
# my.cnf security settings
|
|
733
|
+
[mysqld]
|
|
734
|
+
# Authentication
|
|
735
|
+
default_authentication_plugin = caching_sha2_password
|
|
736
|
+
password_history = 5
|
|
737
|
+
password_reuse_interval = 365
|
|
738
|
+
|
|
739
|
+
# Encryption
|
|
740
|
+
require_secure_transport = ON
|
|
741
|
+
ssl_ca = /etc/mysql/ssl/ca.pem
|
|
742
|
+
ssl_cert = /etc/mysql/ssl/server-cert.pem
|
|
743
|
+
ssl_key = /etc/mysql/ssl/server-key.pem
|
|
744
|
+
tls_version = TLSv1.2,TLSv1.3
|
|
745
|
+
|
|
746
|
+
# Hardening
|
|
747
|
+
local_infile = 0
|
|
748
|
+
symbolic_links = 0
|
|
749
|
+
log_raw = OFF
|
|
750
|
+
binlog_encryption = ON
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
### 7.4 Redis
|
|
754
|
+
|
|
755
|
+
Redis was designed for use within trusted networks and historically had minimal
|
|
756
|
+
security features. Modern Redis (6.0+) includes ACLs, but hardening is still critical.
|
|
757
|
+
|
|
758
|
+
**ACL system (Redis 6+):**
|
|
759
|
+
|
|
760
|
+
```redis
|
|
761
|
+
# Define application user with restricted commands and key patterns
|
|
762
|
+
ACL SETUSER app_user on >strong_password ~app:* ~session:* +get +set +del +expire +ttl -@admin -@dangerous
|
|
763
|
+
|
|
764
|
+
# Define monitoring user
|
|
765
|
+
ACL SETUSER monitor on >monitor_password +info +ping +client|list -@all
|
|
766
|
+
|
|
767
|
+
# Disable default user
|
|
768
|
+
ACL SETUSER default off
|
|
769
|
+
```
|
|
770
|
+
|
|
771
|
+
**Configuration hardening:**
|
|
772
|
+
|
|
773
|
+
```conf
|
|
774
|
+
# redis.conf security settings
|
|
775
|
+
bind 10.0.1.10 # Bind to specific internal IP
|
|
776
|
+
protected-mode yes # Reject external connections
|
|
777
|
+
requirepass "strong-password" # Set authentication password (pre-ACL fallback)
|
|
778
|
+
|
|
779
|
+
# Disable dangerous commands
|
|
780
|
+
rename-command FLUSHALL ""
|
|
781
|
+
rename-command FLUSHDB ""
|
|
782
|
+
rename-command CONFIG ""
|
|
783
|
+
rename-command DEBUG ""
|
|
784
|
+
rename-command SHUTDOWN ""
|
|
785
|
+
|
|
786
|
+
# TLS
|
|
787
|
+
tls-port 6380
|
|
788
|
+
port 0 # Disable non-TLS port
|
|
789
|
+
tls-cert-file /etc/ssl/redis.crt
|
|
790
|
+
tls-key-file /etc/ssl/redis.key
|
|
791
|
+
tls-ca-cert-file /etc/ssl/ca.crt
|
|
792
|
+
tls-auth-clients yes # Require client certificates
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
**P2PInfect botnet (2024)**: Targeted internet-exposed Redis instances, installed
|
|
796
|
+
Monero cryptominers and ransomware modules. Underscores the critical need to never
|
|
797
|
+
expose Redis to the internet.
|
|
798
|
+
|
|
799
|
+
### 7.5 Cloud-Managed Databases
|
|
800
|
+
|
|
801
|
+
**AWS RDS / Aurora:**
|
|
802
|
+
- Enable encryption at rest (KMS). Cannot be enabled after creation.
|
|
803
|
+
- Use IAM database authentication where possible.
|
|
804
|
+
- Enable Performance Insights and Enhanced Monitoring.
|
|
805
|
+
- Configure automated backups with encryption.
|
|
806
|
+
- Use Security Groups, not IP-based rules.
|
|
807
|
+
- Store credentials in AWS Secrets Manager with automatic rotation.
|
|
808
|
+
- Enable Multi-AZ for high availability.
|
|
809
|
+
- Enable audit logging (pgAudit for PostgreSQL, general/slow query logs for MySQL).
|
|
810
|
+
|
|
811
|
+
**Google Cloud SQL:**
|
|
812
|
+
- Enable require_ssl flag for all instances.
|
|
813
|
+
- Use Cloud SQL Auth Proxy instead of direct IP connections.
|
|
814
|
+
- Enable automatic storage encryption (default with Google-managed keys,
|
|
815
|
+
or use CMEK for customer control).
|
|
816
|
+
- Configure authorized networks carefully -- prefer private IP.
|
|
817
|
+
- Use IAM conditions for fine-grained access.
|
|
818
|
+
|
|
819
|
+
**MongoDB Atlas:**
|
|
820
|
+
- Enable IP Access List (whitelist) -- never use 0.0.0.0/0.
|
|
821
|
+
- Enable database auditing in cluster configuration.
|
|
822
|
+
- Use VPC/VNet Peering for private connectivity.
|
|
823
|
+
- Enable encryption at rest with customer-managed keys.
|
|
824
|
+
- Configure LDAP or X.509 authentication.
|
|
825
|
+
- Enable Advanced Threat Protection alerts.
|
|
826
|
+
- Use Atlas Data Lake for analytics to avoid querying production.
|
|
827
|
+
|
|
828
|
+
---
|
|
829
|
+
|
|
830
|
+
## 8. Incident Patterns
|
|
831
|
+
|
|
832
|
+
### 8.1 Database Breach Detection
|
|
833
|
+
|
|
834
|
+
**Indicators of Compromise (IoCs):**
|
|
835
|
+
|
|
836
|
+
- Spike in authentication failures from unfamiliar IP addresses.
|
|
837
|
+
- Abnormally high sequential scan volume or data read rates.
|
|
838
|
+
- Bulk SELECT or COPY/DUMP operations outside normal business hours.
|
|
839
|
+
- New database users or roles created without change tickets.
|
|
840
|
+
- Privilege escalation events (GRANT/REVOKE operations).
|
|
841
|
+
- Queries accessing tables not normally used by the connected application.
|
|
842
|
+
- Database connections from unexpected networks or geographies.
|
|
843
|
+
- Service accounts used for interactive login.
|
|
844
|
+
- Large outbound data transfers from database server.
|
|
845
|
+
|
|
846
|
+
### 8.2 Data Exfiltration Indicators
|
|
847
|
+
|
|
848
|
+
According to Unit 42's 2025 Incident Response Report, the median time to exfiltration
|
|
849
|
+
is now just two days from initial compromise, with nearly one in five cases seeing data
|
|
850
|
+
stolen within the first hour.
|
|
851
|
+
|
|
852
|
+
**Detection methods:**
|
|
853
|
+
|
|
854
|
+
- Monitor query result sizes -- flag queries returning >10,000 rows.
|
|
855
|
+
- Track connection duration -- long-lived sessions may indicate data staging.
|
|
856
|
+
- Alert on COPY TO, pg_dump, mysqldump, mongodump from non-backup users.
|
|
857
|
+
- Monitor outbound network traffic volume from database servers.
|
|
858
|
+
- Use Data Loss Prevention (DLP) tools on database egress points.
|
|
859
|
+
- Compare query patterns against baseline using anomaly detection.
|
|
860
|
+
|
|
861
|
+
### 8.3 Incident Response Playbook
|
|
862
|
+
|
|
863
|
+
1. **Contain**: Immediately revoke compromised credentials. Block suspicious IPs
|
|
864
|
+
at firewall level. Do not shut down the database (preserve evidence).
|
|
865
|
+
2. **Preserve**: Capture database logs, connection logs, query history.
|
|
866
|
+
Snapshot the database for forensic analysis.
|
|
867
|
+
3. **Assess**: Determine scope -- which tables were accessed, what data was read,
|
|
868
|
+
what was modified. Check for backdoor accounts or triggers.
|
|
869
|
+
4. **Eradicate**: Remove unauthorized accounts, backdoors, and malicious triggers
|
|
870
|
+
or stored procedures. Rotate all credentials.
|
|
871
|
+
5. **Recover**: Restore from known-good backup if data integrity is compromised.
|
|
872
|
+
Rebuild from clean state if backdoors are suspected.
|
|
873
|
+
6. **Report**: Notify affected parties per regulatory requirements (GDPR: 72 hours,
|
|
874
|
+
PCI-DSS: immediately to card brands, state breach notification laws).
|
|
875
|
+
|
|
876
|
+
---
|
|
877
|
+
|
|
878
|
+
## 9. Compliance & Standards
|
|
879
|
+
|
|
880
|
+
### 9.1 PCI-DSS Requirements
|
|
881
|
+
|
|
882
|
+
**Requirement 2 -- Secure System Configuration:**
|
|
883
|
+
- Change all vendor-supplied default passwords before deployment.
|
|
884
|
+
- Disable unnecessary services, protocols, and ports.
|
|
885
|
+
- Configure system security parameters to prevent misuse.
|
|
886
|
+
- Remove all unnecessary default accounts.
|
|
887
|
+
|
|
888
|
+
**Requirement 3 -- Protect Stored Cardholder Data:**
|
|
889
|
+
- Keep cardholder data storage to a minimum with data retention policies.
|
|
890
|
+
- Do not store sensitive authentication data after authorization.
|
|
891
|
+
- Mask PAN when displayed (show first six and last four digits maximum).
|
|
892
|
+
- Render PAN unreadable anywhere it is stored (encryption, hashing, truncation).
|
|
893
|
+
- Protect encryption keys against disclosure and misuse.
|
|
894
|
+
|
|
895
|
+
**Requirement 8 -- Identify and Authenticate Access:**
|
|
896
|
+
- Assign unique IDs to each person with computer access.
|
|
897
|
+
- Implement multi-factor authentication for remote access.
|
|
898
|
+
- Encrypt all passwords during transmission and storage.
|
|
899
|
+
- Remove/disable inactive user accounts within 90 days.
|
|
900
|
+
|
|
901
|
+
**Requirement 10 -- Log and Monitor Access:**
|
|
902
|
+
- Implement audit trails for all access to system components.
|
|
903
|
+
- Record user identification, event type, date/time, success/failure.
|
|
904
|
+
- Review logs daily using automated tools.
|
|
905
|
+
- Retain audit trail history for at least one year, with three months immediately available.
|
|
906
|
+
|
|
907
|
+
### 9.2 SOC2 Database Controls
|
|
908
|
+
|
|
909
|
+
**Security (Common Criteria):**
|
|
910
|
+
- CC6.1: Logical access security over information assets (database access controls).
|
|
911
|
+
- CC6.3: Role-based access, least privilege, segregation of duties.
|
|
912
|
+
- CC6.6: Restrictions on software installation (database extensions).
|
|
913
|
+
- CC7.2: Monitor system components for anomalies (database activity monitoring).
|
|
914
|
+
|
|
915
|
+
**Availability:**
|
|
916
|
+
- A1.2: Environmental protections (high availability, failover).
|
|
917
|
+
- Backup and recovery procedures tested regularly.
|
|
918
|
+
|
|
919
|
+
**Confidentiality:**
|
|
920
|
+
- C1.1: Identify and protect confidential information (encryption at rest).
|
|
921
|
+
- C1.2: Dispose of confidential information when no longer needed.
|
|
922
|
+
|
|
923
|
+
### 9.3 GDPR Data Storage Requirements
|
|
924
|
+
|
|
925
|
+
- **Data minimization** (Article 5(1)(c)): Only store personal data that is necessary.
|
|
926
|
+
- **Storage limitation** (Article 5(1)(e)): Define retention periods, delete data when
|
|
927
|
+
no longer needed.
|
|
928
|
+
- **Integrity and confidentiality** (Article 5(1)(f)): Encryption at rest and in transit,
|
|
929
|
+
access controls, protection against unauthorized processing.
|
|
930
|
+
- **Right to erasure** (Article 17): Implement the ability to delete individual records
|
|
931
|
+
on request. This includes backups -- consider backup rotation cycles.
|
|
932
|
+
- **Data breach notification** (Articles 33-34): Report breaches to supervisory authority
|
|
933
|
+
within 72 hours. Notify affected individuals without undue delay if high risk.
|
|
934
|
+
- **Data Protection Impact Assessment** (Article 35): Required for high-risk processing
|
|
935
|
+
(large-scale processing of sensitive data).
|
|
936
|
+
|
|
937
|
+
**PostgreSQL GDPR implementation patterns:**
|
|
938
|
+
|
|
939
|
+
```sql
|
|
940
|
+
-- Data retention: automatic cleanup of expired records
|
|
941
|
+
CREATE OR REPLACE FUNCTION enforce_retention() RETURNS void AS $$
|
|
942
|
+
BEGIN
|
|
943
|
+
DELETE FROM user_activity_logs WHERE created_at < NOW() - INTERVAL '2 years';
|
|
944
|
+
DELETE FROM session_data WHERE expires_at < NOW();
|
|
945
|
+
RAISE NOTICE 'Retention policy enforced at %', NOW();
|
|
946
|
+
END;
|
|
947
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
|
948
|
+
|
|
949
|
+
-- Right to erasure: anonymize user data
|
|
950
|
+
CREATE OR REPLACE FUNCTION anonymize_user(target_user_id INT) RETURNS void AS $$
|
|
951
|
+
BEGIN
|
|
952
|
+
UPDATE users SET
|
|
953
|
+
email = 'redacted-' || target_user_id || '@deleted.local',
|
|
954
|
+
name = 'REDACTED',
|
|
955
|
+
phone = NULL,
|
|
956
|
+
address = NULL,
|
|
957
|
+
anonymized_at = NOW()
|
|
958
|
+
WHERE id = target_user_id;
|
|
959
|
+
|
|
960
|
+
DELETE FROM user_sessions WHERE user_id = target_user_id;
|
|
961
|
+
DELETE FROM user_tokens WHERE user_id = target_user_id;
|
|
962
|
+
END;
|
|
963
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
---
|
|
967
|
+
|
|
968
|
+
## 10. Code Examples
|
|
969
|
+
|
|
970
|
+
### 10.1 Secure Connection Configuration -- TypeScript/Knex
|
|
971
|
+
|
|
972
|
+
```typescript
|
|
973
|
+
// VULNERABLE: No SSL, credentials hardcoded
|
|
974
|
+
const db = require('knex')({
|
|
975
|
+
client: 'pg',
|
|
976
|
+
connection: {
|
|
977
|
+
host: 'db.example.com',
|
|
978
|
+
user: 'root', // superuser!
|
|
979
|
+
password: 'password123', // hardcoded!
|
|
980
|
+
database: 'production',
|
|
981
|
+
ssl: false, // plaintext!
|
|
982
|
+
},
|
|
983
|
+
});
|
|
984
|
+
|
|
985
|
+
// SECURE: SSL verified, credentials from secrets manager, least privilege
|
|
986
|
+
import knex from 'knex';
|
|
987
|
+
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
|
|
988
|
+
import fs from 'fs';
|
|
989
|
+
|
|
990
|
+
async function createSecureDb(): Promise<knex.Knex> {
|
|
991
|
+
const sm = new SecretsManager({ region: 'us-east-1' });
|
|
992
|
+
const secret = await sm.getSecretValue({ SecretId: 'prod/db/app-credentials' });
|
|
993
|
+
const creds = JSON.parse(secret.SecretString!);
|
|
994
|
+
|
|
995
|
+
return knex({
|
|
996
|
+
client: 'pg',
|
|
997
|
+
connection: {
|
|
998
|
+
host: creds.host,
|
|
999
|
+
port: creds.port,
|
|
1000
|
+
user: creds.username, // least-privilege app user
|
|
1001
|
+
password: creds.password, // from secrets manager
|
|
1002
|
+
database: creds.dbname,
|
|
1003
|
+
ssl: {
|
|
1004
|
+
rejectUnauthorized: true, // verify server certificate
|
|
1005
|
+
ca: fs.readFileSync('/etc/ssl/certs/rds-ca-bundle.pem').toString(),
|
|
1006
|
+
},
|
|
1007
|
+
},
|
|
1008
|
+
pool: { min: 2, max: 10 },
|
|
1009
|
+
acquireConnectionTimeout: 10000,
|
|
1010
|
+
});
|
|
1011
|
+
}
|
|
1012
|
+
```
|
|
1013
|
+
|
|
1014
|
+
### 10.2 Secure Connection Configuration -- Python/SQLAlchemy
|
|
1015
|
+
|
|
1016
|
+
```python
|
|
1017
|
+
# VULNERABLE: No SSL, credentials in code, superuser
|
|
1018
|
+
from sqlalchemy import create_engine
|
|
1019
|
+
|
|
1020
|
+
engine = create_engine(
|
|
1021
|
+
"postgresql://postgres:admin@db.example.com:5432/production"
|
|
1022
|
+
)
|
|
1023
|
+
|
|
1024
|
+
# SECURE: SSL verified, credentials from secrets manager, connection limits
|
|
1025
|
+
import json
|
|
1026
|
+
import ssl
|
|
1027
|
+
import boto3
|
|
1028
|
+
from sqlalchemy import create_engine, event
|
|
1029
|
+
from sqlalchemy.pool import QueuePool
|
|
1030
|
+
|
|
1031
|
+
def get_db_credentials():
|
|
1032
|
+
client = boto3.client('secretsmanager', region_name='us-east-1')
|
|
1033
|
+
secret = client.get_secret_value(SecretId='prod/db/app-credentials')
|
|
1034
|
+
return json.loads(secret['SecretString'])
|
|
1035
|
+
|
|
1036
|
+
def create_secure_engine():
|
|
1037
|
+
creds = get_db_credentials()
|
|
1038
|
+
|
|
1039
|
+
ssl_context = ssl.create_default_context(
|
|
1040
|
+
cafile='/etc/ssl/certs/rds-ca-bundle.pem'
|
|
1041
|
+
)
|
|
1042
|
+
ssl_context.check_hostname = True
|
|
1043
|
+
ssl_context.verify_mode = ssl.CERT_REQUIRED
|
|
1044
|
+
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2
|
|
1045
|
+
|
|
1046
|
+
engine = create_engine(
|
|
1047
|
+
f"postgresql://{creds['username']}:{creds['password']}"
|
|
1048
|
+
f"@{creds['host']}:{creds['port']}/{creds['dbname']}",
|
|
1049
|
+
connect_args={'ssl_context': ssl_context},
|
|
1050
|
+
poolclass=QueuePool,
|
|
1051
|
+
pool_size=5,
|
|
1052
|
+
max_overflow=10,
|
|
1053
|
+
pool_timeout=30,
|
|
1054
|
+
pool_recycle=1800, # recycle connections every 30 min
|
|
1055
|
+
pool_pre_ping=True, # validate connections before use
|
|
1056
|
+
)
|
|
1057
|
+
|
|
1058
|
+
# Log slow queries for monitoring
|
|
1059
|
+
@event.listens_for(engine, "before_cursor_execute")
|
|
1060
|
+
def log_query_start(conn, cursor, statement, parameters, context, executemany):
|
|
1061
|
+
conn.info.setdefault('query_start_time', []).append(time.time())
|
|
1062
|
+
|
|
1063
|
+
return engine
|
|
1064
|
+
```
|
|
1065
|
+
|
|
1066
|
+
### 10.3 SQL Injection Prevention at Database Level
|
|
1067
|
+
|
|
1068
|
+
```sql
|
|
1069
|
+
-- VULNERABLE: Dynamic SQL with concatenation in stored procedure
|
|
1070
|
+
CREATE OR REPLACE FUNCTION get_user_orders(user_email TEXT)
|
|
1071
|
+
RETURNS TABLE(order_id INT, total NUMERIC) AS $$
|
|
1072
|
+
BEGIN
|
|
1073
|
+
RETURN QUERY EXECUTE
|
|
1074
|
+
'SELECT id, total FROM orders WHERE email = ''' || user_email || '''';
|
|
1075
|
+
END;
|
|
1076
|
+
$$ LANGUAGE plpgsql;
|
|
1077
|
+
-- Attack: get_user_orders($$'; DROP TABLE orders; --$$)
|
|
1078
|
+
|
|
1079
|
+
-- SECURE: Parameterized dynamic SQL
|
|
1080
|
+
CREATE OR REPLACE FUNCTION get_user_orders(user_email TEXT)
|
|
1081
|
+
RETURNS TABLE(order_id INT, total NUMERIC) AS $$
|
|
1082
|
+
BEGIN
|
|
1083
|
+
RETURN QUERY EXECUTE
|
|
1084
|
+
'SELECT id, total FROM orders WHERE email = $1'
|
|
1085
|
+
USING user_email;
|
|
1086
|
+
END;
|
|
1087
|
+
$$ LANGUAGE plpgsql;
|
|
1088
|
+
```
|
|
1089
|
+
|
|
1090
|
+
### 10.4 Row-Level Security for Multi-Tenant Applications
|
|
1091
|
+
|
|
1092
|
+
```sql
|
|
1093
|
+
-- Create tenant isolation with RLS
|
|
1094
|
+
CREATE TABLE tenant_data (
|
|
1095
|
+
id SERIAL PRIMARY KEY,
|
|
1096
|
+
tenant_id INT NOT NULL,
|
|
1097
|
+
data JSONB NOT NULL,
|
|
1098
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
1099
|
+
);
|
|
1100
|
+
|
|
1101
|
+
-- Enable and force RLS
|
|
1102
|
+
ALTER TABLE tenant_data ENABLE ROW LEVEL SECURITY;
|
|
1103
|
+
ALTER TABLE tenant_data FORCE ROW LEVEL SECURITY;
|
|
1104
|
+
|
|
1105
|
+
-- Isolation policy: each tenant sees only their data
|
|
1106
|
+
CREATE POLICY tenant_isolation ON tenant_data
|
|
1107
|
+
FOR ALL
|
|
1108
|
+
USING (tenant_id = current_setting('app.tenant_id')::INT)
|
|
1109
|
+
WITH CHECK (tenant_id = current_setting('app.tenant_id')::INT);
|
|
1110
|
+
|
|
1111
|
+
-- Application sets tenant context per request
|
|
1112
|
+
-- SET LOCAL ensures it is transaction-scoped
|
|
1113
|
+
BEGIN;
|
|
1114
|
+
SELECT set_config('app.tenant_id', '42', true); -- true = local to transaction
|
|
1115
|
+
SELECT * FROM tenant_data; -- only sees tenant 42's data
|
|
1116
|
+
COMMIT;
|
|
1117
|
+
```
|
|
1118
|
+
|
|
1119
|
+
### 10.5 Complete Least-Privilege Role Hierarchy
|
|
1120
|
+
|
|
1121
|
+
```sql
|
|
1122
|
+
-- Base roles (no login capability)
|
|
1123
|
+
CREATE ROLE app_readonly NOLOGIN;
|
|
1124
|
+
CREATE ROLE app_readwrite NOLOGIN;
|
|
1125
|
+
CREATE ROLE app_admin NOLOGIN;
|
|
1126
|
+
|
|
1127
|
+
-- Schema permissions
|
|
1128
|
+
GRANT USAGE ON SCHEMA public TO app_readonly, app_readwrite, app_admin;
|
|
1129
|
+
|
|
1130
|
+
-- Read-only: SELECT on all tables
|
|
1131
|
+
GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_readonly;
|
|
1132
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO app_readonly;
|
|
1133
|
+
|
|
1134
|
+
-- Read-write: SELECT, INSERT, UPDATE, DELETE (no DDL)
|
|
1135
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_readwrite;
|
|
1136
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_readwrite;
|
|
1137
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
1138
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_readwrite;
|
|
1139
|
+
|
|
1140
|
+
-- Admin: adds DDL capabilities
|
|
1141
|
+
GRANT app_readwrite TO app_admin;
|
|
1142
|
+
GRANT CREATE ON SCHEMA public TO app_admin;
|
|
1143
|
+
|
|
1144
|
+
-- Login users inherit from base roles
|
|
1145
|
+
CREATE USER api_service WITH LOGIN PASSWORD 'from-secrets-manager'
|
|
1146
|
+
CONNECTION LIMIT 20 IN ROLE app_readwrite;
|
|
1147
|
+
|
|
1148
|
+
CREATE USER analyst WITH LOGIN PASSWORD 'from-secrets-manager'
|
|
1149
|
+
CONNECTION LIMIT 5 IN ROLE app_readonly;
|
|
1150
|
+
|
|
1151
|
+
CREATE USER migrator WITH LOGIN PASSWORD 'from-secrets-manager'
|
|
1152
|
+
CONNECTION LIMIT 2 IN ROLE app_admin
|
|
1153
|
+
VALID UNTIL '2025-06-30'; -- temporary elevated access
|
|
1154
|
+
```
|
|
1155
|
+
|
|
1156
|
+
---
|
|
1157
|
+
|
|
1158
|
+
## References
|
|
1159
|
+
|
|
1160
|
+
- OWASP Database Security Cheat Sheet: https://cheatsheetseries.owasp.org/cheatsheets/Database_Security_Cheat_Sheet.html
|
|
1161
|
+
- OWASP SQL Injection Prevention: https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
|
|
1162
|
+
- pgAudit -- PostgreSQL Audit Extension: https://www.pgaudit.org/
|
|
1163
|
+
- MongoDB Security Checklist: https://www.mongodb.com/docs/manual/administration/security-checklist/
|
|
1164
|
+
- Redis Security Documentation: https://redis.io/docs/management/security/
|
|
1165
|
+
- CIS Benchmarks for PostgreSQL, MySQL, MongoDB: https://www.cisecurity.org/cis-benchmarks
|
|
1166
|
+
- AWS RDS Security Best Practices: https://aws.amazon.com/blogs/database/overview-of-security-best-practices-for-amazon-rds-for-postgresql-and-amazon-aurora-postgresql-compatible-edition/
|
|
1167
|
+
- Microsoft 250M Record Breach (Comparitech): https://www.comparitech.com/blog/information-security/microsoft-customer-service-data-leak/
|
|
1168
|
+
- Shanghai Police Breach (The Register): https://www.theregister.com/2022/07/05/shanghai_police_database_for_sell/
|
|
1169
|
+
- MongoBleed CVE-2025-14847 (Arctic Wolf): https://arcticwolf.com/resources/blog/cve-2025-14847/
|
|
1170
|
+
- Redis CVE-2025-49844 (Wiz): https://www.wiz.io/blog/wiz-research-redis-rce-cve-2025-49844
|
|
1171
|
+
- Verizon 2025 Data Breach Investigations Report: https://www.verizon.com/business/resources/reports/dbir/
|