הגדרת sudo ומדיניות הרשאות (sudoers) עבור Linux

שורה שגויה אחת בכללי ההרשאות — וכל הצוות מאבד גישה לשרתים, והשחזור נמשך שעות. אנו מגדירים sudo ומדיניות גישה ריכוזית מקצה לקצה: מעניקים הרשאות לפי תפקידים, מנהלים יומן ומוסרים תקנון. הזמן להענקה ולשלילת גישות מצטמצם פי כמה.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

למה הגדרת sudoers שוברת גישה לשרתים

מדיניות ההרשאות ב-Linux חיה בקובץ אחד — ולכן זו נקודת התצורה המסוכנת ביותר בשרת. טעות בכללים לא נותנת אזהרות: השורה תקינה תחבירית, אבל לא פועלת כלל או פועלת לא עבור מי שהתכוונתם.

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

מקור התקלות השני — הוספה לקבוצות לפי שם: שגיאת כתיב בשם הקבוצה או בנתיב לפקודה לא מפיקה שגיאה, הכלל просто לא מיושם לעולם. השלישי — קונפליקט בין קבוצות, כשמשתמש נמצא בכמה, ואחת מהן אוסרת את מה שאחרת מתירה.

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

מה נותנות הרשאות מנוהלות: פחות תקלות והשבתות

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

עיקרון ההרשאות המינימליות בצורה כזו עולה פחות מהיעדרו: המהנדס מקבל בדיוק את הפעולות הנדרשות, ולא את כל ערכת המנהל.

האפקט מדיד. מתן גישה הופך לעריכה אחת של קובץ, שעוברת בדיקה ומגיעה למאגר: הזמן למתן ולשלילה מתקצר משעות לדקות, ועריכות ידניות בפרודקשן נעלמות כקטגוריה. שלילת הרשאות בעת החלפת תפקיד — אותה פעולה, והיא אינה תלויה בכך שמישהו זוכר עוד שרת.

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

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

הגדרת sudoers ומדיניות גישה מרוכזת

הפקודה sudo קוראת לא קובץ אחד, אלא נקודת כניסה עם הנחיות הכללה: כללי הבסיס נמצאים בקובץ הראשי, ותיקיות נוספות מוכללות בשלמותן. מכאן שלוש דרכים לנהל מדיניות הרשאות — קובץ כללים מקומי בכל מכונה, תבנית תצורה משותפת או ספריית חשבונות מרוכזת.

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

השוואת אפשרויות

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

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

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

סדר היישום: מביקורת הרשאות ועד מסירת נהלים

היישום מתחיל במלאי שרתים וחשבונות: אוספים רשימת מכונות, מסמנים היכן יש כניסה ישירה כ-root, אילו חשבונות מועברים בין אנשים והיכן ההרשאות ניתנו רחב מהמשימה.

לפי התוצאות מתכננים סכמת תפקידים — משימות (הוצאת גרסה, הפעלה מחדש של שירותים, קריאת יומנים) מפוזרות לפי קבוצות וכינויים של פקודות, כך שהגישה ניתנת לתפקיד ולא לאדם. עריכות בקובץ הראשי מוצאות החוצה: שברים שמים בקבצים נפרדים בספריית ההכללה, כך התצורה נשארת ניתנת לבדיקה ולשחזור.

  1. מלאי שרתים, חשבונות וחריגים קיימים — מה ולמי מותר כעת.
  2. סכמת תפקידים וכינויים — לכל תפקיד סט מינימלי של פקודות והרצה ממשתמש ספציפי.
  3. הכנת כללים — בדיקת תחביר לפני יישום, ניתוח קונפליקטים: כלל צר גובר על רחב, איסור חשוב מהרשאה.
  4. בדיקה בסביבת בדיקות — מריצים תרחישים שגרתיים ואסורים, מוודאים שפקודות מיותרות נדחות.
  5. יישום הדרגתי — ממכונות פחות קריטיות לליבה, עם בקרת יומנים בכל שלב.
  6. תוכנית נסיגה — שומרים תצורה מקורית ויודעים להסיר שינויים במכונה אחת בלי לפגוע באחרות.
  7. מסירת נהלים — הצוות מקבל תיאור תפקידים, סדר בקשת גישה וכללים להוספת משימות חדשות.

