ป้องกัน sudo ไม่ให้ใส่รหัสผ่านเมื่อเรียกใช้คำสั่งที่ไม่ได้รับอนุญาต


15

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

นี่คือตัวอย่างของไฟล์ sudoers ของฉัน:

%mygroup ALL=(ALL) NOPASSWD:/usr/local/bin/myscript.sh *

ตัวอย่างเมื่อพวกเขาเรียกใช้สคริปต์ที่ไม่ถูกต้อง:

# sudo /usr/local/bin/otherscript.sh
[sudo] password for user:
Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>.

ผลลัพธ์ที่ต้องการ:

Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>. Please check the command and try again.

สังเกตการขาดพรอมต์รหัสผ่าน

ฉัน google-Fu ล้มเหลวฉันและจะให้ผลลัพธ์ในไม่ได้ขอรหัสผ่านเมื่อผู้ใช้จะได้รับอนุญาตให้ใช้คำสั่ง


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

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

1
@coteyr ที่ใช้งานไฟล์ไบนารีด้วยsudoนั้นใหญ่พอ ๆ กับปัญหาถ้าผู้ใช้มีสิทธิ์เขียนไฟล์เหล่านี้
Dmitry Grigoryev

1
@CarlWitthoft นั่นเป็นเหตุผลว่าทำไมคุณใช้พา ธ สัมบูรณ์เพื่อระบุโปรแกรมที่ได้รับอนุญาตใน sudoers
Dmitry Grigoryev

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

คำตอบ:


25

จากการอ่านอย่างรวดเร็วของ sudo(8)

   -n          The -n (non-interactive) option prevents sudo from
               prompting the user for a password.  If a password is
               required for the command to run, sudo will display an error
               message and exit.

และสำหรับผู้สงสัย:

# grep jdoe /etc/sudoers
jdoe    ALL=(ALL) NOPASSWD: /bin/echo
#

ผ่านการทดสอบแล้ว:

% sudo echo allowed
allowed
% sudo -n ed             
sudo: a password is required
% sudo ed               

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Password:

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


จริง ฉันจะใส่สิ่งที่ชอบalias sudo="$(which sudo) -n"ใน / etc / bashrc จากนั้นใช้sudo(พฤติกรรมปรับ) หรือcommand sudo(พฤติกรรมเริ่มต้น) ตามที่ต้องการ
CVn

7

สิ่งหนึ่งที่ใช้งานได้สำหรับฉัน (Sudo เวอร์ชั่น 1.8.17p1) แต่ตอบสนองเพียงส่วนหนึ่งของปัญหาของคุณคือการกำหนดจำนวนรหัสผ่านพยายามเป็น 0

Defaults:%mygroup passwd_tries = 0

สิ่งนี้ทำให้ sudo exit พร้อมโค้ด 1 เมื่อลองใช้คำสั่งที่ต้องการรหัสผ่าน อย่างไรก็ตามจะไม่สร้างข้อความแสดงข้อผิดพลาดใด ๆ


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

2

คุณไม่สามารถ.

ไม่มีวิธีที่จะบอกได้ว่าคุณเป็นใครจนกว่าคุณจะได้รับการรับรองความถูกต้องและโดยค่าเริ่มต้นคุณไม่สามารถรับรองความถูกต้องโดยไม่มีรหัสผ่าน

คุณสามารถเปลี่ยนการรับรองความถูกต้องเพื่อใช้คีย์ USB สแกนลายนิ้วมือการรับรองความถูกต้องของเสียงการจดจำใบหน้าหรือสิ่งอื่น ๆ แต่จุดนี้เหมือนกัน

คุณไม่สามารถรับรองความถูกต้องโดยไม่ต้องพิสูจน์ตัวตนและก่อนที่จะรับรองความถูกต้อง sudo ไม่มีธุรกิจที่บอกคุณว่าคุณสามารถหรือไม่สามารถทำงานได้


2
การพิมพ์รหัสผ่านของคุณเมื่อคุณเรียกใช้ sudo นั้นไม่ใช่การระบุตัวตน (“ บอกว่าคุณคือใคร”) Sudo รู้ว่าคุณคือใคร การพิมพ์รหัสผ่านของคุณคือการยืนยันการมีอยู่
Gilles 'หยุดความชั่วร้าย' ใน

ฉันพิจารณาการยืนยันตัวตนว่าเป็น "การรับรองความถูกต้อง" เช่นเดียวกับการรับรองความถูกต้องแล้วการอนุญาต
coteyr

2
คำตอบบอกว่า "การรับรองความถูกต้อง" ไม่ใช่ "ตัวตน" ในขณะที่ sudo รู้ว่าคุณเป็นใครโดยอ้างอิงจากผู้ใช้ที่ล็อกอินในเทอร์มินัลนั้น แต่ไม่รู้ว่าคุณเป็นใครจนกว่าคุณจะรับรองความถูกต้องของข้อมูลประจำตัวนั้น
Dave Sherohman

2

@StrongBad แสดงความคิดเห็นที่สมควรได้รับคำตอบ:

ฉันคิดว่าทางออกที่ดีที่สุดคือการเขียนสคริปต์ตัวตัดคำที่เรียกsudoใช้พารามิเตอร์ที่ถูกต้องเสมอ (รวมถึง-n)

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


1

สิ่งนี้เป็นไปไม่ได้ วิธีเดียวคือการเปลี่ยนรหัสต้นฉบับและรวบรวมทางแยกของคุณเองsudo


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