7 שלב בניית יכולות

GitHub Security — אבטחת קוד ותשתיות

בפרק הזה תפעילו את כל שכבות האבטחה של GitHub: Dependabot שמגן על התלויות, CodeQL שסורק את הקוד, secret scanning שמזהה מפתחות שדלפו, ו-push protection שחוסם טעויות לפני שהן קורות. תבנו dependabot.yml מותאם, תגדירו CodeQL workflow, ותבינו בדיוק מה חינמי ומה בתשלום. בסוף הפרק תהיה לכם מערכת אבטחה שלמה שעובדת ברקע — בלי שתצטרכו לחשוב עליה.

אם תיקחו רק דבר אחד מהפרק הזה

צרו קובץ .github/dependabot.yml עם schedule שבועי לכל ה-ecosystems שלכם. זה לוקח 5 דקות, חינמי לגמרי, ומכסה את 90% מפגיעויות האבטחה שמגיעות דרך תלויות. רוב ה-breaches מגיעים מ-dependencies לא מעודכנים — וזה הצעד הפשוט ביותר להגנה.

מה יהיה לך בסוף הפרק הזה
מה תוכלו לעשות בסוף הפרק הזה
דרישות קדם
חוט הפרויקט

מאיפה באנו: בפרק 6 פרסמתם packages ב-GitHub — npm packages ו-Docker images. עכשיו השאלה היא: האם ה-packages שלכם בטוחים? האם ה-dependencies מעודכנים? האם לא דלפו secrets לקוד?

מה נבנה עכשיו: מערכת אבטחה שלמה שרצה ברקע — Dependabot שומר על ה-dependencies, CodeQL סורק את הקוד, ו-push protection מונע דליפת secrets. כל זה ללא התערבות שלכם.

לאן הולכים: בפרק 8 תלמדו לבנות אוטומציות עם GitHub API ו-Webhooks. ה-tokens שתשתמשו בהם שם? עכשיו תלמדו איך להגן עליהם.

מילון מונחים
Dependabot
בוט מובנה של GitHub שמזהה תלויות (dependencies) פגיעות ויוצר PRs אוטומטיים לתיקון ולעדכון
dependabot.yml
קובץ הגדרות שנמצא ב-.github/dependabot.yml וקובע מתי ואיך Dependabot בודק עדכונים
CodeQL
מנוע ניתוח סמנטי (semantic analysis) של GitHub — מתייחס לקוד כאל מסד נתונים ומריץ queries לזיהוי פגיעויות
Code Scanning
סריקה אוטומטית של קוד מקור לזיהוי פגיעויות אבטחה — בדרך כלל באמצעות CodeQL
Secret Scanning
זיהוי אוטומטי של tokens, מפתחות API וסיסמאות שנחשפו בקוד או ב-issues
Push Protection
חסימת git push שמכיל secrets לפני שהוא מגיע לריפוזיטורי — קו ההגנה הראשון
CVE
Common Vulnerabilities and Exposures — מזהה ייחודי עולמי לפגיעות אבטחה ידועה (למשל CVE-2024-12345)
CWE
Common Weakness Enumeration — קטלוג של סוגי חולשות אבטחה בתוכנה (למשל CWE-79 = XSS)
GHAS
GitHub Advanced Security — החבילה המסחרית שמ-2025 פוצלה ל-Secret Protection ($19) ו-Code Security ($30)
Security Advisory
דיווח על פגיעות אבטחה בריפוזיטורי — אפשר ליצור בפרטיות ולפרסם אחרי תיקון עם CVE
Dependency Graph
מפת כל התלויות של הפרויקט שלכם — הבסיס שעליו Dependabot alerts נבנים
SBOM
Software Bill of Materials — רשימה מלאה ומתועדת של כל הרכיבים בפרויקט, כולל גרסאות
Supply Chain Attack
מתקפה שמזריקה קוד זדוני דרך תלויות של הפרויקט — אחד האיומים הנפוצים ביותר כיום
Copilot Autofix
תיקון אוטומטי מבוסס AI עבור code scanning alerts — GitHub מציע fix ישירות ב-PR
Security Overview
Dashboard ברמת ארגון שמציג את מצב האבטחה, מגמות, ושיעורי הפעלה של כלי אבטחה

7.1 שכבות האבטחה של GitHub — התמונה הגדולה

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

שכבות האבטחה של GitHub שכבה 5: Security Overview Dashboard ברמת ארגון — ניטור ומגמות שכבה 4: Secret Scanning + Push Protection זיהוי וחסימת secrets שדולפים לקוד שכבה 3: Code Scanning (CodeQL) ניתוח סטטי — זיהוי SQL injection, XSS ועוד שכבה 2: Dependabot (Alerts + Updates) זיהוי ותיקון תלויות פגיעות — PRs אוטומטיים שכבה 1: Dependency Graph + SBOM מיפוי כל התלויות — הבסיס לכל השאר חינמי לכל הריפוזיטורים חינמי ל-public בלבד בתשלום (private repos)

הנקודה החשובה: רוב השכבות חינמיות. Dependabot alerts, security updates, version updates, dependency graph, ו-SBOM — כל אלה חינמיים לכל ריפוזיטורי, public ו-private. Code scanning, secret scanning ו-push protection חינמיים לריפוזיטורים ציבוריים. רק Security Overview ופיצ'רים מתקדמים דורשים תשלום.

למה זה חשוב עכשיו? מתקפות supply chain (מתקפות שמגיעות דרך תלויות של הפרויקט) הן אחד האיומים הנפוצים ביותר בעולם התוכנה. תחשבו על זה: הפרויקט שלכם משתמש ב-200 packages, כל אחד מהם עם dependencies משלו — ביחד אולי 1,000 רכיבים. אם אחד מהם פגיע, כל המערכת בסיכון. הכלים שנלמד בפרק הזה מגנים על כל השרשרת הזו.

Dependency Graph הוא הבסיס לכל שאר השכבות. GitHub מנתח אוטומטית את קבצי התלויות שלכם (package.json, requirements.txt, Gemfile.lock, pom.xml, ועוד) ובונה מפת תלויות מלאה — כולל תלויות עקיפות (transitive dependencies). אפשר לראות את המפה ב-InsightsDependency graph.

SBOM (Software Bill of Materials) — מסמך מתועד שמפרט את כל הרכיבים בפרויקט, כולל שם, גרסה, רישיון, ומקור. חישבו על זה כ-"רשימת מרכיבים" על אריזת מזון — אלא שזה לתוכנה. אפשר לייצא SBOM מכל ריפוזיטורי: InsightsDependency graphExport SBOM. הפורמט הוא SPDX (סטנדרט בינלאומי). יותר ויותר ארגונים ורגולטורים דורשים SBOM כחלק מתהליכי compliance ו-supply chain transparency — וב-GitHub זה חינמי ואוטומטי לכל ריפוזיטורי.

בפרק הזה נעבור שכבה אחרי שכבה — מהבסיס (Dependabot) דרך CodeQL ו-secret scanning, ועד ל-Security Overview. בכל שכבה: מה זה, למה צריך, ואיך מגדירים.

עשו עכשיו

פתחו ריפוזיטורי שלכם ב-GitHub (אחד עם dependencies — npm, pip, או אחר). לחצו על הטאב Security בסרגל העליון. מה מופעל? מה כבוי? רשמו את המצב הנוכחי של כל כלי אבטחה. גם אם הכל כבוי — זה בסדר, עד סוף הפרק הזה תפעילו את הכל. רשמו גם: לכו ל-InsightsDependency graph — כמה dependencies יש לפרויקט שלכם? direct ו-transitive? המספר הזה יפתיע אתכם.

