Docker匷åã€ã¡ãŒãžã®ã«ã¹ã¿ãã€ãº
ããŒã1ãšããŒã2ã§ã¯ãåºæºãèšå®ããŸããããµãŒãã¹ã Docker Hardened Image(DHI)ã«ç§»è¡ããèåŒ±æ§æ°ããŒãã«æžå°ããã®ãç®æããDHIãæºæ ã®åºç€ã«ããŠããæå·çœ²åãš SLSAã®åºæ ãæ€èšŒããŸããã
ããããã©ããªã«ããŒã¹ã€ã¡ãŒãžãå®å šã§ããã¢ããªã±ãŒã·ã§ã³ãåãããªããã°æå³ããããŸãããããã§ãDHIãã©ã€ã¢ã«äžã«ãšã³ãžãã¢ãæãããå°ãã質åã«ç§»ããŸããã ãã«ã¹ã¿ã ã€ã¡ãŒãžãå¿ èŠã«ãªã£ããã©ãããŸãã?
硬åç»åã¯èšèšäžæå°éã«æããããŠããŸããããã±ãŒãžãããŒãžã£ãŒ(aptãapkãyum)ããŠãŒãã£ãªãã£(wgetãcurl)ãããã«ã¯bashãshã®ãããªã·ã§ã«ãæ¬ ããŠããŸããããã¯ã»ãã¥ãªãã£æ©èœã§ããæªæã®ãã人ç©ãã³ã³ããã«äŸµå ¥ããå Žåã空ã®ããŒã«ããã¯ã¹ãèŠã€ããŸãã
ããããéçºè ã¯ã»ããã¢ããæã«ãããã®ããŒã«ãå¿ èŠãšããããšãå€ãã§ããç£èŠãšãŒãžã§ã³ãã®ã€ã³ã¹ããŒã«ãã«ã¹ã¿ã ã®CAèšŒææžããŸãã¯ç¹å®ã®ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå¿ èŠããããããããŸããã
ã·ãªãŒãºã®æçµåã§ã¯ãDHIã®ã«ã¹ã¿ãã€ãºæŠç¥ãšããŠãDocker Hub UI(ãã©ãããã©ãŒã ããŒã ãããŽãŒã«ãã³ã€ã¡ãŒãžããäœæããããã®ãã®)ãšãã«ãã¹ããŒãžãã«ããã¿ãŒã³(ã¢ããªã±ãŒã·ã§ã³éçºéçºè åã)ã«ã€ããŠåãäžããŸãã
ãªãã·ã§ã³ 1:ãŽãŒã«ãã³ã€ã¡ãŒãž(Docker Hub UI)
ããããªãããã©ãããã©ãŒã ãšã³ãžãã¢ãDevOpsãšã³ãžãã¢ã§ããã°ã瀟å ããŒã ã®ããã«ãç¥çŠããããããŒã¹ã€ã¡ãŒãžãæäŸããããšãç®æšã§ããå¯èœæ§ãé«ãã§ããäŸãã°ã åžžã« äŒæ¥ã®ã«ãŒãCAèšŒææžãšã»ãã¥ãªãã£ãã°ãšãŒãžã§ã³ããå«ãæšæºNode.jsã€ã¡ãŒãžã欲ãããããããŸãããDocker Hubã®UI ããã®ä»¶ã®åªå ã«ãŒãã§ããHub UIã䜿ãæã匷åãªçç±ã¯ã¡ã³ããã³ã¹ã®èªååã§ãã
èŽåœçãªæ©èœ:èªååæ§ç¯
UIãéããŠã€ã¡ãŒãžãã«ã¹ã¿ãã€ãºãããšãDockerã¯ã«ã¹ã¿ã ã¬ã€ã€ãŒãšããŒãåãããããŒã¹ã®é¢ä¿ãèªèããŸããããDockerãåºç€ãšãªãDHIããŒã¹ã€ã¡ãŒãžã®ããã(äŸ:glibcãopensslã®ä¿®æ£)ããªãªãŒã¹ãããšãDocker Hubã¯èªåçã«ã«ã¹ã¿ã ã€ã¡ãŒãžãåæ§ç¯ããŸãã
CIãã€ãã©ã€ã³ãããªã¬ãŒããå¿ èŠã¯ãããŸãããCVEãã£ãŒããç£èŠããå¿ èŠã¯ãããŸããããã©ãããã©ãŒã ã¯ãããé©çšãšåæ§ç¯ãæ åœããããŽãŒã«ãã³ã€ã¡ãŒãžããææ°ã®ã»ãã¥ãªãã£åºæºã«æºæ ããŠããããšãä¿èšŒããŸãã
ä»çµã¿
ãã®ãã©ã€ã¢ã«ã®ããã«çµç¹ãèšå®ããŠããã®ã§ãDocker Hubã§çŽæ¥æ¢çŽ¢ã§ããŸãããŸããçµç¹ããã·ã¥ããŒãã® ãªããžã㪠ã«ç§»åããŸããã«ã¹ã¿ãã€ãºãããç»å(äŸ:dhi-node)ãèŠã€ããã«ã¹ã¿ãã€ãºã¿ããããã«ã¹ã¿ãã€ãºãäœæãã¢ã¯ã·ã§ã³ãã¯ãªãã¯ããŸããããã«ããã以äžã®ã«ã¹ã¿ãã€ãºã¯ãŒã¯ãããŒãéå§ãããŸã:
ãAdd packagesãã»ã¯ã·ã§ã³ã§ã¯ããã£ã¹ããªãã¥ãŒã·ã§ã³ã®ãªããžããªããçŽæ¥OSããã±ãŒãžãæ€çŽ¢ãéžæã§ããŸããäŸãã°ãããã§ã¯ãããã°ã®ããã«ã€ã¡ãŒãžã«bashã远å ããŠããŸãããŸãããOCIã¢ãŒãã£ãã¡ã¯ããã远å ããŠãèšŒææžããšãŒãžã§ã³ããªã©ã®ã«ã¹ã¿ã ãã¡ã€ã«ãæ³šå ¥ããããšãã§ããŸãã
æåŸã«ãã©ã³ã¿ã€ã èšå®(ãŠãŒã¶ãŒãç°å¢å€æ°)ãèšå®ãããã«ããèŠçŽããŸããDocker Hubã¯èšå®ãæ€èšŒãããã«ãããã¥ãŒã«å ¥ããŸãã宿ãããšããã®ã€ã¡ãŒãžã¯çµç¹ã®ãã©ã€ããŒãã¬ãžã¹ããªã§å©çšå¯èœã«ãªããããŒã¹DHIã€ã¡ãŒãžãæŽæ°ããããã³ã«èªåçã«åæ§ç¯ãããŸãã
ãã®ãªãã·ã§ã³ã¯ãçµç¹å šäœã§äœ¿çšãããæšæºåãããããŽãŒã«ãã³ãããŒã¹ç»åã®äœæã«æé©ã§ããäž»ãªå©ç¹ã¯ãDocker Hubã«ããèªååæ§ç¯ã«ããã¡ã³ããã³ã¹ äžèŠã®ã»ãã¥ãªãã£ãããé©çš ã§ããããããåã ã®éçºããŒã ã«ããè¿ éãã€ã¢ããªã±ãŒã·ã§ã³åºæã®ååŸ©äœæ¥ã«ã¯æè»æ§ãå£ããŸãã
ãªãã·ã§ã³ 2:ãã«ãã¹ããŒãžãã«ã
ããããªããéçºè ãªããããããã³ãŒããšäžç·ã«ç°å¢ãå®çŸ©ããDockerfileã§ç®¡çããŠããã§ããããæè»æ§ãå¿ èŠã§ããããèªåã®ãã·ã³ã§ããŒã«ã«ã«åäœããããšãéèŠã§ãã
DHIã€ã¡ãŒãžã«ã¯apt-getãcurlããªããããDockerãã¡ã€ã«å ã§apt-getã®ã€ã³ã¹ããŒã«my-libãå®è¡ããããšã¯ã§ããŸããã倱æããã ããã
代ããã«ããã«ãã¹ããŒãžã®ãã«ããã¿ãŒã³ãçšããŸããã³ã³ã»ããã¯ã·ã³ãã«ã§ã:
- ã¹ããŒãž 1 (ãã«ããŒ):æšæºçãªããã¡ãããã€ã¡ãŒãž(debian:bookworm-slimã®ãããª)ã䜿ã£ãŠäŸåé¢ä¿ãããŠã³ããŒããã³ã³ãã€ã«ãæºåããŠãã ããã
- ã¹ããŒãž 2 (ã©ã³ã¿ã€ã ):åŸãããã¢ãŒãã£ãã¡ã¯ã ã®ã¿ ãçŽç²ãªDHIããŒã¹ã«ã³ããŒããŸãã
ããã«ãããæçµç»åã¯æå°éã§rootåããããå®å šã«ä¿ããã€ã€ãå¿ èŠãªãã®ãã€ã³ã¹ããŒã«ã§ããŸãã
ãã³ãºãªã³ãã¥ãŒããªã¢ã«:ã¢ãã¿ãªã³ã°ãšãŒãžã§ã³ãã®è¿œå
å°å ã§è©ŠããŠã¿ãããäžè¬çãªå®äžçã·ããªãªãã·ãã¥ã¬ãŒãããŸããDatadogã®APMã©ã€ãã©ãª(dd-trace)ãNode.js DHIã€ã¡ãŒãžã«ã°ããŒãã«ã«è¿œå ããããšã§ãã
1ãã»ããã¢ãã
ãã®ãã¹ãçšã«æ°ãããã£ã¬ã¯ããªãäœæããã·ã³ãã«ãªserver.jsãã¡ã€ã«ã远å ããŸãããã®ã¹ã¯ãªããã¯dd-traceã©ã€ãã©ãªãèªã¿èŸŒã¿ãã€ã³ã¹ããŒã«ã®æ€èšŒã詊ã¿ãŸãã
ã¢ããª/server.js
// Simple Express server to demonstrate DHI customization
console.log('Node.js version:', process.version);
try {
require('dd-trace');
console.log('dd-trace module loaded successfully!');
} catch (e) {
console.error('Failed to load dd-trace:', e.message);
process.exit(1);
}
console.log('Running as UID:', process.getuid(), 'GID:', process.getgid());
console.log('DHI customization test successful!');
2ãããŒãã³ãdockerfile
次ã«ãDockerãã¡ã€ã«ãäœæããŸããæšæºã®Debianã€ã¡ãŒãžã䜿ã£ãŠã©ã€ãã©ãªãã€ã³ã¹ããŒã«ãããããDHIã®Node.jsã€ã¡ãŒãžã«ã³ããŒããŸãããã®ãã¹ãçšã«æ°ãããã£ã¬ã¯ããªãäœæããã·ã³ãã«ãªserver.jsãã¡ã€ã«ã远å ããŸãããã®ã¹ã¯ãªããã¯dd-traceã©ã€ãã©ãªãèªã¿èŸŒã¿ãã€ã³ã¹ããŒã«ã®æ€èšŒã詊ã¿ãŸãã
# Stage 1: Builder - a standard Debian Slim image that has apt, curl, and full shell access.
FROM debian:bookworm-slim AS builder
# Install Node.js (matching our target version) and tools
RUN apt-get update && \
apt-get install -y curl && \
curl -fsSL https://deb.nodesource.com/setup_24.x | bash - && \
apt-get install -y nodejs
# Install Datadog APM agent globally (we force the install prefix to /usr/local so we know exactly where files go)
RUN npm config set prefix /usr/local && \
npm install -g dd-trace@5.0.0
# Stage 2: Runtime - we switch to the Docker Hardened Image.
FROM <your-org-namespace>/dhi-node:24.11-debian13-fips
# Copy only the required library from the builder stage
COPY --from=builder /usr/local/lib/node_modules/dd-trace /usr/local/lib/node_modules/dd-trace
# Environment Configuration
# DHI images are strict. We must explicitly tell Node where to find global modules.
ENV NODE_PATH=/usr/local/lib/node_modules
# Copy application code
COPY app/ /app/
WORKDIR /app
# DHI Best Practice: Use the exec form (["node", ...])
# because there is no shell to process strings.
CMD ["node", "server.js"]
3ããã«ãã»ã¢ã³ãã»ã©ã³
ã«ã¹ã¿ã ã€ã¡ãŒãžããã«ãããŸãã
docker build -t dhi-monitoring-test .
ãããå®è¡ããŠãã ãããæåããã°ãã³ã³ããã¯èµ·åããã©ã€ãã©ãªãèŠã€ããŠãããã«éåºããŸãã
docker run --rm dhi-monitoring-test
ã¢ãŠããããïŒ
Node.js version: v24.11.0
dd-trace module loaded successfully!
Running as UID: 1000 GID: 1000
DHI customization test successful!
æå!ã«ã¹ã¿ã ã°ããŒãã«ã©ã€ãã©ãªãæã€åäœããã¢ããªã±ãŒã·ã§ã³ããããããŒãåãããérootããŒã¹äžã§åäœããŠããŸãã
ã»ãã¥ãªãã£ãã§ãã¯
ç§ãã¡ã¯ç»åã®ã«ã¹ã¿ãã€ãºã«æåããŸããããããããã®ã»ãã¥ãªãã£ãæãªã£ãŠããŸã£ãã®ã§ãããã?
ãããDHIãéçšããäžã§æãéèŠãªæèšã§ãã匷åãããããŒã¹ã€ã¡ãŒãžã¯OSãå®ããŸããã远å ããã³ãŒãããã¯å®ããŸãããæ°ããã€ã¡ãŒãžã Docker Scoutã§æ€èšŒããŠã¿ãŸãããã
docker scout cves dhi-monitoring-test --only-severity critical,high
ãµã³ãã«åºå:
â Detected 1 vulnerable package with 1 vulnerability
...
0C 1H 0M 0L lodash.pick 4.4.0
pkg:npm/lodash.pick@4.4.0
â HIGH CVE-2020-8203 [Improperly Controlled Modification of Object Prototype Attributes]
ãã®çµæã¯æ£ç¢ºã§éèŠã§ããããŒã¹ã€ã¡ãŒãž(OSãOpenSSLãNode.jsã©ã³ã¿ã€ã )ã¯äŸç¶ãšããŠå®å šã§ããããããå ã»ã©ã€ã³ã¹ããŒã«ããdd-traceã©ã€ãã©ãªã¯ãé«é倧床ã®è匱æ§ãå«ãäŸåé¢ä¿(lodash.pick)ãåã蟌ãã§ããŸããŸããã
ããã¯ããªãã®èªèšŒãã€ãã©ã€ã³ãæ©èœããŠããããšã®èšŒæã§ãã
ãã ã«ã¹ã¿ã ç»åãã¹ãã£ã³ããŠããªããã°ãã硬åç»åãã䜿ã£ãŠããã®ã§å®å šã ãšæã£ããããããŸãããæçµçãªã¢ãŒãã£ãã¡ã¯ãã«Docker Scoutã䜿ã£ãããšã§ ãã«ã¹ã¿ãã€ãºã«ãã£ãŠ çãããµãã©ã€ãã§ãŒã³ã®è匱æ§ãçºèŠããŸããã
ã¯ãªãŒã³ããŒã¹ãšæ¯ã¹ãŠã©ãã ããèšåŒµããå ãããèŠãŠã¿ãŸãããã
docker scout compare --to <your-org-namespace>/dhi-node:24.11-debian13-fips dhi-monitoring-test
远å ããããµã€ãºã¯dd-traceã©ã€ãã©ãª(~5MB)ãšã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®ã¿ã§ããç§ãã¡ã¯èª€ã£ãŠaptãcurlããã«ããã£ãã·ã¥ããã«ããŒæ®µéããåŒãç¶ãã ããã§ã¯ãããŸãããæ»æå¯Ÿè±¡ã¯æå°éã«æããããŠããŸãã
åºæã«ã€ããŠã®æ³šæ:誰ãäœã«çœ²åããã®ã?
ããŒã 2ã§ã¯ãDocker Hardened Imagesã®SLSAã®åºæãšæå·çœ²åãæ€èšŒããŸãããããã¯ä¿¡é Œã§ãããµãã©ã€ãã§ãŒã³ãç¯ãããã«éåžžã«éèŠã§ããç»åãã«ã¹ã¿ãã€ãºããéã«ã¯ã眲åããææããã人ã誰ããšããåé¡ãéèŠã«ãªããŸãã
- Docker Hub UIã®ã«ã¹ã¿ãã€ãº:Docker Hub UIãéããŠã€ã¡ãŒãžãã«ã¹ã¿ãã€ãºãããšãDockerèªäœãã«ã¹ã¿ã ã€ã¡ãŒãžã®ãã«ããŒãšããŠæ©èœããŸããã€ãŸããã«ã¹ã¿ãã€ãºãããç»åã¯Dockerã®ãã«ãã€ã³ãã©ã¹ãã©ã¯ãã£ããçŽæ¥çœ²åæžã¿ã®åºæãèªèšŒãåãç¶æ¿ããŸããããŒã¹ã®DHIã«ã»ãã¥ãªãã£ããããå±ããšãDockerã¯èªåçã«ã«ã¹ã¿ã ã€ã¡ãŒãžãåæ§ç¯ã»å眲åããç¶ç¶çãªä¿¡é Œãä¿èšŒããŸããããã¯ãã©ãããã©ãŒã ããŒã ã«ãšã£ãŠããŽãŒã«ãã³ã€ã¡ãŒãžããäœæãã倧ããªå©ç¹ã§ãã
- ããŒã«ã«Dockerfile:ãã«ãã¹ããŒãžã®Dockerfileã䜿ã£ãŠããŒã«ã«ã§ã«ã¹ã¿ã ã€ã¡ãŒãžãæ§ç¯ããå Žå(ãã¥ãŒããªã¢ã«ã§è¡ã£ãããã«)ã ããªãã ãã«ããŒã§ããdockerãã«ãã³ãã³ã㯠æ°ãã ã€ã¡ãŒãžãš æ°ãã ãã€ãžã§ã¹ããçæããŸãããã®çµæãDockerã®å
ã®DHI眲åã¯æçµçãªã«ã¹ã¿ã ã€ã¡ãŒãžã«ã¯é©çšãããŸãã(ãããã倿ŽãããŠãããããªããæ°ãããã«ããŒã ããã§ã)ã
ããããä¿¡é Œã®é£éã¯å®å šã«æãããŠããããã§ã¯ãããŸããã - ããŒã¹ã¬ã€ã€ãŒ:ã«ã¹ã¿ã ã€ã¡ãŒãžå ã®åºç€ãšãªãDHIã¬ã€ã€ãŒã¯ãå ã®DockerèªèšŒãä¿æããŠããŸãã
- ã«ã¹ã¿ã ã¬ã€ã€ãŒ:ããªãã®çµç¹ãæ°ããã¬ã€ã€ãŒã®ããã«ããŒããšãªããŸãã
ãã«ãã¹ããŒãžãã«ãã䜿ã£ãæ¬çªå±éã§ã¯ãã«ã¹ã¿ã ã€ã¡ãŒãžã«çœ²åããããã« Cosign ã Docker Content Trust ãCI/CDãã€ãã©ã€ã³ã«çµ±åããŠãã ãããããã«ããã«ãŒããéãããããMyOrgã§äœæãããç»åã®ã¿ãå®è¡ããæ€èšŒæžã¿ã®DHIç»åãåºã«å éšçœ²åãæã€ããšãã£ãããªã·ãŒãé©çšã§ããŸãã
ROIã®æž¬å®:ããŒã ãžã®è³ªå
Docker Hardened Imagesã®ãã©ã€ã¢ã«ãçµããéã«ã¯ãçµç¹ã«ãšã£ãŠãã®äŸ¡å€ãå®éåããããšãéåžžã«éèŠã§ãã以äžã®è³ªåã䜿ã£ãŠãç§»è¡ãã«ã¹ã¿ãã€ãºã®å ·äœçãªææãæ¯ãè¿ã£ãŠãã ãã:
- è匱æ§åæž:DHIã¯CVEæ°ã«ã©ãã»ã©åœ±é¿ãäžããŸããã?ç§»è¡ãããµãŒãã¹ã®ãããã©ãŒã»ã¢ãã¿ãŒãè匱æ§ã¬ããŒããæ¯èŒããŠãã ãããæšå®ãããã»ãã¥ãªãã£ãªã¹ã¯åæžé¡ã¯ã©ã®ãããã§ãã?
- ãšã³ãžãã¢ãªã³ã°ã®åªå: ç»åãDHIã«ç§»è¡ããã®ã«å®éã«å¿ èŠãªãšã³ãžãã¢ãªã³ã°äœæ¥ã¯äœã ã£ãã®ã§ãããã?åŸæ¥ã®ããŒã¹ã€ã¡ãŒãžç®¡çãšæ¯ã¹ãŠããããé©çšãè匱æ§ããªã¢ãŒãžãã»ãã¥ãªãã£ã¬ãã¥ãŒã«ãããæéã®ç¯çŽãèããŠã¿ãŠãã ããã
- ã¯ãŒã¯ãããŒ:DHIã¯ããŒã ã®æ¢åã®éçºããã³CI/CDã¯ãŒã¯ãããŒã«ã©ãã»ã©ããŸãçµ±åãããŠããŸãã?éçºè ã¯ã«ã¹ã¿ãã€ãºãã¿ãŒã³(ãŽãŒã«ãã³ã€ã¡ãŒãž/ãã«ããŒãã¿ãŒã³)ãå®çšçãã€å¹ççã ãšæããŠããŸãã?ããªãã®ããŒã ã¯ãããé·æçã«æ¡çšããå¯èœæ§ã¯ãããŸãã?
ã³ã³ãã©ã€ã¢ã³ã¹ãšç£æ»:DHIã¯SLSAã®åºæãFIPSæºæ ã«ãããã³ã³ãã©ã€ã¢ã³ã¹å ±åãç£æ»ããã»ã¹ãç°¡çŽ åããŸããã?èŠå¶è² æ ã«ã©ã®ãããªåœ±é¿ããããŸãã?
çµè«
æåŸãŸã§èªãã§ãããŠããããšãããããŸã!ãã® 3éšæ§æã®ããã°ã·ãªãŒãºãéããŠãåçŽãªè©Šçšããå®å šãªéçšã¯ãŒã¯ãããŒãžãšç§»è¡ããŸããã
- ç§»è¡:æšæºçãªããŒã¹ã€ã¡ãŒãžãDHIã«çœ®ãæãããšãå³åº§ã«è匱æ§ãæžå°ããŸããã
- æ€èšŒ:眲åãFIPSæºæ ãSBOMãç¬ç«ããŠæ€èšŒããŸããã
- ã«ã¹ã¿ãã€ãº:Hub UI(èªåãããé©çš)ããã«ãã¹ããŒãžãã«ãã䜿ã£ãŠDHIãæ¡åŒµããèªåã®äŸåé¢ä¿ã«ããæ°ããªè匱æ§ããã§ãã¯ããªããåŠã³ãŸããã
ããã§ã®æèšã¯ãDocker Hardened Imagesã®ãããŒãã³ããã¯éæ³ã®çŸã§ã¯ãªããã¯ãªãŒã³ãªåºç€ã§ãããšããããšã§ãããããåºç€ã«æ§ç¯ããããšã§ã ããŒã ã¯æ°åã® äžæµã®è匱æ§ãšçµãããªãæŠããç¹°ãåºããã®ã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®ã»ãã¥ãªãã£ã«æéãå²ãããšãã§ããŸãã