ערכת תצורות ונהלים להרשאות

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

  • תצורות גישה — כללים מסודרים בקבצים נפרדים בספריית ההכללה, ולא נערמים בקובץ sudoers אחד: רואים את ייעודה של כל רשומה, וניתן לבטל עריכה נקודתית.
  • סכמת תפקידים וקבוצות — מפה איזה תפקיד מוענק דרך אילו קבוצות ואילו פקודות זמינות לו; עובד חדש מוכנס על ידי הוספה לקבוצה המתאימה.
  • גיבויים של כללים — תמונת מצב של התצורה לפני ואחרי כל שינוי עם תאריך ומחבר, בתוספת בדיקת תקינות לפני יישום, כדי ששגיאת כתיב לא תחסום כניסה.
  • נוהל מתן ושלילת הרשאות — סדר מהבקשה ועד למתן: מי מאשר, לכמה זמן ניתן גישה מוגברת, כיצד מנוסח כלל זמני ובאיזו רשימת בדיקה הוא מוסר בעת החלפת תפקיד או פיטורין.
  • הוראות לשחזור גישה — תרחיש שלב אחר שלב למקרה של תצורה שבורה: כניסה דרך המסוף, טעינה במצב חירום, פריסת התמונה התקפה האחרונה.
  • יומן שינויים — רשימה אחודה של עריכות עם ציון מי, מתי ולמה שינה את הכללים, כדי שבעת ניתוח אירוע מקור ההחלטה יהיה גלוי.

הערכה נבדקת בסביבת הבדיקות שלכם: המהנדסים שלנו מראים שהכניסה לפי תפקידים, ביטול עריכה ושחזור גישה עובדים לפני שאנחנו מוסרים את התיעוד.

כיצד הסרנו הרשאות מיותרות מצוות השירות

צוות השירות גדל מהר יותר מכללי הגישה: לכל מהנדס בספריית המדיניות היתה רשומה עם גישה מלאה ללא סיסמה, שנוספה «זמנית, כדי לא להפריע לתורן». כעבור חצי שנה שורות «זמניות» כאלה היו רבות יותר מהמהנדסים עצמם, ולהבין מי ולמה קיבל הרשאות root היה אפשרי רק מהיסטוריית ההתכתבות.

נקודת התחלה

המדידות לפני השינויים נראו כך: 27 חשבונות עם גישה מלאה ללא סיסמה — יותר ממספר המהנדסים בצוות; למעלה מ-60 עריכות מדיניות בחודש, יותר ממחציתן — ידנית ישירות על הצומת, ללא ביקורת ובדיקת תחביר; חיבור מהנדס חדש ארך שלושה ימי עבודה, כי הגישה ניתנה דרך שרשרת אישורים בצ'אט.

מה עשינו ומה השתנה

צמצמנו את ההרשאות לשלושה תפקידים: תורן, מהנדס שחרורים, מבקר. גישה מלאה נותרה לשלושה חשבונות שירות עם מפתח נפרד ותיעוד חובה של כל פקודה. המדיניות עברה מעריכות ידניות לקבצי מאגר ומופצת באמצעות Ansible — שינוי עובר ביקורת ותיקוף לפני הגעה לצומת.

אחרי השינויים: שלושה חשבונות עם גישה מלאה במקום 27; ארבע עריכות בחודש דרך ביקורת ואפס שינויים ידניים על הצמתים; קליטת מהנדס חדש — 40 דקות לפי תבנית התפקיד במקום שלושה ימים.

ביומן רואים מי הריץ את הפקודה ובאיזה תפקיד, ופעולה שגויה מבוטלת בהרצה חוזרת של התפקיד, ולא בשחזור ידני של הצומת.

מה לעשות אם הגישה כבר אבדה והעריכה לא מיושמת

עריכה «לא מיושמת» כמעט תמיד אומרת דבר אחד: קובץ המדיניות לא עובר ניתוח, ו-sudo מסרב להעניק הרשאות לכולם מלבד סשן root פתוח. אין פקודה נפרדת של «החל» במדיניות — הקובץ נקרא בכל קריאה, לכן השגיאה מופיעה מיד, ולא לאחר אתחול מחדש. הגרוע מכל הוא כשהעריכה מפוזרת על פני כמה קבצים מוכללים: תקלה באחד חוסמת את הניתוח של כל הסט.