7.2 Dependabot Alerts — כשהתלויות שלך פגיעות

Dependabot (שם שמחבר "depend" + "robot") הוא בוט מובנה של GitHub שמנטר את כל התלויות (dependencies) של הפרויקט שלכם ומתריע כשאחת מהן פגיעה. הוא לא דורש התקנה — הוא חלק מ-GitHub. הוא משתמש ב-Dependency Graph (מפת כל התלויות, כולל תלויות עקיפות) וב-GitHub Advisory Database (מסד נתונים של פגיעויות אבטחה ידועות עם 200,000+ פגיעויות מתועדות) כדי לזהות בעיות.

איך זה עובד — ארבעה שלבים:

  1. Dependency Graph — GitHub מנתח את קבצי התלויות שלכם (package.json, package-lock.json, requirements.txt, Gemfile.lock, pom.xml ועוד) ובונה מפת תלויות מלאה — כולל תלויות עקיפות (transitive)
  2. Advisory Database — GitHub בודק כל תלות מול GitHub Advisory Database, מסד נתונים של פגיעויות ידועות עם CVE IDs. המסד מתעדכן באופן שוטף ע"י GitHub, חוקרי אבטחה, ו-maintainers
  3. Alert — אם נמצאת התאמה (תלות + פגיעות ידועה), GitHub יוצר alert עם כל פרטי הפגיעות ושולח notification
  4. Security Update — אם קיימת גרסה מתוקנת, Dependabot יוצר PR אוטומטי עם השינוי המינימלי הנדרש. ה-PR כולל changelog, release notes, ו-compatibility score

כל alert מכיל מידע מפורט שעוזר לכם להבין את הסיכון ולהחליט מה לעשות:

Dependabot Security Updates הם PRs אוטומטיים שמתקנים פגיעויות. GitHub מזהה פגיעות, מוצא גרסה מתוקנת, ופותח PR עם השינוי המינימלי הנדרש — רק שינוי הגרסה, בלי לגעת בקוד שלכם. ה-PR כולל release notes של הגרסה החדשה, changelog, ו-compatibility score — אחוז שמסמל כמה סביר שהעדכון לא ישבור כלום (מבוסס על נתונים מפרויקטים אחרים). אתם רק צריכים לבדוק שה-tests עוברים ולמזג. זה חינמי לכל הריפוזיטורים — public ו-private.

איך לקרוא Dependabot alert? כשנכנסים ל-alert, רואים כמה אלמנטים חשובים:

Auto-triage rules (בתשלום עם Code Security) — חוקים שמסננים alerts אוטומטית. למשל: "כל alert על devDependency בלבד — סמן כ-low priority" או "כל alert ששפע ה-CVSS שלו תלוי ב-network access ולמערכת שלנו אין network exposure — dismiss אוטומטית". זה חוסך זמן בפרויקטים עם הרבה alerts.

Malware alerts (חדש): Dependabot גם מזהה packages שידועים כ-malware — לא רק פגיעים, אלא ממש זדוניים. תחשבו על typosquatting: package בשם lodahs במקום lodash שמכיל קוד זדוני. Dependabot מזהה packages כאלה ומתריע ב-severity critical. טיפול: הסירו מיד ובדקו אם הקוד הזדוני הורץ.

Dependabot נגד supply chain attacks: מתקפות supply chain (מתקפות שרשרת אספקה) הן אחד האיומים הגדולים ביותר על פרויקטי תוכנה כיום. התוקף לא פורץ את הקוד שלכם — הוא מזריק קוד זדוני דרך dependency שאתם סומכים עליו. הדוגמאות מהעולם האמיתי רבות: event-stream (2018), ua-parser-js (2021), colors.js (2022), xz utils (2024). Dependabot מגן מפני זה בכמה דרכים: הוא מתריע על packages שידועים כ-malware, הוא מתריע כשגרסה מכילה פגיעות ידועה, ועם cooldown (שנלמד בסעיף הבא) הוא מונע אימוץ מהיר מדי של גרסאות חדשות שעלולות להיות מפוקפקות.

עשו עכשיו

פתחו את הטאב SecurityDependabot alerts בריפוזיטורי שלכם. כמה alerts יש? מה ה-severity הגבוה ביותר? לחצו על alert אחד וקראו: מה ה-CVE? מה ה-CVSS score? מה הגרסה המתוקנת? אם יש alert עם severity critical — הוא הראשון שצריך טיפול.

טעות נפוצה: להתעלם מ-Dependabot alerts

הפרויקט עובד, אז למה לשנות? כי פגיעות critical שלא מטופלת היא דלת פתוחה לתוקפים. גם אם הקוד שלכם מושלם, תלות פגיעה יכולה לחשוף את כל המערכת. הכלל: critical → תקנו מיד. high → sprint הנוכחי. medium → triage שבועי. low → backlog.

7.3 Dependabot Version Updates — עדכון שוטף של תלויות

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

יש הבדל חשוב בין שני סוגי העדכונים של Dependabot:

מאפייןSecurity UpdatesVersion Updates
מתי פועלכשנמצאת פגיעותלפי schedule קבוע
דורש הגדרהלא — אוטומטיכן — צריך dependabot.yml
מה מעדכןרק תלויות פגיעותכל התלויות — גם בריאות
מטרהתיקון חירוםשמירה על עדכניות שוטפת
עלותחינמיחינמי

למה צריך Version Updates? כי עדכון קטן כל שבוע הרבה יותר בטוח מעדכון ענקי כל שנה. תחשבו על זה כך: אם dependency עולה מ-2.1.0 ל-2.1.1 (patch) — סביר שמשהו קטן השתנה ו-tests שלכם יעברו. אבל אם חיכיתם שנה ועכשיו צריכים לעלות מ-2.1.0 ל-3.5.0 — יש breaking changes, API שהשתנה, deprecations שצריך לטפל בהם. זה פרויקט של ימים, לא דקות.

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

כדי להפעיל Version Updates, צריך ליצור קובץ .github/dependabot.yml (שם קובץ מדויק — Dependabot לא יזהה שם אחר). זה קובץ YAML שמגדיר: אילו ecosystems לבדוק, באיזו תדירות, ואיך לארגן את ה-PRs. Dependabot קורא את הקובץ ופועל לפי ההגדרות — בלי שום התערבות שלכם.

הנה דוגמה בסיסית של dependabot.yml שמכסה את שלושת ה-ecosystems הנפוצים ביותר:

# .github/dependabot.yml
version: 2
updates:
  # npm dependencies
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
      time: "09:00"
      timezone: "Asia/Jerusalem"
    labels:
      - "dependencies"
      - "automerge"

  # Docker base images
  - package-ecosystem: "docker"
    directory: "/"
    schedule:
      interval: "monthly"

  # GitHub Actions versions
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"

מה יש כאן:

שימו לב למוסכמה חשובה: הקובץ חייב להיות בדיוק ב-.github/dependabot.yml (לא .github/dependabot.yaml, לא dependabot.yml ב-root). אם הקובץ במיקום לא נכון — Dependabot פשוט יתעלם ממנו בלי שום הודעת שגיאה.

