ทำไมจึงมีความเสี่ยงที่จะให้สิทธิ์การเข้าถึง sudo vim แก่ผู้ใช้ทั่วไป?


30

ฉันต้องการสร้างผู้ใช้ใหม่และให้สิทธิ์การเข้าถึง sudo แก่เขา โดยเฉพาะฉันต้องการให้เขาใช้sudo vimและแก้ไข httpd.conf ฉันเขียนสิ่งนี้ใน sudoers:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

อย่างไรก็ตามฉันได้ยินว่าอาจมีความเสี่ยง เหตุใดจึงเป็นปัญหานี้ ปัญหาร้ายแรงเพียงใด?


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

4
เช่นกันที่คุณสามารถสร้างกลุ่มใหม่ที่จะเพิ่มผู้ใช้ใด ๆ /etc/httpd/confs/httpd.confที่จำเป็นต้องเข้าถึง จากนั้นใช้การเปลี่ยนกลุ่มเจ้าของchgrp [OPTION] GROUPNAME FILE /etc/httpd/confs/httpd.confสิ่งที่ต้องการgroupadd vimportantสร้างกลุ่มใหม่และchgrp -v vimportant /etc/httpd/confs/httpd.confเปลี่ยนความเป็นเจ้าของกลุ่ม yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin

4
โปรดทราบว่าเนื่องจากปัญหาทั้งหมดที่กล่าวถึงในคำตอบ sudo รวมถึงวิธีการอนุญาตให้ผู้ใช้แก้ไขไฟล์ด้วยตัวแก้ไขที่ทำงานด้วยสิทธิ์ของตนเอง ค้นหา "แก้ไขอย่างปลอดภัย" ในsudoersหน้า man
Michał Politowski

2
(ไม่แน่ใจว่าสิ่งที่ฉันพูดถูกต้องหรือไม่) เนื่องจากคุณให้sudoการเข้าถึง vim ผู้ใช้จะสามารถใช้ vim เป็น root ได้ ในกลุ่มคุณสามารถเรียกใช้คำสั่งยูนิกซ์ ( วิธีการเรียกใช้คำสั่งยูนิกซ์จากภายในกลุ่ม? ) เพื่อให้ผู้ใช้จะสามารถที่จะทำสิ่งที่ชอบuseradd <myuser>, rm -rf /หรือสิ่งอื่น ๆ อีกมากมาย
fedorqui

6
นี่เป็นคำถามที่ผิดที่ต้องถาม เมื่อพิจารณาถึงการให้สิทธิ์ยกระดับใด ๆ คุณไม่ต้องการคิดว่า "ฉันจะทำสิ่งนี้เว้นแต่ฉันจะคิดด้วยเหตุผลบางอย่างว่าทำไมจึงเป็นอันตราย" คุณต้องการคิดว่า "ฉันจะไม่ทำสิ่งนี้เว้นแต่ฉันจะพิสูจน์ได้ด้วยตัวเองว่าปลอดภัย"
Nate Eldredge

คำตอบ:


60

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

ผู้ใช้สามารถเรียกใช้sudo vim /etc/httpd/conf/httpd.conf แล้ว

  • ล้างข้อความทั้งหมดจากบัฟเฟอร์การแก้ไข
  • จากนั้นสำหรับแหล่งความสะดวกสบายไฟล์ที่มีอยู่ (แม้ว่าจะไม่จำเป็นต้องใช้): ตัวอย่างเช่นการกำหนดค่า sudo
    :r /etc/sudoers หมายเหตุ: ยกเว้นว่า SELinux จะถูก จำกัด โดย SELinux ผู้ใช้สามารถอ่านไฟล์ใด ๆด้วยวิธีนี้!
  • ให้สิทธิ์ตัวเองมากขึ้น sudo user ALL=(ALL) NOPASSWD: ALL
  • เขียนทับการกำหนดค่าเก่า :w /etc/sudoers

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

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

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


