From f6a2007c77313d1639d937b9721c8197aa348293 Mon Sep 17 00:00:00 2001 From: Apple Date: Fri, 9 Jan 2026 12:16:30 -0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A1=EF=B8=8F=20security:=20Implement?= =?UTF-8?q?=20full=20container=20audit=20and=20signed=20images=20guide?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added security/audit-all-containers.sh: Automated Trivy scan for all 60+ project images - Added security/hardening/signed-images.md: Guide for Docker Content Trust (DCT) - Updated NODE1 with audit script and started background scan - Results will be saved to /opt/microdao-daarion/logs/audits/ Co-authored-by: Cursor Agent --- security/audit-all-containers.sh | 77 ++++++++++++++++++++++++++ security/hardening/signed-images.md | 86 +++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100755 security/audit-all-containers.sh create mode 100644 security/hardening/signed-images.md diff --git a/security/audit-all-containers.sh b/security/audit-all-containers.sh new file mode 100755 index 00000000..f036b711 --- /dev/null +++ b/security/audit-all-containers.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# ============================================ +# Full Container Security Audit — DAARION +# Version: 1.0.0 +# Created: 2026-01-09 +# Purpose: Scan all project images for vulnerabilities +# ============================================ + +set -e + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +LOG_DIR="/opt/microdao-daarion/logs/audits" +mkdir -p "$LOG_DIR" +REPORT_FILE="${LOG_DIR}/audit-$(date +%Y%m%d-%H%M%S).md" + +echo -e "${BLUE}============================================${NC}" +echo -e "${BLUE} DAARION Full Container Security Audit${NC}" +echo -e "${BLUE}============================================${NC}" +echo "" + +# Check Trivy +if ! command -v trivy &> /dev/null; then + echo -e "${YELLOW}Installing Trivy...${NC}" + curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin +fi + +# Get all images from all docker-compose files +IMAGES=$(find . -name 'docker-compose*.yml' -exec docker compose -f {} config --images 2>/dev/null \; | sort -u) + +echo -e "Found ${YELLOW}$(echo "$IMAGES" | wc -l)${NC} unique images to scan." +echo "" > "$REPORT_FILE" +echo "# Security Audit Report - $(date)" >> "$REPORT_FILE" +echo "" >> "$REPORT_FILE" +echo "| Image | Critical | High | Status |" >> "$REPORT_FILE" +echo "|-------|----------|------|--------|" >> "$REPORT_FILE" + +for IMAGE in $IMAGES; do + echo -ne "Scanning ${BLUE}${IMAGE}${NC}... " + + # Run scan + SCAN_RESULT=$(trivy image --severity CRITICAL,HIGH --format json "$IMAGE" 2>/dev/null) + + if [ $? -ne 0 ]; then + echo -e "${RED}FAILED${NC}" + echo "| $IMAGE | ERR | ERR | ❌ Scan Failed |" >> "$REPORT_FILE" + continue + fi + + CRITICAL=$(echo "$SCAN_RESULT" | grep -o '"Severity":"CRITICAL"' | wc -l) + HIGH=$(echo "$SCAN_RESULT" | grep -o '"Severity":"HIGH"' | wc -l) + + if [ "$CRITICAL" -gt 0 ]; then + STATUS="🔴 CRITICAL" + elif [ "$HIGH" -gt 0 ]; then + STATUS="🟡 HIGH" + else + STATUS="✅ CLEAN" + fi + + echo -e "${STATUS} (C:${CRITICAL}, H:${HIGH})" + echo "| $IMAGE | $CRITICAL | $HIGH | $STATUS |" >> "$REPORT_FILE" +done + +echo "" +echo -e "${GREEN}Audit completed!${NC}" +echo -e "Report saved to: ${REPORT_FILE}" +echo "" +echo -e "${YELLOW}Top Recommendations:${NC}" +echo "1. Update base images for services with CRITICAL vulnerabilities." +echo "2. Rebuild local images with --no-cache." +echo "3. Use specific versions instead of :latest." diff --git a/security/hardening/signed-images.md b/security/hardening/signed-images.md new file mode 100644 index 00000000..8051ba88 --- /dev/null +++ b/security/hardening/signed-images.md @@ -0,0 +1,86 @@ +# 🔏 Docker Content Trust (DCT) — Signed Images Guide + +**Мета:** Гарантувати, що в системі запускаються тільки перевірені та підписані образи. + +--- + +## 🎯 Що таке Docker Content Trust? + +DCT дозволяє використовувати цифрові підписи для даних, що надсилаються та отримуються з віддалених Docker реєстрів. Це гарантує: +1. **Integrity:** Образ не був змінений. +2. **Publisher:** Образ підписаний саме вами. +3. **Freshness:** Ви використовуєте останню версію підписаного образу. + +--- + +## 🚀 Налаштування DCT + +### 1. Увімкнення DCT (Local & Server) + +Додайте змінну оточення у ваш `.zshrc` або `.bashrc`: + +```bash +export DOCKER_CONTENT_TRUST=1 +``` + +Після цього Docker буде блокувати будь-які операції з непідписаними образами. + +### 2. Генерація ключів підпису + +При першій спробі підписати образ, Docker згенерує ключі: +- **Root key:** Головний ключ (зберігайте в безпечному місці!). +- **Repository key:** Ключ для конкретного репозиторію. + +### 3. Підписання образу при Push + +Якщо `DOCKER_CONTENT_TRUST=1`, команда `docker push` автоматично підпише образ: + +```bash +docker push your-registry/image:tag +``` + +### 4. Налаштування NODE1 для перевірки + +На сервері NODE1 обов'язково увімкніть перевірку: + +```bash +# /etc/environment +DOCKER_CONTENT_TRUST=1 +``` + +Тепер `docker pull` або `docker compose up` завершаться помилкою, якщо образ не має валідного підпису. + +--- + +## 🛠️ Інтеграція в CI/CD (GitHub Actions) + +Використовуйте `cosign` — сучасний стандарт підпису контейнерів від Sigstore. + +```yaml +- name: Install Cosign + uses: sigstore/cosign-installer@main + +- name: Sign the images + run: | + cosign sign --key ${{ secrets.COSIGN_PRIVATE_KEY }} your-registry/image:tag + env: + COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }} +``` + +--- + +## 📊 Стратегія переходу для DAARION + +| Етап | Дія | Результат | +|------|-----|-----------| +| 1. Audit | Прогнати повний аудит поточних образів | Розуміння вразливостей | +| 2. Local Setup | Увімкнути `DOCKER_CONTENT_TRUST=1` локально | Тільки підписані білди | +| 3. Registry | Використовути приватний реєстр (GitHub GHCR) | Безпечне сховище | +| 4. Server Policy | Увімкнути примусову перевірку на NODE1 | Блокування непідписаного malware | + +--- + +## ⚠️ Важливі застереження + +1. **Втрата ключів:** Якщо ви втратите Root key, ви не зможете керувати підписами репозиторію. **Зробіть бекап `~/.docker/trust`!** +2. **Third-party images:** Офіційні образи (nginx, postgres) підписані Docker. Але деякі специфічні образи можуть не мати підписів. Для них потрібно буде створювати власні підписані версії.