הגדרה ובדיקה של התאימות ל-CIS

במאמר הזה מוסבר מהי CIS Benchmark, איך היא קשורה למערכת הפעלה שמותאמת לקונטיינרים (COS), איך לבדוק את סטטוס התאימות במכונה ואיך לפתור בעיות במקרה של כשל.

סקירה כללית

המרכז לאבטחת אינטרנט (CIS) מפרסם מדדים להשוואה של המלצות לשיטות מומלצות לאבטחה בפלטפורמות שונות. ה-CIS Benchmark של מערכת הפעלה שמותאמת לקונטיינרים הוא סדרה של המלצות להגדרת מכונות שמשתמשות במערכת הפעלה שמותאמת לקונטיינרים כדי לתמוך במצב אבטחה חזק. התמונות של COS x86 ו-ARM תואמות ל-CIS.

גישה להשוואה לשוק

המדד של CIS למערכת הפעלה שמותאמת לקונטיינרים זמין באתר CIS:

רמות של המלצות אבטחה

ב-CIS מוגדרות רמות ההמלצות הבאות למערכת הפעלה שמותאמת לקונטיינרים.

רמה 1

ההמלצות ברמה הזו אמורות להיות רלוונטיות לרוב הסביבות. הרמה הזו כוללת המלצות כמו:

  • האפשרות 'הקצאה אקראית של פריסת מרחב כתובות' מופעלת
  • אי אפשר להשתמש ב-/tmp כדי להריץ קבצים בינאריים להפעלה
  • השליחה של הפניית מנות מושבתת

רמה 2

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

  • קיימים כללים בחומת האש לכל היציאות הפתוחות
  • לא מתקבלים ניתובים אוטומטיים של ICMP ומודעות של נתבים
  • זמן הקצוב לתפוגה של מעטפת המשתמש שמוגדר כברירת מחדל הוא 900 שניות או פחות

איך מערכת ההפעלה שמותאמת לקונטיינרים עומדת בדרישות של CIS Benchmarks

החל מMilestone 97, קובצי אימג' של מערכת הפעלה שמותאמת לקונטיינרים תואמים ל-CIS Level 1 כברירת מחדל, ומספקים אפשרות לתאימות ל-CIS Level 2. אנחנו מספקים גם סורק שבעזרתו אפשר לבדוק את המופע שלכם בהשוואה לרמות המומלצות של CIS.

ההגדרה של CIS שמגדירה את ההמלצות נמצאת בכתובת /usr/share/google/security/cis-compliance/cis_config.textproto. סורק CIS משתמש בהגדרה כדי לבדוק את סטטוס התאימות של המופע. התוצאות של כל הרצה של סורק התאימות לרמת CIS נכתבות אל /var/lib/google/cis_scanner_scan_result.textproto. הקובץ הזה מוחלף בכל הפעלה של סורק CIS. אם אחת מהסריקות ברמה 1 או ברמה 2 של CIS נכשלת, הקובץ cis_scanner_scan_result.textproto יכיל רשימה של כל הבדיקות שנכשלו.

בדיקת סטטוס התאימות של מופע

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

  • cis-level1.service: מופעל כברירת מחדל ומתחיל באתחול. כשהשירות מתחיל, הוא בודק אם המופע עומד בדרישות של CIS רמה 1.
  • cis-level2.service: מושבת כברירת מחדל. השירות הזה מאפשר לכם להגדיר את המופע כך שיתאים לרמה 2 של CIS, ולבדוק את סטטוס התאימות לרמה 1 ולרמה 2.

בקטעים הבאים מוסבר איך בודקים את סטטוס התאימות של המופע ואיך מבצעים אוטומציה של תהליך הביקורת.

בדיקת סטטוס התאימות לרמה 1 של CIS

כדי לראות אם המופע שלכם תואם ל-CIS רמה 1, בודקים את הסטטוס של cis-level1.service:

systemctl status cis-level1

הפלט אמור להיראות כך:

Reading scan config from /usr/share/google/security/cis-compliance/cis_config.textproto
Running scan of 62 benchmarks
Scan status: SUCCEEDED
Found 0 non-compliant benchmarks
Writing scan results to /var/lib/google/cis_scanner_scan_result.textproto

