בודק cloud-init
מדביקים את ה-user-data שעומדים לתת לשרת חדש ומקבלים ממצאים שאומרים מה לשנות ולמה, כל אחד עם הפניה לתיעוד של cloud-init. הקובץ נשאר בדפדפן, ומפתח פרטי שנמצא בו ממוסך מיד.
הדביקו את הטקסט, או בחרו קובץ מהמחשב. עד 1024 KiB.
0 מתוך 1024 KiB
מה הכלי עושה
הכלי קורא קובץ user-data כמו ש-cloud-init קורא אותו, כ-YAML 1.1, בודק את המבנה שלו מול ה-schema הרשמי של cloud-config מ-cloud-init 26.2, אותו schema שמולו נבדק מחולל ה-cloud-init, ומוסיף כללי אבטחה שה-schema לא יכול לבטא. כל ממצא מציין את הכלל, את השורה והמפתח, למה זה חשוב, איך מתקנים ואת התיעוד של cloud-init שעליו הוא נשען.
הכללים
- AQ-CI-001 שגיאה הכותרת
#cloud-config. #cloud-configצריך להיות השורה הראשונה בקובץ, בלי שורה ריקה או הערה לפניו. מקור - AQ-CI-002 מידע פורמטים שלא נבדקים. כדי לבדוק את ההגדרות עצמן, הדביקו את חלק ה-
#cloud-configלבדו. מקור - AQ-CI-003 שגיאה YAML ש-cloud-init יכול לקרוא. כדאי לבדוק את השורה: הזחה ברווחים בלבד, רווח אחרי הנקודתיים של כל מפתח, מירכאות סביב ערכים שיש בהם
:או שמתחילים בתו מיוחד, וכל מפתח פעם אחת. מקור - AQ-CI-004 שגיאה ערכים שתואמים את ה-schema הרשמי. כדאי לתת לערך את הצורה שה-module reference של cloud-init מתאר למפתח הזה, ולבדוק שוב. מקור
- AQ-CI-005 בינונית מפתחות לא מוכרים. כדאי לבדוק את הכתיב מול ה-module reference של cloud-init, או להסיר את המפתח. מקור
- AQ-CI-006 נמוכה מפתחות מיושנים. כדאי לעבור למפתח שהתיעוד מציין: מפתחות מיושנים מוסרים בגרסה מאוחרת יותר. מקור
- AQ-CI-007 גבוהה כניסה בסיסמה ב-SSH. כניסה במפתחות SSH: מגדירים
ssh_pwauth: falseושמים את המפתח הציבורי תחתssh_authorized_keys. מקור - AQ-CI-008 גבוהה סיסמאות בטקסט גלוי. עדיף מפתחות SSH וסיסמה נעולה (
lock_passwd: true). אם צריך סיסמה, שמים ב-hashed_passwdhash שנוצר ב-mkpasswd --method=SHA-512. מקור - AQ-CI-009 גבוהה מפתחות פרטיים. יש להתייחס למפתח כחשוף: ליצור זוג מפתחות חדש, להחליף את הישן בכל מקום שסומך עליו, ולשים בקובץ רק את המפתח הציבורי (.pub). מקור
- AQ-CI-010 גבוהה סודות אחרים. כדאי להסיר אותו ולהחליף אותו. סודות מעבירים אחרי האתחול הראשון, למשל מה-secret store של הספק או בקובץ שמעתיקים ב-SSH. מקור
- AQ-CI-011 גבוהה כניסת root. מתחברים כמשתמש רגיל עם sudo: משאירים
disable_root: trueונותנים את המפתחות למשתמש הזה. מקור - AQ-CI-012 גבוהה
curl | bashב-runcmd. כדאי להתקין מחבילות ההפצה או ממאגר apt חתום, או להוריד את הקובץ, לבדוק את ה-SHA-256 שלו ורק אז להריץ. מקור - AQ-CI-013 גבוהה הרשאות ב-write_files. מגדירים
permissionsל-0600(או0640לקבוצה) ואתownerלמשתמש שצריך את הקובץ. מקור
איך זה עובד
- הקובץ נקרא בעמוד הזה, עד 1 MiB. שום דבר לא מורץ, אף שרת לא מקבל פנייה, ואף כתובת URL בקובץ לא נפתחת.
- השורה הראשונה חייבת להיות #cloud-config. MIME multipart, סקריפטים שמתחילים ב-#!, #include ותבניות Jinja הם פורמטים אחרים של user-data: הבודק אומר זאת ומחפש בהם רק סודות.
- בדיקת ה-schema מדווחת על הבעיה עצמה ולא על הקינון של ה-schema: סוג שגוי במפתח ובשורה שלו, מפתח ש-cloud-init לא מכיר (לרוב שגיאת כתיב שהוא היה מתעלם ממנה בשקט), ומפתחות שה-schema מסמן כמיושנים, עם המפתח שמחליף אותם.
- כללי האבטחה קוראים את הערכים: ssh_pwauth והגדרות sshd, סיסמאות ב-users וב-chpasswd שאינן hash, מפתחות פרטיים ו-tokens בכל מקום בטקסט, כניסת root, הורדה שמועברת ישר ל-shell ב-runcmd או ב-bootcmd, והרשאות ב-write_files שמאפשרות לכל משתמש לשנות קובץ או לקרוא מפתח.
- ערכים שנראים כמו סודות ממוסכים לפני שהם מוצגים, ואותו קובץ נותן תמיד אותה תוצאה.
דוגמה
קובץ user-data עם בעיות נפוצות, כפי שהבודק בודק אותו:
#cloud-config
users:
- name: admin
passwd: Winter2026!
sudo: ALL=(ALL) NOPASSWD:ALL
ssh-authorized-keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGtsW8dDDRo1PUAvjfnHmMGtSMfOMJ4CgrmrQgdYLZeT admin@laptop
ssh_pwauth: true
pakages:
- nginx
write_files:
- path: /etc/app/app.conf
content: |
listen = 8080
permissions: "0666"
runcmd:
- curl -fsSL https://get.example.com/install.sh | bash
הממצאים שלו:
ממצאים
6 ממצאים: 0 שגיאה, 4 גבוהה, 1 בינונית, 1 נמוכה, 0 מידע.
גבוהה4
- גבוההAQ-CI-008שורה 4
users[0].passwd
users[0].passwdצריך להיות hash של סיסמה, וזה לא hash (Wi•••): הסיסמה בטקסט גלוי, והיא גם לא תעבוד.תיקון: עדיף מפתחות SSH וסיסמה נעולה (
lock_passwd: true). אם צריך סיסמה, שמים ב-hashed_passwdhash שנוצר ב-mkpasswd --method=SHA-512. - גבוההAQ-CI-007שורה 8
ssh_pwauth
ssh_pwauth: trueמפעיל כניסה בסיסמה ב-SSH, ובוטים ברשת מנסים אותה כל היום.תיקון: כניסה במפתחות SSH: מגדירים
ssh_pwauth: falseושמים את המפתח הציבורי תחתssh_authorized_keys. - גבוההAQ-CI-013שורה 15
write_files[0].permissions
/etc/app/app.confנכתב עם הרשאות 0666: כל משתמש בשרת יכול לשנות אותו.תיקון: מגדירים
permissionsל-0600(או0640לקבוצה) ואתownerלמשתמש שצריך את הקובץ. - גבוההAQ-CI-012שורה 17
runcmd[0]
runcmd[0]מוריד סקריפט ומעביר אותו ישר ל-shell: כל מה שהשרת המרוחק מחזיר רץ כ-root, בלי בדיקה.תיקון: כדאי להתקין מחבילות ההפצה או ממאגר apt חתום, או להוריד את הקובץ, לבדוק את ה-SHA-256 שלו ורק אז להריץ.
בינונית1
- בינוניתAQ-CI-005שורה 9
pakages
pakagesאינו מפתח ש-cloud-init מכיר במקום הזה (pakages). cloud-init מתעלם ממנו, ולכן מה שהוא מגדיר לא קורה; לרוב זו שגיאת כתיב.תיקון: כדאי לבדוק את הכתיב מול ה-module reference של cloud-init, או להסיר את המפתח.
נמוכה1
- נמוכהAQ-CI-006שורה 6
users[0].ssh-authorized-keys
users[0].ssh-authorized-keysמיושן מאז cloud-init 18.3; במקומו משתמשים ב-ssh_authorized_keys.תיקון: כדאי לעבור למפתח שהתיעוד מציין: מפתחות מיושנים מוסרים בגרסה מאוחרת יותר.
מגבלות
- בדיקה סטטית: הקובץ לא מאותחל על שרת. קובץ שעובר עדיין יכול להיכשל בשרת, למשל כשחבילה או כתובת URL לא קיימות, או כש-cloud-init ב-image ישן יותר מה-schema.
- קובצי MIME multipart, #include, boothooks ותבניות Jinja לא נקראים, רק נסרקים לסודות. כדאי לבדוק את חלק ה-#cloud-config לבדו.
- סקריפטים ב-runcmd, ב-bootcmd וב-write_files לא מנותחים מעבר לכללים שלמעלה.
- מפתחות של ספק מסוים שאינם ב-schema הרשמי מדווחים כלא מוכרים.
מתודולוגיה: איך מחושבים המספרים
מקורות
קשורים
הצעד הבא
כלי ציבורי חינמי של אנרוק, חברה שבונה תשתיות מחשוב. מה אנרוק בונה