שאלה איך אני יכול ליישם ansible עם סיסמאות לכל מארח, באופן מאובטח?


אני רוצה להשתמש ansible לנהל קבוצה של שרתים קיימים. אני יצרתי ansible_hosts הקובץ, נבדק בהצלחה (עם -K אפשרות) עם פקודות כי רק היעד לארח בודד

ansible -i ansible_hosts host1 --sudo -K # + commands ...

הבעיה שלי עכשיו היא כי סיסמאות המשתמש על כל מארח הם שונים, אבל אני לא יכול למצוא דרך לטפל זה ב Ansible.

שימוש -K, אני מתבקש רק סיסמה אחת sudo מראש, אשר נראה אז ניסו עבור כל המארחים הבאים ללא הנחיה:

host1 | ...
host2 | FAILED => Incorrect sudo password
host3 | FAILED => Incorrect sudo password
host4 | FAILED => Incorrect sudo password
host5 | FAILED => Incorrect sudo password

מחקר עד כה:

  • א שאלת StackOverflow עם תשובה לא נכונה אחת ("שימוש -K") תגובה אחת של המחבר אומר" גיליתי שאני צריך סיסמה sudo "

  • את המסמכים, אשר אומר "השימוש sudo הסיסמה עושה את זה קל יותר להפוך, אבל זה לא נדרש. "(ההדגשה שלי)

  • זה אבטחה StackExchange השאלה אשר לוקח את זה לקרוא את זה NOPASSWD נדרש

  • מאמר "אספקה ​​ניתנת להרחבה ומובנת ..." שאומר:

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

  • מאמר "Plays Plays בסיסי", שאומר

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

    המחשבות שלי בדיוק, אבל אז איך להאריך מעבר לשרת יחיד?

  • בעיה # 1227, "Ansible צריך לבקש סיסמה sudo עבור כל המשתמשים ב- Playbook", אשר נסגר לפני שנה על ידי mpdehaan עם ההערה "לא ראיתי הרבה ביקוש לכך, אני חושב שרוב האנשים sudoing רק מחשבון משתמש אחד או באמצעות המפתחות רוב הזמן. "

אז ... איך אנשים משתמשים Ansible במצבים כאלה? הגדרה NOPASSWD in /etc/sudoers, שימוש חוזר הסיסמה על פני המארחים או הפעלת שורש SSH הכניסה כל נראה ירידה דרסטית למדי בביטחון.


99
2017-12-09 11:49




האם יש סיבה שאינך משתמש במפתחות SSH? - Trondh
אני כבר משתמש במפתחות SSH; הם אינם משפיעים sudo (אשר עדיין צריך לדרוש סיסמה). - supervacuo
זה לא יכול להיות בדיוק מה שאתה מחפש, אבל על תיבות אובונטו אני עדיין משתמש המפתחות, כלומר לשים את המפתח הציבורי שלי / root / author_keys להיכנס ישירות כמו שורש. חסרון ברור הוא מאפשר כניסה שורש מעל ssh ... אני גם לאסור כניסה סיסמאות על ssh ולהפעיל fail2ban עבור אבטחה הוסיף. - senorsmile
@senorsmile תודה על התגובה! האם אתה מוכן לעשות את זה לתוך התשובה במקום כך אני יכול להשיב לך על כך שאתה לא קורא את השאלה? - supervacuo
כלומר ה ansible_ssh_password ההגדרה חלה רק על סיסמת SSH (הרמז הוא בשם ...). & אני כבר משתמש מפתח SSH כניסה. - supervacuo


תשובות:


אתה בהחלט עשה את המחקר שלך ...

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

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

"אז ... איך אנשים משתמשים ב- Ansible במצבים כאלה?   NOPASSWD ב / etc / sudoers, שימוש חוזר הסיסמה על פני המארחים או הפעלת   הכניסה SSH שורש כל נראה ירידה דרסטית למדי בביטחון. "

