อนุญาตให้ผู้ใช้ 1“ su - user2” โดยไม่มีรหัสผ่าน


51

ฉันต้องอนุญาตให้ผู้ใช้martinสลับไปยังผู้ใช้martin-testโดยไม่ต้องใช้รหัสผ่าน

su - martin-test

ฉันคิดว่านี่สามารถกำหนดค่า/etc/pam.d/suได้ มีบางบรรทัดในไฟล์นั้นซึ่งสามารถยกเลิกหมายเหตุได้ แต่ผมไม่ชอบความคิดของการเพิ่มผู้ใช้ไปยังกลุ่มmartin wheelฉันไม่ต้องการที่จะให้martinสิทธิพิเศษใด ๆ martin-testมากกว่าที่จะสามารถที่จะเปลี่ยนไป sudoฉันยังไม่ต้องการที่จะใช้

อะไรจะเป็นวิธีที่ดีที่สุดที่จะทำในขณะที่รักษาสิทธิ์ของผู้ใช้martinน้อยที่สุด?


2
นี้เป็นเรื่องง่ายที่จะทำอย่างไรกับเช่นsudo sudo -u martin-test -iมีเหตุผลที่คุณถามโดยเฉพาะเกี่ยวกับsu?
jordanm

ฉันไม่ต้องการติดตั้งsudoเพียงเพราะสิ่งนี้ (ปกติฉันไม่ได้ใช้sudoและฉันไม่ชอบมันเป็นพิเศษ) และฉันคิดว่าการใช้pamนั้นสะอาดกว่าและวิธีที่โปร่งใสกว่าที่จะทำ
Martin Vegter

3
@MartinVegter อย่างที่คุณเห็นจากคำตอบของสคริปต์การทำสิ่งนี้ผ่านกลไก pam บางอย่างน่าเกลียดมาก นี่คือสิ่งที่sudoตั้งใจไว้จริงๆ นอกเหนือจากการใช้งานที่ไม่ปกติแล้วอะไรคือข้อคัดค้าน?
Patrick

1
หากการแก้ปัญหาการทำความสะอาดเป็นไปได้ด้วยผมต้องการให้มากกว่าpam sudoหากsudoเป็นไปได้เพียงอย่างเดียวก็ยิ่งดีเช่นกัน การคัดค้านของฉันเพื่อsudoเป็นส่วนใหญ่อุดมการณ์: sudo fooฉันไม่ชอบความคิดของผู้ใช้ทำกับการบริหาร เมื่อฉันต้องทำการบริหารฉันเข้าสู่ระบบในฐานะ root มิฉะนั้นฉันเข้าสู่ระบบในฐานะผู้ใช้บทบาทที่แตกต่างกันสองบทบาทนี้ไม่ควรนำมาผสมกัน นอกจากนี้ฉันได้pamติดตั้งโครงสร้างพื้นฐานแล้ว ฉันไม่ต้องการติดตั้งsetuidโปรแกรมอื่นซึ่งอาจจะแนะนำข้อบกพร่องด้านความปลอดภัย
Martin Vegter

5
@MartinVegter คุณไม่ต้องทำอะไรsudo fooกับคำสั่งเฉพาะ Sudo มีsudo -sตัวไหนที่จะเปิดตัวเชลล์ sudo เป็นสาธารณูปโภคที่มีความหมายที่พบบ่อยมากก็รักษาความปลอดภัยได้รับการตรวจอย่างละเอียดมากขึ้นกว่าบางกลอุบายแพมจะ ฉันจะยืนยันว่าการรูทเชลล์สำหรับงานนั้นไม่ปลอดภัยมากกว่าการเปิดคำสั่งเฉพาะ เมื่อคุณเรียกใช้เชลล์คุณจะเรียกใช้ทุกสิ่งในฐานะรูท หากหนึ่งในสิ่งเหล่านั้น (เช่นแบบง่ายls) มีช่องโหว่ด้านความปลอดภัยแสดงว่าคุณเพิ่งเปิดช่องโหว่ความปลอดภัย
Patrick

คำตอบ:


61

เพิ่มบรรทัดต่อไปนี้ด้านล่างpam_rootok.soบรรทัดใน/etc/pam.d/su:

