@hybridlabor-api/aos 4.8.0 → 4.9.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/agents.md +1 -1
- package/.agents/nodes.json +1 -1
- package/.agents/vendor-manifest.json +23 -1
- package/.claude/agents/godmode-media-eventtech.md +1 -1
- package/.claude/hooks/conventional-commits.mjs +125 -0
- package/.claude/hooks/env-file-protection.mjs +105 -0
- package/.claude/hooks/go-gate.mjs +101 -81
- package/.claude/settings.json +13 -0
- package/.opencode/agents/godmode-media-eventtech.md +1 -1
- package/.opencode/plugins/bdb-aos.js +31 -4
- package/README.de.md +1 -1
- package/README.md +1 -1
- package/README.pt.md +1 -1
- package/THIRD_PARTY_NOTICES.md +88 -0
- package/docs/skills_table.md +1 -1
- package/installer.js +174 -46
- package/package.json +6 -2
- package/packages/aos-cli/README.md +80 -0
- package/packages/aos-cli/bin/aos-cli.mjs +134 -0
- package/packages/aos-cli/core-skills.json +12 -0
- package/packages/aos-cli/extensions/aos.ts +321 -0
- package/packages/aos-cli/package-lock.json +1923 -0
- package/packages/aos-cli/package.json +29 -0
- package/packages/aos-cli/scripts/check-theme.mjs +63 -0
- package/packages/aos-cli/themes/aos.json +97 -0
- package/scripts/build-plugin-manifest.mjs +131 -0
- package/scripts/validate-skills.mjs +81 -6
- package/skills/basic/ao-orchestrator/SKILL.md +116 -0
- package/skills/global_config/agenttrail/SKILL.md +6 -1
- package/skills/global_config/ask-tim/SKILL.md +4 -4
- package/skills/global_config/bash-script-generator/SKILL.md +201 -0
- package/skills/global_config/bash-script-generator/assets/templates/standard-template.sh +96 -0
- package/skills/global_config/bash-script-generator/docs/bash-scripting-guide.md +729 -0
- package/skills/global_config/bash-script-generator/docs/generation-best-practices.md +193 -0
- package/skills/global_config/bash-script-generator/docs/script-patterns.md +566 -0
- package/skills/global_config/bash-script-generator/docs/text-processing-guide.md +437 -0
- package/skills/global_config/bash-script-generator/examples/log-analyzer.sh +92 -0
- package/skills/global_config/bash-script-generator/scripts/generate_script_template.sh +123 -0
- package/skills/global_config/bash-script-generator/scripts/run_ci_checks.sh +172 -0
- package/skills/global_config/bash-script-generator/scripts/test_generator.sh +413 -0
- package/skills/global_config/bash-script-validator/SKILL.md +249 -0
- package/skills/global_config/bash-script-validator/docs/awk-reference.md +449 -0
- package/skills/global_config/bash-script-validator/docs/bash-reference.md +468 -0
- package/skills/global_config/bash-script-validator/docs/common-mistakes.md +623 -0
- package/skills/global_config/bash-script-validator/docs/grep-reference.md +395 -0
- package/skills/global_config/bash-script-validator/docs/regex-reference.md +391 -0
- package/skills/global_config/bash-script-validator/docs/sed-reference.md +454 -0
- package/skills/global_config/bash-script-validator/docs/shell-reference.md +463 -0
- package/skills/global_config/bash-script-validator/docs/shellcheck-reference.md +399 -0
- package/skills/global_config/bash-script-validator/examples/bad-bash.sh +55 -0
- package/skills/global_config/bash-script-validator/examples/bad-shell.sh +54 -0
- package/skills/global_config/bash-script-validator/examples/good-bash.sh +71 -0
- package/skills/global_config/bash-script-validator/examples/good-shell.sh +69 -0
- package/skills/global_config/bash-script-validator/scripts/run_ci_checks.sh +23 -0
- package/skills/global_config/bash-script-validator/scripts/shellcheck_wrapper.sh +174 -0
- package/skills/global_config/bash-script-validator/scripts/test_validate.sh +446 -0
- package/skills/global_config/bash-script-validator/scripts/validate.sh +512 -0
- package/skills/global_config/ci-pipeline/SKILL.md +135 -0
- package/skills/global_config/dispatching-parallel-agents/SKILL.md +170 -0
- package/skills/global_config/dockerfile-generator/SKILL.md +1038 -0
- package/skills/global_config/dockerfile-generator/examples/example.dockerignore +95 -0
- package/skills/global_config/dockerfile-generator/examples/golang-distroless.Dockerfile +34 -0
- package/skills/global_config/dockerfile-generator/examples/java-springboot.Dockerfile +45 -0
- package/skills/global_config/dockerfile-generator/examples/nextjs-production.Dockerfile +49 -0
- package/skills/global_config/dockerfile-generator/examples/nodejs-multistage.Dockerfile +55 -0
- package/skills/global_config/dockerfile-generator/examples/python-fastapi.Dockerfile +48 -0
- package/skills/global_config/dockerfile-generator/references/language_specific_guides.md +510 -0
- package/skills/global_config/dockerfile-generator/references/multistage_builds.md +570 -0
- package/skills/global_config/dockerfile-generator/references/optimization_patterns.md +492 -0
- package/skills/global_config/dockerfile-generator/references/security_best_practices.md +375 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_dockerignore.sh +199 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_golang.sh +172 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_java.sh +185 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_nodejs.sh +279 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_python.sh +218 -0
- package/skills/global_config/dockerfile-generator/scripts/test_generator.sh +210 -0
- package/skills/global_config/dockerfile-validator/SKILL.md +300 -0
- package/skills/global_config/dockerfile-validator/examples/.dockerignore.example +34 -0
- package/skills/global_config/dockerfile-validator/examples/bad-example.Dockerfile +37 -0
- package/skills/global_config/dockerfile-validator/examples/golang-distroless.Dockerfile +50 -0
- package/skills/global_config/dockerfile-validator/examples/good-example.Dockerfile +52 -0
- package/skills/global_config/dockerfile-validator/examples/python-optimized.Dockerfile +53 -0
- package/skills/global_config/dockerfile-validator/examples/security-issues.Dockerfile +42 -0
- package/skills/global_config/dockerfile-validator/references/docker_best_practices.md +348 -0
- package/skills/global_config/dockerfile-validator/references/optimization_guide.md +473 -0
- package/skills/global_config/dockerfile-validator/references/security_checklist.md +208 -0
- package/skills/global_config/dockerfile-validator/scripts/dockerfile-validate.sh +699 -0
- package/skills/global_config/dockerfile-validator/scripts/test_validate.sh +35 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn-lock-read.Dockerfile +6 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn.Dockerfile +6 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/from-platform-nonroot.Dockerfile +7 -0
- package/skills/global_config/dockerfile-validator/tests/test_regression.sh +164 -0
- package/skills/global_config/finishing-a-development-branch/SKILL.md +228 -0
- package/skills/global_config/github-actions-generator/SKILL.md +353 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/composite/action.yml +82 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/Dockerfile +25 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/action.yml +42 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/entrypoint.sh +27 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/action.yml +33 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/index.js +50 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/package.json +27 -0
- package/skills/global_config/github-actions-generator/assets/templates/workflow/basic_workflow.yml +242 -0
- package/skills/global_config/github-actions-generator/assets/templates/workflow/reusable_workflow.yml +106 -0
- package/skills/global_config/github-actions-generator/examples/README.md +147 -0
- package/skills/global_config/github-actions-generator/examples/actions/setup-node-cached/action.yml +93 -0
- package/skills/global_config/github-actions-generator/examples/caching/docker-buildkit.yml +256 -0
- package/skills/global_config/github-actions-generator/examples/security/dependency-review.yml +62 -0
- package/skills/global_config/github-actions-generator/examples/security/sbom-attestation.yml +119 -0
- package/skills/global_config/github-actions-generator/examples/triggers/chatops-commands.yml +475 -0
- package/skills/global_config/github-actions-generator/examples/triggers/repository-dispatch.yml +418 -0
- package/skills/global_config/github-actions-generator/examples/triggers/workflow-orchestration.yml +404 -0
- package/skills/global_config/github-actions-generator/examples/workflows/docker-build-push.yml +68 -0
- package/skills/global_config/github-actions-generator/examples/workflows/go-ci.yml +161 -0
- package/skills/global_config/github-actions-generator/examples/workflows/monorepo-ci.yml +340 -0
- package/skills/global_config/github-actions-generator/examples/workflows/multi-environment-deploy.yml +406 -0
- package/skills/global_config/github-actions-generator/examples/workflows/nodejs-ci.yml +122 -0
- package/skills/global_config/github-actions-generator/examples/workflows/python-ci.yml +157 -0
- package/skills/global_config/github-actions-generator/examples/workflows/scheduled-tasks.yml +376 -0
- package/skills/global_config/github-actions-generator/references/advanced-triggers.md +917 -0
- package/skills/global_config/github-actions-generator/references/best-practices.md +755 -0
- package/skills/global_config/github-actions-generator/references/common-actions.md +715 -0
- package/skills/global_config/github-actions-generator/references/custom-actions.md +320 -0
- package/skills/global_config/github-actions-generator/references/expressions-and-contexts.md +688 -0
- package/skills/global_config/github-actions-generator/references/modern-features.md +421 -0
- package/skills/global_config/github-actions-generator/scripts/test_generator.sh +344 -0
- package/skills/global_config/github-actions-templates/SKILL.md +7 -0
- package/skills/global_config/github-actions-validator/SKILL.md +576 -0
- package/skills/global_config/github-actions-validator/examples/README.md +88 -0
- package/skills/global_config/github-actions-validator/examples/outdated-versions.yml +76 -0
- package/skills/global_config/github-actions-validator/examples/valid-ci.yml +79 -0
- package/skills/global_config/github-actions-validator/examples/with-errors.yml +47 -0
- package/skills/global_config/github-actions-validator/references/act_usage.md +233 -0
- package/skills/global_config/github-actions-validator/references/action_versions.md +122 -0
- package/skills/global_config/github-actions-validator/references/actionlint_usage.md +343 -0
- package/skills/global_config/github-actions-validator/references/common_errors.md +512 -0
- package/skills/global_config/github-actions-validator/references/modern_features.md +384 -0
- package/skills/global_config/github-actions-validator/references/runners.md +317 -0
- package/skills/global_config/github-actions-validator/scripts/install_tools.sh +113 -0
- package/skills/global_config/github-actions-validator/scripts/validate_workflow.sh +910 -0
- package/skills/global_config/github-actions-validator/tests/test_validate_workflow.sh +237 -0
- package/skills/global_config/makefile-generator/SKILL.md +614 -0
- package/skills/global_config/makefile-generator/assets/templates/.gitkeep +1 -0
- package/skills/global_config/makefile-generator/docs/makefile-structure.md +530 -0
- package/skills/global_config/makefile-generator/docs/optimization-guide.md +784 -0
- package/skills/global_config/makefile-generator/docs/patterns-guide.md +642 -0
- package/skills/global_config/makefile-generator/docs/security-guide.md +361 -0
- package/skills/global_config/makefile-generator/docs/targets-guide.md +642 -0
- package/skills/global_config/makefile-generator/docs/variables-guide.md +596 -0
- package/skills/global_config/makefile-generator/scripts/add_standard_targets.sh +539 -0
- package/skills/global_config/makefile-generator/scripts/generate_makefile_template.sh +690 -0
- package/skills/global_config/makefile-generator/test/test_helper_scripts.sh +190 -0
- package/skills/global_config/makefile-validator/SKILL.md +244 -0
- package/skills/global_config/makefile-validator/docs/bake-tool.md +1000 -0
- package/skills/global_config/makefile-validator/docs/best-practices.md +858 -0
- package/skills/global_config/makefile-validator/docs/common-mistakes.md +944 -0
- package/skills/global_config/makefile-validator/examples/bad-makefile.mk +77 -0
- package/skills/global_config/makefile-validator/examples/good-makefile.mk +103 -0
- package/skills/global_config/makefile-validator/scripts/test_validate.sh +382 -0
- package/skills/global_config/makefile-validator/scripts/validate_makefile.sh +712 -0
- package/skills/global_config/{MCP_Manage → mcp-manage}/SKILL.md +3 -3
- package/skills/global_config/requesting-code-review/SKILL.md +98 -0
- package/skills/global_config/requesting-code-review/code-reviewer.md +198 -0
- package/skills/global_config/using-git-worktrees/SKILL.md +170 -0
- package/skills/global_config/verification-before-completion/SKILL.md +123 -0
- package/skills/global_config/writing-plans/SKILL.md +126 -46
- package/skills/global_config/writing-plans-legacy/SKILL.md +139 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
# Dockerfile Security Best Practices
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide provides comprehensive security best practices for writing secure Dockerfiles. Security should be a primary consideration when containerizing applications.
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
1. [Base Image Security](#base-image-security)
|
|
10
|
+
2. [User Management](#user-management)
|
|
11
|
+
3. [Secrets Management](#secrets-management)
|
|
12
|
+
4. [Dependency Management](#dependency-management)
|
|
13
|
+
5. [Attack Surface Reduction](#attack-surface-reduction)
|
|
14
|
+
6. [Vulnerability Scanning](#vulnerability-scanning)
|
|
15
|
+
|
|
16
|
+
## Base Image Security
|
|
17
|
+
|
|
18
|
+
### Use Specific Tags
|
|
19
|
+
|
|
20
|
+
**Problem:** Using `:latest` tag can lead to unpredictable builds and security vulnerabilities.
|
|
21
|
+
|
|
22
|
+
```dockerfile
|
|
23
|
+
# Bad - Unpredictable, may pull vulnerable versions
|
|
24
|
+
FROM node:latest
|
|
25
|
+
|
|
26
|
+
# Good - Specific version
|
|
27
|
+
FROM node:20-alpine
|
|
28
|
+
|
|
29
|
+
# Better - Specific version with digest for reproducibility
|
|
30
|
+
FROM node:20-alpine@sha256:2c6c59cf4d34d4f937ddfcf33bab9d8bbad8658d1b9de7b97622566a52167f5b
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Use Minimal Base Images
|
|
34
|
+
|
|
35
|
+
**Principle:** Smaller images have fewer attack vectors.
|
|
36
|
+
|
|
37
|
+
```dockerfile
|
|
38
|
+
# Large attack surface (>1GB)
|
|
39
|
+
FROM ubuntu:22.04
|
|
40
|
+
|
|
41
|
+
# Medium attack surface (~200MB)
|
|
42
|
+
FROM node:20
|
|
43
|
+
|
|
44
|
+
# Small attack surface (~50MB)
|
|
45
|
+
FROM node:20-alpine
|
|
46
|
+
|
|
47
|
+
# Minimal attack surface (~2MB for Go apps)
|
|
48
|
+
FROM gcr.io/distroless/static-debian12
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Recommended Base Images:**
|
|
52
|
+
- **Alpine Linux:** Minimal Linux distribution (~5MB base)
|
|
53
|
+
- **Distroless:** Google's minimal container images (no shell, package managers)
|
|
54
|
+
- **Scratch:** Empty base image (for static binaries only)
|
|
55
|
+
|
|
56
|
+
### Scan Base Images
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Use Trivy to scan base images
|
|
60
|
+
trivy image node:20-alpine
|
|
61
|
+
|
|
62
|
+
# Use Snyk
|
|
63
|
+
snyk container test node:20-alpine
|
|
64
|
+
|
|
65
|
+
# Use Docker Scout
|
|
66
|
+
docker scout cves node:20-alpine
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## User Management
|
|
70
|
+
|
|
71
|
+
### Never Run as Root
|
|
72
|
+
|
|
73
|
+
**Problem:** Running as root gives attackers full system access if container is compromised.
|
|
74
|
+
|
|
75
|
+
```dockerfile
|
|
76
|
+
# Bad - Runs as root (default)
|
|
77
|
+
FROM node:20-alpine
|
|
78
|
+
COPY . /app
|
|
79
|
+
CMD ["node", "server.js"]
|
|
80
|
+
|
|
81
|
+
# Good - Creates and uses non-root user
|
|
82
|
+
FROM node:20-alpine
|
|
83
|
+
RUN addgroup -g 1001 -S nodejs && \
|
|
84
|
+
adduser -S nodejs -u 1001
|
|
85
|
+
COPY --chown=nodejs:nodejs . /app
|
|
86
|
+
USER nodejs
|
|
87
|
+
CMD ["node", "server.js"]
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### User Creation Patterns
|
|
91
|
+
|
|
92
|
+
**Alpine Linux:**
|
|
93
|
+
```dockerfile
|
|
94
|
+
RUN addgroup -g 1001 -S appgroup && \
|
|
95
|
+
adduser -S app -u 1001 -G appgroup
|
|
96
|
+
USER app
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Debian/Ubuntu:**
|
|
100
|
+
```dockerfile
|
|
101
|
+
RUN useradd -m -u 1001 app
|
|
102
|
+
USER app
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Distroless (built-in nonroot user):**
|
|
106
|
+
```dockerfile
|
|
107
|
+
FROM gcr.io/distroless/static-debian12
|
|
108
|
+
USER nonroot:nonroot
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Set Proper File Permissions
|
|
112
|
+
|
|
113
|
+
```dockerfile
|
|
114
|
+
# Copy with ownership
|
|
115
|
+
COPY --chown=app:app . /app
|
|
116
|
+
|
|
117
|
+
# Ensure executables have correct permissions
|
|
118
|
+
RUN chmod +x /app/entrypoint.sh
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Secrets Management
|
|
122
|
+
|
|
123
|
+
### Never Hardcode Secrets
|
|
124
|
+
|
|
125
|
+
```dockerfile
|
|
126
|
+
# Bad - Hardcoded secrets
|
|
127
|
+
ENV API_KEY=sk_live_abc123
|
|
128
|
+
ENV DATABASE_PASSWORD=password123
|
|
129
|
+
|
|
130
|
+
# Good - Use runtime environment variables
|
|
131
|
+
ENV API_KEY=""
|
|
132
|
+
ENV DATABASE_PASSWORD=""
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Use Build Secrets (BuildKit)
|
|
136
|
+
|
|
137
|
+
```dockerfile
|
|
138
|
+
# Mount secrets during build (never stored in image layers)
|
|
139
|
+
# syntax=docker/dockerfile:1
|
|
140
|
+
FROM alpine
|
|
141
|
+
RUN --mount=type=secret,id=api_key \
|
|
142
|
+
API_KEY=$(cat /run/secrets/api_key) && \
|
|
143
|
+
echo "Configuring with API key..." && \
|
|
144
|
+
# Use API_KEY here
|
|
145
|
+
rm -f /run/secrets/api_key
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Build command:**
|
|
149
|
+
```bash
|
|
150
|
+
docker build --secret id=api_key,src=.env .
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Avoid Secrets in Layers
|
|
154
|
+
|
|
155
|
+
```dockerfile
|
|
156
|
+
# Bad - Secret remains in image history
|
|
157
|
+
FROM alpine
|
|
158
|
+
RUN echo "SECRET_KEY=abc123" > /app/config
|
|
159
|
+
RUN rm /app/config # Secret still in previous layer!
|
|
160
|
+
|
|
161
|
+
# Good - Use multi-stage builds or build secrets
|
|
162
|
+
FROM alpine
|
|
163
|
+
RUN --mount=type=secret,id=config \
|
|
164
|
+
cat /run/secrets/config > /app/config && \
|
|
165
|
+
process_config && \
|
|
166
|
+
rm /app/config
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Dependency Management
|
|
170
|
+
|
|
171
|
+
### Pin Dependency Versions
|
|
172
|
+
|
|
173
|
+
```dockerfile
|
|
174
|
+
# Bad - Unpinned versions
|
|
175
|
+
RUN apt-get install -y curl git
|
|
176
|
+
|
|
177
|
+
# Good - Pinned versions
|
|
178
|
+
RUN apt-get install -y \
|
|
179
|
+
curl=7.81.0-1ubuntu1.16 \
|
|
180
|
+
git=1:2.34.1-1ubuntu1.11
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Node.js:**
|
|
184
|
+
```dockerfile
|
|
185
|
+
# Use package-lock.json or yarn.lock
|
|
186
|
+
COPY package*.json ./
|
|
187
|
+
RUN npm ci # Uses lock file
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Python:**
|
|
191
|
+
```dockerfile
|
|
192
|
+
# Pin versions in requirements.txt
|
|
193
|
+
COPY requirements.txt .
|
|
194
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Go:**
|
|
198
|
+
```dockerfile
|
|
199
|
+
# go.sum ensures reproducible builds
|
|
200
|
+
COPY go.mod go.sum ./
|
|
201
|
+
RUN go mod download
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Clean Package Manager Caches
|
|
205
|
+
|
|
206
|
+
```dockerfile
|
|
207
|
+
# Alpine (apk)
|
|
208
|
+
RUN apk add --no-cache curl
|
|
209
|
+
|
|
210
|
+
# Debian/Ubuntu (apt)
|
|
211
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
212
|
+
curl \
|
|
213
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
214
|
+
|
|
215
|
+
# Node.js (npm)
|
|
216
|
+
RUN npm ci && npm cache clean --force
|
|
217
|
+
|
|
218
|
+
# Python (pip)
|
|
219
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Attack Surface Reduction
|
|
223
|
+
|
|
224
|
+
### Minimize Installed Packages
|
|
225
|
+
|
|
226
|
+
```dockerfile
|
|
227
|
+
# Bad - Installs unnecessary packages
|
|
228
|
+
RUN apt-get install -y \
|
|
229
|
+
curl \
|
|
230
|
+
wget \
|
|
231
|
+
vim \
|
|
232
|
+
sudo \
|
|
233
|
+
ssh
|
|
234
|
+
|
|
235
|
+
# Good - Only essential packages
|
|
236
|
+
RUN apt-get install -y --no-install-recommends \
|
|
237
|
+
curl \
|
|
238
|
+
ca-certificates
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Use Multi-Stage Builds
|
|
242
|
+
|
|
243
|
+
```dockerfile
|
|
244
|
+
# Build stage - can include build tools
|
|
245
|
+
FROM golang:1.21-alpine AS builder
|
|
246
|
+
RUN apk add --no-cache git make
|
|
247
|
+
COPY . .
|
|
248
|
+
RUN make build
|
|
249
|
+
|
|
250
|
+
# Production stage - minimal runtime
|
|
251
|
+
FROM alpine:3.21
|
|
252
|
+
COPY --from=builder /app/binary /app/binary
|
|
253
|
+
CMD ["/app/binary"]
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Remove Build Dependencies
|
|
257
|
+
|
|
258
|
+
```dockerfile
|
|
259
|
+
# Install, use, and remove in same layer
|
|
260
|
+
RUN apk add --no-cache --virtual .build-deps \
|
|
261
|
+
gcc \
|
|
262
|
+
musl-dev \
|
|
263
|
+
&& pip install --no-cache-dir -r requirements.txt \
|
|
264
|
+
&& apk del .build-deps
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Disable Unnecessary Services
|
|
268
|
+
|
|
269
|
+
```dockerfile
|
|
270
|
+
# Don't include SSH, telnet, or other services
|
|
271
|
+
# Use docker exec for debugging instead
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Network Security
|
|
275
|
+
|
|
276
|
+
### Expose Only Necessary Ports
|
|
277
|
+
|
|
278
|
+
```dockerfile
|
|
279
|
+
# Document exposed ports
|
|
280
|
+
EXPOSE 8080
|
|
281
|
+
|
|
282
|
+
# Don't expose unnecessary ports
|
|
283
|
+
# Bad: EXPOSE 22 (SSH)
|
|
284
|
+
# Bad: EXPOSE 3306 (MySQL in app container)
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Use Non-Privileged Ports
|
|
288
|
+
|
|
289
|
+
```dockerfile
|
|
290
|
+
# Good - Use port > 1024 (doesn't require root)
|
|
291
|
+
EXPOSE 8080
|
|
292
|
+
|
|
293
|
+
# Avoid privileged ports (< 1024)
|
|
294
|
+
# EXPOSE 80 # Requires root
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Vulnerability Scanning
|
|
298
|
+
|
|
299
|
+
### Integrate Scanning into CI/CD
|
|
300
|
+
|
|
301
|
+
```yaml
|
|
302
|
+
# GitHub Actions example
|
|
303
|
+
- name: Scan Docker image
|
|
304
|
+
uses: aquasecurity/trivy-action@master
|
|
305
|
+
with:
|
|
306
|
+
image-ref: myapp:latest
|
|
307
|
+
format: 'sarif'
|
|
308
|
+
output: 'trivy-results.sarif'
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Regular Image Updates
|
|
312
|
+
|
|
313
|
+
```dockerfile
|
|
314
|
+
# Rebuild images regularly to get security patches
|
|
315
|
+
FROM node:20-alpine # Alpine releases security updates frequently
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Scan for Secrets
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
# Use gitleaks or trufflehog
|
|
322
|
+
docker run -v $(pwd):/path zricethezav/gitleaks:latest detect --source=/path
|
|
323
|
+
|
|
324
|
+
# Use hadolint to detect some secret patterns
|
|
325
|
+
hadolint Dockerfile
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## Security Checklist
|
|
329
|
+
|
|
330
|
+
- [ ] Use specific base image tags (no `:latest`)
|
|
331
|
+
- [ ] Use minimal base images (Alpine, distroless)
|
|
332
|
+
- [ ] Create and use non-root user
|
|
333
|
+
- [ ] Never hardcode secrets
|
|
334
|
+
- [ ] Use build secrets for sensitive data
|
|
335
|
+
- [ ] Pin dependency versions
|
|
336
|
+
- [ ] Clean package manager caches
|
|
337
|
+
- [ ] Minimize installed packages
|
|
338
|
+
- [ ] Use multi-stage builds
|
|
339
|
+
- [ ] Expose only necessary ports
|
|
340
|
+
- [ ] Scan images for vulnerabilities
|
|
341
|
+
- [ ] Update base images regularly
|
|
342
|
+
- [ ] Use HEALTHCHECK for services
|
|
343
|
+
- [ ] Validate with hadolint and Checkov
|
|
344
|
+
|
|
345
|
+
## Common Vulnerabilities
|
|
346
|
+
|
|
347
|
+
### CVE-Related Issues
|
|
348
|
+
|
|
349
|
+
1. **Outdated base images:** Rebuild regularly
|
|
350
|
+
2. **Known vulnerable packages:** Scan and update
|
|
351
|
+
3. **Missing security patches:** Use latest patch versions
|
|
352
|
+
|
|
353
|
+
### Configuration Issues
|
|
354
|
+
|
|
355
|
+
1. **Running as root:** Create non-root user
|
|
356
|
+
2. **Exposed secrets:** Use build secrets or runtime config
|
|
357
|
+
3. **Unnecessary packages:** Minimize attack surface
|
|
358
|
+
4. **Missing health checks:** Add HEALTHCHECK directive
|
|
359
|
+
|
|
360
|
+
## Tools for Security
|
|
361
|
+
|
|
362
|
+
- **Trivy:** Comprehensive vulnerability scanner
|
|
363
|
+
- **Snyk:** Security scanning and monitoring
|
|
364
|
+
- **Checkov:** Policy-as-code security scanning
|
|
365
|
+
- **hadolint:** Dockerfile linting with security rules
|
|
366
|
+
- **Docker Scout:** Docker's official security tool
|
|
367
|
+
- **Clair:** Container vulnerability analysis
|
|
368
|
+
- **Anchore:** Container security and compliance
|
|
369
|
+
|
|
370
|
+
## References
|
|
371
|
+
|
|
372
|
+
- [Docker Security Best Practices](https://docs.docker.com/develop/security-best-practices/)
|
|
373
|
+
- [CIS Docker Benchmark](https://www.cisecurity.org/benchmark/docker)
|
|
374
|
+
- [OWASP Docker Security Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html)
|
|
375
|
+
- [Snyk Docker Security Best Practices](https://snyk.io/learn/docker-security/)
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Generate a comprehensive .dockerignore file
|
|
3
|
+
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
# Default values
|
|
7
|
+
OUTPUT_FILE="${OUTPUT_FILE:-.dockerignore}"
|
|
8
|
+
LANGUAGE="${LANGUAGE:-generic}"
|
|
9
|
+
|
|
10
|
+
# Usage
|
|
11
|
+
usage() {
|
|
12
|
+
cat <<EOF
|
|
13
|
+
Usage: $0 [OPTIONS]
|
|
14
|
+
|
|
15
|
+
Generate a comprehensive .dockerignore file.
|
|
16
|
+
|
|
17
|
+
OPTIONS:
|
|
18
|
+
-l, --language LANG Language: nodejs, python, go, java, generic (default: generic)
|
|
19
|
+
-o, --output FILE Output file (default: .dockerignore)
|
|
20
|
+
-h, --help Show this help message
|
|
21
|
+
|
|
22
|
+
EXAMPLES:
|
|
23
|
+
# Generic .dockerignore
|
|
24
|
+
$0
|
|
25
|
+
|
|
26
|
+
# Node.js specific
|
|
27
|
+
$0 --language nodejs
|
|
28
|
+
|
|
29
|
+
# Python specific
|
|
30
|
+
$0 --language python
|
|
31
|
+
|
|
32
|
+
EOF
|
|
33
|
+
exit 0
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Parse arguments
|
|
37
|
+
while [[ $# -gt 0 ]]; do
|
|
38
|
+
case $1 in
|
|
39
|
+
-l|--language)
|
|
40
|
+
LANGUAGE="$2"
|
|
41
|
+
shift 2
|
|
42
|
+
;;
|
|
43
|
+
-o|--output)
|
|
44
|
+
OUTPUT_FILE="$2"
|
|
45
|
+
shift 2
|
|
46
|
+
;;
|
|
47
|
+
-h|--help)
|
|
48
|
+
usage
|
|
49
|
+
;;
|
|
50
|
+
*)
|
|
51
|
+
echo "Unknown option: $1"
|
|
52
|
+
usage
|
|
53
|
+
;;
|
|
54
|
+
esac
|
|
55
|
+
done
|
|
56
|
+
|
|
57
|
+
# Validate language parameter
|
|
58
|
+
case "$LANGUAGE" in
|
|
59
|
+
nodejs|python|go|java|generic) ;;
|
|
60
|
+
*)
|
|
61
|
+
echo "Warning: Unknown language '$LANGUAGE'. Supported: nodejs, python, go, java, generic. Falling back to 'generic'." >&2
|
|
62
|
+
LANGUAGE="generic"
|
|
63
|
+
;;
|
|
64
|
+
esac
|
|
65
|
+
|
|
66
|
+
# Generate base .dockerignore
|
|
67
|
+
cat > "$OUTPUT_FILE" <<'EOF'
|
|
68
|
+
# Git
|
|
69
|
+
.git
|
|
70
|
+
.gitignore
|
|
71
|
+
.gitattributes
|
|
72
|
+
|
|
73
|
+
# CI/CD
|
|
74
|
+
.github
|
|
75
|
+
.gitlab-ci.yml
|
|
76
|
+
.travis.yml
|
|
77
|
+
.circleci
|
|
78
|
+
Jenkinsfile
|
|
79
|
+
|
|
80
|
+
# Documentation
|
|
81
|
+
README.md
|
|
82
|
+
CHANGELOG.md
|
|
83
|
+
CONTRIBUTING.md
|
|
84
|
+
LICENSE
|
|
85
|
+
*.md
|
|
86
|
+
docs/
|
|
87
|
+
|
|
88
|
+
# Docker
|
|
89
|
+
Dockerfile*
|
|
90
|
+
docker-compose*.yml
|
|
91
|
+
.dockerignore
|
|
92
|
+
|
|
93
|
+
# Environment
|
|
94
|
+
.env
|
|
95
|
+
.env.*
|
|
96
|
+
*.local
|
|
97
|
+
.envrc
|
|
98
|
+
|
|
99
|
+
# Logs
|
|
100
|
+
logs/
|
|
101
|
+
*.log
|
|
102
|
+
|
|
103
|
+
# IDE
|
|
104
|
+
.vscode/
|
|
105
|
+
.idea/
|
|
106
|
+
*.swp
|
|
107
|
+
*.swo
|
|
108
|
+
*~
|
|
109
|
+
.DS_Store
|
|
110
|
+
*.iml
|
|
111
|
+
|
|
112
|
+
# Testing
|
|
113
|
+
coverage/
|
|
114
|
+
.coverage
|
|
115
|
+
test-results/
|
|
116
|
+
*.test
|
|
117
|
+
|
|
118
|
+
EOF
|
|
119
|
+
|
|
120
|
+
# Add language-specific patterns
|
|
121
|
+
case "$LANGUAGE" in
|
|
122
|
+
nodejs)
|
|
123
|
+
cat >> "$OUTPUT_FILE" <<'EOF'
|
|
124
|
+
# Node.js
|
|
125
|
+
node_modules/
|
|
126
|
+
npm-debug.log*
|
|
127
|
+
yarn-debug.log*
|
|
128
|
+
yarn-error.log*
|
|
129
|
+
.npm
|
|
130
|
+
.yarn
|
|
131
|
+
.pnp.*
|
|
132
|
+
dist/
|
|
133
|
+
build/
|
|
134
|
+
|
|
135
|
+
EOF
|
|
136
|
+
;;
|
|
137
|
+
python)
|
|
138
|
+
cat >> "$OUTPUT_FILE" <<'EOF'
|
|
139
|
+
# Python
|
|
140
|
+
__pycache__/
|
|
141
|
+
*.py[cod]
|
|
142
|
+
*$py.class
|
|
143
|
+
*.so
|
|
144
|
+
.Python
|
|
145
|
+
venv/
|
|
146
|
+
.venv/
|
|
147
|
+
env/
|
|
148
|
+
ENV/
|
|
149
|
+
pip-log.txt
|
|
150
|
+
pip-delete-this-directory.txt
|
|
151
|
+
.pytest_cache/
|
|
152
|
+
.tox/
|
|
153
|
+
*.egg-info/
|
|
154
|
+
dist/
|
|
155
|
+
build/
|
|
156
|
+
|
|
157
|
+
EOF
|
|
158
|
+
;;
|
|
159
|
+
go)
|
|
160
|
+
cat >> "$OUTPUT_FILE" <<'EOF'
|
|
161
|
+
# Go
|
|
162
|
+
vendor/
|
|
163
|
+
*.exe
|
|
164
|
+
*.test
|
|
165
|
+
*.out
|
|
166
|
+
go.work
|
|
167
|
+
go.work.sum
|
|
168
|
+
|
|
169
|
+
EOF
|
|
170
|
+
;;
|
|
171
|
+
java)
|
|
172
|
+
cat >> "$OUTPUT_FILE" <<'EOF'
|
|
173
|
+
# Java
|
|
174
|
+
target/
|
|
175
|
+
*.class
|
|
176
|
+
*.jar
|
|
177
|
+
*.war
|
|
178
|
+
*.ear
|
|
179
|
+
.gradle/
|
|
180
|
+
build/
|
|
181
|
+
.mvn/
|
|
182
|
+
!.mvn/wrapper/maven-wrapper.jar
|
|
183
|
+
|
|
184
|
+
EOF
|
|
185
|
+
;;
|
|
186
|
+
generic)
|
|
187
|
+
cat >> "$OUTPUT_FILE" <<'EOF'
|
|
188
|
+
# Build artifacts
|
|
189
|
+
dist/
|
|
190
|
+
build/
|
|
191
|
+
target/
|
|
192
|
+
out/
|
|
193
|
+
|
|
194
|
+
EOF
|
|
195
|
+
;;
|
|
196
|
+
esac
|
|
197
|
+
|
|
198
|
+
echo "✓ Generated .dockerignore: $OUTPUT_FILE"
|
|
199
|
+
echo " Language: $LANGUAGE"
|