จำกัด ผู้ใช้ Linux ในไฟล์ที่เขาเป็นเจ้าของ


24

ลองนึกภาพการตั้งค่าเซิร์ฟเวอร์ของ บริษัท เว็บโฮสติ้งที่ใช้ร่วมกันซึ่งลูกค้าหลายคน (~ 100) มีการเข้าถึงเชลล์ไปยังเซิร์ฟเวอร์เดียว

จำนวนมากเว็บ "ซอฟต์แวร์" แนะนำให้ไฟล์ chmod 0777 ฉันกังวลเกี่ยวกับลูกค้าของเราติดตามบทเรียนเหล่านี้อย่างไม่เต็มใจเปิดไฟล์ให้ลูกค้ารายอื่นของเรา (แน่นอนว่าฉันไม่ได้ใช้โดยไม่cmod 0777จำเป็นต้องใช้ตัวเอง!) มีวิธีการเพื่อให้แน่ใจว่าลูกค้าสามารถเข้าถึงไฟล์ของตนเองและป้องกันไม่ให้พวกเขาเข้าถึงไฟล์ที่ผู้อ่านคนอื่น ๆ

ฉันมองเข้าไปในAppArmorแต่นั่นเป็นกระบวนการที่แน่นมากซึ่งดูเหมือนว่าจะล้มเหลวในสภาพแวดล้อมนั้น


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

3
@CosmicOssifrage ผู้ใช้ไม่สามารถให้ความรู้ได้อย่างง่ายดายพวกเขาไม่ต้องการอ่านคำแนะนำหรือคู่มือ
Cristian Ciupitu

12
ใด ๆ "ซอฟต์แวร์บนเว็บ" ที่ยังคงแนะนำ 777 สิทธิ์ความต้องการที่จะนำออกมาและยิง การใช้งานsuexecหรือmpm_itkหรือคล้ายกัน
Shadur

3
@CosmicOssifrage ฉันไม่คิดว่า Phillipp กำลังบอกหรือบังคับให้ผู้ใช้ไปยังchmod 0777ไฟล์ของพวกเขา ฉันคิดว่าเขาเป็นกังวลเกี่ยวกับพวกเขาไปloltoturialz.com/php_problemsและตั้งค่าchmod 0777ด้วยตัวเองในขณะที่สุ่มสี่สุ่มห้าติดตามบทความที่เขียนไม่ดี ไม่มีทางป้องกันไม่ให้พวกเขาทำเช่นนั้นหรือป้องกันไม่ให้พวกเขาอารมณ์เสียเมื่อมีคนขโมยสิ่งของของพวกเขา
Kevin - Reinstate Monica

2
@kevin - ซึ่งเป็นเหตุผลที่ทำให้โมฆะการรับประกันถูกสร้างขึ้น ฉันแทบไม่เคยเห็นอุปกรณ์ที่จริงจัง (ไม่ว่าจะเป็นซอฟแวร์ที่รวบรวมมา, สคริปต์หรืออะไรก็ตาม) โดยไม่มีประโยคดังกล่าว และเชื่อหรือไม่ - ในสภาพแวดล้อมที่ผู้ใช้ส่วนใหญ่ตระหนักดีถึงสิ่งนี้
Dani_l

คำตอบ:


34

ใส่ไดเรคทอรี่ที่จำกัดและไม่เปลี่ยนแปลงระหว่างโลกภายนอกและไฟล์ที่ได้รับการป้องกันเช่น

/
 ├─ bin
 ├─ home
 │  └─ joe <===== restricted and immutable
 │     └─ joe <== regular home directory

/home/joe/restricted/public_htmlหรือ

จำกัด หมายถึงเฉพาะผู้ใช้และเว็บเซิร์ฟเวอร์เท่านั้นที่สามารถอ่านได้ (เช่นโหมด0700/ 0750หรือACLบางตัว)

เปลี่ยนไม่สามารถทำได้ด้วยหรือโดยการเปลี่ยนเจ้าของเพื่อสิ่งที่ต้องการchattr +iroot:joe

วิธีง่ายๆในการสร้างลำดับชั้นบน Ubuntu ที่จะแก้ไข/etc/adduser.confและการตั้งค่าไปGROUPHOMESyes


15

มีตัวเลือกที่คุณอาจต้องการพิจารณา (ขึ้นอยู่กับจำนวนงานที่คุณต้องการทำ)

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

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

ฉันใช้วิธีการที่คุ้นเคยเมื่อฉันมีผู้ใช้รายหนึ่งที่สามารถเข้าถึง webfiles ได้ แต่ฉันไม่ต้องการให้เขาเห็นไฟล์อื่น ๆ นอก webfolder

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

แต่สำหรับวันนี้ฉันคิดว่าคุณสามารถทำให้สำเร็จได้ง่ายๆด้วยตัวเลือกOpenSSH chroot:

WikiBooks OpenSSH


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

2
นั่นคือการใช้งานที่เฉพาะเจาะจง ARCHLINUX มีคำสั่ง arch-chroot เฉพาะที่ดูแลการเชื่อมโยงพิเศษทั้งหมด ฯลฯwiki.archlinux.org/index.php/Change_Root#Change_root
Dani_l

