ตั้งรหัสผ่าน sudo แตกต่างจากการเข้าสู่ระบบหนึ่ง


29

ในฐานะผู้ใช้ที่มีสิทธิ์ฉันกำลังพยายามตั้งsudoรหัสผ่านเป็นรหัสอื่นจากนั้นเป็นรหัสผ่านที่ใช้ในการเข้าสู่ระบบ

ฉันได้ทำการวิจัยแล้ว แต่ยังไม่พบคำตอบ ไม่sudoสนับสนุนการกำหนดค่าชนิดที่?

หากคุณทำรหัสผ่านหายคุณจะสูญเสียทุกอย่าง ใครบางคนสามารถเข้าสู่ระบบและส่งเสริมตัวเองrootด้วยรหัสผ่านเดียวกัน

sudoมีตัวเลือกในการขอrootรหัสผ่านแทนรหัสผ่านของผู้ใช้เรียก ( rootpw) แต่การแชร์รหัสผ่านแน่นอนไม่ได้ตัวเลือกนั่นคือเหตุผลที่เราตั้งขึ้นrootsudo

ฉันทำconfig 2FAในอดีตมันใช้งานได้ดี แต่ยังเอาชนะวัตถุประสงค์อัตโนมัติ ตัวอย่างเช่นหากคุณต้องการดำเนินการคำสั่งพิเศษผ่านเซิร์ฟเวอร์หนึ่งโหลด้วยexpectสคริปต์การเพิ่ม2FAไม่อนุญาตให้คุณทำเช่นนั้น

ทางออกที่ใกล้เคียงที่สุดที่ฉันพบคืออนุญาตให้ใช้คีย์ส่วนตัว SSH และการตั้งค่าวลีรหัสผ่านด้วยคีย์ที่แตกต่างจากsudoรหัสผ่าน (เข้าสู่ระบบ) ถึงกระนั้นก็ยังไม่สะดวกสบายเพราะในสถานการณ์ฉุกเฉินคุณไม่สามารถเข้าสู่ระบบด้วยพีซีที่ไม่มีรหัสนั้น


1
ทำไมคุณต้องการสิ่งนี้อย่างแน่นอน บางทีปัญหาอยู่ที่อื่น จะดีกว่าหรือไม่ที่จะมีการรับรองความถูกต้องแบบสองปัจจัยสำหรับการเข้าสู่ระบบด้วยบัญชีที่มีสิทธิ์แล้วมี 'NOPASSWD' ดังนั้น sudo จะไม่ขอรหัสผ่าน? จากนั้นคุณควรมีบัญชีในพื้นที่ฉุกเฉินแยกต่างหากพร้อมรหัสผ่านที่รัดกุมเพื่อให้สามารถเข้าสู่ระบบเมื่อเครือข่ายไม่ทำงาน (ไม่มีการเข้าถึง ssh)
jirib

คำตอบ:


30

หากคุณต้องการขอรหัสผ่านรูทซึ่งตรงข้ามกับรหัสผ่านของผู้ใช้มีตัวเลือกที่คุณสามารถใส่/etc/sudoersได้ rootpwโดยเฉพาะจะทำให้ขอรหัสผ่านรูต มีrunaspwและtargetpwเช่นกัน; ดูรายละเอียด manudo sudoers (5)

นอกเหนือจากนั้น sudo ทำการพิสูจน์ตัวตน (เหมือนทุกอย่าง) ผ่าน PAM PAM รองรับการกำหนดค่าต่อแอปพลิเคชัน การกำหนดค่าของ Sudo อยู่ใน (อย่างน้อยในระบบ Debian ของฉัน) /etc/pam.d/sudoและมีลักษณะดังนี้:

$ cat sudo 
#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive

กล่าวอีกนัยหนึ่งตามค่าเริ่มต้นจะตรวจสอบความถูกต้องเหมือนทุกอย่างในระบบ คุณสามารถเปลี่ยน@include common-authบรรทัดนั้นและมี PAM (และดังนั้น sudo) ใช้แหล่งรหัสผ่านอื่น บรรทัดที่ไม่แสดงความคิดเห็นในการตรวจสอบความถูกต้องจะมีลักษณะดังนี้ (โดยค่าเริ่มต้นสิ่งนี้จะแตกต่างกันหากคุณใช้เช่น LDAP):

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so

