อะไรคือความแตกต่างระหว่างการล็อกอินในฐานะผู้ใช้และการเปลี่ยนผู้ใช้โดยใช้ su ผ่านรูท


17

เมื่อคุณมีเซิร์ฟเวอร์บางจัดเรียงคุณสามารถเข้าถึงได้ผ่านเช่นssh user1@ipและคุณยังสามารถทำssh root@ipไปให้กับผู้ใช้รากของคุณมีสิทธิ์ su su user1แล้วไปที่ ในความคิดของฉันทั้งสองวิธีควรนำฉันไปสู่สภาพแวดล้อมผู้ใช้เดียวกัน (ในกรณีนี้ "user1") แต่จากประสบการณ์จริงของฉันมันไม่ได้เกิดขึ้นเพราะssh user1@ipมีสิ่งที่ติดตั้งอยู่ในsu user1นั้น

ทำไมถึงเป็นอย่างนั้น?

คำตอบ:


15

SSH เริ่มต้นเปลือกเข้าสู่ระบบ suโดยค่าเริ่มต้นไม่ได้

โดยเฉพาะอย่างยิ่งซึ่งหมายความว่า~/.profile(หรือไฟล์ที่คล้ายกัน) สำหรับผู้ใช้นั้นไม่ได้มีแหล่งที่มา ดังนั้นการเปลี่ยนแปลงที่ทำ~/.profileจะไม่มีผล อาจเป็นกรณีที่:

  • แม้ว่าคุณจะเริ่มเชลล์ล็อกอินการเปลี่ยนแปลงที่แตกต่างกันก็เกิดขึ้นในรู~/.profileทซึ่งอาจส่งผลเสียต่อสภาพแวดล้อมของผู้ใช้
    • /etc/profileและ/etc/profile.d/*อาจใช้การตั้งค่าแตกต่างกันสำหรับผู้ใช้ที่แตกต่างกัน (ไม่ใช่โดยค่าเริ่มต้น)
  • อาจมีการตั้งค่าที่แตกต่างกันสำหรับผู้ใช้ที่ต่างกันในการกำหนดค่า SSH
  • การกำหนดค่า PAM นั้นแตกต่างกัน ตัวอย่างเช่น/etc/pam.d/sshมี:

    session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale
    

    ในขณะที่/etc/pam.d/suมี:

    session       required   pam_env.so readenv=1 envfile=/etc/default/locale
    

    นี่หมายความว่าโหลด SSH ~/.pam_environmentแต่suไม่ได้ นี่เป็นเรื่องใหญ่เนื่องจาก~/.pam_environmentเป็นตำแหน่งที่ไม่ขึ้นกับเชลล์สำหรับตัวแปรสภาพแวดล้อมและจะถูกนำไปใช้หากคุณเข้าสู่ระบบจาก GUI, TTY หรือ SSH

ในการเริ่มต้นเชลล์ล็อกอินให้รันหนึ่งใน:

su - <username>
sudo -iu <username>

ตัวอย่าง:

# su muru -c 'sh -c "echo $HOME $PATH"'
/home/muru /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
# su - muru -c 'sh -c "echo $HOME $PATH"'
/home/muru /home/muru/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
# sudo -iu muru sh -c 'echo $HOME $PATH'
/home/muru /home/muru/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# sudo -u muru sh -c 'echo $HOME $PATH'
/root /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ssh muru@localhost 'echo $HOME $PATH'
/home/muru /home/muru/devel/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

แม้ว่าจะมี SSH ถ้าคุณเรียกใช้คำสั่งแทนที่จะเริ่มเชลล์เชลล์ล็อกอินจะไม่สามารถรันได้ (โปรดสังเกตว่าไม่มี~/binการทดสอบ SSH ซึ่งมีอยู่ในsu -และsudo -i) เพื่อให้ได้ผลลัพธ์ที่แท้จริงฉันจะเรียกใช้เปลือกของฉันเป็นเปลือกเข้าสู่ระบบ:

# ssh muru@localhost '$SHELL -ilc "echo \$HOME \$PATH"'
/home/muru /home/muru/bin:/home/muru/devel/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

นี่เป็นสาเหตุsudo suและsudo -sเป็นวิธีเส็งเคร็งในการรับรูทเชลล์ ทั้งสองวิธีนี้มีมลภาวะต่อสิ่งแวดล้อม


ที่เกี่ยวข้อง:


2
ดูเหมือนว่าฉันควรจะตื่นก่อนที่จะตอบคำถาม :) คำตอบของคุณวิเศษมากและฉันพลาดที่จะตั้งเป้าหมายคำตอบที่เหมาะสม ทำได้ดี +1
Videonauth

-1

โดยขนาดใหญ่มันเป็นความแตกต่างเชิงกลยุทธ์เป็นหลัก

หากคุณเข้าสู่ระบบในฐานะผู้ใช้ขั้นสูงคุณสามารถเปลี่ยนแปลงสิ่งใดก็ได้ตลอดเวลา ... เช่น - ไม่มีการป้องกันข้อผิดพลาดร้ายแรงคุณต้องเปลี่ยนผู้ใช้รายอื่นชั่วคราวเพื่อความปลอดภัย

โดยที่: หากคุณเข้าสู่ระบบด้วยสิทธิ์ จำกัด คุณหลีกเลี่ยงความเสี่ยงจากข้อผิดพลาดรุนแรงเนื่องจากคุณต้องเปลี่ยนเป็นรูท su โดยเจตนาสำหรับการเข้าถึงพลังงานชั่วคราว แต่ตอนนี้คุณมีตำแหน่งถอยกลับเริ่มต้นสำหรับผู้ใช้ที่ปลอดภัย .

ความแตกต่างจึงเป็นกลยุทธ์จริงๆไม่ใช่เชิงเทคนิค


คำถามไม่ได้ต่างจากผู้ใช้รูทอย่างแน่นอน มันเป็นความแตกต่างระหว่างการเข้าถึงผู้ใช้เซิร์ฟเวอร์โดยตรงผ่าน ssh และเข้าถึงผ่าน su แล้วภายในผู้ใช้รูต อย่างไรก็ตามฉันเห็นด้วยกับสิ่งที่คุณพูดด้วยฮ่า ๆ ขอบคุณ
Miguel Corti

โอเคขอโทษ ... ฉันสงสัยจริงๆว่าทำไมทุกคนถึงมีรายละเอียดทางเทคนิคฉันคิดว่าฉันเข้าใจผิดความตั้งใจของคุณ
Mr.President
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.