אני יכול לתת לך השקפה אחת על זה. מקרה השימוש שלי הוא 1k צמתים במרכזי נתונים מרובים התומכים בחברת SaaS עולמית שבה אני צריך לתכנן / ליישם כמה פקדי אבטחה הדוקים מאוד בשל אופי העסק שלנו. אבטחה היא תמיד איזון מעשה, יותר שימושיות פחות אבטחה, תהליך זה אינו שונה אם אתה מפעיל 10 שרתים או 1,000 או 100,000.

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

בואו לדבר על שימוש חוזר סיסמה, בארגון גדול, האם זה סביר לבקש sysadmins יש סיסמאות שונות על כל הצומת? עבור כמה צמתים, אולי, אבל המנהלים שלי / מהנדסים היו מורדים אם הם היו צריכים סיסמאות שונות על 1000 צמתים. יישום זה יהיה כמעט בלתי אפשרי גם, כל משתמש יצטרך לאחסן שם סיסמאות משלו איפשהו, בתקווה keypass, לא גיליון אלקטרוני. ובכל פעם שאתה שם את הסיסמה במקום שבו ניתן לשלוף טקסט רגיל, יש לך מאוד ירד הביטחון שלך. הייתי מעדיפה שהם ידעו, בעל פה, אחד או שניים סיסמאות חזקות באמת מאשר להתייעץ עם קובץ keypass בכל פעם שהם צריכים להיכנס או לעורר sudo על מכונה.

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

כאשר אנו עוברים למשתמשים אוטומטיים, המפתחות ssh עבודה נהדר כדי לקבל אותך, אבל אתה עדיין צריך לעבור sudo. הבחירות שלך הן סיסמה סטנדרטית עבור המשתמש האוטומטי (המקובל במקרים רבים) או כדי לאפשר את NOPASSWD כפי שציינת. רוב המשתמשים האוטומטיים מבצעים רק כמה פקודות, אז זה בהחלט אפשרי בהחלט רצוי לאפשר NOPASSWD, אבל רק עבור פקודות שאושרו מראש. הייתי מציע להשתמש ניהול התצורה שלך (ניתן במקרה זה) לנהל את קובץ sudoers שלך, כך שאתה יכול בקלות לעדכן את רשימת פקודות פחות סיסמה.

עכשיו, יש כמה צעדים שתוכל לנקוט ברגע שתתחיל קנה מידה כדי לבודד עוד יותר את הסיכון. אמנם יש לנו 1000 או כל כך צמתים, לא כולם הם "ייצור" שרתים, חלקם סביבות הבדיקה, וכו 'לא כל מנהלי יכולים לגשת שרתי הייצור, אלה יכולים למרות להשתמש באותו משתמש SSO שלהם / לעבור כמו המפתח כפי שהם היו במקום אחר . אבל משתמשים אוטומטיים הם קצת יותר מאובטח, למשל כלי אוטומטי כי מנהלי הייצור שאינם יכולים לגשת יש משתמש & אישורים כי לא ניתן להשתמש בייצור. אם אתה רוצה להשיק ansible על כל הצמתים, היית צריך לעשות את זה בשתי קבוצות, פעם אחת עבור ייצור פעם לייצור.

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

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


52
2017-12-30 16:53



