วิธีป้องกันผู้ใช้ sudo ไม่ให้รันคำสั่งเฉพาะ


29

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

ฉันต้องการหยุดพวกเขาจากการทำงาน

service NetworkManager restart
service network restart

คำสั่ง

มีวิธีใดบ้างที่ฉันจะบรรลุเป้าหมายนี้?


คุณใช้การกระจายแบบใด ชื่อบริการเฉพาะ distro และฉันไม่รู้ distro ใด ๆ ที่ใช้ชื่อที่คุณมี คุณหมายถึงnetworkingและnetwork-manager? นอกจากนี้ทำไมผู้ใช้ของคุณมีsudoการเข้าถึง? พวกเขาไม่ควรเว้นเสียแต่ว่าคุณต้องการให้พวกเขามีสิทธิพิเศษเต็ม
terdon

@terdon ฉันได้แก้ไขแล้ว ขอขอบคุณ. ฉันไม่สามารถโพสต์ไว้เป็นคำตอบได้เพราะฉันเป็นผู้ใช้ใหม่
shekhar

ใช่คุณสามารถทำได้ ฉันต้องการทราบคำตอบที่คุณพบ
terdon

@terdon แน่ใจ แต่มันบอกว่าฉันต้องรอ 8 ชั่วโมงเพื่อโพสต์คำตอบของฉันเองเพราะฉันไม่มีชื่อเสียงแม้แต่ 10 คน
shekhar

1
อาใช่คุณต้องขออภัยอย่างแน่นอน ฉันเพียงแค่ upvoted คุณมีตัวแทนในขณะนี้ :)
terdon

คำตอบ:


47

การใช้ CmndAlias ALLจะไม่ปลอดภัย

มี 1000 วิธีการที่จะทำงานอยู่โดยไม่ต้องทำservice network restart sudo service network restartนี่คือตัวอย่างของสิ่งที่ผู้ใช้ซนอาจลอง:

$ echo "service network restart" > /tmp/hax
$ chmod a+x /tmp/hax
$ sudo /tmp/hax

หากคุณให้ALLนามแฝงคำสั่งแก่ผู้ใช้แล้วลองสร้างบัญชีดำพวกเขาจะสามารถหาวิธีแก้ไขได้ตลอดเวลา บัญชีดำทุบตีและพวกเขาจะใช้หลาม Blacklist python และพวกเขาจะใช้ Perl Blacklist Perl และพวกเขาจะใช้ PHP ไม่มีใครต้องการมัน!

หากคุณไม่ต้องการให้ใครทำอะไรคุณควรทำอย่างที่โธมัสพูดและสร้างบัญชีขาวของสิ่งที่อนุญาตให้ทำ


การตั้งค่ารายการที่อนุญาตด้วยข้อยกเว้น

ตัวอย่างของบัญชีขาวที่มีข้อยกเว้นสามารถพบได้ที่ด้านล่างของman sudoers:

 pete           HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

The user pete is allowed to change anyone's password except for root on the HPPA
machines.  Note that this assumes passwd(1) does not take multiple user names
on the command line.

(อันที่จริงตัวอย่างนี้จาก manpage ไม่ปลอดภัยและสามารถนำไปใช้ในการเปลี่ยนรหัสผ่านของ root ได้! ดูความคิดเห็นด้านล่างเพื่อดูวิธีการ)

เราสามารถพยายามที่จะปรับตัวเข้ากับที่กับกรณีของคุณที่จะนำเสนอทุกserviceคำสั่งไปยังกลุ่มพนักงาน แต่ไม่รวมservice networkคำสั่งที่คุณกังวล:

%staff ALL =   /usr/sbin/service *,                            \
             ! /usr/sbin/service *network*,                    \
             ! /usr/sbin/service *NetworkManager*

( ALLในตำแหน่งนั้นหมายถึง Host_Alias ​​ไม่ใช่ Cmnd_Alias ​​- สับสนใช่มั้ย)

ผู้ใช้จะไม่สามารถทำงานได้sudo bashหรือsudo teeหรือหรือsudo wget sudo /path/to/malicious_scriptคุณสามารถยกเว้นบัญชีผู้ใช้ของผู้ดูแลระบบของคุณถ้าคุณระมัดระวัง เพียงเจาะจง!

หมายเหตุ: ฉันเพิ่มคำ*ก่อนหน้าnetworkข้างบนในกรณีที่มีการเพิ่มการตั้งค่าสถานะที่ไม่เป็นอันตรายในserviceเครื่องมือในอนาคต สมมติว่ามีการ--verboseเพิ่มการตั้งค่าสถานะในอนาคตจากนั้นผู้ใช้จะสามารถเรียกใช้สิ่งต่อไปนี้:

