จะรันคำสั่ง sudo โดยไม่มีรหัสผ่านได้อย่างไร


235

อย่างไรubuntuผู้ใช้บนภาพ AWS สำหรับอูบุนตูเซิร์ฟเวอร์ 12.04 มี passwordless sudoสำหรับคำสั่งทั้งหมดเมื่อมีการกำหนดค่าสำหรับมันไม่มีใน/etc/sudoers?

ฉันใช้เซิร์ฟเวอร์ Ubuntu 12.04 ใน Amazon ฉันต้องการเพิ่มผู้ใช้ใหม่ที่มีพฤติกรรมเหมือนกับผู้ใช้ Ubuntu เริ่มต้น โดยเฉพาะฉันต้องการรหัสผ่านsudoสำหรับผู้ใช้ใหม่นี้

ดังนั้นฉันจึงได้เพิ่มผู้ใช้ใหม่และไปแก้ไข/etc/sudoers(ใช้ visudo แน่นอน) จากการอ่านไฟล์นั้นดูเหมือนว่าubuntuผู้ใช้เริ่มต้นได้รับมันเป็นรหัสผ่านsudoจากการเป็นสมาชิกของadminกลุ่ม ดังนั้นฉันจึงเพิ่มผู้ใช้ใหม่ของฉันลงไป ซึ่งไม่ได้ผล แล้วฉันพยายามเพิ่มคำสั่งไปยังNOPASSWD sudoersซึ่งยังใช้งานไม่ได้

อย่างไรก็ตามตอนนี้ฉันแค่อยากรู้ อย่างไรubuntuผู้ใช้จะได้รับสิทธิพิเศษในการ passwordless /etc/sudoersถ้าพวกเขาจะไม่ได้กำหนดไว้ใน กลไกที่ช่วยให้สิ่งนี้คืออะไร?


คำตอบ:


332

โอเคฉันได้ค้นพบคำตอบแล้วและอาจนำมาไว้ที่นี่เพื่อความสมบูรณ์ ในตอนท้ายของ/etc/sudoersสิ่งที่ฉันคิดว่าเป็นเพียงความคิดเห็น:

#includedir /etc/sudoers.d

อย่างไรก็ตามสิ่งนี้รวมถึงเนื้อหาของไดเรกทอรีนั้นด้วย /etc/sudoers.d/90-cloudimg-ubuntuภายในซึ่งเป็นไฟล์ ซึ่งมีเนื้อหาที่คาดหวัง

# ubuntu user is default user in cloud-images.
# It needs passwordless sudo functionality.
ubuntu ALL=(ALL) NOPASSWD:ALL

ดังนั้นนี่คือที่ตั้งค่า sudo สำหรับผู้ใช้ ubuntu ที่เป็นค่าเริ่มต้น

คุณควรแก้ไขไฟล์นี้โดยใช้ visudo คำสั่งต่อไปนี้จะช่วยให้คุณแก้ไขไฟล์ที่ถูกต้องด้วย visudo

sudo visudo -f /etc/sudoers.d/90-cloudimg-ubuntu

และเพิ่มบรรทัดที่ชอบ:

aychedee ALL=(ALL) NOPASSWD:ALL

ในตอนท้าย


4
ฉันค่อนข้างมั่นใจว่าฉันต้องรีบูตเครื่องใหม่
aychedee

2
จะใช้กฎ sudo ใหม่สำหรับผู้ใช้ที่เข้าสู่ระบบใหม่ทุกครั้ง - ดังนั้นคุณต้องลงชื่อเข้าใช้อีกครั้งอย่างน้อย
bluszcz

32
'sudo service sudo restart' ทำงานได้แล้ว :)
Laice

4
ในรุ่นที่ใหม่กว่า (เช่น 14.04) ไฟล์ที่รวมอยู่คือ/etc/sudoers.d/90-cloud-init-users(เพื่อแก้ไข .. sudo visudo -f /etc/sudoers.d/90-cloud-init-users) แม้ว่ามันจะสะอาดกว่าในการสร้างไฟล์เพิ่มเติมนอกเหนือจากการแก้ไขไฟล์ที่สร้างขึ้น โปรดทราบว่าไฟล์ที่มี.หรือลงท้ายด้วย~จะไม่ถูกรวมไว้
Molomby

2
@ Phil_1984_ เป็นไปได้มากว่ามันถูกเพิ่มเป็นความคิดเห็นเพื่อให้เข้ากันได้กับ sudo รุ่นอื่น (มาตรฐาน?) ซึ่งไม่อนุญาตให้รวมถึง แต่จะไม่ถูกสะดุดโดยความคิดเห็นแปลก ๆ (มาตรฐานนั้นยาก! ;-)
jpaugh

94

ฉันพบว่าสิ่งที่ตรงไปตรงมาที่สุดที่ต้องทำเพื่อให้ง่ายต่อการทำซ้ำพฤติกรรมนี้ในหลาย ๆ เซิร์ฟเวอร์มีดังต่อไปนี้:

sudo visudo

เปลี่ยนบรรทัดนี้:

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) ALL

ถึงบรรทัดนี้:

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL

และย้ายไปอยู่ใต้บรรทัดนี้:

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

ตอนนี้คุณควรมีสิ่งนี้:

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

สำหรับผู้ใช้ทุกคนที่ต้องการการเข้าถึง sudo ด้วยรหัสผ่าน :