אם נמצאו בדיקות שלא עומדות בדרישות, אפשר לעיין במאמר הבדיקה של רמה 1 או רמה 2 של תאימות ל-CIS נכשלה.

הבדיקה cis-level1.service מתבצעת רק פעם אחת, כשמופעלת הדוגמה, כדי לוודא שהיא עומדת בדרישות של CIS רמה 1. כדי להגדיר בדיקה תקופתית של התאימות לתקן CIS, אפשר לעיין במאמר בנושא בדיקה תקופתית של סטטוס התאימות לתקן CIS.

הגדרה של תאימות לרמה 2 של CIS ובדיקת הסטטוס

אפשר להשתמש בשירות cis-level2 כדי להגדיר את המופע כך שיעמוד בדרישות של CIS רמה 2, ולבדוק את סטטוס התאימות לרמה 1 ולרמה 2. שירות systemd תומך בכל ההמלצות של CIS ברמה 2 למעט ההמלצות הבאות:

  • ‫4.1.1.2 מוודאים שהרישום ביומן פועל (מזהה: logging-service-running)

    ההמלצה הזו מושבתת כברירת מחדל, אבל אפשר להפעיל אותה מחדש על ידי מחיקת המזהה מרשימת ההשבתה שנמצאת בקובץ /etc/cis-scanner/env_vars. הבדיקה הזו קיימת רק באבני דרך מגרסה 109 ואילך. בשלבים מוקדמים יותר, הפעלת הרישום בעצמכם תעזור לכם לעמוד בהמלצה הזו. אם מבטלים את ההסכמה, הפעלת השירות cis-level2 מריצה סקריפט שמתחיל רישום ביומן של fluent-bit. אם אתם לא רוצים להשתמש ברישום ברירת המחדל שלנו או שאתם רוצים להשתמש ברישום משלכם, אתם צריכים להשאיר את logging-service-running במצב השבתה.

בהמלצות הבאות, cis-level2 מגדיר את המופע אבל לא בודק את סטטוס התאימות:

  • ‫105 ומטה:

    • ‫3.3.1.1 הקפדה על מדיניות ברירת מחדל של דחייה בחומת אש ב-IPv6
    • ‫3.3.1.2 מוודאים שתנועת ה-loopback של IPv6 מוגדרת
    • ‫3.3.1.3 מוודאים שמוגדרים חיבורים יוצאים וחיבורים קיימים של IPv6
    • ‫3.3.1.4 מוודאים שקיימים כללים לחומת אש של IPv6 לכל היציאות הפתוחות
    • ‫3.3.2.1 מוודאים שמדיניות ברירת המחדל של חומת האש היא דחייה
    • ‫3.3.2.2 מוודאים שתנועת הנתונים ב-loopback מוגדרת
    • ‫3.3.2.3 מוודאים שהחיבורים היוצאים והחיבורים שנוצרו מוגדרים
  • ‫109 ואילך:

    • ‫3.3.1.4 מוודאים שקיימים כללים לחומת אש של IPv6 לכל היציאות הפתוחות

השירות cis-level2 מושבת כברירת מחדל. כדי להפעיל את השירות, מריצים את הפקודה הבאה:

systemctl start cis-level2.service

כדי לבדוק אם המכונה שלכם הוגדרה בהצלחה ועומדת בהמלצות של CIS ברמה 2, צריך לבדוק את הסטטוס של cis-level2.service:

systemctl status cis-level2

הפלט אמור להיראות כך:

Reading scan config from /usr/share/google/security/cis-compliance/cis_config.textproto
Running scan of 112 benchmarks
Scan status: SUCCEEDED
Found 0 non-compliant benchmarks
Writing scan results to /var/lib/google/cis_scanner_scan_result.textproto

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

שירות cis-level2 מגדיר את המופע ובודק את התאימות לתקן CIS Level 2 רק פעם אחת. כדי להגדיר בדיקה תקופתית של התאימות לתקן CIS, אפשר לעיין במאמר בנושא בדיקה תקופתית של סטטוס התאימות לתקן CIS.

בדיקה תקופתית של סטטוס התאימות לתקן CIS