$ sudo service --verbose network restart

ดังนั้นเราจำเป็นต้อง*ใช้แฟล็กใด ๆ ก่อนชื่อบริการ ข้อเสียเปรียบอย่างหนึ่งคือการทำเช่นนี้อาจปิดกั้นบริการอื่น ๆ ที่คุณไม่ได้สนใจผู้ใช้เช่นบริการที่เรียกว่าsafe-networkหรือnetwork-monitorจะถูกปฏิเสธ


อนุญาตให้ผู้ใช้แก้ไขไฟล์โดยใช้สิทธิ์กลุ่ม

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

วิธีที่ง่ายกว่าและปลอดภัยกว่าคือเปลี่ยนสิทธิ์ของกลุ่มในไฟล์เฉพาะที่คุณต้องการเปิดสิทธิ์การแก้ไข นี่คือตัวอย่างบางส่วน:

### Give steve the ability to edit his nginx config:
$ chgrp steve /etc/nginx/sites-available/steves_dodgy_project
$ chmod g+rw /etc/nginx/sites-available/steves_dodgy_project

### Let all members of the staff group edit the group_website config:
$ chgrp staff /etc/nginx/sites-available/group_website
$ chmod g+rw /etc/nginx/sites-available/group_website

หากคุณต้องการการควบคุมที่ละเอียดยิ่งขึ้น (ตัวอย่างเช่น: การเข้าถึงสำหรับผู้ใช้เพียง 3 คน แต่ไม่ใช่พนักงานทุกคน) คุณสามารถสร้างกลุ่มใหม่โดยใช้addgroupคำสั่งและเพิ่มผู้ใช้เพียงไม่กี่คน


อนุญาตให้ผู้ใช้แก้ไขไฟล์ผ่าน sudo

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

หากคุณต้องการให้สิทธิ์ผู้ใช้ของคุณในการแก้ไขไฟล์เฉพาะคุณสามารถลองใช้rnano:

%staff ALL = /bin/rnano /etc/nginx/sites-available/host

rnanoจะให้พวกเขาแก้ไขไฟล์ที่ระบุเท่านั้น นั่นคือสิ่งสำคัญที่จะป้องกันไม่ให้ผู้ใช้ที่เป็นอันตรายจากการแก้ไขการบริการที่แตกต่างกันพุ่งพรวด (ตัวอย่าง/etc/init.d/urandom) service network restartและการเพิ่มสายไปที่จะทำงาน

แต่น่าเสียดายที่ผมไม่ได้หาวิธีที่จะ จำกัด การrvimพอ (ผู้ใช้ยังสามารถเปิดไฟล์ใด ๆ ที่ใช้:e) nanoดังนั้นเราจะติดอยู่กับ

น่าเสียดายที่การอนุญาตให้ผู้ใช้แก้ไขไฟล์หลายไฟล์ทำได้ยากกว่า ...


ให้ผู้ใช้แก้ไขไฟล์หลาย ๆ ไฟล์ (ยากกว่าที่ควรจะเป็น)

1. วิธีที่ไม่ปลอดภัย

ระวังสัญลักษณ์แทน! หากคุณเสนอความยืดหยุ่นที่มากเกินไป (หรือความยืดหยุ่นใด ๆ ) ก็สามารถนำไปใช้ประโยชน์ได้:

