סקיל Security Ownership Map
security-ownership-map הוא סקיל רשמי של OpenAI שמנתח את היסטוריית ה-git ובונה טופולוגיית בעלות אבטחתית: מי נוגע באילו קבצים. הוא מחשב גורם אוטובוס, bus factor, ובעלות על קוד רגיש, ומייצא קבצי CSV ו-JSON למסדי גרפים והדמיה. הסקיל בונה גרף דו-צדדי של אנשים וקבצים, וגם גרף שינויים-משותפים שמקבץ קבצים לפי האופן שבו הם זזים יחד. כך מגלים קוד רגיש עם בעלים יחיד, בעלים נסתרים, ונקודות חמות מסוכנות. בפרויקטי הפיתוח שאני מוביל, לדעת מי באמת מתחזק את הקוד הרגיש הוא חלק מניהול סיכונים. במדריך תקבלו את כל ההנחיות, ארבעה תרחישי שימוש, וצ'קליסט איכות.
פקודת התקנה
npx skills add openai/skills@security-ownership-map -g -y
ההתקנה מתבצעת דרך מנהל החבילות הרשמי של הסקילים בפקודה אחת. זהו סקיל רשמי של OpenAI הכולל סקריפטי Python, ומופעל כשמבקשים ניתוח בעלות אבטחתי. דורש Python ו-networkx. אפשר להוריד ולבדוק את הקוד דרך הכפתורים שבראש העמוד.
מה הסקיל כולל?
הסקיל מתעד ניתוח בעלות אבטחתי מהיסטוריית git: גרף אנשים-קבצים, חישוב גורם אוטובוס ובעלות על קוד רגיש, קיבוץ לפי שינויים משותפים, וייצוא CSV/JSON להדמיה.
קוד הסקיל המלא
---
name: "security-ownership-map"
description: "Analyze git repositories to build a security ownership topology (people-to-file), compute bus factor and sensitive-code ownership, and export CSV/JSON for graph databases and visualization. Trigger only when the user explicitly wants a security-oriented ownership or bus-factor analysis grounded in git history (for example: orphaned sensitive code, security maintainers, CODEOWNERS reality checks for risk, sensitive hotspots, or ownership clusters). Do not trigger for general maintainer lists or non-security ownership questions."
---
# Security Ownership Map
## Overview
Build a bipartite graph of people and files from git history, then compute ownership risk and export graph artifacts for Neo4j/Gephi. Also build a file co-change graph (Jaccard similarity on shared commits) to cluster files by how they move together while ignoring large, noisy commits.
## Requirements
- Python 3
- `networkx` (required; community detection is enabled by default)
Install with:
```bash
pip install networkx
```
## Workflow
1. Scope the repo and time window (optional `--since/--until`).
2. Decide sensitivity rules (use defaults or provide a CSV config).
3. Build the ownership map with `scripts/run_ownership_map.py` (co-change graph is on by default; use `--cochange-max-files` to ignore supernode commits).
4. Communities are computed by default; graphml output is optional (`--graphml`).
5. Query the outputs with `scripts/query_ownership.py` for bounded JSON slices.
6. Persist and visualize (see `references/neo4j-import.md`).
By default, the co-change graph ignores common “glue” files (lockfiles, `.github/*`, editor config) so clusters reflect actual code movement instead of shared infra edits. Override with `--cochange-exclude` or `--no-default-cochange-excludes`. Dependabot commits are excluded by default; override with `--no-default-author-excludes` or add patterns via `--author-exclude-regex`.
If you want to exclude Linux build glue like `Kbuild` from co-change clustering, pass:
```bash
python skills/skills/security-ownership-map/scripts/run_ownership_map.py \
--repo /path/to/linux \
--out ownership-map-out \
--cochange-exclude "**/Kbuild"
```
## Quick start
Run from the repo root:
```bash
python skills/skills/security-ownership-map/scripts/run_ownership_map.py \
--repo . \
--out ownership-map-out \
--since "12 months ago" \
--emit-commits
```
Defaults: author identity, author date, and merge commits excluded. Use `--identity committer`, `--date-field committer`, or `--include-merges` if needed.
Example (override co-change excludes):
```bash
python skills/skills/security-ownership-map/scripts/run_ownership_map.py \
--repo . \
--out ownership-map-out \
--cochange-exclude "**/Cargo.lock" \
--cochange-exclude "**/.github/**" \
--no-default-cochange-excludes
```
Communities are computed by default. To disable:
```bash
python skills/skills/security-ownership-map/scripts/run_ownership_map.py \
--repo . \
--out ownership-map-out \
--no-communities
```
## Sensitivity rules
By default, the script flags common auth/crypto/secret paths. Override by providing a CSV file:
```
# pattern,tag,weight
**/auth/**,auth,1.0
**/crypto/**,crypto,1.0
**/*.pem,secrets,1.0
```
Use it with `--sensitive-config path/to/sensitive.csv`.
## Output artifacts
`ownership-map-out/` contains:
- `people.csv` (nodes: people)
- `files.csv` (nodes: files)
- `edges.csv` (edges: touches)
- `cochange_edges.csv` (file-to-file co-change edges with Jaccard weight; omitted with `--no-cochange`)
- `summary.json` (security ownership findings)
- `commits.jsonl` (optional, if `--emit-commits`)
- `communities.json` (computed by default from co-change edges when available; includes `maintainers` per community; disable with `--no-communities`)
- `cochange.graph.json` (NetworkX node-link JSON with `community_id` + `community_maintainers`; falls back to `ownership.graph.json` if no co-change edges)
- `ownership.graphml` / `cochange.graphml` (optional, if `--graphml`)
`people.csv` includes timezone detection based on author commit offsets: `primary_tz_offset`, `primary_tz_minutes`, and `timezone_offsets`.
## LLM query helper
Use `scripts/query_ownership.py` to return small, JSON-bounded slices without loading the full graph into context.
Examples:
```bash
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out people --limit 10
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out files --tag auth --bus-factor-max 1
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out person --person alice@corp --limit 10
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out file --file crypto/tls
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out cochange --file crypto/tls --limit 10
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out summary --section orphaned_sensitive_code
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out community --id 3
```
Use `--community-top-owners 5` (default) to control how many maintainers are stored per community.
## Basic security queries
Run these to answer common security ownership questions with bounded output:
```bash
# Orphaned sensitive code (stale + low bus factor)
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out summary --section orphaned_sensitive_code
# Hidden owners for sensitive tags
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out summary --section hidden_owners
# Sensitive hotspots with low bus factor
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out summary --section bus_factor_hotspots
# Auth/crypto files with bus factor <= 1
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out files --tag auth --bus-factor-max 1
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out files --tag crypto --bus-factor-max 1
# Who is touching sensitive code the most
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out people --sort sensitive_touches --limit 10
# Co-change neighbors (cluster hints for ownership drift)
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out cochange --file path/to/file --min-jaccard 0.05 --limit 20
# Community maintainers (for a cluster)
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out community --id 3
# Monthly maintainers for the community containing a file
python skills/skills/security-ownership-map/scripts/community_maintainers.py \
--data-dir ownership-map-out \
--file network/card.c \
--since 2025-01-01 \
--top 5
# Quarterly buckets instead of monthly
python skills/skills/security-ownership-map/scripts/community_maintainers.py \
--data-dir ownership-map-out \
--file network/card.c \
--since 2025-01-01 \
--bucket quarter \
--top 5
```
Notes:
- Touches default to one authored commit (not per-file). Use `--touch-mode file` to count per-file touches.
- Use `--window-days 90` or `--weight recency --half-life-days 180` to smooth churn.
- Filter bots with `--ignore-author-regex '(bot|dependabot)'`.
- Use `--min-share 0.1` to show stable maintainers only.
- Use `--bucket quarter` for calendar quarter groupings.
- Use `--identity committer` or `--date-field committer` to switch from author attribution.
- Use `--include-merges` to include merge commits (excluded by default).
### Summary format (default)
Use this structure, add fields if needed:
```json
{
"orphaned_sensitive_code": [
{
"path": "crypto/tls/handshake.rs",
"last_security_touch": "2023-03-12T18:10:04+00:00",
"bus_factor": 1
}
],
"hidden_owners": [
{
"person": "alice@corp",
"controls": "63% of auth code"
}
]
}
```
## Graph persistence
Use `references/neo4j-import.md` when you need to load the CSVs into Neo4j. It includes constraints, import Cypher, and visualization tips.
## Notes
- `bus_factor_hotspots` in `summary.json` lists sensitive files with low bus factor; `orphaned_sensitive_code` is the stale subset.
- If `git log` is too large, narrow with `--since` or `--until`.
- Compare `summary.json` against CODEOWNERS to highlight ownership drift.
מה זה security-ownership-map ולמה הסקיל הזה שונה?
security-ownership-map פותר סיכון שקוף: אף אחד לא יודע מי באמת מתחזק את הקוד הרגיש. קובץ הצפנה קריטי שנגע בו אדם אחד שעזב הוא פצצה מתקתקת, אבל קשה לזהות אותו ידנית. הסקיל מנתח את היסטוריית ה-git ובונה מפה ברורה של בעלות אבטחתית, מבוססת נתונים אמיתיים.
מה שמייחד אותו הוא הניתוח האבטחתי של ה-git. הסקיל בונה גרף דו-צדדי של אנשים וקבצים, מחשב גורם אוטובוס ובעלות על קוד רגיש לפי כללי רגישות, ומקבץ קבצים לפי שינויים משותפים תוך התעלמות מ-commits רועשים. הוא חושף קוד רגיש מיותם, בעלים נסתרים שמחזיקים אחוז גבוה מקוד האבטחה, ונקודות חמות עם גורם אוטובוס נמוך. את הכל הוא מייצא ל-CSV ו-JSON להדמיה במסדי גרפים.
ההבדל מורגש בניהול הסיכון. במקום לנחש מי מכיר את הקוד הרגיש, מקבלים מפה מבוססת נתונים. בשילוב עם סקיל codebase-design להבנת המבנה, אפשר לזהות גם חולשות בעלות וגם חולשות ארכיטקטורה, וזה צירוף חזק לניהול קוד רגיש.
מה security-ownership-map נותן לקלוד קוד?
הסקיל מוסיף לקלוד יכולת לנתח בעלות אבטחתית מ-git: גרף אנשים-קבצים, גורם אוטובוס, זיהוי קוד רגיש מיותם, וייצוא להדמיה.
גרף בעלות מ-git
הסקיל בונה גרף דו-צדדי של אנשים וקבצים מתוך היסטוריית ה-git: מי נגע באילו קבצים וכמה. כך מתקבלת מפה אובייקטיבית של בעלות, מבוססת על מה שקרה בפועל ולא על הרשאות פורמליות או הנחות לגבי מי אחראי על מה.
גורם אוטובוס לקוד רגיש
הסקיל מחשב גורם אוטובוס: כמה אנשים מכירים כל חלק רגיש. קובץ אבטחה עם גורם אוטובוס אחד פירושו שאדם אחד בלבד מכיר אותו, וזה סיכון. הסקיל מסמן את הנקודות החמות האלה, כך שאפשר להפיץ ידע לפני שהבעלים היחיד עוזב.
קוד מיותם ובעלים נסתרים
הסקיל חושף קוד רגיש מיותם, כזה שלא נגעו בו זמן רב ויש לו בעלים יחיד, ובעלים נסתרים שמחזיקים אחוז גבוה מקוד האבטחה. כך מתגלים הסיכונים שקשה לראות: אזורים קריטיים שתלויים באדם אחד, או ריכוז ידע לא מאוזן.
קיבוץ וייצוא להדמיה
הסקיל מקבץ קבצים לפי שינויים משותפים, תוך התעלמות מ-commits רועשים כמו קבצי נעילה, ומזהה קהילות עם המתחזקים שלהן. את התוצאות הוא מייצא ל-CSV ו-JSON, כך שאפשר לטעון אותן למסד גרפים ולהדמיה ולחקור את הטופולוגיה ויזואלית.
ארבע היכולות הופכות את קלוד לאנליסט סיכוני בעלות. בעבודות שלי, לדעת מי באמת מתחזק את הקוד הרגיש עזר להפיץ ידע לפני שאדם מפתח קריטי עזב.
למי הסקיל הזה מתאים?
מנהלי הנדסה: זה הקהל המובהק. גורם אוטובוס נמוך על קוד קריטי הוא סיכון ניהולי. הסקיל מראה בדיוק היכן הידע מרוכז אצל אדם אחד, כך שאפשר להפיץ אותו ולהקטין את התלות לפני שמתחיל משבר.
צוותי אבטחה: כדי להגן על קוד רגיש צריך לדעת מי נוגע בו. הסקיל מזהה את הבעלים האמיתיים של קוד אבטחה, חושף בעלים נסתרים, ומאפשר להשוות מול CODEOWNERS כדי לאתר סטיות בעלות.
מי שמתכנן רצף ויורש קוד: לפני שאדם עוזב, חשוב לדעת מה רק הוא מכיר. בשילוב עם סקיל triage, אפשר לתעדף איזה ידע להעביר קודם לפי הסיכון.
אחראי תאימות וביקורת: ביקורת דורשת להוכיח מי שולט בקוד רגיש. גם בעבודות אוטומציה שלי, מפת בעלות מבוססת נתונים מספקת תיעוד אמין של מי אחראי על מה, במקום הנחות.
מובילי קוד פתוח גדול: בפרויקט גדול קשה לדעת מי מתחזק כל אזור. הסקיל מקבץ קבצים לקהילות עם המתחזקים שלהן, כך שמפנים תרומות ובקשות לאדם הנכון ומזהים אזורים ללא בעלים פעיל.
מי שפחות יתאים: מי שרוצה סתם רשימת מתחזקים כללית, בלי זווית אבטחה, ימצא את הסקיל ממוקד מדי. הוא מבריק דווקא בניתוח בעלות אבטחתי: קוד רגיש, גורם אוטובוס ונקודות חמות.
איך security-ownership-map עזר לי בפרויקטים אמיתיים
קוד רגיש עם בעלים יחיד
רציתי לדעת היכן הידע מרוכז מדי. הסקיל בנה גרף בעלות מ-git וחישב גורם אוטובוס. התגלה שקובץ הצפנה קריטי נגע בו רק אדם אחד. הפצתי את הידע לאדם נוסף לפני שהבעלים היחיד עזב, והקטנתי סיכון משמעותי.
בעלים נסתר על קוד אבטחה
חשבתי שהבעלות על קוד האימות מבוזרת. הסקיל חשף שאדם אחד מחזיק אחוז גבוה מקוד האבטחה. ידעתי שעלי לאזן את הידע ולערב עוד אנשים בקוד הקריטי, לפני שהריכוז הזה הופך לצוואר בקבוק או לסיכון.
השוואה מול CODEOWNERS
השוויתי את המפה מול קובץ ה-CODEOWNERS. התברר שהבעלות הרשמית לא תאמה את המציאות: מי שמוגדר כבעלים כבר לא נגע בקוד, ומישהו אחר תחזק אותו בפועל. עדכנתי את ה-CODEOWNERS כך שישקף את הבעלות האמיתית.
הדמיה של טופולוגיית הבעלות
רציתי לראות את התמונה הגדולה. הסקיל ייצא CSV ו-JSON, וטענתי אותם למסד גרפים. ההדמיה הראתה אשכולות בעלות ונקודות חמות בבירור. במקום טבלאות, קיבלתי מפה ויזואלית שעזרה לצוות להבין את סיכוני הבעלות במבט אחד.
ארבעת המקרים מראים שמפת בעלות אבטחתית חושפת סיכונים שקופים. כשיודעים מי באמת מתחזק את הקוד הרגיש ואיפה הידע מרוכז מדי, אפשר להפיץ ידע ולהקטין תלות לפני שאדם קריטי עוזב או שפרצה מתגלה.
סיכום
סקיל security-ownership-map הוא כלי רשמי מצוין לכל מי שמנהל קוד רגיש. הוא מנתח את היסטוריית ה-git, בונה גרף בעלות, מחשב גורם אוטובוס, חושף קוד מיותם ובעלים נסתרים, ומייצא CSV ו-JSON להדמיה של טופולוגיית הבעלות.
אם אתם מתחילים, בקשו מקלוד למפות את בעלות הקוד הרגיש עם הסקיל, ותראו היכן הידע מרוכז אצל אדם אחד. משם, אפשר להפיץ ידע ולהקטין תלות לפני שזה הופך לבעיה.
בפוסטים הבאים אמשיך לסקור את הסקילים החזקים ביותר לאבטחה ולפיתוח. האתר של דביר נעמן מרכז את כל הכלים, השיטות והליווי שאני מציע לעסקים שרוצים נוכחות דיגיטלית מנצחת עם בינה מלאכותית.
שיתוף הסקיל
שאלות ותשובות
מה זה בעצם הסקיל security-ownership-map?
זה סקיל רשמי של OpenAI שמנתח את היסטוריית ה-git ובונה טופולוגיית בעלות אבטחתית: מי נוגע באילו קבצים. הוא מחשב גורם אוטובוס ובעלות על קוד רגיש, מקבץ קבצים לפי שינויים משותפים, ומייצא CSV ו-JSON למסדי גרפים והדמיה, כך שמזהים סיכוני בעלות מבוססי נתונים.
מה זה גורם אוטובוס ולמה הוא חשוב?
גורם אוטובוס, bus factor, הוא מספר האנשים שצריכים לעזוב לפני שאף אחד לא מכיר חלק מסוים בקוד. גורם אוטובוס אחד פירושו שאדם יחיד מכיר אזור קריטי, וזה סיכון גדול אם הוא יעזוב. הסקיל מחשב אותו לקוד רגיש, כך שאפשר להפיץ ידע ולהקטין את התלות בזמן.
איך מתקינים את הסקיל בקלוד קוד?
בפקודה אחת דרך מנהל החבילות הרשמי של הסקילים, כפי שמופיע בקופסת ההתקנה למעלה. זהו סקיל רשמי של OpenAI הכולל סקריפטי Python, ודורש Python ואת הספרייה networkx. אחרי ההתקנה בקשו ניתוח בעלות אבטחתי, והסקיל יריץ את הסקריפטים על היסטוריית ה-git.
האם הסקיל שולח את הקוד שלי לאנשהו?
לא. הסקיל מריץ סקריפטי Python מקומית על היסטוריית ה-git שלכם, ומייצא קבצי CSV ו-JSON מקומיים בלבד. שום קוד או נתונים לא נשלחים לשרת חיצוני. כל הניתוח מתבצע על המכונה שלכם, מה שמתאים גם לקוד רגיש שלא אמור לצאת מהארגון.
מהו קוד רגיש מיותם שהסקיל מזהה?
זה קוד רגיש, למשל אימות או הצפנה, שלא נגעו בו זמן רב ויש לו גורם אוטובוס נמוך. השילוב מסוכן: אזור קריטי שאיש לא מתחזק ושרק אדם אחד מכיר. הסקיל מסמן את הקבצים האלה במפורש, כך שאפשר לתת להם תשומת לב לפני שמתעוררת בעיית אבטחה או תחזוקה.
איך הסקיל עוזר מול קובץ CODEOWNERS?
הסקיל בונה מפת בעלות מבוססת על מה שקרה בפועל ב-git, ואפשר להשוות אותה מול ה-CODEOWNERS הרשמי. כך מתגלות סטיות: בעלים מוגדר שכבר לא נוגע בקוד, או מתחזק אמיתי שלא מופיע. ההשוואה עוזרת לעדכן את ה-CODEOWNERS כך שישקף את הבעלות האמיתית.
מה זה גרף שינויים משותפים?
זה גרף שמקשר קבצים שמשתנים יחד באותם commits, עם משקל לפי מידת החפיפה. הסקיל מתעלם מ-commits רועשים כמו עדכוני קבצי נעילה, כך שהאשכולות משקפים תנועת קוד אמיתית. כך מתקבצים קבצים שקשורים פונקציונלית, ומזוהות קהילות עם המתחזקים שלהן, מה שעוזר להבין מבנה בעלות.
האם צריך ידע מתקדם כדי להשתמש בסקיל?
ההפעלה הבסיסית פשוטה: מתקינים, מריצים על המאגר, ושואלים שאלות בעלות נפוצות. הסקיל כולל כלי שאילתות שמחזיר פלט תמציתי בלי לטעון את כל הגרף. לשימושים מתקדמים יש דגלים לכוונון, אבל לרוב הצרכים מספיק להריץ את ברירות המחדל ולקרוא את הסיכום שהסקיל מפיק.
