שאלה העברת ssh-agent ו- sudo למשתמש אחר


אם יש לי שרת A שבו אני יכול להתחבר עם מפתח ssh שלי ויש לי את היכולת "sudo su - otheruser", אני מאבד את העברת המפתח, כי משתנים env מוסרים ו את שקע הוא קריא רק על ידי המשתמש המקורי שלי. האם יש דרך שאני יכול לגשר על מקש העברת דרך "sudo su-otheruser", אז אני יכול לעשות דברים על שרת B עם המפתח שלי מועבר (git clone ו rsync במקרה שלי)?

הדרך היחידה שאני יכול לחשוב על זה הוא מוסיף את המפתח כדי author_keys של משתמש אחר ו "ssh otheruser @ localhost", אבל זה מסורבל לעשות עבור כל משתמש ושילוב שרת אני יכול להיות.

בקצרה:

$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey). 

144
2018-01-28 13:52






תשובות:


כפי שציינת, משתני הסביבה מוסרים על ידי sudo, מטעמי ביטחון.

אבל למרבה המזל sudo הוא די להגדרה: אתה יכול להגיד את זה בדיוק איזה משתנים הסביבה אתה רוצה לשמור הודות env_keep אפשרות תצורה ב - Windows XP /etc/sudoers.

עבור העברת סוכן, אתה צריך לשמור את SSH_AUTH_SOCK משתנה הסביבה. לשם כך, פשוט ערוך את /etc/sudoers קובץ תצורה (תמיד באמצעות visudo) ולהגדיר את env_keep אפשרות למשתמשים המתאימים. אם ברצונך להגדיר אפשרות זו עבור כל המשתמשים, השתמש ב Defaults ככה:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers לפרטים נוספים.