คุณสามารถใช้เช่นpam_userdb.soแทนpam_unix.soและเก็บรหัสผ่านสำรองของคุณในฐานข้อมูล Berkeley DB

ตัวอย่าง

ฉันสร้างไดเรกทอรี/var/local/sudopassเจ้าของ / กลุ่มโหมดroot:shadow 2750ข้างในฉันไปข้างหน้าและสร้างไฟล์ฐานข้อมูลรหัสผ่านโดยใช้db5.1_load(ซึ่งเป็นเวอร์ชันของ Berkeley DB ที่ใช้ใน Debian Wheezy):

# umask 0027
# db5.1_load -h / var / local / sudopass -t hash -T passwd.db
แอนโทนี่
WMaEFvCFEFplI
^D

แฮชนั้นถูกสร้างขึ้นmkpasswd -m desโดยใช้รหัสผ่าน "รหัสผ่าน" ความปลอดภัยสูงมาก! (น่าเสียดายที่ pam_userdb ดูเหมือนจะไม่สนับสนุนอะไรที่ดีไปกว่าการคร่ำครวญแบบโบราณcrypt(3))

ตอนนี้แก้ไข/etc/pam.d/sudoและลบ@include common-authบรรทัดและวางไว้ในสถานที่:

auth    [success=1 default=ignore]      pam_userdb.so crypt=crypt db=/var/local/sudopass/passwd
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so

โปรดทราบว่า pam_userdb เพิ่ม.dbส่วนขยายไปยังฐานข้อมูลที่ส่งผ่านดังนั้นคุณต้อง.dbปิด

ตามdannysauerในความคิดเห็นที่คุณอาจจำเป็นต้องทำการแก้ไขเดียวกันเพื่อให้/etc/pam.d/sudo-iได้เป็นอย่างดี

ตอนนี้สำหรับ sudo ฉันต้องใช้passwordแทนรหัสผ่านการเข้าสู่ระบบจริงของฉัน:

anthony @ sudotest: ~ $ sudo -K
anthony @ sudotest: ~ $ sudo echo -e '\ nit working'
[sudo] รหัสผ่านสำหรับ anthony: passwordRETURN

มันทำงานได้

ตรวจสอบให้แน่ใจว่าได้กำหนดค่า "sudo-i" ซึ่ง sudo รุ่นใหม่กว่ามักใช้สำหรับ "sudo -i" (หากผู้ขายไม่ได้เปลี่ยนอะไรบางอย่าง)
dannysauer

คุณช่วยอธิบายเกี่ยวกับ PAM config ได้ไหม?
ShâuShắc

@ ShâuShắcฉันได้เพิ่มตัวอย่างรวมถึงการเปลี่ยนแปลงการกำหนดค่า PAM
Derobert

ขอบคุณ แต่ฉันไม่พบ db51-utils ที่ใดก็ได้ใน Redhat / centos หรือแหล่งที่มามีเฉพาะในรุ่น Debian เท่านั้น
ShâuShắc

3
" crypt(3)hashing โบราณ" ใน glibc รุ่นใหม่มีการรองรับ sha-512 เช่น mkpasswd -m sha-512. pam_userdb.so สามารถจัดการสิ่งเหล่านี้ได้ดี
Andrew Domaszek

6

สำหรับ Redhat / Centos สามารถทำได้ตามขั้นตอนดังต่อไปนี้:

สร้างผู้ใช้ที่กำหนดเองและผ่าน:

# db_load -t hash -T /usr/local/etc/passwd.db
user
pass
^d

แก้ไขไฟล์ sudo pam.d เพื่อให้ดูเหมือน:

$ cat /etc/pam.d/sudo

auth            required        pam_userdb.so db=/usr/local/etc/passwd
account         required        pam_userdb.so db=/usr/local/etc/passwd
password        include         system-auth