ความเสี่ยงที่สองเช่นการแสดงความเห็นอื่น ๆ อีกมากมายมีออกมาชี้ว่าvimช่วยให้หนีเปลือกที่คุณสามารถเริ่มต้นการย่อยเปลือกจากภายในเป็นกลุ่มที่ช่วยให้คุณดำเนินการคำสั่งใด ๆ โดยพล จากภายในเซสชัน sudo vim ของคุณสิ่งเหล่านี้จะทำงานเป็นรูทตัวอย่างเช่น shell escape:

  • :!/bin/bash จะให้รูตเชลล์แบบโต้ตอบ
  • :!/bin/rm -rf / จะทำให้เรื่องดีในผับ

จะทำอย่างไรแทน

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

ในการกำหนดค่า sudoers ของคุณคุณสามารถตั้งค่าคำสั่งพิเศษที่สงวนไว้sudoeditแล้วตามด้วยชื่อพา ธ แบบเต็ม (wildcard) ไปยังไฟล์ที่ผู้ใช้สามารถแก้ไขได้:

user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf

ผู้ใช้อาจใช้-eสวิตช์ในบรรทัดคำสั่ง sudo หรือใช้sudoeditคำสั่ง:

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf

ตามที่อธิบายไว้ในman page :

-e (edit)ตัวเลือกที่แสดงให้เห็นว่าแทนการใช้คำสั่งที่ผู้ใช้ต้องการที่จะแก้ไขอย่างใดอย่างหนึ่งหรือไฟล์อื่น ๆ อีกมากมาย แทนคำสั่งสตริง "sudoedit" จะใช้เมื่อปรึกษานโยบายความปลอดภัย
หากผู้ใช้ได้รับอนุญาตจากนโยบายจะมีการดำเนินการตามขั้นตอนต่อไปนี้:

  • สำเนาชั่วคราวทำจากไฟล์ที่จะแก้ไขโดยเจ้าของถูกตั้งค่าเป็นผู้ใช้ที่เรียกใช้
  • ตัวแก้ไขที่ระบุโดยนโยบายจะถูกเรียกใช้เพื่อแก้ไขไฟล์ชั่วคราว นโยบาย sudoers ใช้ตัวแปรสภาพแวดล้อม SUDO_EDITOR, VISUAL และ EDITOR (ตามลำดับ) หากไม่มีการตั้งค่า SUDO_EDITOR, VISUAL หรือ EDITOR จะมีการใช้โปรแกรมแรกในรายการตัวแก้ไขsudoers(5)
  • หากมีการแก้ไขไฟล์ชั่วคราวจะถูกคัดลอกกลับไปยังตำแหน่งเดิมและเวอร์ชันชั่วคราวจะถูกลบออก
    หากไฟล์ที่ระบุไม่มีอยู่ไฟล์นั้นจะถูกสร้างขึ้น
    โปรดทราบว่าไม่เหมือนกับคำสั่งส่วนใหญ่ที่ดำเนินการโดย sudo ตัวแก้ไขจะถูกเรียกใช้โดยไม่มีการแก้ไขสภาพแวดล้อมของผู้ใช้ หากด้วยเหตุผลบางอย่าง sudo ไม่สามารถอัปเดตไฟล์ด้วยเวอร์ชันที่แก้ไขได้ผู้ใช้จะได้รับคำเตือนและสำเนาที่แก้ไขจะยังคงอยู่ในไฟล์ชั่วคราว

sudoersคู่มือนอกจากนี้ยังมีส่วนทั้งวิธีการที่จะสามารถนำเสนอ จำกัดการป้องกันการหลบหนีเปลือกด้วยRESRICTและNOEXECตัวเลือก

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

และ

