השוואת קובצי Docker Compose

הדביקו שתי גרסאות של קובץ Compose וראו מה באמת השתנה, ואילו שינויים מעלים את הסיכון. סדר המפתחות ותחביר קצר או ארוך לא נחשבים. שני הקבצים נשארים בדפדפן.

נשאר רק בדפדפן שלך. מה שהדבקתם או בחרתם נקרא רק בעמוד הזה. הוא לא נשלח לשרת, לא נשמר בקישור או באחסון הדפדפן, ולעולם לא נכלל ב-analytics.

הדביקו את הטקסט, או בחרו קובץ מהמחשב. עד 512 KiB.

0 מתוך 512 KiB

נשאר רק בדפדפן שלך. מה שהדבקתם או בחרתם נקרא רק בעמוד הזה. הוא לא נשלח לשרת, לא נשמר בקישור או באחסון הדפדפן, ולעולם לא נכלל ב-analytics.

הדביקו את הטקסט, או בחרו קובץ מהמחשב. עד 512 KiB.

0 מתוך 512 KiB

מה הכלי עושה

הכלי קורא את שני הקבצים עם אותו parser בטוח של בודק ה-Compose, מביא כל אחד מהם לצורה מנורמלת ומשווה בין הצורות, service אחר service ומפתח אחר מפתח. לשני קבצים ש-Compose קורא באותו אופן אין שינויים, בלי קשר לסדר המפתחות ולתחביר שבו נכתבו. אחר כך הוא מסווג את השינויים שהופכים את הקובץ השני למסוכן יותר, ומריץ את כללי הבודק על שני הקבצים כדי להראות אילו ממצאים השינוי מוסיף ואילו הוא פותר.

איך זה עובד

  1. שני הקבצים מפוענחים עם מגבלות גודל, עומק ו-aliases; אין מעקב אחרי tags או include של YAML, ושום דבר לא מורץ או נטען מהרשת.
  2. כל קובץ עובר נרמול: פורטים ו-volumes בתחביר קצר או ארוך מקבלים צורה אחת, ‏environment, ‏labels ו-networks כרשימה או כמיפוי הופכים למיפוי, ‏depends_on מקבל את תנאי ברירת המחדל שלו, ופקודה שנכתבה כמחרוזת מפוצלת למילים כמו ש-Compose מפצל אותה.
  3. מיפויים מושווים ערך אחר ערך, ורשימות כמו ports, ‏volumes ו-cap_add פריט אחר פריט, כך שרשימה בסדר אחר אינה שינוי. ערכים של משתנים שנראים כמו סודות מוסתרים בתוצאה.
  4. שבעה כללי השוואה מזהים את השינויים שמעלים סיכון, וכללי הבודק רצים על שני הקבצים. ממצא שכלל השוואה כבר מדווח לא מדווח פעמיים.

דוגמה

עדכון של WordPress, שבו הקובץ השני גם מסודר אחרת וכתוב בתחביר אחר. ההשוואה מדווחת על ארבעה שינויים:

לפני
before/docker-compose.yml
services:
  wordpress:
    image: wordpress:6.8-apache
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
    depends_on:
      db:
        condition: service_healthy
  db:
    image: mariadb:11.8
    restart: unless-stopped
    volumes:
      - db:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
volumes:
  db: {}
אחרי
after/docker-compose.yml
services:
  db:
    image: mariadb:latest
    restart: unless-stopped
    ports:
      - "3306:3306"
    healthcheck:
      interval: 10s
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
  wordpress:
    image: wordpress:6.9-apache
    restart: unless-stopped
    ports:
      - target: 80
        host_ip: 127.0.0.1
        published: 8080
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_NAME=wordpress
    depends_on:
      db:
        condition: service_healthy
volumes:
  db: {}
  • השתנה: db › image: mariadb:11.8 ← mariadb:latest
  • נוסף: db › ports: 3306:3306
  • הוסר: db › volumes: db:/var/lib/mysql
  • השתנה: wordpress › image: wordpress:6.8-apache ← wordpress:6.9-apache

שלושה מהם מעלים סיכון:

  • ‏db מפרסם עכשיו את 3306:3306 על כל ממשקי הרשת. ‏Docker מפרסם פורטים מעבר לחוקי ufw, ולכן הפורט עלול להיות נגיש מהאינטרנט.
  • ‏db עבר מה-image המוצמד mariadb:11.8 ל-mariadb:latest, שעוקב אחרי כל גרסה שתתפרסם בהמשך.
  • ‏db כבר לא מעגן את db:/var/lib/mysql. נתונים שה-container כתב שם לא יהיו ב-container החדש, ומה שייכתב מעכשיו יאבד כשה-container ייווצר מחדש.

והבודק מוסיף ממצא אחד:

  • ‏db מריץ את image מסד הנתונים mariadb:latest בלי volume לתיקיית הנתונים /var/lib/mysql.

מגבלות

  • השוואה סטטית: שום דבר לא מורץ, ולכן images, פורטים ונתיבים לא נבדקים מול מערכת רצה.
  • לא diff של טקסט ולא merge: הערות, עיצוב וסדר מפתחות לא נחשבים, והכלי לא כותב קובץ משולב.
  • משכי זמן מושווים כפי שנכתבו: ‏90s ו-1m30s נחשבים שינוי.
  • משתנים לא נקראים מ-.env: ‏${VAR} מושווה כפי שנכתב, חוץ מפורט מפורסם או מקור של volume, שבהם משתנה עם ברירת מחדל נחשב לפי ברירת המחדל שלו.
  • כללי הסיכון מכסים את השינויים שמפורטים למעלה. שינוי שהם לא מזכירים עדיין יכול להיות חשוב: קראו את רשימת השינויים המלאה.

מתודולוגיה: איך מחושבים המספרים

מקורות

  1. Docker Docs: Compose file reference
  2. Compose Specification
  3. Docker Docs: Docker Engine security
  4. Docker Docs: Packet filtering and firewalls

עודכן

הצעד הבא

Docker Compose Analyzer

כלי ציבורי חינמי של אנרוק, חברה שבונה תשתיות מחשוב. מה אנרוק בונה