השוואת קובצי Docker Compose
הדביקו שתי גרסאות של קובץ Compose וראו מה באמת השתנה, ואילו שינויים מעלים את הסיכון. סדר המפתחות ותחביר קצר או ארוך לא נחשבים. שני הקבצים נשארים בדפדפן.
הדביקו את הטקסט, או בחרו קובץ מהמחשב. עד 512 KiB.
0 מתוך 512 KiB
הדביקו את הטקסט, או בחרו קובץ מהמחשב. עד 512 KiB.
0 מתוך 512 KiB
מה הכלי עושה
הכלי קורא את שני הקבצים עם אותו parser בטוח של בודק ה-Compose, מביא כל אחד מהם לצורה מנורמלת ומשווה בין הצורות, service אחר service ומפתח אחר מפתח. לשני קבצים ש-Compose קורא באותו אופן אין שינויים, בלי קשר לסדר המפתחות ולתחביר שבו נכתבו. אחר כך הוא מסווג את השינויים שהופכים את הקובץ השני למסוכן יותר, ומריץ את כללי הבודק על שני הקבצים כדי להראות אילו ממצאים השינוי מוסיף ואילו הוא פותר.
איך זה עובד
- שני הקבצים מפוענחים עם מגבלות גודל, עומק ו-aliases; אין מעקב אחרי tags או include של YAML, ושום דבר לא מורץ או נטען מהרשת.
- כל קובץ עובר נרמול: פורטים ו-volumes בתחביר קצר או ארוך מקבלים צורה אחת, environment, labels ו-networks כרשימה או כמיפוי הופכים למיפוי, depends_on מקבל את תנאי ברירת המחדל שלו, ופקודה שנכתבה כמחרוזת מפוצלת למילים כמו ש-Compose מפצל אותה.
- מיפויים מושווים ערך אחר ערך, ורשימות כמו ports, volumes ו-cap_add פריט אחר פריט, כך שרשימה בסדר אחר אינה שינוי. ערכים של משתנים שנראים כמו סודות מוסתרים בתוצאה.
- שבעה כללי השוואה מזהים את השינויים שמעלים סיכון, וכללי הבודק רצים על שני הקבצים. ממצא שכלל השוואה כבר מדווח לא מדווח פעמיים.
דוגמה
עדכון של WordPress, שבו הקובץ השני גם מסודר אחרת וכתוב בתחביר אחר. ההשוואה מדווחת על ארבעה שינויים:
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: {}
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, שבהם משתנה עם ברירת מחדל נחשב לפי ברירת המחדל שלו.
- כללי הסיכון מכסים את השינויים שמפורטים למעלה. שינוי שהם לא מזכירים עדיין יכול להיות חשוב: קראו את רשימת השינויים המלאה.
מתודולוגיה: איך מחושבים המספרים
מקורות
קשורים
הצעד הבא
כלי ציבורי חינמי של אנרוק, חברה שבונה תשתיות מחשוב. מה אנרוק בונה