שימו לב: כאשר פלייבוקים של Ansible מאוחסנים ב-Git, סודות בתוכם מהווים סיכון מתמיד. vars/production.yml עם סיסמאות מסד נתונים, מפתחות API ומפתחות SSH בטקסט פשוט הוא סיפור נפוץ בפרויקטים שהתחילו כ"רק סקריפטים לעצמי". Ansible Vault מצפין נתונים אלה ישירות במאגר, ו-ansible-playbook מפענח אותם תוך כדי ריצה. אנו רואים זאת בכל פרויקט שני — ותמיד ממליצים ליישם הצפנה לפחות עבור סביבת הייצור.
לצוות שלנו יש 7 שנות ניסיון מעשי עם Ansible, ואבטחנו למעלה מ-200 פלייבוקים עבור לקוחות במגוון תעשיות.
לפי דוחות GitGuardian, מיליוני פרטי גישה מתגלים במאגרים ציבוריים מדי שנה. Ansible Vault הוא קו ההגנה הראשון שאינו דורש תשתית מורכבת. היישום משתלם לאחר האירוע הראשון שנמנע: הנזק מדליפת סיסמה יכול להגיע ל-$2.7k–3.9k, והחיסכון הממוצע בעלויות בעת מניעת אירוע אחד הוא $1.4k–1.9k. המהנדסים שלנו מוצאים 12–15 סודות בטקסט פשוט בכל פלייבוק, ויישום Vault מפחית את סיכון הדליפה ב-90%. אנו מבטיחים שלאחר הביקורת תקבלו מפה מלאה של הסודות והמלצות להגנתם. עלות היישום מתחילה מ-$400 עבור סביבה אחת, וכל סביבה נוספת עולה $200.
95% מהפלייבוקים שאנו בודקים מכילים לפחות סוד אחד מקודד קשיח.
הפחתת הסיכון לדליפת סודות
שימוש ב-Ansible Vault הוא הבסיס להגנה. אנו ממליצים להצפין את כל הסודות עבור סביבות ייצור וסטייג'ינג. בנוסף, הגדירו Vault ID כדי להפריד גישה לפי סביבות. Vault ID מאובטח פי 2 מסיסמת vault יחידה עבור הגדרות מרובות סביבות. מומחים מוסמכים מבצעים ביקורת ומגדירים הצפנה, מה שמבטיח הגנה אמינה.
פקודות בסיסיות
# Зашифровать файл целиком
ansible-vault encrypt vars/production.yml
# Зашифровать отдельную строку (для встраивания в незашифрованный файл)
ansible-vault encrypt_string 'mysecretpassword' --name 'db_password'
# Редактировать зашифрованный файл
ansible-vault edit vars/production.yml
# Сменить пароль шифрования
ansible-vault rekey vars/production.yml
# Запуск плейбука с vault
ansible-playbook deploy.yml --ask-vault-pass
# или через файл с паролем (для автоматизации)
ansible-playbook deploy.yml --vault-password-file ~/.vault_pass קובץ סיסמת Vault לעומת Vault ID
# Зашифровать файл целиком ansible-vault encrypt vars/production.yml # Зашифровать отдельную строку (для встраивания в незашифрованный файл) ansible-vault encrypt_string 'mysecretpassword' --name 'db_password' # Редактировать зашифрованный файл ansible-vault edit vars/production.yml # Сменить пароль шифрования ansible-vault rekey vars/production.yml # Запуск плейбука с vault ansible-playbook deploy.yml --ask-vault-pass # или через файл с паролем (для автоматизации) ansible-playbook deploy.yml --vault-password-file ~/.vault_pass פשוט נוח עבור סיסמה אחת. כאשר לפרויקט יש מספר סביבות עם מפתחות הצפנה שונים, אנו משתמשים ב-Vault ID:
# Шифрование с указанием vault-id
ansible-vault encrypt vars/production.yml --vault-id production@prompt
ansible-vault encrypt vars/staging.yml --vault-id staging@~/.vault_staging
# Запуск с несколькими vault-id
ansible-playbook deploy.yml \
--vault-id production@~/.vault_production \
--vault-id staging@~/.vault_stagingVault ID מוסיף תווית לנתונים המוצפנים — Ansible יודע איזו סיסמה להשתמש עבור כל קובץ. זה מאפשר לפלייבוק אחד לעבוד עם סודות מסביבות שונות בו זמנית.
| קריטריון | סיסמה יחידה | Vault ID |
|---|---|---|
| מספר סביבות | 1 | מרובות |
| ניהול סיסמאות | קובץ אחד | קבצים מרובים |
| תאימות ל-Git | כן | כן |
| סיכון לשימוש חוזר | גבוה | נמוך |
הגדרת Vault ID עבור סביבות מרובות
בעת הוספת סביבה חדשה, צרו קובץ סיסמה נפרד, לדוגמה --vault-password-file. הצפינו קבצים עם ה-ID המתאים. בצנרת, ציינו את כל פרמטרי # Шифрование с указанием vault-id ansible-vault encrypt vars/production.yml --vault-id production@prompt ansible-vault encrypt vars/staging.yml --vault-id staging@~/.vault_staging # Запуск с несколькими vault-id ansible-playbook deploy.yml \ --vault-id production@~/.vault_production \ --vault-id staging@~/.vault_staging . Ansible קובע אוטומטית איזו סיסמה להחיל על כל בלוק מוצפן. זה מונע שימוש מקרי בסודות ייצור בסטייג'ינג.
אינטגרציה עם CI/CD
עבור צנרת אוטומטית, סיסמת ה-vault מאוחסנת במשתני CI/CD:
---
# .gitlab-ci.yml
deploy:
script:
- echo "$VAULT_PASSWORD" > .vault_pass
- chmod 600 .vault_pass
- ansible-playbook -i inventory/production deploy.yml --vault-password-file .vault_pass
- rm -f .vault_pass
~/.vault_staging הוא משתנה CI של GitLab עם סוג "Masked and Protected". הסיסמה אינה מופיעה ביומנים וזמינה רק בענפים מוגנים. הגדרה דומה חלה על GitHub Actions.
מבנה קבצים מוצפנים
תבנית מומלצת: הפרדת משתנים וערכיהם:
---
# vars/production.yml (незашифрованный - для читаемости)
db_host: "db.example.com"
db_name: "myapp_production"
db_user: "myapp"
db_password: "{{ vault_db_password }}"
api_key: "{{ vault_api_key }}"
# vars/vault_production.yml (зашифрованный через ansible-vault)
vault_db_password: "supersecretpassword"
vault_api_key: "sk-prod-abcdef123456"
גישה זו מאפשרת לראות ב-Git אילו משתנים נמצאים בשימוש (קובץ לא מוצפן), בעוד שערכי הסוד נשארים מוצפנים. --vault-id על קובץ מוצפן יציג שינוי ב-blob בינארי, ולא את הסוד בפועל.
חשיבות הפרדת משתנים מוצפנים ולא מוצפנים
ההפרדה מפשטת את בדיקת הקוד: עמיתים רואים אילו משתנים נמצאים בשימוש מבלי לחשוף את ערכיהם. זה גם מפחית את הסיכון לחשיפת סוד בטעות במהלך commit — הקובץ הלא מוצפן אינו מכיל נתונים רגישים.
מגבלות של Ansible Vault וחלופות
Vault מצפין נתונים עם מפתח סימטרי (AES-256-CBC). אובדן הסיסמה משמעותו חוסר יכולת לפענח סודות. יש לאחסן את הסיסמה בנפרד — במנהל סיסמאות, HashiCorp Vault, או AWS Secrets Manager.
עבור פרויקטים עם דרישות אבטחה גבוהות, Ansible Vault הוא פתרון ביניים. Ansible Vault קל פי שלושה ליישום מאשר HashiCorp Vault, תוך כיסוי של 80% מתרחישי ניהול הסודות. אינטגרציה עם HashiCorp Vault דרך תוסף החיפוש # .gitlab-ci.yml deploy: script: - echo "$VAULT_PASSWORD" > .vault_pass - chmod 600 .vault_pass - ansible-playbook -i inventory/production deploy.yml --vault-password-file .vault_pass - rm -f .vault_pass מספקת שליפה דינמית של סודות ללא אחסונם במאגר:
---
- name: Deploy app
vars:
db_password: "{{ lookup('hashi_vault', 'secret=secret/myapp/production:db_password') }}"
tasks:
- template:
src: app.conf.j2
dest: /etc/myapp/app.conf
| קריטריון | Ansible Vault | HashiCorp Vault |
|---|---|---|
| סוג הצפנה | סימטרי (AES-256-CBC) | דינמי, עם רוטציה |
| אחסון מפתחות | קובץ סיסמה | אחסון חיצוני |
| ביקורת גישה | לא | ביקורת מלאה |
| מורכבות יישום | נמוכה | בינונית |
עדכון סיסמת Vault ללא אובדן נתונים
עדכון סיסמת ה-vault מתבצע עם הפקודה $VAULT_PASSWORD. היא מפענחת את כל הקבצים המוצפנים ומצפינה אותם מחדש עם הסיסמה החדשה. חשוב לשמור את הסיסמה החדשה ב-CI/CD לפני ביצוע rekey, אחרת הצנרת תישבר.
כיצד אנו מגדירים Ansible Vault
התהליך האופייני שלנו כולל:
- ביקורת — מציאת כל הסודות בטקסט פשוט בפלייבוקים ובמלאי.
- תכנון — בחירת סכמה: סיסמה יחידה או vault ID לכל סביבה.
- הצפנה —
# vars/production.yml (незашифрованный - для читаемости) db_host: "db.example.com" db_name: "myapp_production" db_user: "myapp" db_password: "{{ vault_db_password }}" api_key: "{{ vault_api_key }}" # vars/vault_production.yml (зашифрованный через ansible-vault) vault_db_password: "supersecretpassword" vault_api_key: "sk-prod-abcdef123456"עבור קבצים,git diffעבור משתנים בודדים, שיפוץ מבנה. - CI/CD — הגדרת משתני צנרת, מיסוך, הגנת ענפים.
- הדרכה — הדגמה לצוות: כיצד לערוך, לבצע rekey, ולהריץ.
לוח זמנים: בין 0.5 ליום עבודה אחד עבור פרויקט עם סביבה אחת. העלות מחושבת באופן אישי — תלויה בהיקף הפלייבוקים ובמספר הסביבות.
מה כלול
- ביקורת ומלאי של סודות.
- הגדרת vault ID עבור כל סביבה.
- הצפנת משתנים וקבצים.
- אינטגרציה עם GitLab CI / GitHub Actions.
- תיעוד על עבודה עם vault.
- תמיכה לשבוע אחד לאחר היישום.
שלטו ב-Ansible Vault כדי להבטיח ניהול סודות חזק בצנרת ה-CI/CD שלכם. קבלו ייעוץ על הגדרת Ansible Vault לפרויקט שלכם. הזמינו ביקורת אבטחה לפלייבוקים של Ansible — ננתח את הקוד ונציע את תכנית הגנת הסודות האופטימלית.