sudo adduser <user> sudo

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

sudo adduser <user> admin

และสุดท้ายเรียกใช้สิ่งนี้:

sudo service sudo restart

และนั่นมัน!

แก้ไข:คุณอาจต้องเพิ่มกลุ่มผู้ดูแลระบบเนื่องจากฉันไม่คิดว่ามีอยู่ตามค่าเริ่มต้น

sudo groupadd admin

คุณยังสามารถเพิ่มubuntuผู้ใช้AWS เริ่มต้นให้กับadminกลุ่มผ่านคำสั่งนี้:

sudo usermod ubuntu -g admin

หมายเหตุ: ตามที่@hataกล่าวไว้คุณอาจต้องใช้admเป็นชื่อกลุ่มผู้ดูแลระบบของคุณทั้งนี้ขึ้นอยู่กับเวอร์ชันของ Ubuntu ที่กำลังใช้งานอยู่


3
หมายเหตุถึงตัวเอง: เป็นแบบแผนในการย้ายสิทธิ์ที่ จำกัด น้อยลงในสแต็ก แต่ไม่ทำมันจะไม่ส่งผลกระทบต่อการทำงาน
poweratom

2
ตามที่ jiminikiz อธิบายฉันต้องวาง% adminหลังจาก% sudoบน Ubuntu GNOME 16.04 LTS ของฉัน Plus, id กลุ่มผู้บริหารเป็นสิ่งไม่ดูแลระบบแต่ADMบน Ubuntu ของฉัน ไม่จำเป็นต้องรีบูต
hata

5

ฉันจะสร้างไฟล์ของตัวเองภายใต้ไดเร็กทอรี /etc/sudoers.d/ - ไฟล์ที่สร้างโดย Amazon Cloud อาจถูกเขียนทับในกรณีที่มีการอัพเดต หลังจากสร้างไฟล์ของคุณใน /etc/sudoers.d เพิ่มรายการนี้

<your user name> ALL=(ALL) NOPASSWD:ALL

รีบูทระบบและจะใช้งานได้


2

คำตอบสั้น ๆ โดยไม่ใช้โปรแกรมแก้ไขใด ๆ (ทดสอบกับ bash มีความเสี่ยงสูงที่จะเรียกใช้งานบนโฮสต์ระยะไกล)

กำหนดค่า sudo ให้ทำงานโดยไม่มีรหัสผ่านสำหรับผู้ใช้ปัจจุบัน:

echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers

ตรวจสอบการแก้ไขด้วย:

sudo visudo -c

ตรวจสอบว่าคุณสามารถใช้ sudo โดยไม่ต้องใช้รหัสผ่าน:

sudo cat /etc/sudoers | grep "$USER"

... หรือลองกับ:

sudo <anything>

21
นี่เป็นคำแนะนำที่ค่อนข้างอันตราย ... คัดลอกและวางสิ่งนี้ผิดและคุณจะล็อคตัวเองออกจากเซิร์ฟเวอร์ของคุณเอง ดังนั้นคำแนะนำในการใช้ visudo ตรวจสอบว่าไวยากรณ์ถูกต้องก่อนบันทึกลงดิสก์ ดังนั้นสำหรับทุกคนที่ต้องการใช้สิ่งนี้ อย่าทำบนเซิร์ฟเวอร์ระยะไกลที่คุณสนใจ คุณอาจต้องการรวมคำเตือนไว้ในคำตอบของคุณ
aychedee

8
การไม่ใช้ visudo เป็นความคิดที่น่ากลัว เชื่อฉันเถอะ
trognanders

1
IMHO การคัดลอกวางปลอดภัยกว่าการแก้ไขด้วยตนเอง การทำให้เข้าใจง่ายเล็กน้อย:echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
theartofrain

4
@theartofrain - ปกติฉันเห็นด้วย แต่visudoเป็นเรื่องดีโดยเฉพาะเกี่ยวกับการไม่อนุญาตให้คุณทำลายไฟล์ sudoers จึงไม่ล็อคคุณออกจากเครื่อง (หรืออย่างน้อย sudo)
Jon V

3
@JonV คุณจะสูญเสียสิทธิผู้ดูแลระบบผ่านvisudoเกินไป แต่มักจะไม่ได้โดยอุบัติเหตุเพราะvisudoเพียงช่วยประหยัดการเปลี่ยนแปลงที่ดีขึ้นตามไวยากรณ์สำหรับไฟล์ sudoers ความผิดพลาดส่วนใหญ่นั้นผิดทางไวยากรณ์ดังนั้นจึงไม่ก่อให้เกิดอันตรายใดvisudoๆ หาก/etc/sudoersไฟล์/etc/sudoers.d นั้นมีรูปแบบไม่ดีsudoปฏิเสธที่จะยกระดับสิทธิ์สำหรับทุกคนในฐานะมาตรการรักษาความปลอดภัยซึ่งเป็นสาเหตุที่ไม่ใช้visudoเป็นอันตราย (แม้ว่าบางครั้งpkexecสามารถแก้ไขได้โดยไม่ต้องรีบูท)
Eliah Kagan

0

นี่คือวิธีที่ฉันใช้ผู้ใช้ที่ไม่ใช่รูทและไม่มีรหัสผ่านในอิมเมจ Docker ชั่วคราวสำหรับใช้ใน CICD ไปป์ไลน์:

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
    echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.