%staff ALL = /bin/rnano /etc/nginx/sites-available/*                # UNSAFE!

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

$ sudo rnano /etc/nginx/sites-available/../../../any/file/on/the/system

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

ฉันหวังว่าสิ่งนี้จะได้ผล แต่ก็ยังไม่ปลอดภัย:

%staff ALL = /bin/rnano /etc/nginx/sites-available/[A-Za-z0-9_-]*   # UNSAFE!

เนื่องจากsudoในปัจจุบันมีเฉพาะรูปแบบแบบกลมที่*จะจับคู่อะไร - มันไม่ใช่ regexp!

(แก้ไข: ฉันได้พิจารณาแล้วว่าคุณสามารถหลีกเลี่ยงสิ่งที่กล่าวมาข้างต้นในสถานการณ์ของคุณได้เนื่องจากไม่มีโฟลเดอร์ย่อยอยู่ข้างใต้sites-availableเราต้องการให้ถ่านหนึ่งตัวถูกจับคู่หลังจากโฟลเดอร์และ/..ควรล้มเหลวหลังจากชื่อไฟล์อย่างไรก็ตามนี่ไม่ใช่ โซลูชันที่ใช้การได้เพราะrnanoยอมรับข้อโต้แย้งหลาย ๆ ข้อและโดยทั่วไปแล้วสิ่งนี้จะยังไม่ปลอดภัยในโฟลเดอร์ที่มีโฟลเดอร์ย่อย!)

แม้ว่าเราจะไม่มีโฟลเดอร์ย่อยและเราไม่รวมสายใด ๆ ที่มี/../กฎที่นำเสนอ*glob ยังสามารถใช้ประโยชน์เพราะrnanoยอมรับข้อโต้แย้งหลาย ๆ (ขี่จักรยานผ่านพวกเขาใน<C-X>และพื้นที่ที่เป็นที่ยอมรับกันอย่างมีความสุขโดย*glob

$ rnano /etc/nginx/sites-available/legal_file /then/any/file/on/the/system

2. กดซองจดหมาย (ไม่ปลอดภัยที่สุด)

แล้วถ้าเราปฏิเสธบรรทัดใด ๆ ที่มีช่องว่างหรือพยายามเข้าถึง/..ล่ะ จากนั้นโซลูชันที่ใช้งานได้ขั้นสุดท้ายอาจเป็นเช่นนี้:

# I tried hard to make this safe, but in the end I failed again.
# Please don't use this unless you are really smart or really stupid.

%staff ALL =   /bin/rnano /etc/nginx/sites-available/*,    \
             ! /bin/rnano */..*,                           \
             ! /bin/rnano /etc/nginx/sites-available/,     \
             ! /bin/rnano */.,                             \
             ! /bin/rnano * *

# CONCLUSION: It is still NOT SAFE if there are any subfolders, due to
# the bug in rnano described below.

เรายอมรับทุกสิ่งที่ "ภายใต้" โฟลเดอร์ แต่เราก็ปฏิเสธการโทรใด ๆrnanoหาก/..หรือ/.หรือถูกส่งผ่านหรือหากโฟลเดอร์ถูกกำหนดเป้าหมายโดยตรง (ในทางเทคนิคแล้วการ/.ยกเว้นทำให้การ/..ยกเว้นซ้ำซ้อน แต่ฉันทิ้งไว้ทั้งสองอย่างเพื่อความชัดเจน)

ฉันพบโฟลเดอร์และต้องการ/.การยกเว้นเนื่องจากไม่เช่นนั้นผู้ใช้สามารถกำหนดเป้าหมายโฟลเดอร์เองได้ ตอนนี้คุณอาจคิดว่าrnanoจะบล็อกหากชี้ไปที่โฟลเดอร์ แต่คุณจะผิด อันที่จริงแล้วเวอร์ชั่นของฉัน (2.2.6-1ubuntu1) เริ่มต้นด้วยคำเตือนเล็กน้อยและไฟล์ว่างเปล่าจากนั้น<C-X>ขอให้ฉันใส่ชื่อไฟล์ใด ๆ ที่ฉันต้องการบันทึกไว้เพื่อเปิดเวกเตอร์การโจมตีใหม่! อย่างน้อยก็ปฏิเสธที่จะเขียนทับไฟล์ที่มีอยู่ (ในการทดสอบเดียวที่ฉันทำ) อย่างไรก็ตามเนื่องจากไม่มีวิธีในการขึ้นบัญชีดำโฟลเดอร์ย่อยด้วย sudo เราต้องสรุปว่าวิธีนี้ไม่ปลอดภัยอีกครั้ง ขออภัยผู้ใช้!

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

3. แนวทางที่ปลอดภัย แต่ จำกัด

Globs ถูก จำกัด มาก - พวกเขาไม่ให้เราจับคู่คลาสของตัวละครหลาย ๆ ครั้ง คุณสามารถแก้ไขไฟล์ได้หลายไฟล์หากชื่อไฟล์ทั้งหมดของคุณมีความยาวเท่ากัน (ในกรณีนี้hostตามด้วยหลักเดียว):

%staff ALL = /bin/rnano /etc/nginx/sites-available/host[0-9]       # SAFE

แต่ถ้าคุณต้องการให้ผู้ใช้สามารถแก้ไขไฟล์ต่าง ๆ ได้คุณอาจต้องระบุไฟล์แต่ละไฟล์อย่างชัดเจน:

%staff ALL = /bin/rnano /etc/nginx/sites-available/hothost    \
             /bin/rnano /etc/nginx/sites-available/coldhost   \    # SAFE
             /bin/rnano /etc/nginx/sites-available/wethost    \
             /bin/rnano /etc/nginx/sites-available/steves_dodgy_project