תמונות של מערכת הפעלה שמותאמת לקונטיינרים כוללות את השירותים הבאים, שבודקים מעת לעת את התאימות ל-CIS:

  • cis-compliance-scanner.service: בודק את סטטוס התאימות על סמך משתני סביבה שמוגדרים ב-/etc/cis-scanner/env_vars. כברירת מחדל, השירות הזה בודק תאימות ל-CIS רמה 1 ומושבת.
  • cis-compliance-scanner.timer: מופעל cis-compliance-scanner.service מעת לעת. תקופת ברירת המחדל היא פעם ביום.

הגדרת שירות הסורק

הקובץ cis-compliance-scanner.service אחראי לבדיקת הסטטוס של התאימות ל-CIS על סמך משתני הסביבה שמוגדרים ב-/etc/cis-scanner/env_vars. כברירת מחדל, השירות הזה בודק את התאימות לרמה 1 של CIS.

כדי לבדוק את התאימות לרמה 2 של CIS, מגדירים את משתנה הסביבה LEVEL ב-/etc/cis-scanner/env_vars לערך 2. קובץ /etc/cis-scanner/env_vars אמור להיראות כך:

# cis-compliance-scanner.service environment variables
# The config file defines which checks to perform by cis_scanner
CONFIG="/usr/share/google/security/cis-compliance/cis_config.textproto"
# Where to store the result of the scan
RESULT="/var/lib/google/cis_scanner_scan_result.textproto"
# Upto which level to scan. It can be 1 or 2
LEVEL="2"
# Extra options that can be passed to cis_scanner
# For valid options, see output of `cis_scanner -h`
EXTRA_OPTIONS=""

הגדרת הטיימר

כדי להגדיר סריקה תקופתית של תאימות, מתחילים את יחידת הלימוד cis-compliance-scanner.timer:

systemctl start cis-compliance-scanner.timer

כברירת מחדל, cis-compliance-scanner.timer מתחיל cis-compliance-scanner.service פעם ביום. כדי לשנות את תקופת הסריקה, מחליפים את הערך בשדה OnUnitActiveSec של יחידת cis-compliance-scanner.timer:

sudo mkdir /etc/systemd/system/cis-compliance-scanner.timer.d
sudo tee /etc/systemd/system/cis-compliance-scanner.timer.d/override.conf <<EOF
[Unit]
Description=Run CIS Scanner once an hour
[Timer]
OnUnitActiveSec=1h
EOF

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

כדי להחיל את השינויים, צריך לטעון מחדש את יחידות systemd:

systemctl daemon-reload

ביטול הסכמה לבדיקות תאימות ספציפיות של CIS

ההמלצות של CIS ברמה 1 וברמה 2 מיועדות להיות רלוונטיות לרוב הסביבות. עם זאת ,יכול להיות שחלק מההמלצות לא רלוונטיות לסביבה הספציפית שלכם. כדי לבטל את ההסכמה לקבלת המלצות ספציפיות, משתמשים במשתנה הסביבה EXTRA_OPTIONS ב-/etc/cis-scanner/env_vars.

בדוגמה הבאה, קובץ env_vars לא נכלל בהמלצה etc-passwd-permissions:

# cis-compliance-scanner.service environment variables
# The config file defines which checks to perform by cis_scanner
CONFIG="/usr/share/google/security/cis-compliance/cis_config.textproto"
# Where to store the result of the scan
RESULT="/var/lib/google/cis_scanner_scan_result.textproto"
# Upto which level to scan. It can be 1 or 2
LEVEL="1"
# Extra options that can be passed to cis_scanner
# For valid options:`cis_scanner -h`
EXTRA_OPTIONS="--benchmark-opt-out-ids=etc-passwd-permissions"

אוטומציה של הפעלה ובדיקה של סטטוס התאימות ל-CIS

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

  • דוגמה 1: בדיקת התאימות לרמה 1 של CIS פעם ביום.
  • דוגמה 2: בדיקת התאימות לרמה 1 של CIS פעם בשעה.
  • דוגמה 3: בדיקת התאימות לרמה 2 של CIS פעם ביום.
  • דוגמה 4: ביטול הסכמה לבדיקת תאימות ספציפית של CIS.

שימוש ב-cloud-init

לפני שמנסים את הדוגמאות הבאות, חשוב לוודא שאתם יודעים איך להגדיר מכונת COS באמצעות cloud-init. לשם כך, אפשר לעיין בהוראות שבמאמר שימוש ב-cloud-init עם פורמט הגדרות Cloud.