הפעולה הראשונה — לא לאתחל מחדש את המארח, אלא למצוא סשן root חי: הרשאותיו אינן תלויות במצב המדיניות, ולעיתים קרובות זה מספיק. אם אין סשן כזה, כניסת חירום מתבצעת דרך ערוץ נפרד — מסוף ההיפרוויזור או פאנל הספק, מצב משתמש יחיד עם עיגון מערכת הקבצים השורשית לכתיבה. כניסה ב-SSH באותו רגע חסרת תועלת: החיבור יעלה, אבל להרשאות כבר לא יהיה לסשן.

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

בשינויים שיושמו חלקית הסדר הפוך: תחילה מקבעים את הבלוקים שכבר נותחו ועובדים, ולא נוגעים בהם, ואז מתקנים את זה ששובר את הניתוח. את התוצאה בודקים לא דרך הגישה שלנו, אלא בשאילתת הרשאות עבור משתמש ספציפי מתוך root — כך רואים שחזר בדיוק הנדרש ולא משהו מיותר.

גיבויי כללים ובדיקה על מארח בדיקות ממירים תקלה כזו מהשבתה של חצי יום לעשר דקות עבודה.

שאלות טכניות בנושא הרשאות ויישום כללים

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

כיצד לבדוק תצורה בלי לסכן גישה?

עריכה מתבצעת דרך visudo: הוא מנתח את התחביר לפני הכתיבה, לכן כלל שבור לא נכנס לקובץ ולא חוסם את root. לאחר מכן מריצים בדיקה לכל קובץ בספריית ההכללות ומשווים את התוצאה עם הפקודה sudo -l תחת החשבון הרצוי — רואים אילו פקודות באמת מותרות.

מה יקרה אם יש שגיאה בכלל?

שגיאת תחביר לא תישמר כלל. מסוכנת יותר שגיאה לוגית: הקובץ תקין, אבל נותן יותר מדי. לכן בודקים את סט הכללים בסביבת בדיקות ומחזיקים נתיב גישה שני — מסוף או דרך מנהל נפרד.

האם אפשר להתיר פקודות בודדות ללא סיסמה?

כן, דרך NOPASSWD — אבל רק לסט צר: הפעלה מחדש של שירות אחד, קריאת יומנים. סט מלא של הרשאות ללא סיסמה הופך את sudo לחשבון root רגיל ומאפס את הביקורת: ביומן יישאר רק עצם ההרצה, אך לא אימות זהות.

מה לעשות עם חשבונות שירות?

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

מה לעשות עם שרתים שהוגדרו ידנית?

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

נדון בסכמת הרשאות עבור התשתית שלכם

כדי שההערכה תהיה עניינית ולא «בערך», דרושים מלאי ומספר נתוני פתיחה. ככל שתתארו את המצב הנוכחי בצורה מדויקת יותר, כך נכניס פחות הנחות לתוכנית היישום.

  • רשימת מארחים וקבוצות עם תפקידם: היכן באמת נדרש root מלא, והיכן די בסט פקודות ספציפיות.
  • ענפי ההפצות העדכניים: מהם תלוי תחביר הכללים והאופן שבו מתנהגות ספריות מוכללות.
  • קבצי מדיניות ההרשאות הנוכחיים, כולל ספריות drop-in ועריכות ידניות שחיות מחוץ למערכת ניהול התצורה.
  • כיצד הכללים מועברים כעת — ידנית ב-ssh, בסקריפטים או במנהל תצורה כמו Ansible.
  • דרישות ביקורת: האם יש לתעד כל פקודה מורשית ולאן לאסוף יומנים.
  • האם נדרש חיבור לספריית משתמשים, כדי שההרשאות יינתנו לקבוצות ולא יפורטו לפי אנשים.
  • חלון שינויים, סדר בדיקה בסביבת בדיקות ודרישת נסיגה לסכמה הקודמת.
  • מדיניות סיסמאות והרצה ללא אישור: לאילו משימות היא מותרת ולאילו סגורה.

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

העברת ידע — סעיף נפרד: תיעוד לפי תפקידים, ניתוח התצורה עם המהנדסים שלכם והוראות כיצד להוסיף הרשאות באופן עצמאי בלי לשבור את שלמות הסכמה.