session         optional        pam_keyinit.so revoke
session         required        pam_limits.so

ฉันยังคงมองหาวิธีการตั้งค่าเพื่อให้เฉพาะผู้ใช้ / กลุ่มที่ต้อง authen ด้วยวิธีการที่กำหนดเองนี้คนอื่น ๆ ยังคงสามารถ authen โดยวิธีการตรวจสอบระบบปกติ ใครสามารถให้คำแนะนำแก่ฉันได้บ้าง


คุณควรจะสามารถทำสิ่งนี้กับไวยากรณ์การกระทำแบบเต็มใน PAM เช่น[user_unknown=ignore,success=ok,default=bad]... แต่คุณจะต้องเล่นกับ (และอ่านเอกสาร PAM) เพื่อได้รับมันขวา
derobert

สิ่งนี้สามารถทำได้โดยใช้pam_succeed_ifข้ามโมดูลหนึ่งถ้าผู้ใช้อยู่ในรายการของกลุ่มหรือข้ามสองโมดูลถ้าไม่
dannysauer

ดังนั้นสิ่งที่ทั่วไปเช่นนี้ /// รับรองความถูกต้อง [ความสำเร็จ = ละเว้น default = 1] ผู้ใช้ pam_succeed_if.so ใน danny: ตรงไปตรงมา /// รับรองความถูกต้อง danny_frank_module.so เพียงพอ /// รับรองความถูกต้องเพียงพอ not_danny_frank.so
dannysauer

3

ฉันไม่คิดว่า sudo รองรับการตั้งค่าแบบนี้ จุดประสงค์ของพรอมต์รหัสผ่าน sudo คือเพื่อให้แน่ใจว่าบุคคลที่ออกคำสั่ง sudo นั้นเป็นบุคคลเดียวกันกับที่ล็อกอินและวิธีที่ง่ายที่สุดในการทำเช่นนั้นคือการขอให้ผู้ใช้ที่เข้าสู่ระบบในปัจจุบันพิสูจน์ตัวตนอีกครั้ง

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


3
Sudo ไม่ได้ (ยกเว้นในกรณีที่คุณต้องการถามรหัสผ่านรูทหรือผู้ใช้รายใดรายหนึ่งหรือรหัสผ่านของผู้ใช้เป้าหมาย) แต่ PAM ทำ และ sudo ใช้ PAM
Derobert

1

ข้อกังวลของคุณคือสามารถเปิดเผยรหัสผ่านบัญชีของคุณได้ การแก้ปัญหาคือการไม่ใช้รหัสผ่านการเข้าสู่ระบบในลักษณะที่สามารถเปิดเผยได้ ด้วย ssh รหัสผ่านจะถูกเข้ารหัสบน wire ดังนั้นจึงไม่เป็นปัญหา ผู้คนปิดรหัสผ่านรับรองความถูกต้องด้วย ssh เพื่อป้องกันการโจมตีด้วยรหัสผ่านที่คาดเดาไม่ได้เพื่อป้องกันการรักษาความลับรหัสผ่าน หากคุณใช้รหัสผ่านบัญชีเดียวกันกับสิ่งอื่นใดโปรดตรวจสอบให้แน่ใจว่าคุณกำลังใช้แชนเนลที่ปลอดภัยและเข้ารหัสเพื่อระบุรหัสผ่าน หากคุณกังวลเกี่ยวกับ keylogger หรืออะไรก็ตามหยุดใช้เครื่องที่ไม่น่าเชื่อถือเพื่อเข้าสู่ระบบ

หากใครบางคนสามารถรับรหัสผ่าน ssh ของพวกเขาพวกเขาอาจจะได้รับรหัสผ่าน sudo ทางเลือกอื่นดังนั้นคุณควรสละเวลาในการลงทุนเพื่อให้การเชื่อมต่อของคุณปลอดภัยยิ่งขึ้นกว่าการใช้เวลาเพียงแค่ทำสิ่งต่าง ๆ ให้ยุ่งยาก