github-actions כ-ecosystem: שימו לב שהגדרנו גם github-actions כ-ecosystem. זה מעדכן את ה-versions של Actions שאתם משתמשים בהם ב-workflows — למשל עדכון מ-actions/checkout@v3 ל-actions/checkout@v4. זה חשוב במיוחד מבחינת אבטחה: Actions ישנים עלולים להריץ על Node.js versions שכבר לא נתמכים.

תרגיל 1 — יצירת dependabot.yml

מטרה: להגדיר Dependabot Version Updates לפרויקט שלכם.

  1. פתחו את הריפוזיטורי ב-GitHub
  2. צרו קובץ חדש: .github/dependabot.yml (אם אין תיקיית .github, צרו אותה)
  3. הגדירו updates עבור כל ה-ecosystems הרלוונטיים לפרויקט שלכם:
    • npm (אם יש package.json) — weekly, יום שני, 09:00 שעון ישראל
    • docker (אם יש Dockerfile) — monthly
    • github-actions (אם יש workflows) — weekly
  4. הוסיפו labels לכל ecosystem: "dependencies"
  5. עשו commit ו-push

תוצאה צפויה: תוך דקות, Dependabot יתחיל לפתוח PRs עם עדכונים. בדקו את הטאב Pull Requests — אם יש תלויות לא מעודכנות, כבר יופיעו PRs.

עשו עכשיו

אחרי שיצרתם את הקובץ ועשיתם push, חכו דקה ובדקו את הטאב Pull Requests. האם Dependabot כבר יצר PRs? אם כן — כמה? על איזה packages?

7.4 dependabot.yml לעומק — כל האפשרויות

dependabot.yml תומך בהרבה יותר מ-schedule בסיסי. הנה התכונות המתקדמות שכדאי להכיר:

Groups — קיבוץ PRs

בלי groups, Dependabot פותח PR נפרד לכל dependency שצריכה עדכון. בפרויקט עם 50 dependencies, אתם עלולים לקבל 20 PRs ביום שני בבוקר — זה מכריע. Groups פותרים את הבעיה: אתם מגדירים כללים שמקבצים כמה עדכונים ל-PR אחד. במקום 20 PRs — מקבלים 3-4.

אפשר לקבץ לפי:

דוגמה:

updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      # קיבוץ כל ה-dev dependencies ל-PR אחד
      development-dependencies:
        dependency-type: "development"
      # קיבוץ packages של testing
      testing:
        patterns:
          - "jest*"
          - "@testing-library/*"
          - "vitest"

Cooldown — עיכוב חכם

תכונה חדשה (מ-July 2025) שמונעת אימוץ מהיר מדי של גרסאות חדשות — הגנה מפני supply chain attacks:

updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    cooldown:
      default: 3    # ברירת מחדל: 3 ימים
      semver-major-version: 14  # major: חכו 14 יום
      semver-minor-version: 7   # minor: חכו 7 ימים
      semver-patch-version: 3   # patch: חכו 3 ימים

למה cooldown חשוב? Supply chain attacks מנצלים את החלון בין פרסום package זדוני לבין גילויו. תוקף מפרסם גרסה חדשה של package פופולרי (או package עם שם דומה), ופרויקטים שמעדכנים מיד — מכניסים קוד זדוני. אם Dependabot מחכה 3 ימים לפני שפותח PR — יש סיכוי טוב שה-package הזדוני כבר יתגלה, ידווח, ויוסר מה-registry לפני שהגרסה מגיעה לפרויקט שלכם.

המלצת baseline: 3 ימים ל-patch (שינויים קטנים), 7 ימים ל-minor (תכונות חדשות), 14 ימים ל-major (שינויים שוברים). זה נותן מספיק זמן לקהילה לבדוק גרסאות חדשות בלי להאט אתכם יותר מדי.

Allow/Ignore — סינון תלויות

updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    # רק security updates ל-lodash
    ignore:
      - dependency-name: "lodash"
        update-types: ["version-update:semver-major"]
    # private registry
    registries:
      - npm-private

עוד אפשרויות חשובות

דוגמה מציאותית: startup עם Node.js backend, React frontend, Docker deployment, Terraform infra, ו-GitHub Actions. ה-dependabot.yml שלהם מגדיר 5 ecosystems, כל אחד עם schedule מותאם — npm weekly, docker monthly, terraform monthly, github-actions weekly, pre-commit weekly. Groups מקבצים dev dependencies ביחד ו-production dependencies ביחד. Cooldown מונע אימוץ מהיר של versions חדשים. התוצאה: 5-8 PRs בשבוע במקום 30+, וכל אחד כולל tests שרצים אוטומטית.

זרימת ההחלטה של Dependabot גרסה חדשה זמינה תיקון אבטחה? כן Security Update — PR מיידי לא Version Update — לפי schedule cooldown עבר? לא המתנה כן PR מקובץ (Grouped PR) Review, Test, Merge
מסגרת החלטה: אסטרטגיית Dependabot Configuration
מצבschedulegroupscooldown
פרויקט אישי קטןweeklyלא חייבלא חייב
startup עם צוות קטןweekly + reviewersכן — dev/prod3/7/14 ימים
חברה עם הרבה reposweekly + org-level configכן + multi-ecosystemחובה
פרויקט קוד פתוחmonthly (פחות רעש)כן — שומר על PRs נקייםכן — הגנה מ-supply chain
monorepo עם directoriesweekly per directoryכן — per directoryכן
עשו עכשיו

הוסיפו cooldown configuration ל-dependabot.yml שלכם: 3 ימים ל-patch, 7 ימים ל-minor, 14 ימים ל-major. זה מוסיף שכבת הגנה נגד supply chain attacks בלי עלות.

טעות נפוצה: לסמוך רק על security updates בלי dependabot.yml

Dependabot alerts ו-security updates הם אוטומטיים — אבל הם מטפלים רק בפגיעויות ידועות. Version updates מונעים בעיות מצטברות: כש-dependencies מעודכנים שוטפית, הסיכון נמוך יותר. עדכון קטן כל שבוע >> עדכון ענקי כל שנה שישבור חצי מהפרויקט.

7.5 Code Scanning עם CodeQL — ניתוח סטטי שמבין את הקוד

CodeQL הוא מנוע הניתוח הסמנטי (semantic analysis engine) של GitHub. בניגוד ל-linters רגילים שבודקים תחביר, CodeQL מתייחס לקוד שלכם כאל מסד נתונים ומריץ queries שמוצאים דפוסים מסוכנים — כמו SQL injection, Cross-Site Scripting (XSS), path traversal, ועוד.

איך זה עובד:

  1. בניית מסד נתונים — CodeQL מנתח את כל הקוד שלכם ובונה representation פנימי: כל פונקציה, כל משתנה, כל זרימת נתונים ממקור (source) ליעד (sink). זה שונה מ-linter שבודק שורה אחרי שורה — CodeQL מבין את הזרימה המלאה
  2. הרצת queries — CodeQL מריץ מאות שאילתות (queries) שמחפשים patterns מסוכנים. כל query מגדיר: מהו source (איפה input מגיע), מהו sink (למה הוא מגיע), ומה חסר באמצע (למשל: sanitization). דוגמה: "האם יש מקום שבו input מהמשתמש מגיע ל-SQL query בלי prepared statement?"
  3. יצירת alerts — אם נמצאת התאמה, נוצר alert עם description, severity, CWE reference, ו-data flow visualization שמראה בדיוק את הנתיב מ-source ל-sink. זה חלק מהערך המוסף: אתם לא רק יודעים שיש בעיה, אתם רואים בדיוק איך ה-input זורם דרך הקוד