noexec
ระบบจำนวนมากที่สนับสนุนไลบรารีที่แบ่งใช้มีความสามารถในการแทนที่ฟังก์ชันไลบรารีเริ่มต้นด้วยการชี้ตัวแปรสภาพแวดล้อม (โดยปกติคือ LD_PRELOAD) ไปยังไลบรารีที่ใช้ร่วมกันสำรอง ในระบบดังกล่าวสามารถใช้ฟังก์ชั่น noexec ของ sudo เพื่อป้องกันโปรแกรมที่เรียกใช้โดย sudo จากการเรียกใช้งานโปรแกรมอื่น ๆ หมายเหตุ... ...
หากต้องการเปิดใช้งาน noexec สำหรับคำสั่งให้ใช้NOEXECแท็กตามที่ระบุไว้ในส่วนข้อมูลจำเพาะผู้ใช้ด้านบน นี่คือตัวอย่างอีกครั้ง:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
สิ่งนี้อนุญาตให้แอรอนผู้ใช้รัน/usr/bin/moreและ/usr/bin/viเปิดใช้งาน noexec สิ่งนี้จะป้องกันไม่ให้ทั้งสองคำสั่งดำเนินการคำสั่งอื่น ๆ (เช่นเชลล์)


ฉันไม่ทราบว่าsudo tarและsudo unzipยังทำให้เกิดปัญหา ขอขอบคุณ.
mi0pu

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

2
นอกจากนี้? หากคุณใช้เสียงเรียกเข้าคุณสามารถทำอะไรบางอย่างที่น่ากลัวเช่น:!rm -rf /ว้าว!
Wayne Werner

1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcและบูม รูทการเข้าถึง tar เป็นช่องโหว่
Qix

1
@ MichaelKjörlingนั่นคือคำตอบที่ฉันคาดหวัง:shไว้จากนั้นบูมเชลล์รูท
Creek

5

การกำหนดค่านี้ช่วยให้ผู้ใช้นั้นสามารถแก้ไขไฟล์นั้น ในการที่จะทำเช่นนั้นเขาจะเริ่มvimแก้ไขโดยมีสิทธิ์รูท

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

ดังนั้นขณะนี้ผู้ใช้สามารถดูและแก้ไขไฟล์โดยพลการและเรียกใช้คำสั่งโดยพลการบนระบบของคุณ


"การกำหนดค่านี้อนุญาตให้ผู้ใช้ทุกคนแก้ไขไฟล์นั้นได้อย่างไร" "ผู้ใช้" มีความหมายพิเศษหรือไม่?
mi0pu

โอ๊ะโอไม่ได้ใส่ใจ แก้ไขคำตอบ
michas

5

ล็อคเพื่อความปลอดภัย

บางโปรแกรมเช่นตัวอย่างเช่นless, vi, vimและmoreอนุญาตให้โปรแกรมอื่น ๆ จะวิ่งออกจากเปลือกคำสั่งสิ่งที่เรียกว่าเชลล์หนีหรือหลบหนีไปแปลคำสั่ง ในกรณีเหล่านี้คุณสามารถใช้NOEXECเพื่อป้องกันบางโปรแกรมที่อนุญาตให้เรียกใช้สิทธิ์โปรแกรมอื่น ๆ ตัวอย่าง:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

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

ที่สำคัญsudoมีการล็อคเพื่อความปลอดภัยหลายตัว (ค่าเริ่มต้น) ที่สามารถป้องกันงานที่เป็นอันตรายเช่นการเปลี่ยนเส้นทางเอาต์พุตมาตรฐานของการดำเนินการของโปรแกรม ( STDOUT) ไปยังไฟล์ที่อยู่นอกโฮมไดเรกทอรีของผู้ใช้

หากกำหนดไว้ในไฟล์/etc/sudoersที่ผู้ใช้สามารถเรียกใช้ด้วยสิทธิ์พิเศษ/usr/bin/vimเช่นสิ่งต่อไปนี้:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudoอนุญาตให้ผู้ใช้ปกติที่กำหนดสามารถเรียกใช้/usr/bin/vimด้วยวิธีต่อไปนี้:

sudo /usr/bin/vim
sudo vim

