{"schema":"aegistrust.agent-build-attestation/v1","source_hash":"sha256:7a5ce3839b86d9e7e21aaea26e7c5a731958d1c172e34d36b983f1b58440c480","input_count":19,"base_image":"node:24-alpine","node_engine":">=24","dockerfile_sha256":"70350af05f1ea0aced98ccdf098a95a17947917d5af60a10719fe9c1336c1fb3","dockerfile":"# AegisTrust Data Plane Agent — 客户内网轻量容器\n#\n# 用法（加固形态，2026-09-29 第 40 轮起为唯一推荐形态）：\n#   docker build -t aegistrust-agent agent/\n#   docker run -d --name aegistrust-agent \\\n#     --user 10001:10001 --read-only --cap-drop ALL --security-opt no-new-privileges \\\n#     --tmpfs /var/lib/aegistrust:uid=10001,gid=10001,mode=0755 \\\n#     -e AGENT_API_URL=https://api.aegistrust.ai/v1/agent \\\n#     -e AGENT_API_KEY=<控制台生成的 key> \\\n#     -v \"$(pwd)\":/work:ro \\\n#     aegistrust-agent\n#\n# 基底镜像：node:24-alpine = 当前 LTS 线（Node 20 的官方维护已于 2026-04 结束，\n# 留在 20 会持续吃不到安全补丁）。\nFROM node:24-alpine\n\n# 非 root 运行（2026-09-29 第 40 轮）：旧镜像实际以 uid=0(root) 跑，与对外\n# 「100% 用户态零侵入 / 无特权容器」的承诺矛盾。固定 gid/uid 10001 并在构建期\n# chown 运行时需要的目录；只读根 FS 下 /var/lib/aegistrust 由调用方用 tmpfs\n# 或命名卷挂载（见 agent/deploy/README.md）。\nRUN addgroup -g 10001 -S aegis \\\n && adduser -u 10001 -S -G aegis -h /app -s /sbin/nologin aegis \\\n && mkdir -p /var/lib/aegistrust \\\n && chown -R 10001:10001 /var/lib/aegistrust\n\nWORKDIR /app\nCOPY package.json ./\nCOPY src/ ./src/\n\n# 本地检查依赖（可选：AWS CLI——凭证由客户挂载，绝不进镜像/云端；\n# iproute2 提供 ss——network-exposed-ports 检查器依赖）\n# 2026-08-21 修复：aws-cli 在 alpine 默认 repo 不存在（community）——\n# 与 git/iproute2 同条 apk 会整体失败导致 fallback 丢掉全部依赖；\n# 拆开执行，aws-cli 失败不阻断其余依赖。\nRUN apk add --no-cache git iproute2 && (apk add --no-cache aws-cli || echo \"aws-cli unavailable (aws-s3 checker will be skipped)\")\n\n# /app 只读即可；/work 由调用方只读挂载（Agent 只读扫描，绝不写客户代码）。\nENV AGENT_WORKDIR=/work \\\n    AGENT_QUEUE_PATH=/var/lib/aegistrust/queue.ndjson\n\n# 应用层正向代理（第 41 轮，可选，默认不启动）：设置 AGENT_PROXY_PORT 才监听。\n# 端口默认只绑 127.0.0.1 —— 适配同 pod / 同任务内 sidecar（应用设 HTTP_PROXY 指向它）。\n# 要让其它网络命名空间访问，必须显式 AGENT_PROXY_BIND=0.0.0.0 并置于 NetworkPolicy 之后；\n# 代理自身不做认证，绝不能直接暴露到不受信网络。CONNECT 为盲隧道（不拆 TLS），看不到加密载荷。\nENV AGENT_PROXY_MODE=monitor\nEXPOSE 8787\n\nUSER 10001:10001\n\n# 真健康信号：离线队列目录必须可写。只读根 FS 漏挂 tmpfs 时会如实变 unhealthy，\n# 而不是\"进程还在、结果却只留在内存里\"的假健康。\nHEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \\\n  CMD node -e \"const fs=require('node:fs');const p=(process.env.AGENT_QUEUE_PATH||'/var/lib/aegistrust/queue.ndjson');const d=p.slice(0,p.lastIndexOf('/'))||'.';fs.accessSync(d,fs.constants.W_OK)\"\n\nCMD [\"node\", \"src/index.mjs\"]\n","inputs":[{"path":"Dockerfile","sha256":"70350af05f1ea0aced98ccdf098a95a17947917d5af60a10719fe9c1336c1fb3","bytes":3003},{"path":"package-lock.json","sha256":"8d8d20287739e380dcdf12755c384cd2fc3a73ad74a65eea469321ebaa85421b","bytes":998},{"path":"package.json","sha256":"2a8623d18eca82105801372620abdd660d73af0a951be331e9998e07a1f14eb0","bytes":901},{"path":"src/checks.mjs","sha256":"da47e43bdbd321792d747b8b7296a1a45a652159925a7a0244b2df1686d6f5cb","bytes":27764},{"path":"src/dry_run.mjs","sha256":"0490de41da1ba3705ad5fd780bc427dbec8354b151aea20ecacf145cf5489c18","bytes":12933},{"path":"src/egress.mjs","sha256":"b0e5c7933a12ddeadb01e87ca4cf1fc60f0c99622de2c44f5d4e1eefeab0dcc9","bytes":3568},{"path":"src/heal.mjs","sha256":"d1df13927d343763c2917c5c9931a6111f26fcb3a94e3e50ee896b6a718c16a6","bytes":8520},{"path":"src/index.mjs","sha256":"9b090d9c34d47a28a7814e2b43ff33f0492a9e117208b85a98db7d1e74b65244","bytes":39100},{"path":"src/modules.mjs","sha256":"224b76ff63e13341ba584b309d93eea5801d7727aa88584bc5ced753b5f7fb72","bytes":4096},{"path":"src/normalize.mjs","sha256":"0cb00a22d41f1b40128c9193d288f02c20498bc37ad58c7e41384e6e3eaeb60b","bytes":4087},{"path":"src/otel.mjs","sha256":"c9a63950cfd28abb9b65726713bac22b10fc01492cf06b5ceb41b0e2708562ce","bytes":6946},{"path":"src/proxy.mjs","sha256":"4981acec5c87bc612210e20fad4ec665c7cf328f47d280f227ca0330292bcc87","bytes":19493},{"path":"src/queue.mjs","sha256":"498e36fbc2dcd214b91c9bc710bf98847b3d2c99e64a77eeb947078f4b5781f2","bytes":9348},{"path":"src/receipts.mjs","sha256":"5b935781b6c0d2691d7e24226aceec1c4008ac716676dab0d6894266693d33a1","bytes":10769},{"path":"src/rule_cache.mjs","sha256":"44653c328c1e8bebc8f4b069f6ef8ed4ed150dca0a384617cafe06a9c6ca34c2","bytes":3818},{"path":"src/signature.mjs","sha256":"b31836fe85b9db3f80763954e32edd9b66d0859f3245a3de621e14f4cde4eb52","bytes":1958},{"path":"src/threats.mjs","sha256":"f6d55ae5f57e7298f5cb8cc3be50679aa064815407e082356c1df3a250ff5f64","bytes":3569},{"path":"src/uplink.mjs","sha256":"910a67c613791ec5453768a1ba57116629e686ea27d9ba7b0b6129c1b2d168d3","bytes":1661},{"path":"src/wasm_plugins.mjs","sha256":"3ddb9ddf31e0ebe0ee098311a1e0408ba177965c2df683bc0a581fcb5c6b5ffd","bytes":13034}]}