auth  [success=ignore default=1] pam_succeed_if.so user = martin-test
auth  sufficient                 pam_succeed_if.so use_uid user = martin

บรรทัดเหล่านี้ทำการตรวจสอบโดยใช้pam_succeed_if.soโมดูล ดูเพิ่มเติมไวยากรณ์ไฟล์การกำหนดค่า Linux-PAMเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับauthบรรทัด

  • บรรทัดแรกตรวจสอบว่าผู้ใช้เป้าหมายเป็นmartin-testหรือไม่ หากเป็นเช่นนั้นไม่มีอะไรเกิดขึ้น ( success=ignore) และเรายังคงในบรรทัดถัดไปในการตรวจสอบผู้ใช้ปัจจุบัน หากไม่เป็นเช่นนั้นบรรทัดถัดไปจะถูกข้าม ( default=1) และเราจะดำเนินการตามบรรทัดถัดไปด้วยขั้นตอนการตรวจสอบสิทธิ์ตามปกติ
  • martinบรรทัดที่สองจะตรวจสอบว่าผู้ใช้ปัจจุบันคือ หากเป็นเช่นนั้นระบบจะพิจารณากระบวนการตรวจสอบสิทธิ์ว่าเป็นผลสำเร็จและส่งคืน ( sufficient) หากไม่เป็นเช่นนั้นจะไม่มีอะไรเกิดขึ้นและเราจะดำเนินการตามขั้นตอนการรับรองความถูกต้องตามปกติ

คุณสามารถ จำกัดsuกลุ่มได้ที่นี่กลุ่มallowedpeopleสามารถsuไม่มีรหัสผ่าน:

auth sufficient pam_succeed_if.so use_uid user ingroup allowedpeople

1
หากคุณต้องการอนุญาตหากพวกเขาอยู่ในกลุ่มใดกลุ่มหนึ่ง: รับรองความถูกต้องเพียงพอ pam_succeed_if.so ผู้ใช้กลุ่ม ing กลุ่ม
shrimpwagon

@gnp Super ขอบคุณ !! ทำงานกับ iCinga กับ nrpe, ต้องรันคำสั่งบางคำเป็นผู้ใช้อื่น !! ช่วยมาก !!!!!! ขอบคุณ !!!!!
saravanakumar

@GnP โปรดช่วยฉันที่askubuntu.com/questions/821793/…
Nullpointer

มันเป็นการดีที่จะเพิ่มข้อมูลเกี่ยวกับวิธีการใช้การเปลี่ยนแปลงเช่นกัน
Kyslik

@Kyslik คุณหมายถึงอะไร? คำแนะนำเกี่ยวกับวิธีแก้ไขไฟล์ที่จำเป็นมีอยู่ในคำตอบ ...
GnP

12

หากคุณไม่ต้องการเปลี่ยนกลุ่มหรือใช้sudoให้ใช้โมดูล pam ที่เรียกใช้pam_execเพื่อรันสคริปต์ภายนอกในระยะ pam

เพิ่มบรรทัด/etc/pam.d/suหลังpam_rootok.soบรรทัด:

auth       sufficient pam_exec.so quiet /path/to/script

/path/to/script มีสิทธิ์ 755 (rwxr-xr-x) และเนื้อหาต่อไปนี้:

#!/bin/bash
if [ "$PAM_TYPE" == "auth" ] && \
[ "$PAM_USER" == "martin-test" ] && \
[ "$PAM_RUSER" == "martin" ]; then
  exit 0
else
  exit 1
fi

ดังนั้นสคริปต์นี้จึงมีความสำเร็จถ้าsu:

  • ถูกเรียกในบริบทของการพิสูจน์ตัวตน
  • ผู้ใช้ที่โทรคือmartinและ
  • martin-testผู้ใช้ในการตรวจสอบคือ

ดู:

martin@host:~$ su - martin-test
martin-test@host:~$ exit
martin@host:~$ su - otheruser
Password: ****
otheruser@host:~$ 

1
pam_access สามารถนำมาใช้เพื่อให้การทำงานที่คล้ายกันโดยไม่ต้องพึ่งพาสคริปต์ (นี่คือสิ่งที่ทำให้ pam_access ทำ)
jsbillings

1
@jsbillings คุณจะทำอย่างนั้น (มีรายละเอียดบางอย่าง) คำตอบอื่นได้หรือไม่
Hauke ​​Laging