@CristianCiupitu นั่นคือสิ่งที่ฉันทำให้เฉพาะชุดย่อยของคำสั่งที่มีการเชื่อมโยงห้องสมุด nessesary ทั้งหมดนั่นคือเหตุผลที่ฉันบอกว่ามันเป็นระเบียบ :) Dani_l จริงการตั้งค่าของฉันเป็นเซิร์ฟเวอร์ debian ฉันไม่เคยมีเวลาที่จะตรวจสอบใน gentoo เศร้า .
Dennis Nolte

@Dani_l: แล้วแพ็คเกจที่ติดตั้งล่ะ? arch-chrootคำสั่งไม่ได้ดูเหมือนจะปกที่ แล้วยังมีปัญหาเรื่องพื้นที่ดิสก์ที่สิ้นเปลืองด้วยซ้ำทั้งหมด ฉันไม่ได้บอกว่ามันเป็นไปไม่ได้ที่จะทำมันเพียงเพราะมันอาจซับซ้อนกว่านี้เล็กน้อย
Cristian Ciupitu

1
สิ่งที่ทำให้สิ่งนี้ง่ายมากคือการใช้ UnionFS เพื่อ chroot ผู้ใช้เป็นยูเนี่ยนพิเศษของ rootfs ในโหมดอ่านอย่างเดียวและอ่านไดเรกทอรีบ้านอ่านเขียนซึ่งหมายความว่าพวกเขาเห็นแพคเกจระบบและไบนารีทั้งหมด แต่เขียนเสร็จใน โฟลเดอร์บ้านของพวกเขา ต้องรวมกับการทำให้โฮมไดเรกทอรีทั้งหมด 700 สิทธิ์ผู้ใช้อื่นสามารถอ่านไฟล์จากผู้ใช้รายอื่นได้
Vality

11

ฉันได้พบรายการควบคุมการเข้าถึง POSIX อนุญาตให้คุณในฐานะผู้ดูแลระบบเพื่อปกป้องผู้ใช้ของคุณจากความไม่รู้ที่เลวร้ายที่สุดของพวกเขาเองโดยการแทนที่การอนุญาตระบบไฟล์ของกลุ่มผู้ใช้กลุ่มอื่นโดยไม่มีโอกาสทำลายอะไรที่สำคัญ .

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

ใช่ผู้ใช้ที่มีความรู้สามารถลบ / แทนที่พวกเขาอีกครั้งพอเพียงเรื่องแปลกที่ว่าไม่น่าและผู้ใช้ที่สามารถมักจะไม่ได้คนเพื่อความสะดวกchmod -R 777 ~/อยู่แล้วใช่มั้ย?

คุณต้องเมานต์ระบบไฟล์ด้วยaclตัวเลือกเมานต์:

 mount -o remount,acl /home

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

การใช้ ACL เป็นเรื่องเล็กน้อยเพื่อป้องกันไม่ให้ผู้ใช้รายอื่นเข้าถึงโฮมไดเร็กตอรี่:

ก่อน:

 chmod 0777 /home/user* 

 ls -l /home/user*
 drwxrwxrwx.  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx.  2 user2  user2  4096 Jul 11 15:24 user2

ตอนนี้ตั้งค่าสิทธิ์ไดเรกทอรีที่มีประสิทธิภาพสำหรับสมาชิกของusersกลุ่มที่0ไม่อ่านเขียนหรือเข้าถึง:

 setfacl setfacl -m g:users:0 /home/user*

 ls -l 
 drwxrwxrwx+  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx+  2 user2  user2  4096 Jul 11 15:24 user2

+สัญญาณหมายถึงการปรากฏตัวของการตั้งค่า ACL มี และgetfaclสามารถยืนยันได้ว่า:

getfacl /home/user1
getfacl: Removing leading '/' from absolute path names
# file: home/user1
# owner: user1
# group: user1
user::rwx
group::rwx
group:users:---
mask::rwx
other::rwx

group:users:---แสดงให้เห็นว่ากลุ่มได้อย่างมีประสิทธิภาพไม่มีสิทธิ์แม้จะมีสิทธิ์ที่ปกติสำหรับความเป็นอยู่อื่น ๆother::rwx

และทดสอบในฐานะผู้ใช้ 1:

[user1@access ~]$ ls -la /home/user2
ls: cannot open directory /home/user2: Permission denied

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


5
อะไรคือ"ไฟ" ? ฉันไม่แนะนำให้ใช้คำย่อหรือตัวย่อยกเว้นว่าเป็นคลาสสิกอย่าง "eg", "ie", "etc" และบางที OP
Cristian Ciupitu

3

Linux Containers (LXC)อาจเป็นการผสมผสานที่ดีที่สุดของ chroot และระบบแยก

  1. พวกเขาเป็นเหมือน chroot ขั้นสูงไม่ใช่ virtualization แต่คุณสามารถรวมระบบปฏิบัติการที่แตกต่างกันในเซิร์ฟเวอร์เดียว

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