อย่าถูกล่อลวงให้ใช้งาน*ณ จุดใด ๆ ดูหัวข้อที่ 1 และ 2 ข้างต้นเพราะเหตุใด! ข้อควรจำ: สลิปขนาดเล็กหนึ่งอันสามารถประนีประนอมกับบัญชี superuser ทั้งหมดและทั้งระบบ

4. เขียนตัวตรวจสอบอาร์กิวเมนต์ของคุณเอง (ความปลอดภัยเป็นความรับผิดชอบของคุณแล้ว)

ฉันหวังว่าพวกเขาจะเพิ่มการสนับสนุน regexp sudoในอนาคต มันสามารถแก้ปัญหาได้มากมายหากใช้อย่างถูกต้อง แต่เราอาจต้องการความสามารถในการตรวจสอบคุณสมบัติของอาร์กิวเมนต์ (เพื่ออนุญาตเฉพาะไฟล์โฟลเดอร์เท่านั้นหรือเฉพาะธงบางอย่าง)

แต่มีอีกทางเลือกหนึ่งในการสร้างความยืดหยุ่นใน sudo ผ่านเจ้าชู้:

%staff ALL = /root/bin/staffedit *

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


5
คำตอบนี้ใช้เวลานาน แต่ในที่สุดฉันคิดว่าฉันเข้าใจว่า sudo ทำงานอย่างไร ฉันยอมแพ้ในหลาย ๆ ครั้งในอดีตการค้นหาALL=(ALL:ALL) ALLขาดความหมายเกินไป แต่ฉันคิดเสมอว่าจะมีเครื่องตรวจสอบอาร์กิวเมนต์ที่เหมาะสม ... ฉันคิดผิด มัน จำกัด มากจริงๆ แม้แต่การยกเว้นรูท passwd ที่เสนอใน man-page ก็สามารถแตกได้ด้วยอาร์กิวเมนต์บรรทัดคำสั่งธรรมดา, sudo passwd -q root. ผู้เขียน sudo ก็ทำรายการ [ทางเลือกบางอย่าง] (sudo.ws/sudo/other.html) บนเว็บไซต์ของพวกเขา ฉันหวังว่าพวกเขาจะเพิ่มการสนับสนุน regexp ในอนาคต
joeytwiddle

คุณใช้เฉพาะrnanoในคำอธิบายของคุณที่นี่เพราะเป็นรุ่นนาโนที่ไม่มีฟังก์ชั่น 'บันทึกเป็น' หรือไม่? ฉันไม่คุ้นเคยกับโปรแกรม
Shadur

ใช่. ถ้าเราดูแลเกี่ยวกับการรักษาความปลอดภัย, บรรณาธิการควรเพียงแก้ไขไฟล์ที่ระบุและไม่ควรจะสามารถเปิดเปลือก สำหรับข้อมูล$ man nanoแล้ว/-R<Enter>
joeytwiddle

การแก้ไข: หากต้องการทำลายตัวอย่าง pete -qต้องมาภายหลัง: sudo passwd root -q. ตัวอย่าง pete *root*สามารถแข็งโดยการยกเว้น
joeytwiddle

พิจารณาใช้เพื่อเปิดใช้งานไฟล์มีการแก้ไขได้อย่างปลอดภัยด้วยsudoedit sudo
Totor

5

ก่อนเปิด sudoers sudo visudoไฟล์ด้วย เพิ่มuser ALL=!/usr/sbin/serviceจะ IIRC ไม่อนุญาตคำสั่งสำหรับผู้ใช้serviceuser

แหล่งที่มา: http://nixcraft.com/showthread.php/15132-Sudo-Exclude-Commands-And-Disable-sudo-su-Bash-Shell


นี่จะหยุดทำงานบริการอื่น ๆ ด้วยและฉันก็ไม่ต้องการมัน ขอบคุณสำหรับคำตอบ. :)
shekhar

ในขณะที่คำตอบของคุณไม่ได้ช่วยฉันอย่างแน่นอน แต่มันช่วยในการขุดทางออกขอบคุณ แต่คุณรู้ว่าจะให้ upvote หรือโพสต์คำตอบการทำงานของฉันฉันไม่มีชื่อเสียงเพียงพอ ฉันจะขอบคุณอย่างแน่นอนเมื่อฉัน ขอขอบคุณ.
shekhar

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

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

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

5

ฉันพบวิธีแก้ปัญหาแล้ว

ฉันได้เปิดเทอร์มินัลและเปลี่ยนเป็นผู้ใช้รูทด้วยsu -จากนั้นฉันก็พิมพ์visudoเพื่อแก้ไข

