ใช้ find อย่างปลอดภัยด้วย sudo


10

บนเซิร์ฟเวอร์ Linux ฉันต้องลบสิทธิ์การใช้งานรูทออกจากกลุ่มผู้ใช้ แต่ผู้ใช้เหล่านั้นมีเหตุผลอันชอบด้วยกฎหมายที่จะสามารถใช้ยูทิลิตี "ค้นหา" เพื่อค้นหาไฟล์ตามชื่อไฟล์วันที่แก้ไขและเมตาดาต้าอื่น ๆ

บนเซิร์ฟเวอร์ชื่อไฟล์ไม่สำคัญ แต่เนื้อหาไฟล์อาจเป็น

ฉันต้องการใช้ sudo เพื่อให้ผู้ใช้สามารถค้นหาไฟล์ได้ทุกที่บนเซิร์ฟเวอร์ ยูทิลิตี "find" นั้นยอดเยี่ยม แต่มันช่วยให้เกิดผลข้างเคียงทุกชนิดเช่นการใช้ "-exec" เพื่อวางคำสั่งโดยพลการ

ฉันสามารถfindทำงานกับข้อ จำกัด ของฉันได้หรือไม่?


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

2
ไม่มีใครบังคับให้คุณมีส่วนร่วมในคำถาม ฉันคิดว่าหนึ่งในจุดประสงค์ของ Server Fault คือทำหน้าที่เป็นฟอรัมสำหรับสถานการณ์ที่ผิดปกติ
Troels Arvin

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

คำตอบ:


19

สิ่งที่เกี่ยวกับการค้นหา ?

หาอ่านฐานข้อมูลอย่างน้อยหนึ่งรายการที่เตรียมโดย updatedb (8) และเขียนชื่อไฟล์ที่ตรงกันอย่างน้อยหนึ่งในรูปแบบไปยังเอาต์พุตมาตรฐานหนึ่งรายการต่อบรรทัด ถ้า --regex ไม่ได้ระบุรูปแบบสามารถมีตัวอักษรกลม หากรูปแบบใด ๆ มีไม่มีอักขระ globbing ค้นหาพฤติกรรมเช่นถ้ารูปแบบมีรูปแบบ

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

หรืออาจจะslocate :

Secure Locate เป็นวิธีที่ปลอดภัยในการสร้างดัชนีและค้นหาไฟล์ในระบบของคุณอย่างรวดเร็ว มันใช้การเข้ารหัสที่เพิ่มขึ้นเช่นเดียวกับที่ GNU ระบุไว้เพื่อบีบอัดฐานข้อมูลเพื่อให้การค้นหาเร็วขึ้น แต่ก็จะเก็บสิทธิ์การใช้ไฟล์และความเป็นเจ้าของเพื่อที่ผู้ใช้จะไม่เห็นไฟล์ที่พวกเขาไม่สามารถเข้าถึงได้

หน้าคู่มือนี้เป็นเอกสารของ GNU รุ่น slocate slocate ช่วยให้ผู้ใช้ระบบสามารถค้นหาระบบไฟล์ทั้งหมดโดยไม่แสดงไฟล์ที่ไม่ได้รับอนุญาต


ความคิดที่ดี. ฉันไม่รู้ว่าทำไมฉันไม่คิดอย่างนี้ แต่ฉันเกรงว่าพารามิเตอร์ "-d" อาจจะถูกใช้เพื่ออ่านเป็นไฟล์ใด ๆ ถ้ากฎ sudo อนุญาตให้ผู้ใช้เรียกใช้คำสั่ง "ค้นหา" ใด ๆ ?
Troels Arvin

2
@TroelsArvin: locateไม่จำเป็นต้องsudo; เฉพาะupdatedbงานเท่านั้นที่ต้องการสิทธิ์พิเศษ ผู้ใช้ของคุณจึงไม่ควรทำงานหรือไม่สามารถทำงานsudo locateได้
jwodder

1
@jwodder: บนเซิร์ฟเวอร์ RHEL 7: สมมติว่าผู้ใช้ u ไม่สามารถเข้าถึง / data / foo ใน / data / foo มีไฟล์ "somefile.csv" ตอนนี้เมื่อคุณดำเนินการ "ค้นหา somefile.csv" ผลลัพธ์จาก "ค้นหา" จะไม่รวม /data/foo/somefile.csv - ยกเว้นว่าผู้ใช้ดำเนินการ "ค้นหา" ผ่าน sudo (การใช้ "--nofollow argument" ไม่ได้ช่วย.)
Troels อาร์วิน

1
@TroelsArvin แต่-dตั้งค่าสถานะเฉพาะเส้นทางฐานข้อมูลหรือไม่ บางทีฉันอาจจะเข้าใจผิด
Lenniey