0

ฉันไม่สามารถเข้าถึงระบบที่ฉันสามารถทดสอบและหารายละเอียดได้ทันที แต่ฉันมีความคิด:

  • (สมมติว่าบัญชีเข้าสู่ระบบปกติของคุณคือshau)
  • สร้างบัญชีที่สอง: shau2. (ฉันไม่แน่ใจว่าคุณต้องการให้มี UID เหมือนshauกันหรือไม่)
  • กำหนดค่าshau2ให้มีสิทธิ์ sudo ด้วย NOPASSWD
  • su shau2 -c sudo "$@"ตั้งค่านามแฝงหรือเชลล์สคริปต์ที่จะทำ สิ่งนี้ควรถามshau2รหัสผ่านของ หากป้อนอย่างถูกต้องมันจะทำงานsudoเป็นshau2 (ซึ่งไม่ควรถามรหัสผ่าน)
  • ลบshauสิทธิ์ของ sudo

น่าเสียดายที่คุณต้องทำซ้ำสำหรับผู้ใช้ทุกคนที่มีสิทธิ์ sudo


0

ขอบคุณ@ ShâuShắcสำหรับคำตอบ ! โซลูชันนั้นยังใช้งานได้กับLinuxMint 17.1 Cinnamon 32 บิต (ฉันเพิ่งติดตั้งdb-utilแพคเกจเพื่อใช้งานdb_load)

แต่ฉันสับสนมากกับpasswd.dbไฟล์ผลลัพธ์ ฉันทำเช่นเดียวกันในคำตอบของคุณ (แต่ใช้davidและjonesพวกเขาดูสะดุดตามากขึ้น):

# db_load -t hash -T /usr/local/etc/passwd.db
david
jones
^d

แต่ข้อมูลประจำตัวที่ป้อนจะถูกเก็บไว้ในไฟล์แฮชเป็นข้อความธรรมดา:

# grep 'jones.*david'  /usr/local/etc/passwd.db
Binary file /usr/local/etc/passwd.db matches

คุณยังสามารถดูdavidและjonesผ่านmcedit :

ป้อนคำอธิบายรูปภาพที่นี่

ใช่มันเป็นไปได้ที่จะ จำกัด /usr/local/etc/passwd.dbสิทธิ์ของ แต่อย่างไรก็ตามชื่อผู้ใช้และรหัสผ่านที่จัดเก็บในรูปแบบข้อความล้วนไม่ดี


แม้ว่าจะมีรหัสผ่านsudoแยกกันแต่ก็มีช่องโหว่ด้านความปลอดภัยที่อาจเกิดขึ้นได้ (โดยการตั้งค่า distro เริ่มต้น) ดังนั้นรหัสผ่านแยกจึงไม่สามารถใช้ได้กับsu (ดังนั้นจึงเป็นไปได้ที่จะเริ่มเซสชันรูทโดยใช้suและรหัสผ่านเข้าสู่ระบบ) นอกจากนี้ยังไม่เคารพรหัสผ่านแยกต่างหากโดยชุดนโยบาย (เป็นไปได้ที่จะเริ่มSynapticโดยใช้synaptic-pkexecและรหัสผ่านเข้าสู่ระบบจากนั้นลบแพ็คเกจ ... ) ปัญหาเหล่านี้สามารถถูกกำจัดได้โดยการปรับแต่งไฟล์การกำหนดค่าเพิ่มเติม

โดยทั่วไปดูเหมือนว่ารหัสผ่าน sudo ที่ปลอดภัยสามารถทำได้ด้วยความช่วยเหลือของโมดูล PAM ที่กำหนดเองเท่านั้น (บางทีโมดูลดังกล่าวจะเปรียบเทียบรหัสผ่านและการแฮช SHA-512 ที่อ่านจากไฟล์) หรือฟังก์ชัน SELinux

PS: ขออภัยมันควรเป็นความคิดเห็น แต่มันจะเป็นคำตอบเพราะรูปแบบข้อความ ขอบคุณสำหรับความเข้าใจ.

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