תודה, @Zeb - דמיינתי שמשתמשים עם עשרות עד אלפי שרתים ישתמשו NOPASSWD מסיבות של שפיות בכל מקרה (כנראה נתמך על ידי כללי חומת אש הדוק יותר וכו '), אבל זה טוב לקרוא את מקרה השימוש שלך ואת המחשבות על מודל האיום. - supervacuo
הערה אחת, אם כי, על ההצעה שלך לגבי הגבלת "מאושר מראש" sudo פקודות (אשר אכן עלה על דעתי כאשר גיליתי את זה NOPASSWD הוא נדרש הרבה יותר). למרבה הצער, זה נראה לחלוטין לא נתמך גם כן - ansible עושה שום הבטחות על התקשרות למשל  chown או mkdir בינאריות ישירות, וצריך להיות מסוגל sudo /bin/sh עבור רוב המודולים לעבוד. - supervacuo
נדמה לי שאני זוכר אחד המהנדסים שלי מתלונן על זה זמן מה בחזרה, זה מעצבן. - Zeb


מ ansible 1.5 ב, ניתן להשתמש קמרון מוצפן עבור host_vars ומשתנים אחרים. זה לפחות מאפשר לך לאחסן לכל מארח (או לכל קבוצה) ansible_sudo_passמשתנה באופן מאובטח. לצערי, --ask-vault-pass תבקש רק סיסמת קמרון אחת לכל קריאה אפשרית, לכן אתה עדיין מוגבל לכרטיס כספת יחיד עבור כל המארחים שבהם תשתמש יחד.

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


36
2018-05-10 20:32



ה ansible_sudo_pass האפשרות נראית חדשה, גם - ונראה לעשות מה שאני מבקש. סיסמה אחת קמרון הוא אידיאלי למטרות שלי, כמו גם. תודה! - supervacuo
האם יש דרך למנוע הצפנה את כל  host_vars באמצעות שיטה זו? (הגבלה פוטנציאלית שציין אלכס דופוי) - supervacuo
@supervacuo - כדי למנוע הצפנה של כל Vars מארח, פשוט להשתמש בספרייה var המארח המכיל main.ym (לא מוצפן) ו secret.yml (מוצפן) - לראות את החלק האחרון של זה סעיף דוק שבו הוא מדבר על "raleigh" קבוצה - טכניקה זו עובדת עבור vars מארח ו vars הקבוצה. אני משתמש זה הרבה, וריאציה היחידה היא שאם סוד הוא רק צורך כמה playbooks זה יכול להיות שימושי לאחסן אותו עץ אחר לחלוטין וכולל דרך נתיב הכולל את המארח או שם var. - RichVel
אם אני מוצפן את הערך 'ansible_ssh_pass' בכספת, אז אני גם צריך לשכפל את הערך 'ansible_sudo_pass'? האם יש ערך לערך השני sudo_pass כדי refences הראשון 'ssh_pass' ערך? - emeraldjava


עם ansible 1.5, ניתן להגדיר את ansible_sudo_pass משתנה באמצעות lookup('password', …)You

ansible_sudo_pass: "{{ lookup('password', 'passwords/' + inventory_hostname) }}"

אני מוצא את זה יותר נוח מאשר באמצעות קבצים host_vars/ מכמה סיבות:

  • אני ממש משתמש with_password: "passwords/{{ inventory_hostname}} encrypt=sha256_crypt" כדי לספק את הסיסמאות עבור לפרוס המשתמש מרחוק (אשר לאחר מכן נדרש סודו), אז הם כבר נמצאים בתיקים (אם כי עושה את אלה בטקסטים lookups מאבד את הערך מלח המאוחסנים בקובץ כאשר נוצר ערך hashed).

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

  • הצבת הסיסמאות בספריה נפרדת מקלה על שמירת הקבצים מתוך בקרת מקור, או שימוש בכלי כמו Git-crypt כדי לאחסן אותם בצורה מוצפנת (אתה יכול להשתמש בו עם Ansible קודם לכן כי חסר את תכונה קמרון). אני משתמש git-crypt ומאז אני רק לבדוק את המאגר בצורה מפוענחת על מערכות קבצים מוצפנים, אני לא טורחים עם הכספת ולכן אין צורך להקליד את הסיסמה קמרון. (באמצעות שניהם יהיה כמובן בטוח יותר).

אתה יכול גם להשתמש הבט מעלה לתפקד עם ansible_ssh_pass; זה עשוי אפילו להיות אפשרי עם גירסאות קודמות של Ansible כי אין ansible_sudo_pass.


22
2018-05-26 19:33



אני סוף כל סוף יש לנסות את זה (תודה!), אבל לא יכול לראות איך זה יעבוד בלי git-crypt; עד כמה שאני רואה. זה נראה כמו Ansible עדיין אין תמיכה לשימוש lookup על קמרון מוצפן. ה password מסמכים מודול אומרים כי יש תמיכה עדיין לא מתועד לאחסון מוצפן, אבל אני עדיין לא למצוא פרטים. רמזים כלשהם? - supervacuo


שימוש לעבור היא שיטה פשוטה לספק ansible עם סיסמאות sudo. להעביר את הסיסמה סיסמה אחת לכל קובץ אשר עושה את זה קל לשתף סיסמאות באמצעות git או שיטות אחרות. זה גם מאובטח (באמצעות GnuPG) ואם אתה משתמש gpg-agent, זה מאפשר לך להשתמש ansible מבלי להזין סיסמה על כל שימוש.

כדי לספק את הסיסמה המאוחסנת כ- servers/foo עבור שרת foo לא ניתן להשתמש בו, להשתמש בו בקובץ המלאי כך:

[servers]
foo ansible_sudo=True \
    ansible_sudo_pass="{{ lookup('pipe', 'pass servers/foo') }}"

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


19
2018-01-19 19:51



פתרון מצוין כזה - תודה! - Leng


זהו חוט ישן למדי, ובכל זאת:

  • אנו משתמשים בשתי מערכות אימות שונות בתוך הבית, ניהול מכונות נעשה מתחנות עבודה מקומיות בצוות שלי.
  • כתבתי vars_plugin עבור ansible (יישום מלא למדי ניתן למצוא בכתובת https://gist.github.com/mfriedenhagen/e488235d732b7becda81), המבדיל בין מספר מערכות לאימות:
  • השם של מערכת האימות הוא ספציפי לקבוצה.
  • משתמש כניסה / משתמש sudo הוא קבוצה ספציפית מנהל.
  • אז אני מושך את המשתמש מהסביבה של המנהל ואת הסיסמה המתאימה באמצעות ספריית python-keyring מתוך סיסמה בטוח (אנו משתמשים ב- Mac OS X של keychain, אבל מן התיעוד kwallet Gnome ו _win_crypto נתמכים גם כן).
  • אני קובע הרשאות על הסיסמאות במחרוזת המפתחות של Mac OS X כדי להודיע ​​לי על העובדה, כי שורת הפקודה אבטחה התוכנית מבקשת גישה לסיסמה עבור כל מערכת אימות בשימוש על ידי המארחים, אז אני מפעיל "ansible -s כל פינג" ולקבל שני הנחיות (אחד עבור כל מערכת האימות) שבו אני לוחץ על מקש הרווח ו ansible מרים את הסיסמאות.

3
2018-03-03 17:33



זה נראה מאוד מסודר, תודה - אני אוהב את הרעיון של לא צריך לאחסן סיסמאות בשני מקומות. כרגע אני תקוע באמצעות KeepassX (כי keyroom GNOME לא נראה מאוד נייד), אבל אולי אני יכול לעשות python-keepass לעבוד? - supervacuo
ככל שאני מבין, פיתון- keyring היא הפשטה עבור זה, כך עמיתים שלך עשוי להשתמש במערכות הפעלה אחרות. או שאתה לאחסן את keeppx db על מקל USB יש לנהל מתחנות עבודה עם מערכות הפעלה שונות? - Mirko Friedenhagen
הבין; התכוונתי שאני כבר צריך להשתמש KeepassX יש גישה סיסמאות על מערכות שאינן GNOME, כך אחסון אותם gnome-keyring פירושו שמירה על רשומות כפולות. עדיין הדרך הרבה יותר מאשר להשתמש NOPASSWD, אבל ... - supervacuo


דרך אפשרית אחת לעשות זאת היא שימוש במשתנים סביבתיים.

למשל

pass1=foo pass2=bar ansible-playbook -i production servers.xml

ואז במחזות, אתה יכול לבדוק את הסיסמה sudo באמצעות:

lookup('env', 'pass1') 
lookup('env', 'pass2') 

0
2017-07-21 08:57