Data flow analysis הוא היתרון המרכזי של CodeQL על פני כלי linting רגילים כמו ESLint או Pylint. Linter בודק pattern מקומי ("האם יש eval() בקוד?"). CodeQL עוקב אחרי זרימת הנתונים בין פונקציות ומודולים — הוא יודע ש-input שמגיע מ-req.body.name בשורה 5 של routes/users.js עובר דרך processInput() בשורה 12 של utils/input.js, ומגיע ל-db.query() בשורה 23 של models/user.js. אם באף שלב בנתיב הזה לא היה sanitization — זו פגיעות. הנתיב הזה בדיוק הוא מה שה-data flow visualization מראה ב-alert.

שני מצבי הגדרה: GitHub מציע שתי דרכים להפעיל CodeQL. Default setup הוא one-click — GitHub מגדיר הכל אוטומטית. Advanced setup נותן שליטה מלאה דרך קובץ workflow YAML. לרוב, default setup מספיק. עברו ל-advanced רק אם צריכים שליטה ספציפית.

מאפייןDefault SetupAdvanced Setup
הגדרהלחיצה אחת ב-Settingsקובץ workflow YAML
שליטהGitHub מחליט הכלאתם קובעים שפות, queries, schedule
מתאים לרוב הפרויקטיםפרויקטים עם build מורכב או דרישות מיוחדות
שפותזיהוי אוטומטיאתם מגדירים
זמן הגדרה30 שניות10-20 דקות

שפות נתמכות (9): C/C++, C#, Go, Java/Kotlin, JavaScript/TypeScript, Python, Ruby, Swift, ו-Actions workflows (GA מ-April 2025 — CodeQL סורק גם את ה-YAML של Workflows!).

סריקת Actions workflows היא תכונה חדשה וחשובה שנכנסה ל-GA באפריל 2025: CodeQL מוצא בעיות אבטחה ב-workflow YAML files. הבעיה הנפוצה ביותר: injection attacks. למשל, שימוש ב-${{ github.event.issue.title }} ישירות ב-run: step. תוקף יכול לפתוח issue עם כותרת שמכילה פקודות shell — והן ירוצו ב-runner שלכם עם הרשאות ה-workflow. CodeQL מזהה patterns כאלה ומתריע. אם אתם משתמשים ב-Actions (ולמדתם בפרק 1) — הפעילו את זה. ב-default setup, אם יש workflows בריפוזיטורי — הם נסרקים אוטומטית.

מה CodeQL מוצא בפועל? דוגמאות מייצגות:

גרסה נוכחית: CodeQL Action v4 (שוחרר October 2025, רץ על Node.js 24). v3 ידורג (deprecated) ב-December 2026. אם יש לכם workflows ישנים עם @v3 — עדכנו ל-@v4. ההגירה פשוטה: שנו github/codeql-action/init@v3 ל-@v4 בכל שלושת ה-steps (init, autobuild, analyze). הפורמט זהה.

עשו עכשיו

הפעילו code scanning ב-default setup: SettingsCode security and analysisCode scanningEnable. זה לוקח פחות מ-30 שניות וכבר מתחיל לסרוק.

טעות נפוצה: לחשוב ש-CodeQL מחליף code review

CodeQL מוצא patterns טכניים — SQL injection, XSS, path traversal, hardcoded credentials. אבל הוא לא מבין business logic, ארכיטקטורה, או readability. אם פונקציה מוחקת את כל הנתונים במקום לעדכן רשומה אחת — אבל עושה את זה בצורה "בטוחה" טכנית (prepared statement, no injection) — CodeQL לא ימצא את הבעיה. Code review אנושי נדרש עבור: לוגיקה עסקית, ארכיטקטורה, ביצועים, readability, edge cases. הגישה הנכונה: שניהם ביחד — CodeQL לאוטומטיקה, code review לשיקול דעת.

7.6 CodeQL Workflow — הגדרה מתקדמת ב-Actions

Default setup מספיק לרוב הפרויקטים — הוא מזהה את השפות אוטומטית ומריץ סריקה על push ו-PR. אבל יש מקרים שצריך שליטה מלאה. מתי צריך advanced setup במקום default? כשרוצים:

הנה workflow מלא שמגדיר סריקת CodeQL ב-advanced setup. קחו את ה-template הזה ושנו את ה-language לפי הפרויקט שלכם:

# .github/workflows/codeql.yml
name: "CodeQL Analysis"

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
  schedule:
    - cron: '30 8 * * 1'  # כל יום שני ב-08:30 UTC

jobs:
  analyze:
    name: Analyze (${{ matrix.language }})
    runs-on: ubuntu-latest
    permissions:
      security-events: write
      contents: read

    strategy:
      fail-fast: false
      matrix:
        language: [ 'javascript-typescript' ]
        # אפשרויות: c-cpp, csharp, go, java-kotlin,
        # javascript-typescript, python, ruby, swift, actions

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v4
        with:
          languages: ${{ matrix.language }}
          queries: security-and-quality
          # query suites:
          # default — רק security
          # security-extended — security + נוספות
          # security-and-quality — הכי מקיף

      - name: Autobuild
        uses: github/codeql-action/autobuild@v4
        # לשפות compiled: אם autobuild לא עובד,
        # החליפו ב-build steps ידניים

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v4
        with:
          category: "/language:${{ matrix.language }}"

ה-workflow מגדיר trigger על push, PR ו-schedule שבועי (חשוב לזיהוי פגיעויות חדשות בקוד קיים). שימו לב ל-permissions: CodeQL צריך security-events: write כדי ליצור alerts, ו-contents: read כדי לקרוא את הקוד.

שלושה query suites:

Build modes (לשפות compiled):

טיפ חשוב: אם אתם עובדים עם JavaScript/TypeScript בלבד — אל תשתמשו ב-autobuild. השתמשו ב-build-mode: none (ברירת מחדל לשפות interpreted). Autobuild מיועד לשפות compiled ויאט את הסריקה ללא צורך.

הגירה מ-v3 ל-v4:

# ישן (v3) — deprecated December 2026
- uses: github/codeql-action/init@v3
- uses: github/codeql-action/autobuild@v3
- uses: github/codeql-action/analyze@v3

# חדש (v4) — מומלץ
- uses: github/codeql-action/init@v4
- uses: github/codeql-action/autobuild@v4
- uses: github/codeql-action/analyze@v4

הפורמט זהה, אין שינויים ב-configuration. פשוט שנו @v3 ל-@v4 ב-3 המקומות.

תרגיל 2 — הגדרת CodeQL Workflow מתקדם

מטרה: ליצור CodeQL workflow עם advanced setup.

  1. צרו קובץ .github/workflows/codeql.yml
  2. הגדירו סריקה עבור השפה העיקרית של הפרויקט (למשל javascript-typescript)
  3. השתמשו ב-query suite: security-and-quality (הכי מקיף)
  4. הגדירו triggers: push ל-main, PR ל-main, schedule שבועי
  5. עשו commit, push, ועקבו אחרי הריצה בטאב Actions

תוצאה צפויה: ה-workflow ירוץ ויסיים (ייקח 2-10 דקות תלוי בגודל הפרויקט). אפשר לעקוב בטאב Actions — תראו job בשם "Analyze (javascript-typescript)" עם steps: Checkout, Initialize CodeQL, Autobuild, Perform Analysis. כש-step האחרון מסתיים — תוצאות יופיעו ב-SecurityCode scanning alerts.