דוגמה 1

הגדרת הדוגמה הבאה מתחילה סריקה תקופתית ברמה 1 של CIS עם תקופת ברירת המחדל של פעם ביום.

#cloud-config

runcmd:
# Check the compliance status of the instance once a day.
- systemctl start cis-compliance-scanner.timer

דוגמה 2

בדוגמה הבאה מוגדרת סריקה תקופתית ברמה 1 של CIS פעם בשעה.

#cloud-config

# Override cis-compliance-scanner.timer with 1 hour frequency.
write_files:

- path: /etc/systemd/system/cis-compliance-scanner.timer.d/override.conf
  permissions: 0600
  owner: root
  content: |
    [Unit]
    Description=Run CIS Scanner once an hour

    [Timer]
    OnUnitActiveSec=1h

runcmd:
# Reload systemd units.
- systemctl daemon-reload
# Check the compliance status of the instance once an hour.
- systemctl start cis-compliance-scanner.timer

דוגמה 3

בדוגמה הבאה מוגדרת סריקה תקופתית ברמה 2 של CIS עם תקופת ברירת המחדל של פעם ביום.

#cloud-config

runcmd:
# Configure the instance for CIS level 2.
- systemctl start cis-level2.service
# Change the scan level to CIS Level 2.
- sed -i 's/^LEVEL=.*$/LEVEL="2"/' /etc/cis-scanner/env_vars
# Check the compliance status of the instance once a day.
- systemctl start cis-compliance-scanner.timer

דוגמה 4

בדוגמה הבאה מוגדר שהסורק יפעל פעם ביום, ומוגדרת ביטול הסכמה להמלצה ספציפית של CIS.

#cloud-config

runcmd:
# Opt-out of the etc-passwd-permissions check.
- sed -i 's/^EXTRA.*$/EXTRA_OPTIONS="--benchmark-opt-out-ids=etc-passwd-permissions"/' /etc/cis-scanner/env_vars
# Check the compliance of the instance once a day.
- systemctl start cis-compliance-scanner.timer

שימוש במדיניות OS

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

בנוסף, צריך להוסיף את האפשרויות instanceFilter ו-rollout בדוגמאות הבאות לפריסה.

דוגמה 1

הגדרת הדוגמה הבאה מתחילה סריקה תקופתית ברמה 1 של CIS עם תקופת ברירת המחדל של פעם ביום.

# An OS policy to check CIS level 1 compliance once a day.
id: ensure-cis-level1-compliance-once-a-day-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: ensure-cis-level1-compliance-once-a-day
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # COS 97 images are by-default CIS Level 1 compliant and there is no
          # additional configuration needed. However, if certain changes
          # cause non-compliance because of the workload on the instance, this
          # section can be used to automate to make fixes. For example, the
          # workload might generate a file that does not comply with the
          # recommended file permissions.
          # Return an exit code of 100 to indicate that the desired changes
          # successfully applied.
          script: |-
            # optional <your code>
            # Check the compliance of the instance once a day.
            systemctl start cis-compliance-scanner.timer && exit 100

דוגמה 2

בדוגמה הבאה מוגדרת סריקה תקופתית ברמה 1 של CIS פעם בשעה.

# An OS policy to check CIS level 1 compliance once an hour.
id: ensure-cis-level1-compliance-once-an-hour-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: ensure-cis-level1-compliance-once-an-hour
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # Return an exit code of 100 to indicate that the desired changes
          # were successfully applied.
          script: |-
            # Overwrite "OnUnitActiveSec" field of the
            # cis-compliance-scanner.timer to trigger
            # cis-compliance-scanner.service once an hour
            # instead of once a day.
            mkdir /etc/systemd/system/cis-compliance-scanner.timer.d
            tee /etc/systemd/system/cis-compliance-scanner.timer.d/override.conf <<EOF
            [Unit]
            Description=Run CIS Scanner once an hour

            [Timer]
            OnUnitActiveSec=1h
            EOF
            # Reload systemd units.
            systemctl daemon-reload
            # Check the compliance of the instance once an hour.
            systemctl start cis-compliance-scanner.timer && exit 100

דוגמה 3

בדוגמה הבאה מוגדרת סריקה תקופתית ברמה 2 של CIS עם תקופת ברירת המחדל של פעם ביום.