แต่จะป้องกันไม่ให้ทำงานเป็นกลุ่มดังต่อไปนี้:

cd /usr/bin
sudo ./vim

2
นี่ควรจะเป็นคำตอบหรือข้อผิดพลาดการตัดและวางหรือไม่?
jasonwryan

1
ส่วนใหญ่ไม่เกี่ยวข้องกับคำถาม
Hauke ​​Laging

4

คำตอบง่ายๆ:

ต่อไปนี้เป็นคำสั่ง Vim:

:shell

ตอนนี้พวกเขามีรูตเชลล์


1

การปรับปรุงความปลอดภัยที่เพิ่มขึ้นหนึ่งที่เป็นไปได้คือการแทนที่

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

กับ

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

จากนั้นให้ผู้ใช้เรียกใช้sudo rvim /etc/httpd/confs/httpd.confแทน

Vim สนับสนุนโหมด จำกัด ที่ถูกเรียกใช้พร้อมกับตัวเลือกบรรทัดคำสั่ง -Z หรือโดยเริ่มโปรแกรมเป็น rvim เมื่อเปิดใช้งานโหมด จำกัด "คำสั่งทั้งหมดที่ใช้ประโยชน์จากเปลือกภายนอกถูกปิดใช้งาน" วิธีการนี้จะไม่ป้องกันผู้ใช้จากการใช้:split fileคำสั่งอดีตเปิดไฟล์อื่น ๆ :!rm -rf /แต่อย่างน้อยควรป้องกันไม่ให้คำสั่งเชลล์ที่เป็นอันตรายเช่นจงใจ


1
น่าเสียดายที่มันไม่ปลอดภัย 100% หากผู้ใช้จัดการเพื่อแก้ไข / etc / sudoers เพื่อให้ตัวเองมีอำนาจทุกอย่างในระบบจากนั้นเขาสามารถเรียกใช้คำสั่งใด ๆ ในฐานะที่เป็นราก
vurp0

0

ฉันเห็นด้วยกับคำตอบของ HBruijnว่าการเรียกใช้ vim เมื่อรูทเปิดระบบได้กว้างมากและ sudoedit จะเป็นทางออกที่ปลอดภัยกว่า

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

การรักษาความปลอดภัย:

httpdหากโปรแกรมที่ใช้แล้วมันจะทำงานเป็นผู้ใช้ที่เริ่มต้น นี่จะเป็นรูทหากเซิร์ฟเวอร์เริ่มโดยรูท ต้องแน่ใจว่าโปรแกรมนั้นปลอดภัย

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

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


0

ควรสังเกตว่าแม้sudoedit {.../whatever.conf}จะเป็นความเสี่ยงด้านความปลอดภัย

สร้างเชลล์สคริปต์ /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

และเรียกใช้สคริปต์นี้ในไฟล์กำหนดค่าของคุณ ฉันรู้หลายตัวอย่างว่าวิธีนี้ใช้ได้ผลอย่างไร

samba -> คำสั่ง log nt token

log nt token command = /tmp/make_me_root.sh

syslog-ng -> โปรแกรม: การส่งข้อความไปยังแอปพลิเคชันภายนอก

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

Apache -> CustomLog

CustomLog "|/tmp/make_me_root.sh"

ฉันคิดว่าใครสามารถขยายรายการนี้ได้ไม่สิ้นสุด

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


0

แน่นอนมันไม่ปลอดภัยเลย อย่างที่บอกไว้ก่อนหน้า sudoedit มันเป็นวิธีที่ง่ายและเหมาะสมที่สุดในการทำ

สิ่งที่ฉันต้องการเพิ่มคือ vim อนุญาตให้เปิดเชลล์ได้ดังนั้นไม่เพียง แต่สามารถแก้ไขไฟล์ระบบใด ๆ ได้ แต่ยังอนุญาตให้เปิดเชลล์และทำตามที่เขาต้องการ

แค่ลองเรียกใช้กลุ่มและประเภท: sh

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