1
ฉันจะต้องแก้ไขของฉัน/etc/pam.d/suเพื่อใช้pam_accessสำหรับสถานการณ์ของฉันได้อย่างไร
Martin Vegter

3
@jsbillings ที่จริงpam_accessไม่สามารถทำได้ เมื่อsuจะผ่าน pam สแต็คก็ทำเช่นนั้นเป็นผู้ใช้ที่คุณกำลังเปลี่ยนไปไม่ใช่ผู้ใช้ที่คุณกำลังเปลี่ยนจาก ดังนั้นถ้าคุณเพิ่มกฎเช่น+ : martin : ALLก็จะช่วยให้ทุกคนเปลี่ยนไป martinแม้ว่าคุณmartinจะเปลี่ยนเป็นmartin-testมันจะยังคงให้ใครทำ คุณต้องวิเคราะห์ทั้งผู้ใช้ที่คุณมาและผู้ใช้ที่คุณกำลังเปลี่ยน จริงๆตรงนี้เป็นสิ่งที่sudoเป็น ...
แพทริค

0

หากคุณไม่มีสิทธิ์เข้าถึงบัญชีรูท แต่มีรหัสผ่านของผู้ใช้ที่คุณต้องการใช้เพื่อเรียกใช้คำสั่งคุณสามารถทำสิ่งต่อไปนี้

  • นี่จะขอรหัสผ่านของคุณจาก toto: su - toto -c whoami
  • สิ่งนี้จะไม่: ssh toto @ localhost whoami

เพียงติดตั้งกุญแจสาธารณะของคุณใน authorized_keys ของ toto


คำตอบที่รอบคอบ .. อย่างไรก็ตามคำสั่งที่ใครบางคนอยากลองใช้ทำงานอยู่ในเครื่องแล้ว ดังนั้นจึงไม่มีประเด็นที่ไปยังเซิร์ฟเวอร์เดียวกัน
ราชา Anbazhagan

-1

ทางออกที่ง่ายของฉันคือ:

sudo login -f martin-test

หากคุณต้องการหลีกเลี่ยง sudo ที่ค่าใช้จ่ายทั้งหมดฉันคิดว่ามันควรจะเป็นไปได้ที่จะใส่ไว้ในสคริปต์:

  1. เป็นเจ้าของโดย root และมีสิทธิ์ใช้งานรูท (ใช้แฟล็ก setuid )
  2. ปฏิบัติการโดยทุกคนโดยไม่มี sudo ใด ๆ

อย่างไรก็ตามฉันไม่สามารถหาchown rootและchmod +s ToTest.shบิตเพื่อให้ใช้งานได้จริง:

#!/usr/bin/env bash
echo howdy, I am $(whoami)
sudo login -f martin-test

ฉันยังคงทำงานในฐานะผู้ใช้ปกติของฉันตามที่ echo บอกฉัน และมันยังต้องใช้รหัสผ่าน sudo ถ้ามันทำงานเหมือนรูทหนึ่งสามารถทำได้โดยใช้sudoในบรรทัดสุดท้าย ...


การตั้งค่าสถานะ setuid บนเชลล์ (หรือสคริปต์อื่น ๆ ) จะไม่ทำงานใน Linux และด้วยเหตุผลที่ดี โปรดสังเกตว่าสคริปต์ด้านบนที่มีสถานะ suid ที่ใช้งานได้จะเป็นกับดักทันที: มันจะทำการโจมตีผ่าน "env" (ค่อนข้างจะเอาชนะตัวเองได้เพราะถ้าคุณคิดว่าคุณไม่รู้ว่าอยู่ที่ไหนbashทำไมคุณคิดว่าคุณอยู่ที่ไหนenvหรือ ไม่ว่ามันจะมีอยู่จริง?) แต่ในที่สุดคุณก็ไม่รู้ว่าbashจะเป็นเช่นไร มันอาจมาจากไดเรกทอรีผู้ใช้ที่อ้างสิทธิ์และได้รวบรวมหนึ่งนาทีก่อนหน้าจากซอร์สโค้ดของเขา คุณเห็นว่าฉันกำลังจะไปไหน หรือผู้ใช้สามารถแทนที่whoami...
David Tonhofer

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