21

ตามที่ man 7 capabilities

   CAP_DAC_READ_SEARCH
          * Bypass file read permission checks and directory read and execute permission checks;
          * Invoke open_by_handle_at(2).

สิ่งนี้ใช้ได้สำหรับฉัน (บรรทัดที่ขึ้นต้นด้วย '#' คือรูทส่วนที่มี '$' ไม่ใช่รูท) ในกรณีนี้ผู้ใช้ที่ไม่ใช่รูทอยู่ในwheelกลุ่ม

# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root 
find: ‘/root’: Permission denied
$ sudofind /root
/root /root 
/root/Testbed 
...
... 
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied 
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec  4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =

ด้วยความสามารถที่ได้รับมันจึงสอดคล้องกับสิ่งที่คุณต้องการ ฉันไม่ได้ตรวจสอบอย่างละเอียดถี่ถ้วนว่าfindมีคุณสมบัติที่ช่วยให้คุณอ่านไบต์ภายในไฟล์หรือไม่ แต่สิ่งที่ชัดเจนเช่นLD_PRELOADและการโจมตี shim ของไลบรารีไม่ควรทำงานเนื่องจากลักษณะของการตรวจสอบ setuid ใน Linux และบิตความสามารถไม่ได้รับ สืบทอดโดยกระบวนการลูก (ไม่เหมือน setuid ดิบ) ดังนั้นจึงเป็นโบนัสอีกอย่าง

โปรดจำไว้ว่าสิ่งที่คุณต้องการจะเพิ่มข้อกังวลเกี่ยวกับข้อมูลส่วนบุคคลที่เป็นไปได้เกี่ยวกับการสร้างหรือการเข้าถึงไฟล์ชั่วคราวและโปรแกรมสามารถใช้เป็นพื้นฐานในการติดตั้งเงื่อนไขการแข่งขัน / การเพิ่มระดับสิทธิ์ (เทียบกับโปรแกรมที่สร้างชื่อไฟล์ แต่ไม่ทำการตรวจสอบความปลอดภัยที่ถูกต้อง)

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

ดังนั้นระวังและระมัดระวังเกี่ยวกับการทำและเข้าใจว่ายังมีความเสี่ยงที่เกี่ยวข้องกับสิ่งนี้แม้ว่าสิ่งที่ชัดเจนไม่ทำงาน

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


5
นี่มันดูน่าสนใจทีเดียว!
สเวน

แบบนี้? ดีไม่มี PoC แต่ที่น่าสนใจยังคงอยู่: forums.grsecurity.net/ …
Lenniey

ฉันชอบความคิดนี้ แต่มีข้อเสียเปรียบที่สำคัญ: sudofind ตอนนี้เป็นไบนารีซึ่งไม่ได้เป็นส่วนหนึ่งของซอฟต์แวร์ใด ๆ (เช่น RPM) แพ็คเกจในระบบ ดังนั้นหากการกระจายส่งแพตช์สำหรับ "ค้นหา" ดังนั้น sudofind จะไม่ได้รับการอัพเดต
Troels Arvin

2
@TroelsArvin ไม่จำเป็นต้องเป็นสิ่งที่ไม่ดี หากคุณกำลังเพิ่มความสามารถที่เหมือน setuid ให้กับยูทิลิตี้ที่มีอยู่ซึ่งไม่ได้ออกแบบมาสำหรับความสามารถเหล่านั้นคุณจะไม่ต้องการการอัปเดตใด ๆ ในยูทิลิตี้พื้นฐานก่อนที่คุณจะตรวจสอบว่า ความสามารถในการ ลองนึกภาพในกรณีนี้หากมีการอัพเดทให้findความสามารถในการรันโค้ดบางอย่างที่ผู้ใช้จัดหาโดยตรงเช่นเดียวกับสิ่งที่awkสามารถทำได้
Andrew Henle

4
ปัญหาที่ใหญ่ที่สุดที่ฉันเห็นได้คือไดเรกทอรีที่เขียนได้ซึ่งอยู่ภายใต้ไดเรกทอรีที่ไม่สามารถค้นหาได้นั้นสามารถเขียนได้ทันที
Tavian Barnes

2

ฉันจะให้สิทธิ์ที่เหมาะสมแก่ผู้ใช้

โดยค่าเริ่มต้นหาก umask คือ022ไดเรกทอรีจะถูกสร้างขึ้นเพื่อให้ทุกคนสามารถแสดงรายการและสถิติไฟล์ในพวกเขา หากไม่เป็นเช่นนั้นคุณสามารถเปลี่ยนการอนุญาตของไดเรกทอรีเป็นบิตหรือของสิทธิ์เก่าด้วยตนเองและ0555:

chmod +0555 foo

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

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

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