עכשיו אתה אמור להיות מסוגל לעשות משהו כזה (בתנאי user1המפתח הציבורי קיים ~/.ssh/authorized_keys in user1@serverA ו user2@serverB, ו serverA's /etc/sudoers הקובץ מוגדר כמפורט לעיל):

user1@mymachine> eval `ssh-agent`  # starts ssh-agent
user1@mymachine> ssh-add           # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA    # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2     # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB         # goto user2@serverB w/o typing pwd again...
user2@serverB>                     # ...because forwarding still works

168
2018-03-03 21:24



זוהי התשובה הנכונה, צריך להיות מסומן. - Xealot
זה רק עובד, אם user2 לעיל הוא root! אחרת, user2 יהיה SSH_AUTH_SOCK להגדיר כראוי, אבל user2 לא יוכל לגשת אל למשל. / tmp / ssh-GjglIJ9337 /. root האם יש גישה זו. אז זה יכול לפתור חלק מהבעיה, אבל לא אופס: "ו את שקע הוא לקריא רק על ידי המשתמש המקורי שלי " - Peter V. Mørch
Defaults>root env_keep+=SSH_AUTH_SOCK צריך לוודא שזה רק קדימה כאשר sudoing ל שורש. אתה לא רוצה לעשות את זה בכל מקרה למשתמשים אחרים מטעמי אבטחה. עדיף להפעיל ssh- סוכן נפרד עבור אחרים, ולהוסיף את המפתחות המתאימים. - Paul Schyska
sudo su - לא עובד בשבילי, סביר להניח שזה לא יכול לשמר את הסביבה כי זה לא sudo בשעה פגז ההפעלה. sudo su נראה לעבוד. - Alex Fortuna
מעולם לא הבנתי למה אנשים משתמשים sudo su בכל מקרה. אם אתה צריך פגז שורש, זה מה sudo -s או sudo -i בשביל. - eaj


sudo -E -s
  • - אני אשמור על הסביבה
  • - מפעיל פקודה, ברירות מחדל לקליפה

זה ייתן לך פגז שורש עם המקשים המקורי עדיין טעון.


55
2018-01-01 15:31



כמו עם ההערה לעיל, זה רק כתובות השאלה אם אתה הופך שורש, כי במקרה זה השורש הוא מסוגל לעקוף את הרשאות גישה כרגיל על SSH_AUTH_SOCK $. - doshea


להתיר האחר לגשת $SSH_AUTH_SOCK קובץ וזה ספריה, למשל על ידי ACL הנכון, לפני המעבר אליהם. הדוגמה מניחה Defaults:user env_keep += SSH_AUTH_SOCK in /etc/sudoers על מחשב מארח:

$ ssh -A user@host
user@host$ setfacl -m otheruser:x   $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$

בטוח יותר ועובד עבור משתמשים שאינם שורש;


33
2017-11-15 10:58



זכור בעת שימוש בשיטה זו, אנשים אחרים נכנסו בתור otheruser יכול גם להשתמש באימות ssh שלך. - gitaarik
זה עובד בשבילי, אבל הייתי צריך לשנות "sudo su - otheruser" כדי "sudo su otheruser" (הסרת -). - Charles Finkel
למה rwx ולא rw (או r בכלל)? - anatoly techtonik
@atatolytechtonik מ man 7 unix - על לינוקס חיבור לשקע דורש הרשאות קריאה וכתוב על שקע זה. כמו כן, אתה צריך לחפש (ביצוע) ו הרשאת כתיבה בספרייה שבה אתה יוצר שקע או רק חיפוש (ביצוע) רשות בעת חיבור לשקע זה. אז התשובה לעיל לבצע אישור על שקע הוא מיותר. - mixel


מצאתי כי זה עובד גם.

sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

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

chmod 777 -R `dirname $SSH_AUTH_SOCK`
sudo su otheruser -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

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


16
2018-03-21 00:01



זה מסוכן מאוד. מתן כל משתמש אחר רשות להשתמש סוכן SSH שלך שווה לתת להם את כל האישורים שלך (ואם אתה משתמש אי פעם sudo או su, נותן להם כוח שורש על כל שאר המשתמשים על המערכת, כמו גם את כל המערכות האחרות אתה ssh!) . זה לעולם לא צריך להיעשות! - Matija Nalis
אני לא מסכים עם ההצהרה כי "זה חייב אף פעם לא נעשה!" ישנם מקרים רבים שבהם הסיכון הזה מקובל. לדוגמה, קבוצה קטנה שבה לכל אחד יש את אותן הרשאות ואתה בוטח בכל המשתמשים האחרים. זה לא צריך להיעשות מבלי להבין את הסיכונים הכרוכים בכך. אבל ברגע שהסיכונים האלה מובנים, יש פעמים שהסיכון מקובל. - phylae


אם אתה מורשה sudo su - $USER, אז סביר להניח שיהיה לך ויכוח טוב על היותו רשאי לעשות ssh -AY $USER@localhost במקום זאת, עם המפתח הציבורי התקף בספריית הבית של USER. ואז העברת האימות שלך תבוצע באמצעותך.


6
2018-01-28 14:08



הוא הזכיר שבתחתית שאלתו, ואמר שיהיה קשה לעשות זאת. - Fahad Sadah
זה כנראה הפתרון הטוב ביותר אבל זה מקבל שעיר אם USER הוא אדם אמיתי (tm) - הם עלולים למחוק את המפתח של SA מ author_keys או לשנות את הסיסמה שלהם ... - voretaq7
ניתן להסיר את הרשאת הגישה שלהם ל - author_keys (אם כי הם באמת נקבעים על מניעת גישה לפלוריאן, הם יכולים למחוק אותו מחדש, זה להיות בספרייה שלהם) - Fahad Sadah


אתה תמיד יכול פשוט ssh כדי localhost עם העברת סוכן במקום להשתמש sudo:

ssh -A otheruser@localhost

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

כמו כן, שים לב שכאשר אתה משתמש בהעברת ssh, השורש יכול תמיד לגשת לשקע שלך ולהשתמש באימות ssh שלך (כל עוד אתה מחובר עם העברת ssh). אז ודא שאתה יכול לסמוך על השורש.


4
2017-11-27 14:56





אין להשתמש sudo su - USER, אלא sudo -i -u USER. עובד בשבילי!


3
2018-01-28 16:51



איזו גרסה של סודו יש לך? שלי (1.6.7p5, CentOS 4.8) אין-i בדף האיש שלו. - David Mackintosh
Sudo version 1.6.9p17 רץ על דביאן לני. נסה sudo -s? - Fahad Sadah
לא עובד בשבילי.
על אובונטו, באמצעות Sudo 1.8.9p5, לא sudo -s ולא sudo -i לעבוד בשבילי ... - Jon L.


שילוב של מידע מן התשובות האחרות הגעתי עם זה:

user=app
setfacl -m $user:x $(dirname "$SSH_AUTH_SOCK")
setfacl -m $user:rwx "$SSH_AUTH_SOCK"
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -u $user -i

אני אוהב את זה כי אני לא צריך לערוך sudoers קובץ.

נבדק על אובונטו 14.04 (היה צריך להתקין acl החבילה).


2
2018-06-10 17:39





למרבה הצער, כאשר אתה su למשתמש אחר (או אפילו להשתמש sudo) תאבד את היכולת להשתמש המפתחות המועבר שלך. זוהי תכונה אבטחה: אתה לא רוצה משתמשים אקראיים התחברות שלך ssh-agent ושימוש המפתחות שלך :)

השיטה "ssh-$ $ {USER} @localhost" היא קצת מסורבלת (וכפי שציינתי בהערותי על תשובתו של דוד לשבירה), אבל זה כנראה הכי טוב שאתה יכול לעשות.


1
2018-01-28 16:52



הממ, אבל אם אני עושה את זה עם ssh, אז הסוכן שלי נגיש על ידי המשתמש בכל זאת, או שאני טועה?
אם אתה SSH לתוך המשתמש היעד עם העברת סוכן בקשות הסוכן שלך יהיה להקפיץ את השרשרת עד היכן הסוכן "האמיתי" הוא. כאשר אתה סו או sudo מן המשתמש המקורי שלך שקע הסוכן SSH לא (או לא צריך) להיות נגיש - הספרייה היא חיה במצב 700 & בבעלות המשתמש המקורי. (Caveat ברור: אם אתה עובר לשורש & לאפס את הסביבה SSH_AUTH_SOCK זה יכול לעבוד, אבל אני לא לסמוך על זה) - voretaq7
בשרת שלי (Ubuntu 12.04, גרסה ssh OpenSSH_5.9p1 Debian-5ubuntu1.1, OpenSSL 1.0.1 14 מרס 2012), ssh has -a ו -A ארגומנטים. -a עושה בדיוק את ההפך ממה שהוא מיועד, זה משבית העברת סוכן! אז, תחת הגרסה האחרונה (ואולי כל) של אובונטו, להשתמש -A כדי לאפשר העברת סוכן. - knite
@knite אתה צודק - זה טעות דפוס (בת 3!) בתשובה שלי. תוקן עכשיו :-) - voretaq7