คุณสามารถเรียกใช้sudo โดยไม่ต้องใส่รหัสผ่านได้โดยการเพิ่มNOPASSWDกฎลงในนโยบาย sudoers วิธีที่ปลอดภัยที่สุดคืออนุญาตเฉพาะคำสั่งการดูแลระบบที่คุณต้องการใช้จริงๆ แทนที่จะปิดใช้งานการขอรหัสผ่านสำหรับทุกคำสั่ง sudo
ก่อนที่จะเปลี่ยนแปลงอะไร โปรดจำไว้ว่าการตั้งค่านี้ทำอะไร: บุคคลหรือสิ่งใดก็ตามที่ควบคุมบัญชีล็อกอินของคุณได้ อาจสามารถเรียกใช้คำสั่งที่ได้รับอนุญาตในฐานะผู้ใช้ root โดยไม่ต้องผ่านขั้นตอนการตรวจสอบสิทธิ์เพิ่มเติมคู่มือsudoersNOPASSWDระบุว่าแท็กนี้จะลบการตรวจสอบสิทธิ์สำหรับคำสั่งที่ตรงกัน
เหตุใด sudo -s จึงไม่ใช่เมธอด sudo ที่ไม่ต้องใช้รหัสผ่าน
คำแนะนำเก่าๆ ที่ให้ลองใช้sudo -ssudo นั้น จริงๆ แล้วไม่ได้ตั้งค่าให้ใช้งาน sudo โดยไม่ต้องใช้รหัสผ่าน-sตัวเลือกนี้จะเริ่มต้นเชลล์ภายใต้ sudo แต่กฎของ sudo อาจยังคงกำหนดให้คุณต้องยืนยันตัวตนก่อน นอกจากนี้ คุณอาจเห็นคำสั่งหลายคำสั่งทำงานโดยไม่ต้องมีการแจ้งเตือนอีกครั้ง เพราะโดยปกติ sudo จะแคชการยืนยันตัวตนที่สำเร็จไว้ในช่วงเวลาสั้นๆ ซึ่งแตกต่างจากNOPASSWDกฎ ถาวร
เรียกใช้คำสั่ง sudo เฉพาะโดยไม่ต้องใส่รหัสผ่าน
ตัวอย่างนี้แสดงวิธีalexการรีสตาร์ท Nginx โดยไม่ต้องใช้รหัสผ่าน โปรดแทนที่ชื่อผู้ใช้ คำสั่ง และอาร์กิวเมนต์ด้วยค่าที่ตรงกับระบบของคุณ
1. ยืนยันชื่อผู้ใช้และเส้นทางคำสั่งของคุณ
เรียกใช้คำสั่งต่อไปนี้ในฐานะผู้ใช้ปกติของคุณ:
whoami
command -v systemctl
คำสั่งที่สองอาจส่งค่ากลับมาเป็น/usr/bin/systemctl. ใช้เส้นทางที่ระบบของคุณรายงาน กฎของ Sudoers ควรระบุคำสั่งโดยใช้เส้นทางแบบเต็ม
ตรวจสอบชื่อบัญชีและเส้นทางแบบเต็มของคำสั่งก่อนเขียนกฎ sudoers
2. สร้างไฟล์ drop-in ของ sudoers โดยเฉพาะ
แทนที่จะแก้ไข/etc/sudoersโดยตรง ให้ใช้visudoไฟล์ในรูปแบบ/etc/sudoers.d:
sudo visudo -f /etc/sudoers.d/alex-nopasswd
โดยปกติคุณจะต้องป้อนรหัสผ่านในขั้นตอนการตั้งค่านี้visudoแนะนำให้ใช้ `visudo` เพราะจะตรวจสอบไวยากรณ์ก่อนยอมรับการเปลี่ยนแปลงคู่มือ visudo ของ Ubuntuยังระบุด้วยว่า ` visudovisudo` จะล็อกไฟล์ระหว่างการแก้ไขและตรวจสอบข้อผิดพลาดในการแยกวิเคราะห์
ให้เปิดไฟล์ sudoers drop-in แยกต่างหากvisudoแทนที่จะแก้ไขไฟล์นโยบายหลักด้วยโปรแกรมแก้ไขข้อความทั่วไป
3. เพิ่มกฎ NOPASSWD ที่แคบที่สุดเท่าที่คุณต้องการ
สำหรับตัวอย่างการรีสตาร์ท Nginx ให้เพิ่ม:
alex ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
กฎนี้อนุญาตให้เรียกใช้คำสั่งนั้นพร้อมอาร์กิวเมนต์ที่ระบุเท่านั้นในฐานะผู้ใช้ root โดยไม่ต้องมีการตรวจสอบสิทธิ์ หากต้องการอนุญาตคำสั่งเฉพาะหลายคำสั่ง ให้คั่นคำสั่งด้วยเครื่องหมายจุลภาค
หากคุณต้องการให้คำสั่ง sudo ทุกคำสั่งสำหรับผู้ใช้รายใดรายหนึ่งไม่ต้องผ่านการตรวจสอบสิทธิ์ กฎโดยทั่วไปคือ:
alex ALL=(ALL:ALL) NOPASSWD: ALL
วิธีนี้มีความปลอดภัยน้อยกว่ามาก และแทบจะไม่ใช่ตัวเลือกที่ดีที่สุดสำหรับเวิร์กสเตชันหรือระบบที่ใช้งานร่วมกัน เซสชันของผู้ใช้ที่ถูกบุกรุกจะสามารถเข้าถึงสิทธิ์ระดับรูทได้อย่างไม่จำกัดโดยตรง
กฎเฉพาะคำสั่งนั้นปลอดภัยกว่าการอนุญาตโดยNOPASSWD: ALLทั่วไป
4. ตรวจสอบและทดสอบกฎ
หลังจากบันทึกและออกจากโปรแกรมแก้ไขแล้ว โปรดตรวจสอบนโยบาย sudoers ฉบับเต็ม:
sudo visudo -c
อย่าข้ามขั้นตอนการตรวจสอบนี้visudoเอกสารระบุว่านโยบาย sudoers จะถูกประเมินโดยรวม ดังนั้นการตรวจสอบการกำหนดค่าทั้งหมดจะช่วยตรวจจับปัญหาที่อาจเกี่ยวข้องกับไฟล์ที่รวมอยู่ด้วย
จากนั้นให้ยกเลิกสิทธิ์การเข้าถึง sudo ที่แคชไว้ และทดสอบโดยไม่ต้องมีการโต้ตอบใดๆ:
sudo -k
sudo -n /usr/bin/systemctl restart nginx
ตัวเลือก นี้-nบอกให้ sudo ไม่ต้องถามรหัสผ่าน หากตรงตามกฎ คำสั่งจะทำงานโดยไม่ต้องถามรหัสผ่าน หากยังคงต้องการการตรวจสอบสิทธิ์ sudo จะออกจากโปรแกรมพร้อมแสดงข้อผิดพลาดแทนที่จะรอรับข้อมูลป้อนเข้า ตัวเลือกนี้มีsudo -nประโยชน์อย่างยิ่งสำหรับสคริปต์ที่ไม่ควรค้างอยู่ที่หน้าจอขอรหัสผ่าน
ตรวจสอบความถูกต้องของนโยบาย ล้างข้อมูลประจำตัวที่แคชไว้ และใช้sudo -nเพื่อยืนยันว่าคำสั่งนั้นไม่จำเป็นต้องใช้รหัสผ่านอีกต่อไปแล้ว
การแก้ไขปัญหา sudo แบบไม่ต้องใช้รหัสผ่าน
- คำสั่งนี้ยังคงขอรหัสผ่าน:โปรดตรวจสอบให้แน่ใจว่าชื่อผู้ใช้ เส้นทางคำสั่ง และอาร์กิวเมนต์ตรงกับรายการใน sudoers ทุกประการ
- คำสั่งนี้ไม่ได้รับอนุญาต:กรุณาเรียกใช้คำสั่ง
sudo -lเพื่อตรวจสอบสิทธิ์ที่กำหนดให้กับบัญชีของคุณ
- ดูเหมือนว่าการแทรกไฟล์จะถูกละเลย:ให้ใช้ชื่อไฟล์ที่เรียบง่าย เช่น
alex-nopasswd. การตั้งค่า sudoers บางอย่างจะไม่สนใจไฟล์ใน/etc/sudoers.dที่มีชื่อไฟล์ประกอบด้วยจุดหรือลงท้ายด้วยคำต่อท้ายแบบเดียวกับไฟล์สำรองข้อมูล
- คุณต้องยกเลิกการเปลี่ยนแปลง:เปิด drop-in อีกครั้งด้วย
sudo visudo -f /etc/sudoers.d/alex-nopasswdลบหรือจำกัดขอบเขตของกฎ บันทึก และเรียกใช้sudo visudo -cอีกครั้ง
แนวปฏิบัติที่ดีที่สุด
ควรใช้ sudo แบบไม่ต้องใส่รหัสผ่านเฉพาะเมื่อมีความจำเป็นอย่างแท้จริง เช่น การดำเนินการกับบริการที่มีการควบคุมอย่างเข้มงวด หรือภารกิจอัตโนมัติ ควรระบุเส้นทางคำสั่งและอาร์กิวเมนต์อย่างแม่นยำ หลีกเลี่ยงNOPASSWD: ALLการใส่รหัสผ่านหากเป็นไปได้ และควรตั้งค่ากฎ sudoers ให้เล็กที่สุดเท่าที่งานจะเอื้ออำนวย วิธีนี้จะช่วยรักษาการป้องกันส่วนใหญ่ของ sudo ในขณะที่ยังคงกำจัดข้อความแจ้งให้ใส่รหัสผ่านเมื่อจำเป็นอย่างแท้จริง