אם אין alerts — מצוין! הקוד שלכם נקי מהפגיעויות שCodeQL מזהה. אם יש — עברו לסעיף הבא ללמוד איך לטפל.

טיפ: אם ה-workflow נכשל — בדקו את ה-logs. הסיבה הנפוצה ביותר: שם שפה שגוי ב-matrix (למשל javascript במקום javascript-typescript) או בעיית build בשפות compiled.

7.7 טיפול בתוצאות Code Scanning — dismiss, fix, suppress

תוצאות code scanning מופיעות ב-SecurityCode scanning alerts. כל alert מכיל:

מה ה-data flow מראה? זה אחד הכלים החזקים ביותר של CodeQL. ה-data flow visualization מציג את הנתיב המלא של הנתונים דרך הקוד — מ-source (איפה ה-input נכנס למערכת) דרך כל הפונקציות שהוא עובר, ועד ל-sink (המקום המסוכן). כל צעד בנתיב מקושר לשורה ספציפית בקוד. זה מאפשר להבין לא רק "יש בעיה" אלא "איך בדיוק ה-input מגיע למקום הבעייתי" — וזה מקצר דרמטית את זמן התיקון.

שלוש אפשרויות טיפול:

פעולהמתימה קורה
Fix — תקנו את הקודה-alert אמיתי ורלוונטיה-alert נסגר אוטומטית אחרי ש-commit עם הfix נכנס ל-default branch
Dismiss — סמנו כ-false positiveה-alert לא רלוונטי (won't fix / used in tests / false positive)ה-alert נעלם מהרשימה, לא יחזור על אותו מיקום בקוד
Suppress — inline commentהקוד בסדר אבל CodeQL לא מבין את ההקשרהערה בקוד (// codeql-suppress) שמדכאת alerts ספציפיים

מתי לעשות Dismiss? לפעמים CodeQL מזהה pattern שנראה מסוכן אבל בהקשר שלכם הוא לא. דוגמאות:

כש-dismiss, תמיד בחרו סיבה (false positive / used in tests / won't fix) — זה יוצר documentation ועוזר לצוות להבין למה ה-alert נסגר.

Copilot Autofix — תכונה שמשנה את משחק האבטחה. כש-CodeQL מוצא פגיעות, Copilot מציע קוד מתוקן ישירות ב-PR. אתם רואים את ה-diff של התיקון המוצע, בודקים שהוא הגיוני, ומאשרים בלחיצה. זה חינמי ל-public repos ודורש רישיון Code Security ל-private.

דוגמה מעשית: נניח ש-CodeQL מצא SQL injection בשורה 42 של api/users.js. ה-data flow מראה שה-input מגיע מ-req.query.name (source) ומגיע ישירות ל-db.query(`SELECT * FROM users WHERE name = '${name}'`) (sink). Copilot Autofix יציע להחליף את ה-template literal ב-prepared statement: db.query('SELECT * FROM users WHERE name = $1', [name]). אתם בודקים שהלוגיקה נשמרת, מאשרים, ו-merge.

Security Campaigns (בתשלום, Code Security) — כלי ניהול ברמת ארגון שמאפשר ל-security team לקבץ alerts לפי נושא (למשל "כל ה-SQL injections") ולהקצות אותם לצוותים, לעקוב אחרי התקדמות, ולוודא שהכל מטופל. שימושי כשיש עשרות ריפוזיטורים ומאות alerts.

מסגרת החלטה: Alert Triage — סדר עדיפויות
Severityפעולהטווח זמן
Criticalתקנו מיד — זה חירוםאותו יום
Highתקנו ב-sprint הנוכחישבוע
Mediumtriage שבועי — תעדפו2-4 שבועות
Lowbacklog או dismissלפי capacity
עשו עכשיו

פתחו את SecurityCode scanning alerts בריפוזיטורי שלכם. אם יש alerts — פתחו אחד, קראו את ה-description, בדקו את ה-data flow. אם אין alerts — מצוין, הקוד שלכם נקי מהדפוסים שCodeQL מזהה!

7.8 Secret Scanning — כשמפתחות API דולפים

Secret Scanning היא אחת מהתכונות הקריטיות ביותר של GitHub מבחינת אבטחה. היא סורקת את כל ה-commits, PRs, issues ו-discussions בריפוזיטורי שלכם ומחפשת secrets — API keys, tokens, סיסמאות, connection strings, private keys וכו'. GitHub מזהה 200+ סוגי secrets מ-100+ service providers, ורשימת ה-patterns מתעדכנת כל חודש.

למה secrets מגיעים לקוד מלכתחילה? טעות אנושית. מפתח עובד על feature, מכניס API key לקובץ configuration "רק לבדיקה", שוכח להסיר, ועושה git add . ואז git push. זה קורה בכל חברה, בכל גודל צוות. Secret scanning תופס את הטעויות האלה.

הזיהוי מבוסס על patterns ספציפיים — GitHub יודע בדיוק איך נראה AWS access key, GitHub PAT, Stripe secret key וכו'. יש שני סוגי זיהוי:

Copilot Secret Scanning — תכונה חדשה שמשתמשת ב-AI לזיהוי secrets לא מובנים (unstructured) כמו סיסמאות שנכתבו בקוד. למשל: password = "MyS3cret!" — pattern שאין לו מבנה קבוע ש-regex רגיל לא ימצא. ה-AI מבין context: הוא יודע שמשתנה בשם db_password שמכיל מחרוזת ארוכה הוא כנראה secret אמיתי.

Custom patterns (בתשלום עם Secret Protection) — אפשר להגדיר regex patterns מותאמים לזיהוי secrets ארגוניים. למשל: אם לארגון שלכם יש internal API keys בפורמט MYORG-KEY-[a-z0-9]{32}, אפשר להגדיר pattern שיזהה אותם. אפשר גם לכלול את ה-custom patterns ב-push protection.

אילו סוגי secrets מזוהים? הנה דוגמאות חלקיות מתוך 200+ הסוגים הנתמכים:

Providerסוג Secretדוגמה לפורמט
GitHubPersonal Access Tokenghp_xxxxxxxxxxxxxxxxxxxx
AWSAccess Key IDAKIA... (20 תווים)
StripeSecret Keysk_live_...
Google CloudAPI KeyAIza... (39 תווים)
SlackBot Tokenxoxb-...
npmPublish Tokennpm_...
TwilioAPI KeySK... (34 תווים)

Secret scanning מתעדכן באופן שוטף — ב-March 2026 נוספו 9 סוגים חדשים כולל Airtable, Databricks, PostHog ו-Shopify. GitHub עובד עם 100+ service providers בתוכנית שותפים (Partner Program). כל provider מספק ל-GitHub את ה-patterns של ה-secrets שלו, ובתמורה מקבל notification אוטומטי כשsecret דולף — מה שמאפשר לו לבטל את המפתח מיידית ולהגן על הלקוח.

Secret scanning ב-Issues ו-Discussions: שימו לב — secret scanning לא סורק רק commits. הוא סורק גם issues, PRs descriptions, discussions, ו-wikis. אם מישהו הדביק API key בתגובה ל-issue — GitHub יזהה ויתריע. זו סיבה נוספת שהפעלת secret scanning חשובה גם לפרויקטים שלא מפרסמים קוד רגיש.

מה לעשות כש-secret נחשף? זהו תהליך חירום של 5 צעדים שצריך לבצע מהר ככל האפשר:

  1. Revoke — בטלו את המפתח מיד אצל ה-provider (AWS console, Stripe dashboard, וכו')
  2. Rotate — הנפיקו מפתח חדש
  3. Update — עדכנו את המפתח החדש בכל מקום שצריך (secrets, environment variables, vault)
  4. Audit — בדקו logs אצל ה-provider: האם מישהו השתמש במפתח שדלף?
  5. Prevent — ודאו ש-push protection מופעל כדי למנוע חזרה. הוסיפו את הקובץ שהכיל את ה-secret ל-.gitignore

זמן תגובה: לכל סוג secret יש חלון סיכון שונה. AWS access key שדלף — תוקף יכול להריץ שרתים על החשבון שלכם תוך דקות. GitHub PAT — תוקף יכול לגשת לכל הריפוזיטורים שלכם. Stripe secret key — תוקף יכול לבצע חיובים. הכלל: revoke מיד, לא "אחר כך".

מחזור חיים של Secret שדלף מפתח/ת עושה push עם secret GitHub מזהה Secret Scanning התראות נשלחות Partner + User alerts ביטול מיידי Revoke Token הנפקה חדשה Rotate + Verify הזמן הקריטי: מרגע שה-secret ב-git history — הוא compromised מחיקה ב-commit הבא לא עוזרת! Git שומר היסטוריה.
עשו עכשיו

בדקו: SettingsCode security and analysisSecret scanning. האם זה מופעל? אם לא — הפעילו עכשיו (לחיצה אחת). בדקו גם ב-SecuritySecret scanning alerts — האם כבר נמצאו secrets?

טעות נפוצה: לחשוב שמחיקת secret ב-commit הבא מספיקה

ברגע שמפתח API נמצא ב-git history, הוא compromised — גם אם מחקתם אותו ב-commit הבא. Git שומר את כל ההיסטוריה, וכל מי שיכול לגשת לריפוזיטורי יכול לראות commits ישנים. הפתרון: revoke מיד (בטלו את המפתח אצל ה-provider), הנפיקו מפתח חדש, ועדכנו בכל מקום שהמפתח הישן היה בשימוש.

7.9 Push Protection — חסימה לפני שהנזק קורה

ההבדל בין secret scanning ל-push protection הוא העיתוי:

מאפייןSecret ScanningPush Protection
מתי פועלאחרי ש-push הושלםלפני ש-push מגיע לריפו
מה קורהמודיע שנמצא secretחוסם את ה-push
ה-secret בהיסטוריה?כן — כבר שםלא — נחסם בזמן
עלותחינמי (public) / $19 (private)חינמי (public) / $19 (private)

Push protection עובד כ-pre-receive hook בצד של GitHub — לא אצלכם על המחשב, אלא ב-server של GitHub. כש-git push שולח את ה-commits, GitHub סורק את ה-diff (השינויים) של כל commit לפני שמאפשר להם להיכנס לריפוזיטורי. אם מזוהה secret — ה-push כולו נחסם. נכון ל-2026, יש 39 detectors שמופעלים כברירת מחדל — GitHub tokens, AWS keys, Azure secrets, Stripe keys, ועוד.

מה זה אומר בפועל? זה אומר שגם אם טעיתם ועשיתם git add . שכלל קובץ .env עם API key, וגם עשיתם git commit — ה-push ייחסם. ה-secret לעולם לא יגיע ל-GitHub. זה ההבדל הקריטי בין push protection לבין secret scanning: push protection מונע את הנזק, secret scanning רק מגלה אותו אחרי שכבר קרה.

מה קורה כשPush נחסם?

אם ניסיתם לעשות push ו-GitHub זיהה secret, תקבלו הודעת שגיאה בטרמינל:

remote: error: GH009: Secret detected in push
remote: —— GitHub Personal Access Token ——
remote: locations:
remote:   - file: config/api.js:15
remote:
remote: To push, either remove the secret from your commits,
remote: or visit the URL to allow the secret.

שלוש אפשרויות bypass (אם אתם בטוחים שזה בסדר):

מה קורה אחרי bypass? ה-push עובר, אבל GitHub מתעד מי עשה bypass, מתי, ובאיזו סיבה. ב-Security tab אפשר לראות את כל ה-bypass events. בארגון עם delegated bypass, ה-reviewer מקבל notification ויכול לאשר או לדחות אחרי שה-push כבר נכנס — אם הוא דוחה, הצוות צריך לתקן מיד.

Push Protection for Users — תכונת הגנה שמופעלת כברירת מחדל לכל המשתמשים שדוחפים לריפוזיטורים ציבוריים. חינמי, לא צריך הגדרה. אפשר לבדוק ולנהל: Settings (של המשתמש) → Code security and analysisPush protection for yourself. מומלץ מאוד להשאיר מופעל.

Delegated bypass (בתשלום עם Secret Protection) — בארגון, admin מגדיר מי יכול לאשר bypass requests. במקום שהמפתח יחליט לבד אם לעקוף את ההגנה, הוא שולח בקשת bypass ל-reviewer מורשה. ה-reviewer רואה את ה-secret שזוהה ומחליט אם לאשר. זה יוצר audit trail ומונע bypass חסר אחריות.

Push protection exemptions (חדש מ-March 2026) — אפשר להגדיר ב-repository settings אילו roles, teams או apps פטורים מ-push protection. שימושי ל-automation tools שדוחפים configuration files עם patterns שנראים כמו secrets אבל לא באמת secrets (למשל test fixtures, mock data). אבל — השתמשו בזהירות. כל exemption מחליש את ההגנה.

הפרקטיקה הנכונה עם secrets: כדי לא להיתקל בחסימות של push protection, תמיד:

עשו עכשיו

וודאו ש-push protection מופעל: SettingsCode security and analysisPush protectionEnable. אם הוא כבר דלוק — מצוין, אל תכבו אותו!

תרגיל 3 — בדיקת Push Protection בפועל

מטרה: לראות איך push protection עובד בפועל.

שימו לב: תרגיל זה משתמש ב-token מזויף — לא בsecret אמיתי!

  1. צרו branch חדש: git checkout -b test-push-protection
  2. צרו קובץ test-secret.txt עם תוכן שנראה כמו GitHub PAT:
    ghp_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef12

    (זה token מזויף — push protection יזהה את הפורמט)

  3. עשו commit: git add test-secret.txt && git commit -m "test push protection"
  4. נסו push: git push origin test-push-protection
  5. צפו בחסימה — קראו את ההודעה בטרמינל
  6. מחקו את הקובץ, עשו commit חדש, ונסו push שוב

תוצאה צפויה: ה-push הראשון ייחסם עם הודעת GH009: Secret detected in push. ההודעה תפרט איזה סוג secret זוהה (GitHub Personal Access Token), באיזה קובץ ושורה, ותיתן לכם URL ל-bypass אם צריך.

אחרי מחיקת הקובץ ו-commit חדש — ה-push יעבור. חשוב: מחקו את ה-branch אחרי התרגיל: git branch -d test-push-protection.

שימו לב: גם אם מחקתם את הקובץ ב-commit נפרד, ה-secret עדיין קיים ב-git history (ב-commit הקודם). במקרה של secret אמיתי, revoke הוא חובה — מחיקה לא מספיקה.

7.10 GHAS, Security Advisories ו-Security Overview — מה עוד יש

Security Advisories — ניהול פגיעויות בפרטיות

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

  1. חוקר אבטחה מוצא פגיעות ומדווח דרך Private Vulnerability Reporting
  2. בעלי הריפוזיטורי יוצרים Draft Advisory — מרחב עבודה פרטי לתיקון
  3. אחרי התיקון, מפרסמים את ה-advisory — הוא מקבל CVE ID ונכנס ל-GitHub Advisory Database

כדי להפעיל: SettingsCode security and analysisPrivate vulnerability reportingEnable. אפשר גם ברמת ארגון — הפעלה על כל הריפוזיטורים בבת אחת.

למה זה חשוב? בלי ערוץ מאובטח לדיווח, חוקרי אבטחה שמוצאים פגיעות בפרויקט שלכם יכולים לפרסם אותה פומבית (responsible disclosure) לפני שתספיקו לתקן. עם Private Vulnerability Reporting, הם יכולים לדווח ישירות דרך GitHub, אתם מקבלים notification, ויש לכם זמן לתקן לפני פרסום. Draft Advisory מאפשר שיתוף פעולה פרטי על התיקון — אפשר להוסיף collaborators, ליצור temporary fork פרטי לעבודה על הfix, ולפרסם רק כשהכל מוכן.

GHAS — ההיסטוריה והמבנה החדש

עד אפריל 2025, כל פיצ'רי האבטחה המתקדמים נמכרו כחבילה אחת: GitHub Advanced Security (GHAS). מאז אפריל 2025, GHAS פוצל לשני מוצרים עצמאיים:

מוצרמחירמה כולל
Secret Protection $19/committer/חודש Push protection מתקדם, delegated bypass, custom patterns, security overview, AI-powered detection
Code Security $30/committer/חודש Copilot Autofix, security campaigns, Dependabot premium (auto-triage rules), dependency review action, security overview

חדש: גם לקוחות GitHub Team יכולים עכשיו לרכוש את המוצרים האלה — עד 2025 זה היה זמין רק ל-Enterprise. המחירון הוא per active committer — כלומר אתם משלמים רק על מפתחים שעשו commit בפועל באותו חודש, לא על כל חבר בארגון.

Consumption-based billing — המודל החדש (מ-2025) הוא pay-as-you-go. אתם לא מתחייבים על מספר committers מראש. אם בחודש מסוים רק 3 מפתחים עשו commit — משלמים על 3. בחודש הבא 10 — משלמים על 10. זה מפחית את הסיכון ומאפשר להתחיל בקטן.

לקוחות GHAS הקיימים: אם הארגון שלכם כבר משלם על GHAS, המעבר למודל החדש (Secret Protection + Code Security) יקרה בחידוש הבא אחרי אפריל 2025. ברוב המקרים העלות דומה — אבל עכשיו אפשר לרכוש רק את מה שצריכים (למשל Secret Protection בלי Code Security).

מה חינמי ומה בתשלום — הטבלה המלאה

פיצ'רחינמי — כל הריפוזיטוריםחינמי — public בלבדבתשלום
Dependency Graph
SBOM export
Dependabot Alerts
Dependabot Security Updates
Dependabot Version Updates
Security Advisories
Partner Secret Alerts
Code Scanning (CodeQL)Code Security $30
Secret Scanning (User)Secret Protection $19
Push ProtectionSecret Protection $19
Copilot AutofixCode Security $30
Delegated BypassSecret Protection $19
Custom PatternsSecret Protection $19
Security CampaignsCode Security $30
Security OverviewSecret/Code Security

איך לקרוא את הטבלה: אם הפרויקט שלכם הוא public repo — כל האבטחה חינמית. זה אחד היתרונות הגדולים של פרויקטי קוד פתוח ב-GitHub. אם הריפו private — Dependabot חינמי לגמרי, אבל code scanning, secret scanning ו-push protection דורשים רישיון (Secret Protection או Code Security).

טיפ אסטרטגי: אם אפשר, שקלו להפוך ריפוזיטורים ל-public (כמובן לא כאלה שמכילים IP, לוגיקה עסקית רגישה, או credentials) — תקבלו את כל כלי האבטחה בחינם. הרבה חברות מחזיקות internal tools, libraries, ו-config repos שאפשר להפוך ל-public בלי סיכון.

Security Overview — Dashboard ברמת ארגון

Security Overview הוא dashboard שמציג את מצב האבטחה של כל הריפוזיטורים בארגון:

זמין לבעלי ארגון, security managers, ומי שיש לו רישיון Secret Protection או Code Security.

Enablement trends — Dashboard נוסף ב-Security Overview שמציג אילו ריפוזיטורים בארגון כבר הפעילו כל כלי אבטחה ואילו עדיין לא. שימושי מאוד ל-security team שרוצה להגיע ל-100% coverage: אפשר לראות בדיוק אילו repos עדיין לא הפעילו Dependabot, CodeQL, או secret scanning.

GitHub Code Quality (Public Preview מ-February 2026) — Dashboard ברמת ארגון שמציג לא רק אבטחה אלא גם code quality: code coverage, test results, lint issues. עדיין ב-preview אבל מצביע על הכיוון — GitHub הופך לפלטפורמה שלמה לניטור איכות קוד, לא רק אבטחה.

Free secret risk assessment — גם בלי רישיון Secret Protection, ארגוני Team ו-Enterprise יכולים להריץ סריקה חד-פעמית שמראה כמה secrets דולפים ב-repos שלהם. זה בחינם ונותן תמונה ברורה של מצב הסיכון — טוב לקבלת החלטה אם שווה לרכוש רישיון.

מסגרת החלטה: Free מול Paid — מתי שווה לשדרג
מצבהמלצהסיבה
פרויקט open sourceFree מספיקכל הפיצ'רים חינמיים ל-public repos
private repo אישיFree מספיקDependabot חינמי, push protection for users חינמי
startup עם private reposSecret Protection ($19)push protection + secret scanning ל-private repos — הכי critical
צוות 10+ מפתחים, private reposSecret Protection + Code SecurityCopilot Autofix חוסך שעות, security campaigns מסדרים triage
enterprise עם complianceשניהם + audit logcompliance, delegated bypass, security overview — חובה
תרגיל 4 — מיפוי אבטחה של הפרויקט שלכם

מטרה: ליצור מפה ברורה של מה מופעל ומה לא.

  1. פתחו את הריפוזיטורי → SettingsCode security and analysis
  2. מלאו את הטבלה הבאה:
    פיצ'רמופעל?חינמי/בתשלוםצריך לי?
    Dependency Graph
    Dependabot Alerts
    Dependabot Security Updates
    Dependabot Version Updates
    Code Scanning (CodeQL)
    Secret Scanning
    Push Protection
    Private Vulnerability Reporting
  3. כל מה שחינמי וכבוי — הפעילו עכשיו
  4. מה שבתשלום — רשמו לעצמכם אם ומתי שווה שיקול

תוצאה צפויה: טבלה מלאה שנותנת תמונה ברורה של מצב האבטחה. אחרי התרגיל, כל הפיצ'רים החינמיים צריכים להיות מופעלים.

תרגיל 5 — הפעלת Private Vulnerability Reporting

מטרה: לפתוח ערוץ מאובטח לדיווח על פגיעויות.

  1. לכו ל-SettingsCode security and analysis
  2. מצאו Private vulnerability reportingEnable
  3. בדקו שיש לכם Security Policy (קובץ SECURITY.md):
    # Security Policy
    
    ## Reporting a Vulnerability
    
    Please report security vulnerabilities through GitHub's
    private vulnerability reporting feature.
    
    Go to the Security tab → Report a vulnerability.
  4. צרו את הקובץ ב-root של הריפוזיטורי (או בתיקיית .github/)

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

7.11 סיכום ומבט קדימה

סיכום הפרק
  • חמש שכבות אבטחה — Dependency Graph → Dependabot → CodeQL → Secret Scanning + Push Protection → Security Overview. רוב השכבות חינמיות
  • Dependabot מגן על התלויות בשני מסלולים: Security Updates (אוטומטי, מתקן פגיעויות) ו-Version Updates (דורש dependabot.yml, שומר הכל מעודכן)
  • dependabot.yml תומך ב-30+ ecosystems, groups, cooldown, private registries, ועוד. Cooldown (מ-2025) מגן מ-supply chain attacks
  • CodeQL מתייחס לקוד כמסד נתונים ומריץ queries שמוצאים SQL injection, XSS ועוד. Default setup = 30 שניות. Advanced setup = שליטה מלאה
  • Secret Scanning מזהה 200+ סוגי secrets. Push Protection חוסם לפני שה-secret נכנס להיסטוריה — ההבדל בין "מזהה" ל"מונע"
  • GHAS פוצל (אפריל 2025) ל-Secret Protection ($19) ו-Code Security ($30). הרבה פיצ'רים חינמיים — במיוחד ל-public repos
  • Security Advisories מאפשרים טיפול פרטי בפגיעויות עם CVE IDs. Private Vulnerability Reporting פותח ערוץ מאובטח לחוקרים
בדקו את עצמכם
  1. מה ההבדל בין Dependabot Security Updates ל-Dependabot Version Updates? מתי צריך dependabot.yml ומתי לא?
  2. מה הכוונה ב-"cooldown" ב-dependabot.yml? למה זה מגן מ-supply chain attacks?
  3. מה ההבדל בין Secret Scanning ל-Push Protection? למה צריך את שניהם?
  4. CodeQL Action v4 שוחרר באוקטובר 2025. מה קורה ב-December 2026 עם v3? מה צריך לעשות?
  5. תנו שלוש דוגמאות לפיצ'רי אבטחה שחינמיים לכל הריפוזיטורים ושלוש דוגמאות שחינמיים רק ל-public.
שגרת עבודה מומלצת
  • יומית: אל תתעלמו מ-Dependabot PRs — review ו-merge אם ה-tests עוברים. בפרויקט עם CI, Dependabot PR שעובר tests הוא בטוח ל-merge. אם push protection חסם push — אל תעשו bypass, הסירו את ה-secret ותקנו. אם בטעות עשיתם bypass — revoke מיד.
  • שבועית: בדקו Dependabot alerts: critical → תקנו מיד, high → sprint הנוכחי, medium → תעדפו, low → backlog. בדקו Code scanning alerts חדשים ועשו triage. ודאו ש-CodeQL workflow רץ בהצלחה על ה-PRs האחרונים. בדקו אם יש secret scanning alerts חדשים.
  • חודשית: סקרו את כל ה-alerts הפתוחים — alerts שפתוחים יותר מחודש דורשים הסבר. בדקו ש-dependabot.yml מכסה את כל ה-ecosystems בפרויקט (אם הוספתם Docker — הוסיפו ecosystem). בדקו שכל פיצ'רי האבטחה החינמיים מופעלים בכל הריפוזיטורים.
  • רבעונית: סקרו את הצורך ב-paid features (Secret Protection / Code Security) — האם גדלתם מספיק שזה שווה? בדקו אם יש secrets ישנים שצריכים rotation (PATs, API keys). עדכנו את SECURITY.md אם שינויים קרו. סקרו את ה-bypass history של push protection — האם יש patterns מדאיגים?
צ'קליסט — מה עשינו בפרק הזה
  • ☐ הבנתי את 5 שכבות האבטחה של GitHub ואיך הן עובדות יחד
  • ☐ בדקתי את הטאב Security בריפוזיטורי שלי — מה מופעל ומה כבוי
  • ☐ הבנתי את ההבדל בין Dependabot Security Updates ל-Version Updates
  • ☐ יצרתי קובץ .github/dependabot.yml עם schedule, groups ו-labels (תרגיל 1)
  • ☐ הוספתי cooldown configuration ל-dependabot.yml
  • ☐ הפעלתי Code Scanning (default או advanced setup)
  • ☐ יצרתי CodeQL workflow מתקדם עם security-and-quality queries (תרגיל 2)
  • ☐ הבנתי איך לטפל בתוצאות: fix, dismiss, suppress
  • ☐ הפעלתי Secret Scanning ובדקתי alerts
  • ☐ בדקתי push protection בפועל — ראיתי חסימה (תרגיל 3)
  • ☐ מיפיתי את כל פיצ'רי האבטחה: חינמי/בתשלום, מופעל/כבוי (תרגיל 4)
  • ☐ הפעלתי Private Vulnerability Reporting ויצרתי SECURITY.md (תרגיל 5)
  • ☐ הבנתי את ההבדל בין Secret Protection ל-Code Security (GHAS)
  • ☐ קראתי את כל 15 מונחי המילון
  • ☐ עניתי על 5 שאלות "בדקו את עצמכם"

מה למדנו ביחס ל-pipeline המלא

אחרי הפרקים הקודמים, ה-pipeline שלכם כולל:

  1. פרק 1 (Actions): CI/CD — build, test, deploy אוטומטי
  2. פרק 6 (Packages): פרסום packages ו-images אוטומטי
  3. פרק 7 (Security): Dependabot מגן על dependencies, CodeQL סורק קוד, push protection חוסם secrets

כל שכבה מתחברת לקודמת: ה-packages שפרסמתם בפרק 6 עכשיו מוגנים ע"י Dependabot — אם תלות של ה-package שלכם פגיעה, Dependabot ייצר PR שיתקן. ה-Actions workflows מפרק 1 עכשיו כוללים גם CodeQL scanning שרץ על כל PR. וה-secrets שמפעילים את ה-pipeline — GITHUB_TOKEN, PATs, Docker credentials — push protection מוודא שהם לא דולפים לקוד.

טיפ לשימור ידע: אם עשיתם את כל התרגילים בפרק, הפרויקט שלכם כבר מוגן ע"י: dependabot.yml עם schedule ו-cooldown, CodeQL workflow עם security-and-quality queries, push protection מופעל, secret scanning פעיל, ו-SECURITY.md עם private vulnerability reporting. שמרו על זה — השגרה מסעיף "שגרת עבודה מומלצת" מוודאת שהכל ממשיך לעבוד.

בפרק הבא: נלמד לגשת ל-GitHub API ולבנות Webhooks ו-GitHub Apps. ה-tokens שתשתמשו בהם שם — PATs (classic ו-fine-grained), OAuth tokens, App installation tokens — אלה בדיוק הסוגים ש-push protection מגן עליהם. תלמדו את ההבדל בין סוגי האימות ואיך לבחור את הנכון. מה שלמדתם בפרק הזה על אבטחת secrets הוא הבסיס לעבודה בטוחה עם ה-API — כי כל טוקן שנוצר ב-API הוא secret שצריך הגנה.