จากนั้นในตอนท้ายฉันก็เขียนเหมือน

user ALL=!/etc/init.d/NetworkManager restart
user ALL=!/etc/init.d/network restart

จากนั้นฉันได้บันทึก & ปิดและรีสตาร์ทด้วย

ตอนนี้ถ้าฉันพิมพ์เป็นservice network restartหรือservice NetworkManager restartไม่อนุญาตให้ฉันและให้ข้อผิดพลาดเช่น

Sorry user is not allowed to execute '/sbin/service NetowkrManager restart' as root on localhost.localdomain

และในทำนองเดียวกันสำหรับservice network restartคำสั่งด้วย


12
สิ่งนี้จะใช้ได้กับผู้ใช้ที่ไม่มีประสบการณ์และไม่เป็นอันตราย แต่ก็เป็นเรื่องง่ายที่จะหลีกเลี่ยงข้อ จำกัด ของ sudo (เช่นsudo cp -p /etc/init.d/network /etc/init.d/network-not-in-sudoจากนั้นsudo /etc/init.d/network-not-in-sudo restart) นี่คือเหตุผลที่ปลอดภัยกว่าที่จะสร้างการรวมแทนการแยกในไฟล์ sudoers เช่นระบุว่าบริการใดที่พวกเขาได้รับอนุญาตให้โต้ตอบ
โทมัส

ทุกอย่างที่ 'บริการเครือข่ายเริ่มต้นใหม่' ทำคุณสามารถทำกับคำสั่งอื่น ๆ เช่นคำสั่งในสคริปต์เครือข่าย init.d ฉันจะไม่ลองรายการพวกเขาที่นี่ แต่ถ้าคุณต้องการเช่นเพื่อป้องกันการแก้ไขสถานะอินเตอร์เฟซจริง ๆ แล้วนโยบาย SELinux ดูเหมือนว่าฉันจะเป็นไปได้ มันเป็นหัวข้อที่ซับซ้อน แต่เมื่อบัญชีขาวมีข้อ จำกัด มากเกินไปหรือมีภาระมากเกินไปและบัญชีดำไม่เพียงพอก็อาจเป็นตัวเลือกที่ดีที่สุดของคุณ มันนำมาใช้ในเคอร์เนลและช่วยให้คุณสามารถ จำกัด การเข้าถึงอินเทอร์เฟซเครือข่าย (และทรัพยากรอื่น ๆ ) แม้กับผู้ใช้ sudo'd
Bob Kerns

ถ้าเป็นไปได้ด้วย SELinux แล้วมันจะยินดีมากขึ้น @BobKerns ขอบคุณ ฉันจะพยายามอย่างนั้น
shekhar

3

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

joe@box:~$ sudo bash root@box:~# service network restart

หรือคำสั่งสนุก ๆ ที่พวกเขาสามารถใช้เพื่อหลีกเลี่ยงข้อ จำกัด ของคุณในไฟล์ sudoers:

sudo visudo

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


ใช่. หนึ่งควรหลีกเลี่ยงคำสั่งที่สามารถวางไข่เปลือกจากภายใน
Bonsi Scott

1
ปัญหาคือมันไม่ใช่คำสั่งที่คุณต้องการป้องกัน แต่สถานะของวัตถุเคอร์เนลเช่นตารางเส้นทาง, อินเตอร์เฟส ฯลฯ - ไม่ว่าจะใช้คำสั่งใด (หรือการเรียกระบบ) และคุณต้องการปกป้องจากผู้ใช้รูทบางคน แต่ไม่ใช่ทั้งหมด SELinux ได้รับการออกแบบโดยใช้สถานการณ์จำลองนี้ แต่ก่อนอื่นฉันจะเริ่มด้วยการตรวจสอบว่าทำไมผู้ใช้เหล่านี้เข้าถึง sudo ได้บ้าง หากพวกเขาต้องการทำสิ่งที่เฉพาะเจาะจงเพียงเล็กน้อยการดำเนินการรายการที่อนุญาตพิเศษใน sudoers อาจเป็นสิ่งที่คุณต้องการ
Bob Kerns

2

ใช้ firejail เพื่อ จำกัด ผู้ใช้ด้วยกล่องทราย

https://github.com/netblue30/firejail/

ตั้งค่า firejail เป็น shell แทนที่จะเป็น bash ใน / etc / passwd สำหรับผู้ใช้ทุกคนที่คุณต้องการ จำกัด มันใช้งานง่ายมากและมีเอกสารที่ดี

ตัวอย่าง:

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