blockmine 1.21.0 → 1.23.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/.claude/agents/README.md +469 -0
- package/.claude/agents/auth-route-debugger.md +118 -0
- package/.claude/agents/auth-route-tester.md +93 -0
- package/.claude/agents/auto-error-resolver.md +97 -0
- package/.claude/agents/build-optimizer.md +236 -0
- package/.claude/agents/code-architecture-reviewer.md +83 -0
- package/.claude/agents/code-refactor-master.md +94 -0
- package/.claude/agents/cost-optimizer.md +134 -0
- package/.claude/agents/deployment-orchestrator.md +113 -0
- package/.claude/agents/documentation-architect.md +82 -0
- package/.claude/agents/frontend-error-fixer.md +77 -0
- package/.claude/agents/iac-code-generator.md +71 -0
- package/.claude/agents/incident-responder.md +346 -0
- package/.claude/agents/infrastructure-architect.md +31 -0
- package/.claude/agents/kubernetes-specialist.md +56 -0
- package/.claude/agents/migration-planner.md +181 -0
- package/.claude/agents/network-architect.md +196 -0
- package/.claude/agents/plan-reviewer.md +52 -0
- package/.claude/agents/refactor-planner.md +63 -0
- package/.claude/agents/security-scanner.md +102 -0
- package/.claude/agents/web-research-specialist.md +78 -0
- package/.claude/commands/cost-analysis.md +315 -0
- package/.claude/commands/dev-docs-update.md +55 -0
- package/.claude/commands/dev-docs.md +51 -0
- package/.claude/commands/incident-debug.md +247 -0
- package/.claude/commands/infra-plan.md +81 -0
- package/.claude/commands/migration-plan.md +478 -0
- package/.claude/commands/route-research-for-testing.md +37 -0
- package/.claude/commands/security-review.md +66 -0
- package/.claude/hooks/CONFIG.md +448 -0
- package/.claude/hooks/README.md +163 -0
- package/.claude/hooks/SKILL_ACTIVATION_COMPLETE.md +226 -0
- package/.claude/hooks/WINDOWS_HOOKS_README.md +151 -0
- package/.claude/hooks/add-skill-activation-banners.ts +132 -0
- package/.claude/hooks/comprehensive-skill-test.ts +1315 -0
- package/.claude/hooks/error-handling-reminder.sh +12 -0
- package/.claude/hooks/error-handling-reminder.ts +222 -0
- package/.claude/hooks/k8s-manifest-validator.sh +56 -0
- package/.claude/hooks/package-lock.json +556 -0
- package/.claude/hooks/package.json +16 -0
- package/.claude/hooks/post-tool-use-tracker.ps1 +174 -0
- package/.claude/hooks/post-tool-use-tracker.sh +183 -0
- package/.claude/hooks/security-policy-check.sh +247 -0
- package/.claude/hooks/skill-activation-prompt.ps1 +10 -0
- package/.claude/hooks/skill-activation-prompt.sh +10 -0
- package/.claude/hooks/skill-activation-prompt.ts +141 -0
- package/.claude/hooks/stop-build-check-enhanced.sh +130 -0
- package/.claude/hooks/terraform-validator.sh +53 -0
- package/.claude/hooks/test-input.json +7 -0
- package/.claude/hooks/test-skill-activation.ts +427 -0
- package/.claude/hooks/trigger-build-resolver.sh +79 -0
- package/.claude/hooks/tsc-check.sh +173 -0
- package/.claude/hooks/tsconfig.json +19 -0
- package/.claude/settings.json +59 -0
- package/.claude/settings.local.json +36 -14
- package/.claude/skills/README.md +507 -0
- package/.claude/skills/api-engineering/SKILL.md +63 -0
- package/.claude/skills/api-engineering/resources/api-versioning.md +88 -0
- package/.claude/skills/api-engineering/resources/graphql-patterns.md +106 -0
- package/.claude/skills/api-engineering/resources/rate-limiting.md +118 -0
- package/.claude/skills/api-engineering/resources/rest-api-design.md +105 -0
- package/.claude/skills/backend-dev-guidelines/SKILL.md +306 -0
- package/.claude/skills/backend-dev-guidelines/resources/architecture-overview.md +451 -0
- package/.claude/skills/backend-dev-guidelines/resources/async-and-errors.md +307 -0
- package/.claude/skills/backend-dev-guidelines/resources/complete-examples.md +638 -0
- package/.claude/skills/backend-dev-guidelines/resources/configuration.md +275 -0
- package/.claude/skills/backend-dev-guidelines/resources/database-patterns.md +224 -0
- package/.claude/skills/backend-dev-guidelines/resources/middleware-guide.md +213 -0
- package/.claude/skills/backend-dev-guidelines/resources/routing-and-controllers.md +756 -0
- package/.claude/skills/backend-dev-guidelines/resources/sentry-and-monitoring.md +336 -0
- package/.claude/skills/backend-dev-guidelines/resources/services-and-repositories.md +789 -0
- package/.claude/skills/backend-dev-guidelines/resources/testing-guide.md +235 -0
- package/.claude/skills/backend-dev-guidelines/resources/validation-patterns.md +754 -0
- package/.claude/skills/budget-and-cost-management/SKILL.md +850 -0
- package/.claude/skills/build-engineering/SKILL.md +431 -0
- package/.claude/skills/build-engineering/resources/artifact-repositories.md +72 -0
- package/.claude/skills/build-engineering/resources/build-caching.md +96 -0
- package/.claude/skills/build-engineering/resources/build-pipelines.md +105 -0
- package/.claude/skills/build-engineering/resources/build-security.md +95 -0
- package/.claude/skills/build-engineering/resources/build-systems.md +389 -0
- package/.claude/skills/build-engineering/resources/compilation-optimization.md +201 -0
- package/.claude/skills/build-engineering/resources/dependency-management.md +73 -0
- package/.claude/skills/build-engineering/resources/monorepo-builds.md +110 -0
- package/.claude/skills/build-engineering/resources/performance-optimization.md +113 -0
- package/.claude/skills/build-engineering/resources/reproducible-builds.md +82 -0
- package/.claude/skills/cloud-engineering/SKILL.md +675 -0
- package/.claude/skills/cloud-engineering/resources/aws-patterns.md +742 -0
- package/.claude/skills/cloud-engineering/resources/azure-patterns.md +714 -0
- package/.claude/skills/cloud-engineering/resources/cleared-cloud-environments.md +987 -0
- package/.claude/skills/cloud-engineering/resources/cloud-cost-optimization.md +757 -0
- package/.claude/skills/cloud-engineering/resources/cloud-networking.md +1058 -0
- package/.claude/skills/cloud-engineering/resources/cloud-security-tools.md +1530 -0
- package/.claude/skills/cloud-engineering/resources/cloud-security.md +990 -0
- package/.claude/skills/cloud-engineering/resources/gcp-patterns.md +758 -0
- package/.claude/skills/cloud-engineering/resources/migration-strategies.md +820 -0
- package/.claude/skills/cloud-engineering/resources/multi-cloud-strategies.md +670 -0
- package/.claude/skills/cloud-engineering/resources/oci-patterns.md +1198 -0
- package/.claude/skills/cloud-engineering/resources/serverless-patterns.md +795 -0
- package/.claude/skills/cloud-engineering/resources/well-architected-frameworks.md +966 -0
- package/.claude/skills/cybersecurity/SKILL.md +409 -0
- package/.claude/skills/cybersecurity/resources/security-architecture.md +266 -0
- package/.claude/skills/database-engineering/SKILL.md +61 -0
- package/.claude/skills/database-engineering/resources/backup-and-recovery.md +72 -0
- package/.claude/skills/database-engineering/resources/database-replication.md +63 -0
- package/.claude/skills/database-engineering/resources/postgresql-fundamentals.md +70 -0
- package/.claude/skills/database-engineering/resources/query-optimization.md +68 -0
- package/.claude/skills/devsecops/SKILL.md +374 -0
- package/.claude/skills/devsecops/resources/ci-cd-security.md +204 -0
- package/.claude/skills/devsecops/resources/compliance-automation.md +530 -0
- package/.claude/skills/devsecops/resources/compliance-frameworks.md +2322 -0
- package/.claude/skills/devsecops/resources/container-security.md +915 -0
- package/.claude/skills/devsecops/resources/cspm-integration.md +1440 -0
- package/.claude/skills/devsecops/resources/policy-enforcement.md +619 -0
- package/.claude/skills/devsecops/resources/secrets-management.md +755 -0
- package/.claude/skills/devsecops/resources/security-monitoring.md +146 -0
- package/.claude/skills/devsecops/resources/security-scanning.md +887 -0
- package/.claude/skills/devsecops/resources/security-testing.md +203 -0
- package/.claude/skills/devsecops/resources/supply-chain-security.md +518 -0
- package/.claude/skills/devsecops/resources/vulnerability-management.md +481 -0
- package/.claude/skills/devsecops/resources/zero-trust-architecture.md +177 -0
- package/.claude/skills/documentation-as-code/SKILL.md +323 -0
- package/.claude/skills/documentation-as-code/resources/api-documentation.md +90 -0
- package/.claude/skills/documentation-as-code/resources/changelog-management.md +79 -0
- package/.claude/skills/documentation-as-code/resources/diagram-generation.md +44 -0
- package/.claude/skills/documentation-as-code/resources/docs-as-code-workflow.md +99 -0
- package/.claude/skills/documentation-as-code/resources/documentation-automation.md +68 -0
- package/.claude/skills/documentation-as-code/resources/documentation-sites.md +79 -0
- package/.claude/skills/documentation-as-code/resources/markdown-best-practices.md +162 -0
- package/.claude/skills/documentation-as-code/resources/openapi-specification.md +77 -0
- package/.claude/skills/documentation-as-code/resources/readme-engineering.md +60 -0
- package/.claude/skills/documentation-as-code/resources/technical-writing-guide.md +202 -0
- package/.claude/skills/engineering-management/SKILL.md +356 -0
- package/.claude/skills/engineering-management/resources/career-ladders.md +609 -0
- package/.claude/skills/engineering-management/resources/hiring-and-assessment.md +555 -0
- package/.claude/skills/engineering-management/resources/one-on-one-guides.md +609 -0
- package/.claude/skills/engineering-management/resources/resource-planning.md +557 -0
- package/.claude/skills/engineering-management/resources/team-organization-patterns.md +491 -0
- package/.claude/skills/engineering-management/resources/technical-interviews.md +474 -0
- package/.claude/skills/engineering-operations-management/SKILL.md +817 -0
- package/.claude/skills/error-tracking/SKILL.md +379 -0
- package/.claude/skills/frontend-dev-guidelines/SKILL.md +403 -0
- package/.claude/skills/frontend-dev-guidelines/resources/common-patterns.md +331 -0
- package/.claude/skills/frontend-dev-guidelines/resources/complete-examples.md +872 -0
- package/.claude/skills/frontend-dev-guidelines/resources/component-patterns.md +502 -0
- package/.claude/skills/frontend-dev-guidelines/resources/data-fetching.md +767 -0
- package/.claude/skills/frontend-dev-guidelines/resources/file-organization.md +502 -0
- package/.claude/skills/frontend-dev-guidelines/resources/loading-and-error-states.md +501 -0
- package/.claude/skills/frontend-dev-guidelines/resources/performance.md +406 -0
- package/.claude/skills/frontend-dev-guidelines/resources/routing-guide.md +364 -0
- package/.claude/skills/frontend-dev-guidelines/resources/styling-guide.md +428 -0
- package/.claude/skills/frontend-dev-guidelines/resources/typescript-standards.md +418 -0
- package/.claude/skills/general-it-engineering/SKILL.md +393 -0
- package/.claude/skills/general-it-engineering/resources/asset-management.md +712 -0
- package/.claude/skills/general-it-engineering/resources/automation-orchestration.md +817 -0
- package/.claude/skills/general-it-engineering/resources/business-continuity.md +786 -0
- package/.claude/skills/general-it-engineering/resources/change-management.md +715 -0
- package/.claude/skills/general-it-engineering/resources/enterprise-monitoring.md +729 -0
- package/.claude/skills/general-it-engineering/resources/help-desk-operations.md +738 -0
- package/.claude/skills/general-it-engineering/resources/incident-service-management.md +834 -0
- package/.claude/skills/general-it-engineering/resources/it-governance.md +753 -0
- package/.claude/skills/general-it-engineering/resources/itil-framework.md +503 -0
- package/.claude/skills/general-it-engineering/resources/service-management.md +669 -0
- package/.claude/skills/infrastructure-architecture/SKILL.md +328 -0
- package/.claude/skills/infrastructure-architecture/resources/architecture-decision-records.md +505 -0
- package/.claude/skills/infrastructure-architecture/resources/architecture-patterns.md +528 -0
- package/.claude/skills/infrastructure-architecture/resources/capacity-planning.md +453 -0
- package/.claude/skills/infrastructure-architecture/resources/cleared-environment-architecture.md +773 -0
- package/.claude/skills/infrastructure-architecture/resources/cost-architecture.md +499 -0
- package/.claude/skills/infrastructure-architecture/resources/data-architecture.md +501 -0
- package/.claude/skills/infrastructure-architecture/resources/disaster-recovery.md +535 -0
- package/.claude/skills/infrastructure-architecture/resources/migration-architecture.md +512 -0
- package/.claude/skills/infrastructure-architecture/resources/multi-region-design.md +608 -0
- package/.claude/skills/infrastructure-architecture/resources/reference-architectures.md +562 -0
- package/.claude/skills/infrastructure-architecture/resources/security-architecture.md +538 -0
- package/.claude/skills/infrastructure-architecture/resources/system-design-principles.md +489 -0
- package/.claude/skills/infrastructure-architecture/resources/workload-classification.md +1000 -0
- package/.claude/skills/infrastructure-strategy/SKILL.md +924 -0
- package/.claude/skills/network-engineering/SKILL.md +385 -0
- package/.claude/skills/network-engineering/resources/dns-management.md +738 -0
- package/.claude/skills/network-engineering/resources/load-balancing.md +820 -0
- package/.claude/skills/network-engineering/resources/network-architecture.md +546 -0
- package/.claude/skills/network-engineering/resources/network-security.md +921 -0
- package/.claude/skills/network-engineering/resources/network-troubleshooting.md +749 -0
- package/.claude/skills/network-engineering/resources/routing-switching.md +373 -0
- package/.claude/skills/network-engineering/resources/sdn-networking.md +695 -0
- package/.claude/skills/network-engineering/resources/service-mesh-networking.md +777 -0
- package/.claude/skills/network-engineering/resources/tcp-ip-protocols.md +444 -0
- package/.claude/skills/network-engineering/resources/vpn-connectivity.md +672 -0
- package/.claude/skills/observability-engineering/SKILL.md +101 -0
- package/.claude/skills/observability-engineering/resources/apm-tools.md +97 -0
- package/.claude/skills/observability-engineering/resources/correlation-strategies.md +87 -0
- package/.claude/skills/observability-engineering/resources/distributed-tracing.md +98 -0
- package/.claude/skills/observability-engineering/resources/logs-aggregation.md +118 -0
- package/.claude/skills/observability-engineering/resources/observability-cost-optimization.md +141 -0
- package/.claude/skills/observability-engineering/resources/opentelemetry.md +110 -0
- package/.claude/skills/platform-engineering/SKILL.md +555 -0
- package/.claude/skills/platform-engineering/resources/architecture-overview.md +600 -0
- package/.claude/skills/platform-engineering/resources/container-orchestration.md +916 -0
- package/.claude/skills/platform-engineering/resources/cost-optimization.md +634 -0
- package/.claude/skills/platform-engineering/resources/developer-platforms.md +670 -0
- package/.claude/skills/platform-engineering/resources/gitops-automation.md +650 -0
- package/.claude/skills/platform-engineering/resources/infrastructure-as-code.md +778 -0
- package/.claude/skills/platform-engineering/resources/infrastructure-standards.md +708 -0
- package/.claude/skills/platform-engineering/resources/multi-tenancy.md +602 -0
- package/.claude/skills/platform-engineering/resources/platform-security.md +711 -0
- package/.claude/skills/platform-engineering/resources/resource-management.md +592 -0
- package/.claude/skills/platform-engineering/resources/service-mesh.md +628 -0
- package/.claude/skills/release-engineering/SKILL.md +393 -0
- package/.claude/skills/release-engineering/resources/artifact-management.md +108 -0
- package/.claude/skills/release-engineering/resources/build-optimization.md +84 -0
- package/.claude/skills/release-engineering/resources/ci-cd-pipelines.md +411 -0
- package/.claude/skills/release-engineering/resources/deployment-strategies.md +197 -0
- package/.claude/skills/release-engineering/resources/pipeline-security.md +62 -0
- package/.claude/skills/release-engineering/resources/progressive-delivery.md +83 -0
- package/.claude/skills/release-engineering/resources/release-automation.md +68 -0
- package/.claude/skills/release-engineering/resources/release-orchestration.md +77 -0
- package/.claude/skills/release-engineering/resources/rollback-strategies.md +66 -0
- package/.claude/skills/release-engineering/resources/versioning-strategies.md +59 -0
- package/.claude/skills/route-tester/SKILL.md +392 -0
- package/.claude/skills/skill-developer/ADVANCED.md +197 -0
- package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +306 -0
- package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +152 -0
- package/.claude/skills/skill-developer/SKILL.md +430 -0
- package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +315 -0
- package/.claude/skills/skill-developer/TRIGGER_TYPES.md +305 -0
- package/.claude/skills/skill-developer/TROUBLESHOOTING.md +514 -0
- package/.claude/skills/skill-rules.json +2940 -0
- package/.claude/skills/sre/SKILL.md +464 -0
- package/.claude/skills/sre/resources/alerting-best-practices.md +282 -0
- package/.claude/skills/sre/resources/capacity-planning.md +226 -0
- package/.claude/skills/sre/resources/chaos-engineering.md +193 -0
- package/.claude/skills/sre/resources/disaster-recovery.md +232 -0
- package/.claude/skills/sre/resources/incident-management.md +436 -0
- package/.claude/skills/sre/resources/observability-stack.md +240 -0
- package/.claude/skills/sre/resources/on-call-runbooks.md +167 -0
- package/.claude/skills/sre/resources/performance-optimization.md +108 -0
- package/.claude/skills/sre/resources/reliability-patterns.md +183 -0
- package/.claude/skills/sre/resources/slo-sli-sla.md +464 -0
- package/.claude/skills/sre/resources/toil-reduction.md +145 -0
- package/.claude/skills/systems-engineering/SKILL.md +648 -0
- package/.claude/skills/systems-engineering/resources/automation-patterns.md +771 -0
- package/.claude/skills/systems-engineering/resources/configuration-management.md +998 -0
- package/.claude/skills/systems-engineering/resources/linux-administration.md +672 -0
- package/.claude/skills/systems-engineering/resources/networking-fundamentals.md +982 -0
- package/.claude/skills/systems-engineering/resources/performance-tuning.md +871 -0
- package/.claude/skills/systems-engineering/resources/powershell-scripting.md +482 -0
- package/.claude/skills/systems-engineering/resources/security-hardening.md +739 -0
- package/.claude/skills/systems-engineering/resources/shell-scripting.md +915 -0
- package/.claude/skills/systems-engineering/resources/storage-management.md +628 -0
- package/.claude/skills/systems-engineering/resources/system-monitoring.md +787 -0
- package/.claude/skills/systems-engineering/resources/troubleshooting-guide.md +753 -0
- package/.claude/skills/systems-engineering/resources/windows-administration.md +738 -0
- package/.claude/skills/technical-leadership/SKILL.md +728 -0
- package/CHANGELOG.md +102 -42
- package/CLAUDE.md +284 -0
- package/README.md +315 -71
- package/backend/docs/SECRETS_DOCUMENTATION.md +327 -0
- package/backend/jest.config.js +59 -0
- package/backend/package-lock.json +6801 -0
- package/backend/package.json +24 -4
- package/backend/prisma/migrations/20251026104609_add_websocket_api/migration.sql +33 -0
- package/backend/prisma/migrations/20251116111851_add_execution_trace/migration.sql +22 -0
- package/backend/prisma/migrations/20251120154914_add_panel_api_keys/migration.sql +21 -0
- package/backend/prisma/migrations/20251121110241_add_proxy_table/migration.sql +45 -0
- package/backend/prisma/migrations/migration_lock.toml +2 -2
- package/backend/prisma/schema.prisma +103 -1
- package/backend/src/__tests__/core/DependencyService.test.js +336 -0
- package/backend/src/__tests__/core/UserService.test.js +875 -0
- package/backend/src/__tests__/repositories/BaseRepository.test.js +146 -0
- package/backend/src/__tests__/repositories/BotRepository.test.js +118 -0
- package/backend/src/__tests__/repositories/CommandRepository.test.js +132 -0
- package/backend/src/__tests__/repositories/EventGraphRepository.test.js +93 -0
- package/backend/src/__tests__/repositories/GroupRepository.test.js +155 -0
- package/backend/src/__tests__/repositories/PermissionRepository.test.js +130 -0
- package/backend/src/__tests__/repositories/PluginRepository.test.js +107 -0
- package/backend/src/__tests__/repositories/ServerRepository.test.js +80 -0
- package/backend/src/__tests__/repositories/UserRepository.test.js +128 -0
- package/backend/src/__tests__/secretsFilter.test.js +425 -0
- package/backend/src/__tests__/services/BotLifecycleService.test.js +416 -0
- package/backend/src/__tests__/services/BotProcessManager.test.js +285 -0
- package/backend/src/__tests__/services/CacheManager.test.js +125 -0
- package/backend/src/__tests__/services/CommandExecutionService.test.js +460 -0
- package/backend/src/__tests__/services/ResourceMonitorService.test.js +207 -0
- package/backend/src/__tests__/services/TelemetryService.test.js +291 -0
- package/backend/src/__tests__/setup.js +25 -0
- package/backend/src/ai/plugin-assistant-system-prompt.md +788 -0
- package/backend/src/api/middleware/auth.js +27 -0
- package/backend/src/api/middleware/botAccess.js +7 -3
- package/backend/src/api/middleware/panelApiAuth.js +135 -0
- package/backend/src/api/routes/aiAssistant.js +995 -0
- package/backend/src/api/routes/apiKeys.js +181 -0
- package/backend/src/api/routes/auth.js +669 -633
- package/backend/src/api/routes/botCommands.js +107 -0
- package/backend/src/api/routes/botGroups.js +165 -0
- package/backend/src/api/routes/botHistory.js +108 -0
- package/backend/src/api/routes/botPermissions.js +99 -0
- package/backend/src/api/routes/botStatus.js +36 -0
- package/backend/src/api/routes/botUsers.js +162 -0
- package/backend/src/api/routes/bots.js +2451 -2360
- package/backend/src/api/routes/eventGraphs.js +4 -1
- package/backend/src/api/routes/logs.js +13 -3
- package/backend/src/api/routes/panel.js +66 -66
- package/backend/src/api/routes/panelApiKeys.js +179 -0
- package/backend/src/api/routes/pluginIde.js +1715 -135
- package/backend/src/api/routes/plugins.js +376 -218
- package/backend/src/api/routes/proxies.js +130 -0
- package/backend/src/api/routes/search.js +4 -0
- package/backend/src/api/routes/servers.js +20 -3
- package/backend/src/api/routes/settings.js +5 -0
- package/backend/src/api/routes/system.js +174 -0
- package/backend/src/api/routes/traces.js +131 -0
- package/backend/src/config/debug.config.js +36 -0
- package/backend/src/container.js +82 -0
- package/backend/src/core/BotHistoryStore.js +180 -0
- package/backend/src/core/BotManager.js +149 -868
- package/backend/src/core/BotManager.old.js +1093 -0
- package/backend/src/core/BotProcess.js +850 -191
- package/backend/src/core/EventGraphManager.js +194 -198
- package/backend/src/core/GraphExecutionEngine.js +709 -57
- package/backend/src/core/MessageQueue.js +39 -12
- package/backend/src/core/NodeRegistry.js +37 -1134
- package/backend/src/core/PluginLoader.js +99 -5
- package/backend/src/core/PluginManager.js +126 -15
- package/backend/src/core/PrismaService.js +32 -0
- package/backend/src/core/TaskScheduler.js +1 -1
- package/backend/src/core/UserService.js +3 -3
- package/backend/src/core/__tests__/PrismaService.test.js +24 -0
- package/backend/src/core/commands/README.md +305 -0
- package/backend/src/core/commands/dev.js +13 -7
- package/backend/src/core/commands/ping.js +10 -4
- package/backend/src/core/commands/whois.js +63 -0
- package/backend/src/core/config/validation.js +27 -0
- package/backend/src/core/constants/graphTypes.js +21 -0
- package/backend/src/core/node-registries/actions.js +202 -0
- package/backend/src/core/node-registries/arrays.js +155 -0
- package/backend/src/core/node-registries/bot.js +23 -0
- package/backend/src/core/node-registries/data.js +290 -0
- package/backend/src/core/node-registries/debug.js +26 -0
- package/backend/src/core/node-registries/events.js +201 -0
- package/backend/src/core/node-registries/flow.js +139 -0
- package/backend/src/core/node-registries/logic.js +62 -0
- package/backend/src/core/node-registries/math.js +42 -0
- package/backend/src/core/node-registries/objects.js +98 -0
- package/backend/src/core/node-registries/strings.js +187 -0
- package/backend/src/core/node-registries/time.js +113 -0
- package/backend/src/core/node-registries/type.js +25 -0
- package/backend/src/core/node-registries/users.js +79 -0
- package/backend/src/core/nodes/{action_bot_look_at.js → actions/bot_look_at.js} +36 -36
- package/backend/src/core/nodes/{action_bot_set_variable.js → actions/bot_set_variable.js} +32 -32
- package/backend/src/core/nodes/actions/create_command.js +189 -0
- package/backend/src/core/nodes/actions/delete_command.js +92 -0
- package/backend/src/core/nodes/{action_send_log.js → actions/send_log.js} +28 -23
- package/backend/src/core/nodes/{action_send_message.js → actions/send_message.js} +32 -32
- package/backend/src/core/nodes/actions/send_websocket_response.js +33 -0
- package/backend/src/core/nodes/actions/update_command.js +133 -0
- package/backend/src/core/nodes/arrays/get_next.js +35 -0
- package/backend/src/core/nodes/arrays/join.js +28 -0
- package/backend/src/core/nodes/{data_cast.js → data/cast.js} +10 -1
- package/backend/src/core/nodes/data/datetime_literal.js +27 -0
- package/backend/src/core/nodes/data/entity_info.js +69 -0
- package/backend/src/core/nodes/data/get_nearby_entities.js +32 -0
- package/backend/src/core/nodes/data/get_nearby_players.js +64 -0
- package/backend/src/core/nodes/{data_get_user_field.js → data/get_user_field.js} +1 -1
- package/backend/src/core/nodes/data/type_check.js +53 -0
- package/backend/src/core/nodes/{debug_log.js → debug/log.js} +16 -16
- package/backend/src/core/nodes/{flow_branch.js → flow/branch.js} +15 -15
- package/backend/src/core/nodes/{flow_break.js → flow/break.js} +14 -14
- package/backend/src/core/nodes/flow/delay.js +43 -0
- package/backend/src/core/nodes/{flow_for_each.js → flow/for_each.js} +39 -39
- package/backend/src/core/nodes/{flow_sequence.js → flow/sequence.js} +16 -16
- package/backend/src/core/nodes/{flow_switch.js → flow/switch.js} +47 -47
- package/backend/src/core/nodes/{flow_while.js → flow/while.js} +1 -1
- package/backend/src/core/nodes/logic/__tests__/compare.test.js +83 -0
- package/backend/src/core/nodes/logic/not.js +22 -0
- package/backend/src/core/nodes/math/__tests__/operation.test.js +65 -0
- package/backend/src/core/nodes/strings/__tests__/concat.test.js +89 -0
- package/backend/src/core/nodes/{string_starts_with.js → strings/starts_with.js} +1 -1
- package/backend/src/core/nodes/strings/to_lower.js +22 -0
- package/backend/src/core/nodes/strings/to_upper.js +22 -0
- package/backend/src/core/nodes/time/__tests__/now.test.js +24 -0
- package/backend/src/core/nodes/time/add.js +33 -0
- package/backend/src/core/nodes/time/compare.js +35 -0
- package/backend/src/core/nodes/time/diff.js +29 -0
- package/backend/src/core/nodes/time/format.js +32 -0
- package/backend/src/core/nodes/time/now.js +18 -0
- package/backend/src/core/nodes/type/to_string.js +32 -0
- package/backend/src/core/nodes/{user_check_blacklist.js → users/check_blacklist.js} +37 -37
- package/backend/src/core/nodes/{user_get_groups.js → users/get_groups.js} +36 -36
- package/backend/src/core/nodes/{user_get_permissions.js → users/get_permissions.js} +36 -36
- package/backend/src/core/nodes/{user_set_blacklist.js → users/set_blacklist.js} +37 -37
- package/backend/src/core/services/BotLifecycleService.js +835 -0
- package/backend/src/core/services/BotProcessManager.js +163 -0
- package/backend/src/core/services/CacheManager.js +111 -0
- package/backend/src/core/services/CommandExecutionService.js +430 -0
- package/backend/src/core/services/DebugSessionManager.js +347 -0
- package/backend/src/core/services/GraphCollaborationManager.js +501 -0
- package/backend/src/core/services/MinecraftBotManager.js +259 -0
- package/backend/src/core/services/MinecraftViewerService.js +216 -0
- package/backend/src/core/services/ResourceMonitorService.js +90 -0
- package/backend/src/core/services/TelemetryService.js +124 -0
- package/backend/src/core/services/TraceCollectorService.js +545 -0
- package/backend/src/core/services/ValidationService.js +132 -0
- package/backend/src/core/services/__tests__/ValidationService.test.js +148 -0
- package/backend/src/core/services.js +20 -5
- package/backend/src/core/system/CommandContext.js +84 -0
- package/backend/src/core/system/RuntimeCommandRegistry.js +116 -0
- package/backend/src/core/system/Transport.js +74 -0
- package/backend/src/core/utils/__tests__/jsonParser.test.js +44 -0
- package/backend/src/core/utils/jsonParser.js +18 -0
- package/backend/src/core/utils/secretsFilter.js +262 -0
- package/backend/src/core/utils/variableParser.js +89 -0
- package/backend/src/core/validation/__tests__/nodeSchemas.test.js +175 -0
- package/backend/src/core/validation/nodeSchemas.js +112 -0
- package/backend/src/lib/prisma.js +2 -4
- package/backend/src/real-time/botApi/handlers/commandHandlers.js +28 -0
- package/backend/src/real-time/botApi/handlers/graphHandlers.js +99 -0
- package/backend/src/real-time/botApi/handlers/graphWebSocketHandlers.js +147 -0
- package/backend/src/real-time/botApi/handlers/index.js +43 -0
- package/backend/src/real-time/botApi/handlers/messageHandlers.js +66 -0
- package/backend/src/real-time/botApi/handlers/statusHandlers.js +17 -0
- package/backend/src/real-time/botApi/handlers/userHandlers.js +141 -0
- package/backend/src/real-time/botApi/index.js +40 -0
- package/backend/src/real-time/botApi/middleware.js +79 -0
- package/backend/src/real-time/botApi/utils.js +65 -0
- package/backend/src/real-time/panelNamespace.js +387 -0
- package/backend/src/real-time/presence.js +7 -2
- package/backend/src/real-time/socketHandler.js +400 -5
- package/backend/src/repositories/BaseRepository.js +43 -0
- package/backend/src/repositories/BotRepository.js +42 -0
- package/backend/src/repositories/CommandRepository.js +53 -0
- package/backend/src/repositories/EventGraphRepository.js +40 -0
- package/backend/src/repositories/GroupRepository.js +69 -0
- package/backend/src/repositories/PermissionRepository.js +48 -0
- package/backend/src/repositories/PluginRepository.js +42 -0
- package/backend/src/repositories/ServerRepository.js +27 -0
- package/backend/src/repositories/UserRepository.js +48 -0
- package/backend/src/server.js +21 -0
- package/backend/src/test-refactor.js +85 -0
- package/frontend/dist/assets/index-B1serztM.js +11210 -0
- package/frontend/dist/assets/index-t6K1u4OV.css +32 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/package-lock.json +9437 -0
- package/frontend/package.json +8 -5
- package/package.json +3 -2
- package/screen/console.png +0 -0
- package/screen/dashboard.png +0 -0
- package/screen/graph_collabe.png +0 -0
- package/screen/graph_live_debug.png +0 -0
- package/screen/management_command.png +0 -0
- package/screen/node_debug_trace.png +0 -0
- package/screen/plugin_/320/276/320/261/320/267/320/276/321/200.png +0 -0
- package/screen/websocket.png +0 -0
- package/screen//320/275/320/260/321/201/321/202/321/200/320/276/320/271/320/272/320/270_/320/276/321/202/320/264/320/265/320/273/321/214/320/275/321/213/321/205_/320/272/320/276/320/274/320/260/320/275/320/264_/320/272/320/260/320/266/320/264/321/203_/320/272/320/276/320/274/320/260/320/275/320/273/320/264/321/203_/320/274/320/276/320/266/320/275/320/276_/320/275/320/260/321/201/321/202/321/200/320/260/320/270/320/262/320/260/321/202/321/214.png +0 -0
- package/screen//320/277/320/273/320/260/320/275/320/270/321/200/320/276/320/262/321/211/320/270/320/272_/320/274/320/276/320/266/320/275/320/276_/320/267/320/260/320/264/320/260/320/262/320/260/321/202/321/214_/320/264/320/265/320/271/321/201/321/202/320/262/320/270/321/217_/320/277/320/276_/320/262/321/200/320/265/320/274/320/265/320/275/320/270.png +0 -0
- package/frontend/dist/assets/index-B9GedHEa.js +0 -8352
- package/frontend/dist/assets/index-zLiy9MDx.css +0 -1
- package/nul +0 -0
- /package/backend/src/core/nodes/{action_http_request.js → actions/http_request.js} +0 -0
- /package/backend/src/core/nodes/{array_add_element.js → arrays/add_element.js} +0 -0
- /package/backend/src/core/nodes/{array_contains.js → arrays/contains.js} +0 -0
- /package/backend/src/core/nodes/{array_find_index.js → arrays/find_index.js} +0 -0
- /package/backend/src/core/nodes/{array_get_by_index.js → arrays/get_by_index.js} +0 -0
- /package/backend/src/core/nodes/{array_get_random_element.js → arrays/get_random_element.js} +0 -0
- /package/backend/src/core/nodes/{array_remove_by_index.js → arrays/remove_by_index.js} +0 -0
- /package/backend/src/core/nodes/{bot_get_position.js → bot/get_position.js} +0 -0
- /package/backend/src/core/nodes/{data_array_literal.js → data/array_literal.js} +0 -0
- /package/backend/src/core/nodes/{data_boolean_literal.js → data/boolean_literal.js} +0 -0
- /package/backend/src/core/nodes/{data_get_argument.js → data/get_argument.js} +0 -0
- /package/backend/src/core/nodes/{data_get_bot_look.js → data/get_bot_look.js} +0 -0
- /package/backend/src/core/nodes/{data_get_entity_field.js → data/get_entity_field.js} +0 -0
- /package/backend/src/core/nodes/{data_get_server_players.js → data/get_server_players.js} +0 -0
- /package/backend/src/core/nodes/{data_get_variable.js → data/get_variable.js} +0 -0
- /package/backend/src/core/nodes/{data_length.js → data/length.js} +0 -0
- /package/backend/src/core/nodes/{data_make_object.js → data/make_object.js} +0 -0
- /package/backend/src/core/nodes/{data_number_literal.js → data/number_literal.js} +0 -0
- /package/backend/src/core/nodes/{data_string_literal.js → data/string_literal.js} +0 -0
- /package/backend/src/core/nodes/{logic_compare.js → logic/compare.js} +0 -0
- /package/backend/src/core/nodes/{logic_operation.js → logic/operation.js} +0 -0
- /package/backend/src/core/nodes/{math_operation.js → math/operation.js} +0 -0
- /package/backend/src/core/nodes/{math_random_number.js → math/random_number.js} +0 -0
- /package/backend/src/core/nodes/{object_create.js → objects/create.js} +0 -0
- /package/backend/src/core/nodes/{object_delete.js → objects/delete.js} +0 -0
- /package/backend/src/core/nodes/{object_get.js → objects/get.js} +0 -0
- /package/backend/src/core/nodes/{object_has_key.js → objects/has_key.js} +0 -0
- /package/backend/src/core/nodes/{object_set.js → objects/set.js} +0 -0
- /package/backend/src/core/nodes/{string_concat.js → strings/concat.js} +0 -0
- /package/backend/src/core/nodes/{string_contains.js → strings/contains.js} +0 -0
- /package/backend/src/core/nodes/{string_ends_with.js → strings/ends_with.js} +0 -0
- /package/backend/src/core/nodes/{string_equals.js → strings/equals.js} +0 -0
- /package/backend/src/core/nodes/{string_length.js → strings/length.js} +0 -0
- /package/backend/src/core/nodes/{string_matches.js → strings/matches.js} +0 -0
- /package/backend/src/core/nodes/{string_split.js → strings/split.js} +0 -0
|
@@ -0,0 +1,915 @@
|
|
|
1
|
+
# Container Security
|
|
2
|
+
|
|
3
|
+
Comprehensive guide to securing container images and runtime environments, covering image scanning, base image selection, vulnerability remediation, distroless images, runtime security, and container best practices.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Overview](#overview)
|
|
8
|
+
- [Image Scanning](#image-scanning)
|
|
9
|
+
- [Base Image Selection](#base-image-selection)
|
|
10
|
+
- [Distroless Images](#distroless-images)
|
|
11
|
+
- [Runtime Security](#runtime-security)
|
|
12
|
+
- [Pod Security Standards](#pod-security-standards)
|
|
13
|
+
- [Image Signing and Verification](#image-signing-and-verification)
|
|
14
|
+
- [Container Hardening](#container-hardening)
|
|
15
|
+
- [Best Practices](#best-practices)
|
|
16
|
+
- [Anti-Patterns](#anti-patterns)
|
|
17
|
+
|
|
18
|
+
## Overview
|
|
19
|
+
|
|
20
|
+
**Container Security Layers:**
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
┌────────────────────────────────────────────────┐
|
|
24
|
+
│ Supply Chain Security │
|
|
25
|
+
│ (Image signing, SBOM, provenance) │
|
|
26
|
+
├────────────────────────────────────────────────┤
|
|
27
|
+
│ Build-Time Security │
|
|
28
|
+
│ (Base image, dependencies, scanning) │
|
|
29
|
+
├────────────────────────────────────────────────┤
|
|
30
|
+
│ Registry Security │
|
|
31
|
+
│ (Access control, encryption, scanning) │
|
|
32
|
+
├────────────────────────────────────────────────┤
|
|
33
|
+
│ Runtime Security │
|
|
34
|
+
│ (Falco, AppArmor, Seccomp, monitoring) │
|
|
35
|
+
└────────────────────────────────────────────────┘
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Image Scanning
|
|
39
|
+
|
|
40
|
+
### Trivy Image Scanning
|
|
41
|
+
|
|
42
|
+
**Basic Scanning:**
|
|
43
|
+
```bash
|
|
44
|
+
# Scan image
|
|
45
|
+
trivy image nginx:latest
|
|
46
|
+
|
|
47
|
+
# Scan with severity filter
|
|
48
|
+
trivy image --severity HIGH,CRITICAL nginx:latest
|
|
49
|
+
|
|
50
|
+
# Scan local Dockerfile
|
|
51
|
+
trivy config Dockerfile
|
|
52
|
+
|
|
53
|
+
# Scan and fail on vulnerabilities
|
|
54
|
+
trivy image --exit-code 1 --severity CRITICAL nginx:latest
|
|
55
|
+
|
|
56
|
+
# Generate SBOM
|
|
57
|
+
trivy image --format cyclonedx nginx:latest
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**CI Integration:**
|
|
61
|
+
```yaml
|
|
62
|
+
# .github/workflows/container-scan.yml
|
|
63
|
+
name: Container Security Scan
|
|
64
|
+
|
|
65
|
+
on:
|
|
66
|
+
push:
|
|
67
|
+
branches: [ main ]
|
|
68
|
+
pull_request:
|
|
69
|
+
|
|
70
|
+
jobs:
|
|
71
|
+
trivy-scan:
|
|
72
|
+
runs-on: ubuntu-latest
|
|
73
|
+
steps:
|
|
74
|
+
- uses: actions/checkout@v3
|
|
75
|
+
|
|
76
|
+
- name: Build image
|
|
77
|
+
run: |
|
|
78
|
+
docker build -t myapp:${{ github.sha }} .
|
|
79
|
+
|
|
80
|
+
- name: Run Trivy vulnerability scanner
|
|
81
|
+
uses: aquasecurity/trivy-action@master
|
|
82
|
+
with:
|
|
83
|
+
image-ref: 'myapp:${{ github.sha }}'
|
|
84
|
+
format: 'sarif'
|
|
85
|
+
output: 'trivy-results.sarif'
|
|
86
|
+
severity: 'CRITICAL,HIGH'
|
|
87
|
+
exit-code: '1'
|
|
88
|
+
|
|
89
|
+
- name: Upload Trivy results to GitHub Security
|
|
90
|
+
uses: github/codeql-action/upload-sarif@v2
|
|
91
|
+
if: always()
|
|
92
|
+
with:
|
|
93
|
+
sarif_file: 'trivy-results.sarif'
|
|
94
|
+
|
|
95
|
+
- name: Generate SBOM
|
|
96
|
+
uses: aquasecurity/trivy-action@master
|
|
97
|
+
with:
|
|
98
|
+
image-ref: 'myapp:${{ github.sha }}'
|
|
99
|
+
format: 'cyclonedx'
|
|
100
|
+
output: 'sbom.json'
|
|
101
|
+
|
|
102
|
+
- name: Upload SBOM
|
|
103
|
+
uses: actions/upload-artifact@v3
|
|
104
|
+
with:
|
|
105
|
+
name: sbom
|
|
106
|
+
path: sbom.json
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Trivy Configuration:**
|
|
110
|
+
```yaml
|
|
111
|
+
# trivy.yaml
|
|
112
|
+
scan:
|
|
113
|
+
security-checks:
|
|
114
|
+
- vuln
|
|
115
|
+
- config
|
|
116
|
+
- secret
|
|
117
|
+
|
|
118
|
+
severity:
|
|
119
|
+
- CRITICAL
|
|
120
|
+
- HIGH
|
|
121
|
+
|
|
122
|
+
vulnerability:
|
|
123
|
+
type:
|
|
124
|
+
- os
|
|
125
|
+
- library
|
|
126
|
+
|
|
127
|
+
ignore-unfixed: true
|
|
128
|
+
|
|
129
|
+
secret:
|
|
130
|
+
config: .trivyignore-secrets
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Ignore File:**
|
|
134
|
+
```
|
|
135
|
+
# .trivyignore
|
|
136
|
+
# Temporary ignore for CVE with no fix available
|
|
137
|
+
CVE-2023-12345
|
|
138
|
+
|
|
139
|
+
# Ignore low severity in dev dependencies
|
|
140
|
+
CVE-2023-67890 npm:dev-dependency
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Grype Scanning
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# Install Grype
|
|
147
|
+
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh
|
|
148
|
+
|
|
149
|
+
# Scan image
|
|
150
|
+
grype nginx:latest
|
|
151
|
+
|
|
152
|
+
# Only high/critical
|
|
153
|
+
grype nginx:latest --fail-on high
|
|
154
|
+
|
|
155
|
+
# Output formats
|
|
156
|
+
grype nginx:latest -o json > results.json
|
|
157
|
+
grype nginx:latest -o sarif > results.sarif
|
|
158
|
+
grype nginx:latest -o template -t grype-report.tmpl
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Snyk Container
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
# Authenticate
|
|
165
|
+
snyk auth
|
|
166
|
+
|
|
167
|
+
# Scan image
|
|
168
|
+
snyk container test nginx:latest
|
|
169
|
+
|
|
170
|
+
# Monitor image
|
|
171
|
+
snyk container monitor nginx:latest --project-name=nginx-prod
|
|
172
|
+
|
|
173
|
+
# Test Dockerfile
|
|
174
|
+
snyk container test nginx:latest --file=Dockerfile
|
|
175
|
+
|
|
176
|
+
# Get remediation advice
|
|
177
|
+
snyk container test nginx:latest --json | jq '.vulnerabilities[].remediation'
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**GitHub Action:**
|
|
181
|
+
```yaml
|
|
182
|
+
- name: Snyk Container Scan
|
|
183
|
+
uses: snyk/actions/docker@master
|
|
184
|
+
env:
|
|
185
|
+
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
|
186
|
+
with:
|
|
187
|
+
image: myapp:latest
|
|
188
|
+
args: --severity-threshold=high --file=Dockerfile
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Base Image Selection
|
|
192
|
+
|
|
193
|
+
### Official vs Custom Images
|
|
194
|
+
|
|
195
|
+
**Official Images (Recommended):**
|
|
196
|
+
```dockerfile
|
|
197
|
+
# ✅ Good: Official images, well-maintained
|
|
198
|
+
FROM node:20-alpine
|
|
199
|
+
FROM python:3.11-slim
|
|
200
|
+
FROM nginx:1.25-alpine
|
|
201
|
+
FROM postgres:15-alpine
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**Avoid:**
|
|
205
|
+
```dockerfile
|
|
206
|
+
# ❌ Bad: Unknown source, no security updates
|
|
207
|
+
FROM someuser/custom-node:latest
|
|
208
|
+
FROM random-image:v1
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Choosing the Right Variant
|
|
212
|
+
|
|
213
|
+
**Variants Comparison:**
|
|
214
|
+
|
|
215
|
+
| Variant | Size | Use Case | Security |
|
|
216
|
+
|---------|------|----------|----------|
|
|
217
|
+
| `alpine` | ~5MB | Production, minimal | Excellent |
|
|
218
|
+
| `slim` | ~50MB | Good balance | Very Good |
|
|
219
|
+
| `standard` | ~200MB | Dev, all tools | Good |
|
|
220
|
+
| `distroless` | ~20MB | Production, secure | Excellent |
|
|
221
|
+
|
|
222
|
+
**Examples:**
|
|
223
|
+
|
|
224
|
+
```dockerfile
|
|
225
|
+
# Alpine (smallest)
|
|
226
|
+
FROM node:20-alpine
|
|
227
|
+
# Size: ~50MB, Good for production
|
|
228
|
+
|
|
229
|
+
# Slim (balanced)
|
|
230
|
+
FROM python:3.11-slim
|
|
231
|
+
# Size: ~150MB, Common packages included
|
|
232
|
+
|
|
233
|
+
# Distroless (most secure)
|
|
234
|
+
FROM gcr.io/distroless/nodejs20-debian11
|
|
235
|
+
# Size: ~70MB, No shell, minimal attack surface
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Multi-Stage Builds
|
|
239
|
+
|
|
240
|
+
**Security Benefits:**
|
|
241
|
+
- Remove build tools from final image
|
|
242
|
+
- Smaller attack surface
|
|
243
|
+
- Reduced vulnerability count
|
|
244
|
+
|
|
245
|
+
```dockerfile
|
|
246
|
+
# Multi-stage build for security
|
|
247
|
+
FROM node:20-alpine AS builder
|
|
248
|
+
WORKDIR /app
|
|
249
|
+
|
|
250
|
+
# Install dependencies
|
|
251
|
+
COPY package*.json ./
|
|
252
|
+
RUN npm ci --only=production && \
|
|
253
|
+
npm cache clean --force
|
|
254
|
+
|
|
255
|
+
COPY . .
|
|
256
|
+
RUN npm run build
|
|
257
|
+
|
|
258
|
+
# Final production image
|
|
259
|
+
FROM gcr.io/distroless/nodejs20-debian11
|
|
260
|
+
WORKDIR /app
|
|
261
|
+
|
|
262
|
+
# Copy only necessary files
|
|
263
|
+
COPY --from=builder /app/dist ./dist
|
|
264
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
265
|
+
COPY --from=builder /app/package.json ./
|
|
266
|
+
|
|
267
|
+
# Non-root user (distroless default)
|
|
268
|
+
USER nonroot:nonroot
|
|
269
|
+
|
|
270
|
+
# Start app
|
|
271
|
+
CMD ["dist/index.js"]
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Comparison:**
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
# Standard build
|
|
278
|
+
FROM node:20
|
|
279
|
+
WORKDIR /app
|
|
280
|
+
COPY . .
|
|
281
|
+
RUN npm install
|
|
282
|
+
CMD ["node", "index.js"]
|
|
283
|
+
# Result: 900MB, 200+ vulnerabilities
|
|
284
|
+
|
|
285
|
+
# Multi-stage + distroless
|
|
286
|
+
FROM node:20-alpine AS builder
|
|
287
|
+
# ... build steps
|
|
288
|
+
FROM gcr.io/distroless/nodejs20-debian11
|
|
289
|
+
# ... minimal copy
|
|
290
|
+
# Result: 150MB, 5 vulnerabilities
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## Distroless Images
|
|
294
|
+
|
|
295
|
+
### What are Distroless Images?
|
|
296
|
+
|
|
297
|
+
**Traditional Image:**
|
|
298
|
+
```
|
|
299
|
+
Application
|
|
300
|
+
Node.js Runtime
|
|
301
|
+
Shell, Package Manager, Utils
|
|
302
|
+
Base OS (Debian/Alpine)
|
|
303
|
+
────────────────────
|
|
304
|
+
Size: 200MB
|
|
305
|
+
Attack Surface: Large
|
|
306
|
+
CVEs: 100+
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**Distroless Image:**
|
|
310
|
+
```
|
|
311
|
+
Application
|
|
312
|
+
Node.js Runtime
|
|
313
|
+
Base OS (minimal)
|
|
314
|
+
────────────────────
|
|
315
|
+
Size: 70MB
|
|
316
|
+
Attack Surface: Minimal
|
|
317
|
+
CVEs: 5-10
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Using Distroless
|
|
321
|
+
|
|
322
|
+
**Node.js Example:**
|
|
323
|
+
```dockerfile
|
|
324
|
+
FROM node:20-alpine AS builder
|
|
325
|
+
WORKDIR /app
|
|
326
|
+
COPY package*.json ./
|
|
327
|
+
RUN npm ci --only=production
|
|
328
|
+
COPY . .
|
|
329
|
+
RUN npm run build
|
|
330
|
+
|
|
331
|
+
FROM gcr.io/distroless/nodejs20-debian11
|
|
332
|
+
WORKDIR /app
|
|
333
|
+
COPY --from=builder /app/dist ./dist
|
|
334
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
335
|
+
EXPOSE 3000
|
|
336
|
+
USER nonroot:nonroot
|
|
337
|
+
CMD ["dist/index.js"]
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
**Python Example:**
|
|
341
|
+
```dockerfile
|
|
342
|
+
FROM python:3.11-slim AS builder
|
|
343
|
+
WORKDIR /app
|
|
344
|
+
COPY requirements.txt .
|
|
345
|
+
RUN pip install --user --no-cache-dir -r requirements.txt
|
|
346
|
+
COPY . .
|
|
347
|
+
|
|
348
|
+
FROM gcr.io/distroless/python3-debian11
|
|
349
|
+
WORKDIR /app
|
|
350
|
+
COPY --from=builder /root/.local /root/.local
|
|
351
|
+
COPY --from=builder /app .
|
|
352
|
+
ENV PATH=/root/.local/bin:$PATH
|
|
353
|
+
USER nonroot:nonroot
|
|
354
|
+
CMD ["app.py"]
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**Java Example:**
|
|
358
|
+
```dockerfile
|
|
359
|
+
FROM maven:3.9-eclipse-temurin-17 AS builder
|
|
360
|
+
WORKDIR /app
|
|
361
|
+
COPY pom.xml .
|
|
362
|
+
RUN mvn dependency:go-offline
|
|
363
|
+
COPY src ./src
|
|
364
|
+
RUN mvn package -DskipTests
|
|
365
|
+
|
|
366
|
+
FROM gcr.io/distroless/java17-debian11
|
|
367
|
+
WORKDIR /app
|
|
368
|
+
COPY --from=builder /app/target/app.jar .
|
|
369
|
+
USER nonroot:nonroot
|
|
370
|
+
CMD ["app.jar"]
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Debugging Distroless Images
|
|
374
|
+
|
|
375
|
+
**Problem:** No shell for debugging
|
|
376
|
+
|
|
377
|
+
**Solution 1: Debug Variant**
|
|
378
|
+
```dockerfile
|
|
379
|
+
# Use debug variant for troubleshooting
|
|
380
|
+
FROM gcr.io/distroless/nodejs20-debian11:debug
|
|
381
|
+
# Includes busybox shell
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
# Debug with docker exec
|
|
386
|
+
docker run -it --entrypoint=/busybox/sh myapp:debug
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
**Solution 2: Ephemeral Debug Container**
|
|
390
|
+
```bash
|
|
391
|
+
# Kubernetes ephemeral container
|
|
392
|
+
kubectl debug pod/myapp -it --image=busybox --target=myapp
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## Runtime Security
|
|
396
|
+
|
|
397
|
+
### Falco Implementation
|
|
398
|
+
|
|
399
|
+
**Installation (Kubernetes):**
|
|
400
|
+
```yaml
|
|
401
|
+
# falco-helm-values.yaml
|
|
402
|
+
falco:
|
|
403
|
+
rules_file:
|
|
404
|
+
- /etc/falco/falco_rules.yaml
|
|
405
|
+
- /etc/falco/falco_rules.local.yaml
|
|
406
|
+
- /etc/falco/k8s_audit_rules.yaml
|
|
407
|
+
|
|
408
|
+
json_output: true
|
|
409
|
+
json_include_output_property: true
|
|
410
|
+
|
|
411
|
+
priority: warning
|
|
412
|
+
|
|
413
|
+
falcosidekick:
|
|
414
|
+
enabled: true
|
|
415
|
+
webui:
|
|
416
|
+
enabled: true
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
```bash
|
|
420
|
+
# Install via Helm
|
|
421
|
+
helm repo add falcosecurity https://falcosecurity.github.io/charts
|
|
422
|
+
helm repo update
|
|
423
|
+
|
|
424
|
+
helm install falco falcosecurity/falco \
|
|
425
|
+
--namespace falco --create-namespace \
|
|
426
|
+
-f falco-helm-values.yaml
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
**Custom Falco Rules:**
|
|
430
|
+
```yaml
|
|
431
|
+
# custom-rules.yaml
|
|
432
|
+
- rule: Unauthorized Process in Container
|
|
433
|
+
desc: Detect unauthorized processes running in containers
|
|
434
|
+
condition: >
|
|
435
|
+
spawned_process and
|
|
436
|
+
container and
|
|
437
|
+
not proc.name in (node, npm, python, java)
|
|
438
|
+
output: >
|
|
439
|
+
Unauthorized process started in container
|
|
440
|
+
(user=%user.name process=%proc.name
|
|
441
|
+
container=%container.name image=%container.image)
|
|
442
|
+
priority: WARNING
|
|
443
|
+
|
|
444
|
+
- rule: Container Drift Detected
|
|
445
|
+
desc: Detect file modifications in container
|
|
446
|
+
condition: >
|
|
447
|
+
evt.type = open and
|
|
448
|
+
evt.dir = < and
|
|
449
|
+
container and
|
|
450
|
+
fd.name startswith /app/ and
|
|
451
|
+
not proc.name in (node, npm)
|
|
452
|
+
output: >
|
|
453
|
+
File modified in running container
|
|
454
|
+
(file=%fd.name process=%proc.name
|
|
455
|
+
container=%container.name)
|
|
456
|
+
priority: ERROR
|
|
457
|
+
|
|
458
|
+
- rule: Sensitive File Access
|
|
459
|
+
desc: Detect access to sensitive files
|
|
460
|
+
condition: >
|
|
461
|
+
open_read and
|
|
462
|
+
sensitive_files and
|
|
463
|
+
not trusted_process
|
|
464
|
+
output: >
|
|
465
|
+
Sensitive file accessed
|
|
466
|
+
(file=%fd.name process=%proc.name user=%user.name)
|
|
467
|
+
priority: CRITICAL
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### AppArmor Profiles
|
|
471
|
+
|
|
472
|
+
**Kubernetes with AppArmor:**
|
|
473
|
+
```yaml
|
|
474
|
+
apiVersion: v1
|
|
475
|
+
kind: Pod
|
|
476
|
+
metadata:
|
|
477
|
+
name: secured-app
|
|
478
|
+
annotations:
|
|
479
|
+
container.apparmor.security.beta.kubernetes.io/app: localhost/k8s-apparmor-example
|
|
480
|
+
spec:
|
|
481
|
+
containers:
|
|
482
|
+
- name: app
|
|
483
|
+
image: nginx:alpine
|
|
484
|
+
securityContext:
|
|
485
|
+
allowPrivilegeEscalation: false
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
**AppArmor Profile:**
|
|
489
|
+
```
|
|
490
|
+
#include <tunables/global>
|
|
491
|
+
|
|
492
|
+
profile k8s-apparmor-example flags=(attach_disconnected,mediate_deleted) {
|
|
493
|
+
#include <abstractions/base>
|
|
494
|
+
|
|
495
|
+
# Allow network
|
|
496
|
+
network inet tcp,
|
|
497
|
+
network inet udp,
|
|
498
|
+
|
|
499
|
+
# Deny all file writes except in specific directories
|
|
500
|
+
deny /** w,
|
|
501
|
+
/app/** rw,
|
|
502
|
+
/tmp/** rw,
|
|
503
|
+
|
|
504
|
+
# Deny process execution except allowed binaries
|
|
505
|
+
deny /bin/** x,
|
|
506
|
+
deny /usr/bin/** x,
|
|
507
|
+
/usr/bin/node ix,
|
|
508
|
+
|
|
509
|
+
# Deny capability
|
|
510
|
+
deny capability sys_admin,
|
|
511
|
+
deny capability net_admin,
|
|
512
|
+
}
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
### Seccomp Profiles
|
|
516
|
+
|
|
517
|
+
```json
|
|
518
|
+
{
|
|
519
|
+
"defaultAction": "SCMP_ACT_ERRNO",
|
|
520
|
+
"architectures": [
|
|
521
|
+
"SCMP_ARCH_X86_64",
|
|
522
|
+
"SCMP_ARCH_X86",
|
|
523
|
+
"SCMP_ARCH_ARM64"
|
|
524
|
+
],
|
|
525
|
+
"syscalls": [
|
|
526
|
+
{
|
|
527
|
+
"names": [
|
|
528
|
+
"accept4", "bind", "listen", "connect", "socket",
|
|
529
|
+
"read", "write", "open", "close", "stat",
|
|
530
|
+
"fstat", "lstat", "poll", "epoll_wait",
|
|
531
|
+
"rt_sigaction", "rt_sigprocmask", "clone",
|
|
532
|
+
"execve", "wait4", "exit", "exit_group"
|
|
533
|
+
],
|
|
534
|
+
"action": "SCMP_ACT_ALLOW"
|
|
535
|
+
}
|
|
536
|
+
]
|
|
537
|
+
}
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
**Using in Kubernetes:**
|
|
541
|
+
```yaml
|
|
542
|
+
apiVersion: v1
|
|
543
|
+
kind: Pod
|
|
544
|
+
metadata:
|
|
545
|
+
name: secured-pod
|
|
546
|
+
spec:
|
|
547
|
+
securityContext:
|
|
548
|
+
seccompProfile:
|
|
549
|
+
type: Localhost
|
|
550
|
+
localhostProfile: profiles/restricted.json
|
|
551
|
+
containers:
|
|
552
|
+
- name: app
|
|
553
|
+
image: myapp:latest
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
## Pod Security Standards
|
|
557
|
+
|
|
558
|
+
### Pod Security Levels
|
|
559
|
+
|
|
560
|
+
**Privileged (Unrestricted):**
|
|
561
|
+
```yaml
|
|
562
|
+
# No restrictions - avoid in production
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
**Baseline (Minimally Restrictive):**
|
|
566
|
+
```yaml
|
|
567
|
+
apiVersion: v1
|
|
568
|
+
kind: Pod
|
|
569
|
+
metadata:
|
|
570
|
+
name: baseline-pod
|
|
571
|
+
spec:
|
|
572
|
+
containers:
|
|
573
|
+
- name: app
|
|
574
|
+
image: nginx:alpine
|
|
575
|
+
securityContext:
|
|
576
|
+
allowPrivilegeEscalation: false
|
|
577
|
+
capabilities:
|
|
578
|
+
drop: ["ALL"]
|
|
579
|
+
runAsNonRoot: true
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
**Restricted (Highly Restrictive - Recommended):**
|
|
583
|
+
```yaml
|
|
584
|
+
apiVersion: v1
|
|
585
|
+
kind: Pod
|
|
586
|
+
metadata:
|
|
587
|
+
name: restricted-pod
|
|
588
|
+
spec:
|
|
589
|
+
securityContext:
|
|
590
|
+
runAsNonRoot: true
|
|
591
|
+
runAsUser: 1000
|
|
592
|
+
fsGroup: 1000
|
|
593
|
+
seccompProfile:
|
|
594
|
+
type: RuntimeDefault
|
|
595
|
+
|
|
596
|
+
containers:
|
|
597
|
+
- name: app
|
|
598
|
+
image: nginx:alpine
|
|
599
|
+
securityContext:
|
|
600
|
+
allowPrivilegeEscalation: false
|
|
601
|
+
runAsNonRoot: true
|
|
602
|
+
runAsUser: 1000
|
|
603
|
+
capabilities:
|
|
604
|
+
drop: ["ALL"]
|
|
605
|
+
readOnlyRootFilesystem: true
|
|
606
|
+
|
|
607
|
+
volumeMounts:
|
|
608
|
+
- name: tmp
|
|
609
|
+
mountPath: /tmp
|
|
610
|
+
- name: cache
|
|
611
|
+
mountPath: /var/cache/nginx
|
|
612
|
+
|
|
613
|
+
volumes:
|
|
614
|
+
- name: tmp
|
|
615
|
+
emptyDir: {}
|
|
616
|
+
- name: cache
|
|
617
|
+
emptyDir: {}
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
### Namespace-Level Enforcement
|
|
621
|
+
|
|
622
|
+
```yaml
|
|
623
|
+
# Enforce restricted standard for namespace
|
|
624
|
+
apiVersion: v1
|
|
625
|
+
kind: Namespace
|
|
626
|
+
metadata:
|
|
627
|
+
name: production
|
|
628
|
+
labels:
|
|
629
|
+
pod-security.kubernetes.io/enforce: restricted
|
|
630
|
+
pod-security.kubernetes.io/audit: restricted
|
|
631
|
+
pod-security.kubernetes.io/warn: restricted
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
## Image Signing and Verification
|
|
635
|
+
|
|
636
|
+
### Cosign (Sigstore)
|
|
637
|
+
|
|
638
|
+
**Install Cosign:**
|
|
639
|
+
```bash
|
|
640
|
+
# Linux
|
|
641
|
+
wget https://github.com/sigstore/cosign/releases/download/v2.0.0/cosign-linux-amd64
|
|
642
|
+
chmod +x cosign-linux-amd64
|
|
643
|
+
mv cosign-linux-amd64 /usr/local/bin/cosign
|
|
644
|
+
|
|
645
|
+
# macOS
|
|
646
|
+
brew install cosign
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
**Generate Keys:**
|
|
650
|
+
```bash
|
|
651
|
+
# Generate key pair
|
|
652
|
+
cosign generate-key-pair
|
|
653
|
+
|
|
654
|
+
# Outputs:
|
|
655
|
+
# - cosign.key (private key - keep secure!)
|
|
656
|
+
# - cosign.pub (public key - distribute)
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
**Sign Image:**
|
|
660
|
+
```bash
|
|
661
|
+
# Sign image
|
|
662
|
+
cosign sign --key cosign.key myregistry.com/myapp:v1.0.0
|
|
663
|
+
|
|
664
|
+
# Keyless signing (OIDC)
|
|
665
|
+
cosign sign myregistry.com/myapp:v1.0.0
|
|
666
|
+
|
|
667
|
+
# Sign with annotations
|
|
668
|
+
cosign sign --key cosign.key \
|
|
669
|
+
-a git_commit=$(git rev-parse HEAD) \
|
|
670
|
+
-a build_date=$(date -u +%Y-%m-%dT%H:%M:%SZ) \
|
|
671
|
+
myregistry.com/myapp:v1.0.0
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
**Verify Image:**
|
|
675
|
+
```bash
|
|
676
|
+
# Verify signature
|
|
677
|
+
cosign verify --key cosign.pub myregistry.com/myapp:v1.0.0
|
|
678
|
+
|
|
679
|
+
# Keyless verification
|
|
680
|
+
cosign verify \
|
|
681
|
+
--certificate-identity=user@example.com \
|
|
682
|
+
--certificate-oidc-issuer=https://github.com/login/oauth \
|
|
683
|
+
myregistry.com/myapp:v1.0.0
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
**CI Integration:**
|
|
687
|
+
```yaml
|
|
688
|
+
# .github/workflows/sign-image.yml
|
|
689
|
+
name: Build and Sign Container
|
|
690
|
+
|
|
691
|
+
on:
|
|
692
|
+
push:
|
|
693
|
+
tags: [ 'v*' ]
|
|
694
|
+
|
|
695
|
+
jobs:
|
|
696
|
+
build-sign:
|
|
697
|
+
runs-on: ubuntu-latest
|
|
698
|
+
permissions:
|
|
699
|
+
contents: read
|
|
700
|
+
packages: write
|
|
701
|
+
id-token: write # For keyless signing
|
|
702
|
+
|
|
703
|
+
steps:
|
|
704
|
+
- uses: actions/checkout@v3
|
|
705
|
+
|
|
706
|
+
- name: Login to registry
|
|
707
|
+
uses: docker/login-action@v2
|
|
708
|
+
with:
|
|
709
|
+
registry: ghcr.io
|
|
710
|
+
username: ${{ github.actor }}
|
|
711
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
712
|
+
|
|
713
|
+
- name: Build and push
|
|
714
|
+
uses: docker/build-push-action@v4
|
|
715
|
+
with:
|
|
716
|
+
push: true
|
|
717
|
+
tags: ghcr.io/${{ github.repository }}:${{ github.ref_name }}
|
|
718
|
+
|
|
719
|
+
- name: Install Cosign
|
|
720
|
+
uses: sigstore/cosign-installer@v3
|
|
721
|
+
|
|
722
|
+
- name: Sign image
|
|
723
|
+
run: |
|
|
724
|
+
cosign sign --yes \
|
|
725
|
+
ghcr.io/${{ github.repository }}:${{ github.ref_name }}
|
|
726
|
+
```
|
|
727
|
+
|
|
728
|
+
### Admission Controller Verification
|
|
729
|
+
|
|
730
|
+
**Kyverno Policy:**
|
|
731
|
+
```yaml
|
|
732
|
+
apiVersion: kyverno.io/v1
|
|
733
|
+
kind: ClusterPolicy
|
|
734
|
+
metadata:
|
|
735
|
+
name: verify-image-signature
|
|
736
|
+
spec:
|
|
737
|
+
validationFailureAction: enforce
|
|
738
|
+
background: false
|
|
739
|
+
rules:
|
|
740
|
+
- name: verify-signature
|
|
741
|
+
match:
|
|
742
|
+
any:
|
|
743
|
+
- resources:
|
|
744
|
+
kinds:
|
|
745
|
+
- Pod
|
|
746
|
+
verifyImages:
|
|
747
|
+
- imageReferences:
|
|
748
|
+
- "myregistry.com/*"
|
|
749
|
+
attestors:
|
|
750
|
+
- entries:
|
|
751
|
+
- keys:
|
|
752
|
+
publicKeys: |-
|
|
753
|
+
-----BEGIN PUBLIC KEY-----
|
|
754
|
+
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...
|
|
755
|
+
-----END PUBLIC KEY-----
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
## Container Hardening
|
|
759
|
+
|
|
760
|
+
### Minimal Dockerfile
|
|
761
|
+
|
|
762
|
+
```dockerfile
|
|
763
|
+
# ✅ Secure Dockerfile
|
|
764
|
+
FROM node:20-alpine AS builder
|
|
765
|
+
WORKDIR /app
|
|
766
|
+
|
|
767
|
+
# Install dependencies as non-root
|
|
768
|
+
RUN addgroup -g 1001 -S nodejs && \
|
|
769
|
+
adduser -S nodejs -u 1001
|
|
770
|
+
|
|
771
|
+
# Copy dependency files
|
|
772
|
+
COPY --chown=nodejs:nodejs package*.json ./
|
|
773
|
+
|
|
774
|
+
# Install dependencies
|
|
775
|
+
RUN npm ci --only=production && \
|
|
776
|
+
npm cache clean --force
|
|
777
|
+
|
|
778
|
+
# Copy application
|
|
779
|
+
COPY --chown=nodejs:nodejs . .
|
|
780
|
+
|
|
781
|
+
# Build application
|
|
782
|
+
RUN npm run build
|
|
783
|
+
|
|
784
|
+
# Production image
|
|
785
|
+
FROM gcr.io/distroless/nodejs20-debian11
|
|
786
|
+
WORKDIR /app
|
|
787
|
+
|
|
788
|
+
# Copy from builder
|
|
789
|
+
COPY --from=builder --chown=nonroot:nonroot /app/dist ./dist
|
|
790
|
+
COPY --from=builder --chown=nonroot:nonroot /app/node_modules ./node_modules
|
|
791
|
+
COPY --from=builder --chown=nonroot:nonroot /app/package.json ./
|
|
792
|
+
|
|
793
|
+
# Use non-root user
|
|
794
|
+
USER nonroot:nonroot
|
|
795
|
+
|
|
796
|
+
# Health check
|
|
797
|
+
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
798
|
+
CMD ["/nodejs/bin/node", "-e", "fetch('http://localhost:3000/health')"]
|
|
799
|
+
|
|
800
|
+
# Expose port
|
|
801
|
+
EXPOSE 3000
|
|
802
|
+
|
|
803
|
+
# Start application
|
|
804
|
+
CMD ["dist/index.js"]
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
### Security Best Practices
|
|
808
|
+
|
|
809
|
+
```dockerfile
|
|
810
|
+
# ❌ Bad practices
|
|
811
|
+
FROM ubuntu:latest # Don't use 'latest'
|
|
812
|
+
RUN apt-get update # Don't run as root
|
|
813
|
+
ADD http://example.com/file.tar.gz / # Unsafe ADD
|
|
814
|
+
COPY secrets.env . # Never copy secrets
|
|
815
|
+
RUN chmod 777 /app # Overly permissive
|
|
816
|
+
|
|
817
|
+
# ✅ Good practices
|
|
818
|
+
FROM ubuntu:22.04 # Use specific versions
|
|
819
|
+
RUN apt-get update && apt-get install -y package \
|
|
820
|
+
&& rm -rf /var/lib/apt/lists/* # Clean up
|
|
821
|
+
COPY --chown=user:user file.tar.gz / # Use COPY, set ownership
|
|
822
|
+
# Use secret management, not files
|
|
823
|
+
RUN chmod 755 /app # Minimal permissions
|
|
824
|
+
USER nonroot # Run as non-root
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
## Best Practices
|
|
828
|
+
|
|
829
|
+
### 1. Use Minimal Base Images
|
|
830
|
+
|
|
831
|
+
```dockerfile
|
|
832
|
+
# Size and security comparison
|
|
833
|
+
alpine: 5 MB, ~5 CVEs
|
|
834
|
+
distroless: 20 MB, ~3 CVEs
|
|
835
|
+
slim: 50 MB, ~15 CVEs
|
|
836
|
+
standard: 200 MB, ~50 CVEs
|
|
837
|
+
```
|
|
838
|
+
|
|
839
|
+
### 2. Multi-Stage Builds
|
|
840
|
+
|
|
841
|
+
Keep build tools out of production images.
|
|
842
|
+
|
|
843
|
+
### 3. Scan Images Regularly
|
|
844
|
+
|
|
845
|
+
```bash
|
|
846
|
+
# Scan on build
|
|
847
|
+
# Scan on schedule (weekly)
|
|
848
|
+
# Scan on new vulnerabilities
|
|
849
|
+
```
|
|
850
|
+
|
|
851
|
+
### 4. Sign Images
|
|
852
|
+
|
|
853
|
+
Verify image authenticity and integrity.
|
|
854
|
+
|
|
855
|
+
### 5. Run as Non-Root
|
|
856
|
+
|
|
857
|
+
```dockerfile
|
|
858
|
+
USER nonroot:nonroot
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
### 6. Drop Capabilities
|
|
862
|
+
|
|
863
|
+
```yaml
|
|
864
|
+
securityContext:
|
|
865
|
+
capabilities:
|
|
866
|
+
drop: ["ALL"]
|
|
867
|
+
```
|
|
868
|
+
|
|
869
|
+
### 7. Read-Only Root Filesystem
|
|
870
|
+
|
|
871
|
+
```yaml
|
|
872
|
+
securityContext:
|
|
873
|
+
readOnlyRootFilesystem: true
|
|
874
|
+
```
|
|
875
|
+
|
|
876
|
+
### 8. Network Policies
|
|
877
|
+
|
|
878
|
+
Restrict container network access.
|
|
879
|
+
|
|
880
|
+
### 9. Resource Limits
|
|
881
|
+
|
|
882
|
+
Prevent resource exhaustion.
|
|
883
|
+
|
|
884
|
+
### 10. Runtime Monitoring
|
|
885
|
+
|
|
886
|
+
Use Falco or similar tools.
|
|
887
|
+
|
|
888
|
+
## Anti-Patterns
|
|
889
|
+
|
|
890
|
+
❌ **Using `latest` tag** - Unpredictable, not reproducible
|
|
891
|
+
|
|
892
|
+
❌ **Running as root** - Unnecessary privilege
|
|
893
|
+
|
|
894
|
+
❌ **Including secrets in image** - Exposed in layers
|
|
895
|
+
|
|
896
|
+
❌ **Not scanning images** - Unknown vulnerabilities
|
|
897
|
+
|
|
898
|
+
❌ **Privileged containers** - Full host access
|
|
899
|
+
|
|
900
|
+
❌ **No resource limits** - Resource exhaustion risk
|
|
901
|
+
|
|
902
|
+
❌ **Mutable containers** - Configuration drift
|
|
903
|
+
|
|
904
|
+
❌ **Ignoring CVEs** - "Won't fix" attitude
|
|
905
|
+
|
|
906
|
+
❌ **No signature verification** - Supply chain risk
|
|
907
|
+
|
|
908
|
+
❌ **Large images** - More vulnerabilities, slow deployments
|
|
909
|
+
|
|
910
|
+
---
|
|
911
|
+
|
|
912
|
+
**Related Resources:**
|
|
913
|
+
- [security-scanning.md](security-scanning.md) - Vulnerability scanning tools
|
|
914
|
+
- [supply-chain-security.md](supply-chain-security.md) - SBOM, provenance
|
|
915
|
+
- [policy-enforcement.md](policy-enforcement.md) - OPA, Kyverno policies
|