# An OS policy to check CIS level 2 compliance once a day.
id: ensure-cis-level2-compliance-once-a-day-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: ensure-cis-level2-compliance-once-a-day
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # Return an exit code of 100 to indicate that the desired changes
          # were successfully applied.
          script: |-
            # Configure the instance for CIS level 2.
            systemctl start cis-level2.service
            # Change the scan level to 2.
            sed -i 's/^LEVEL=.*$/LEVEL="2"/' /etc/cis-scanner/env_vars
            # Check the compliance of the instance once a day.
            systemctl start cis-compliance-scanner.timer && exit 100

דוגמה 4

בדוגמה הבאה מוגדר שהסורק יפעל פעם ביום, ומוגדרת ביטול הסכמה להמלצה ספציפית של CIS.

# An OS policy to opt-out of CIS check and check compliance status once a day.
id: exclude-cis-check-and-check-compliance-once-a-day-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: exclude-cis-check-and-check-compliance-once-a-day
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # Return an exit code of 100 to indicate that the desired changes
          # were successfully applied.
          script: |-
            # Opt-out of the etc-passwd-permissions check.
            sed -i 's/^EXTRA.*$/EXTRA_OPTIONS="--benchmark-opt-out-ids=etc-passwd-permissions"/' /etc/cis-scanner/env_vars &&
            # Check the compliance of the instance once a day.
            systemctl start cis-compliance-scanner.timer
            # Ensure cis-compliance-scanner completes before exiting
            PID=$(systemctl show --property MainPID --value cis-compliance-scanner.service) &&
            timeout 5m bash -c -- 'while [ -e /proc/'$PID' ]; do echo "CIS Scanner with PID:'$PID' is still running"; sleep 1; done' &&
            exit 100

פתרון בעיות

בקטע הזה מוסבר איך לפתור בעיות שקשורות לסריקת CIS benchmark.

הגדרת מופע בהתאם להמלצות CIS רמה 2 נכשלת

שירות cis-level2 קודם מגדיר את המופע כך שיתאים להמלצות של CIS ברמה 2, ואז בודק את התאימות לרמה 1 ולרמה 2 של CIS. אם הגדרת המופע נכשלת, שירות cis-level2 יוצא עם הודעת השגיאה הבאה:

Job for cis-level2.service failed because the control process exited with error code.
See "systemctl status cis-level2.service" and "journalctl -xeu cis-level2.service" for details.

ביומני הרישום יופיעו ההמלצות שלא הוחלו על המופע, והן גרמו לכשל בשירות cis-level2 systemd.

בדיקת התאימות ל-CIS ברמה 1 או ברמה 2 נכשלת

תוצאות הסריקה של כל הפעלה של תאימות לרמת CIS נכתבות ב-/var/lib/google/cis_scanner_scan_result.textproto. אם אחת מהבדיקות ברמה 1 או ברמה 2 של CIS נכשלת, קובץ ה-textproto יכיל את רשימת כל הבדיקות שנכשלו, כמו בדוגמה הבאה:

cat /var/lib/google/cis_scanner_scan_result.textproto

# Output
start_time: {
  seconds: 1648241700
  nanos: 763152171
}
end_time: {
  seconds: 1648241700
  nanos: 812992527
}
scanner_version: "1.1.4.3"
benchmark_version: "1.0.0"
status: {
  status: SUCCEEDED
}
non_compliant_benchmarks: {
  id: "etc-passwd-permissions"
  compliance_occurrence: {
    non_compliant_files: {
      path: "/etc/passwd"
      reason: "File permission is 0664, expected the following bits to be set: 0444 and the following bits to be clear: 0133"
    }
  }
}
compliant_benchmarks:  {
  id:  "etc-passwd-permissions"
  compliance_occurrence:  {}
}

כדי לטפל בבדיקות שנכשלו, משתמשים ב-CIS Benchmark ופועלים לפי השלבים בקטע Remediation של הבדיקה שנכשלה כדי להפוך את המופע לתואם. כדי לגלות איזו המלצה מתאימה לבדיקה שנכשלה ב-CIS Benchmark, מחפשים את מזהה non_compliant_benchmark's בקובץ ההגדרות של סורק CIS שנמצא במיקום /usr/share/google/security/cis-compliance/cis_config.textproto.