Stéphane Graber ผู้เขียน LXC มีบทช่วยสอนที่ดีที่จะช่วยคุณเริ่มต้น


คุณไม่สามารถรวมระบบปฏิบัติการที่แตกต่างกันได้เพราะทุกคนจำเป็นต้องใช้เคอร์เนล Linuxแต่คุณสามารถใช้การกระจายที่แตกต่างกันได้
Cristian Ciupitu

1
ขอบคุณ :) ใช่แล้วระบบปฏิบัติการที่ใช้ลินุกซ์เคอร์เนลต่างกัน
maniaque

@CristianCiupitu คุณหมายถึงเคอร์เนล Linux ที่เหมือนกันหรือไม่ หรือคุณหมายความว่าแต่ละคอนเทนเนอร์สามารถมีเคอร์เนลเวอร์ชันต่างกันได้หรือไม่?
agks mehx

@agksmehx, ทุกภาชนะบรรจุ LXC ร่วมเคอร์เนลของโฮสต์ มีการใช้งานแอปพลิเคชันและไลบรารีเท่านั้น ตัวอย่างเช่นหากคุณมีโฮสต์ RHEL 7 ที่มีคอนเทนเนอร์ Ubuntu 14.04 จะใช้เคอร์เนล RHEL (3.10.0-123) ในขณะที่ Ubuntu หนึ่ง (3.13.0-24.46) จะไม่ถูกใช้ อ่านความคิดเห็นนี้จากการกวดวิชา อย่างไรก็ตามเนื่องจากไม่ได้ใช้เมล็ดของตู้คอนเทนเนอร์จึงเป็นความคิดที่ดีที่จะลบออกเพื่อประหยัดพื้นที่ดิสก์
Cristian Ciupitu

@CristianCiupitu นั่นคือสิ่งที่ฉันคิด มันไม่ชัดเจนจากคำตอบหรือความคิดเห็นดังนั้นฉันต้องการชี้แจง
22415 agks mehx

3

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

cd /home
sudo chmod 700 *

ตอนนี้/home/usernameเจ้าของเท่านั้นที่มองเห็นได้ ในการทำให้สิ่งนี้เป็นค่าเริ่มต้นสำหรับผู้ใช้ใหม่ทั้งหมดให้แก้ไข/etc/adduser.confและตั้งค่าDIR_MODEเป็น0700แทนที่จะเป็น0755ค่าเริ่มต้น

แน่นอนถ้าคุณต้องการที่จะปรับเปลี่ยน DIR_MODE Ubuntuเริ่มต้นมันขึ้นอยู่กับการกระจายของคุณหนึ่งผมโพสต์ผลงานได้ที่

แก้ไข

ตามที่ระบุไว้อย่างถูกต้อง@Dani_lคำตอบนี้ถูกต้องทำให้ไม่สามารถอ่านได้


พวกเขาถูกเรียกว่า "โลกที่อ่านได้" ด้วยเหตุผล
Mark K Cowan

1
@DennisNolte ที่จริงแล้วมันช่วยได้แม้ว่าไฟล์นั้นจะสามารถอ่านได้ทั่วโลกหากพวกมันอยู่ในไดเรกทอรีที่คุณไม่ได้อ่านหรือดำเนินการคุณก็ยังไม่สามารถอ่านได้
Vality

1
@ ความจริงจริงลบความคิดเห็นของฉันเพราะมันผิดอย่างชัดเจน
Dennis Nolte

2

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


2
ผิด chroot / jail ผู้ใช้ไปยังโฟลเดอร์ย่อยและคุณไม่สามารถอ่านไฟล์ "ปกติ" ที่อ่านได้ทั่วโลก
Dennis Nolte

1
-1 ฉันคิดว่าคุณกำลังวิจารณ์คำถามของ OP โดยไม่จำเป็น เขาต้องการให้ตาข่ายความปลอดภัยแก่ลูกค้าในกรณีที่พวกเขาไม่ฉลาดเกี่ยวกับการอนุญาต แต่ดูเหมือนว่าฉันจะไม่ทราบว่า OP ไม่ทราบว่าการอนุญาตไฟล์ Unix ทำงานอย่างไรหรือหลักการรักษาความปลอดภัยขั้นพื้นฐาน
Kevin - Reinstate Monica

นอกจากนี้คุณสามารถใส่ไฟล์ลงในไดเรกทอรีภายในไดเรกทอรีการอนุญาตจำนวน 000 จากนั้นไม่มีใครสามารถเข้าถึงได้แม้ว่าไฟล์นั้นจะสามารถอ่านได้ทั่วโลก
Vality

ไม่มีใคร? ไม่หยั่งราก? ;-)
Dani_l

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

0

ฉันไม่เห็นการกล่าวถึง 'เชลล์ จำกัด ' ในคำตอบที่ให้ไว้จนถึงตอนนี้

ln / bin / bash / bin / rbash

ตั้งค่านี้เป็นล็อกอินเชลล์


0

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

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

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

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

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

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