รับไฟล์ใหม่เพื่อสืบทอดการอนุญาตของกลุ่มบน Linux


87

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

ฉันต้องการให้เว็บเซิร์ฟเวอร์อ่านเว็บไซต์ทั้งหมดฉันต้องการให้ผู้ใช้สามารถเปลี่ยนได้เอง

การอนุญาตถูกตั้งค่าเช่นนี้ในโฟลเดอร์ในขณะนี้ ....

drwxr-x--- 3 john www-data 4096 Feb 17 21:27 john

มันเป็นพฤติกรรมมาตรฐานใน BSD สำหรับการอนุญาตให้ทำงานด้วยวิธีนี้ ฉันจะให้ Linux ทำสิ่งนี้ได้อย่างไร


2
คุณใช้ ACL ได้ไหม?
slm

คำตอบ:


128

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

ตัวอย่าง

$ whoami
saml

$ groups
saml wheel wireshark

ตั้งค่าไดเรกทอรีด้วย perms + ownerhips

$ sudo mkdir --mode=u+rwx,g+rs,g-w,o-rwx somedir
$ sudo chown saml.apache somedir
$ ll -d somedir/
drwxr-s---. 2 saml apache 4096 Feb 17 20:10 somedir/

แตะไฟล์ที่เป็น saml ใน dir นี้

$ whoami
saml

$ touch somedir/afile
$ ll somedir/afile 
-rw-rw-r--. 1 saml apache 0 Feb 17 20:11 somedir/afile

สิ่งนี้จะให้เสียงประมาณเท่าที่คุณต้องการ หากคุณต้องการสิ่งที่คุณอธิบายอย่างแท้จริงจริงๆฉันคิดว่าคุณจะต้องใช้ฟังก์ชันการควบคุมการเข้าถึงเพื่อรับ (ACLs)

ACL ของ

หากคุณต้องการควบคุมสิทธิ์ของไฟล์ที่สร้างขึ้นภายใต้ไดเรกทอรีให้มากขึ้นอีกเล็กน้อยsomedirคุณสามารถเพิ่มกฎ ACL ต่อไปนี้เพื่อตั้งค่าการอนุญาตเริ่มต้นได้

ก่อน

$ ll -d somedir
drwxr-s---. 2 saml apache 4096 Feb 17 20:46 somedir

กำหนดสิทธิ์

$ sudo setfacl -Rdm g:apache:rx somedir
$ ll -d somedir/
drwxr-s---+ 2 saml apache 4096 Feb 17 20:46 somedir/

โปรดสังเกตว่า+ในตอนท้ายนั่นหมายความว่าไดเรกทอรีนี้มี ACL ที่ใช้กับมัน

$ getfacl somedir
# file: somedir
# owner: saml
# group: apache
# flags: -s-
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:group:apache:r-x
default:mask::r-x
default:other::---

หลังจาก

$ touch somedir/afile
$ ll somedir/afile 
-rw-r-----+ 1 saml apache 0 Feb 17 21:27 somedir/afile
$ 

$ getfacl somedir/afile
# file: somedir/afile
# owner: saml
# group: apache
user::rw-
group::r-x              #effective:r--
group:apache:r-x        #effective:r--
mask::r--
other::---

แจ้งให้ทราบด้วยการอนุญาตเริ่มต้น ( setfacl -Rdm) ตั้งค่าเพื่อให้สิทธิ์ที่จะ ( r-x) โดยค่าเริ่มต้น ( g:apache:rx) สิ่งนี้บังคับให้ไฟล์ใหม่ใด ๆ มีการrเปิดใช้งานบิตของพวกเขาเท่านั้น


ดูเหมือนว่าจะมีฟังก์ชั่นที่ฉันต้องการขอบคุณ
John Tate

ดูเหมือนว่าจะแก้ปัญหาที่คล้ายกันของฉันด้วย อย่างไรก็ตามฉันไม่เข้าใจประโยคสุดท้าย: "นี่เป็นการบังคับให้ไฟล์ใหม่ใด ๆ มีการเปิดใช้งานบิตของพวกเขาเท่านั้น" ทำไมสิทธิ์ x ไม่เปิดใช้งาน มีวิธีการเปิดใช้งานโดยค่าเริ่มต้นหรือไม่?
yaobin

1
@ yaobin ฉันคิดว่ามันเป็นเรื่องความปลอดภัยคุณไม่ต้องการให้ไฟล์ปฏิบัติการโดยค่าเริ่มต้น
cdarken

สิ่งนี้ใช้ไม่ได้unzipหรือ
datasn.io

@ datasn.io - unzipดูหน้าคนของ โดยเฉพาะ-Xสวิตช์
slm

37

TL: DR; เพื่อให้ไฟล์ใหม่สืบทอดกลุ่มของโฟลเดอร์ container ทำ:

$ chmod g+s somefolder

หมายเหตุ: โดยนัยในคำตอบที่ยอมรับได้นี่เป็นเพียงตัวอย่างข้อมูล


3
setgid หมายความว่าใหม่ไฟล์และโฟลเดอร์จะมีกลุ่มที่ถูกต้อง แต่จำไว้ว่าถ้าคุณย้ายไฟล์เป็นต้นไม้ที่พวกเขาจะไม่ได้มีการใช้สิทธิการกำหนดค่า ACL เข้าใกล้ด้วยวิธีนั้น (โดยทั่วไป)
Chris Morgan

@ChrisMorgan มันรับมือกับมันได้อย่างไร? โซลูชันจากคำตอบที่ยอมรับไม่ได้ทำสิ่งใดกับไฟล์ที่ถูกย้ายในกรณีของฉัน
Dan M.

@DanM .: ด้วยโหมดไฟล์คุณตั้งค่าการอนุญาตที่ไม่สืบทอด แต่มี ACL ของคุณตั้งค่าสิทธิ์ที่จะได้รับมรดก (แม้ว่าเด็กสามารถระบุ ACL ของของตัวเองแทนที่ว่า) ถูกตรวจสอบที่รันไทม์
Chris Morgan

@ ChrisMorgan ใช่ คุณจะทำอย่างไร โซลูชันที่ใช้คำตอบที่ยอมรับในแบบฟอร์ม ACL ไม่ทำงาน
Dan M.

10

ในฐานะที่เป็นส่วนประกอบของคำตอบของ slm โปรดทราบว่าในระบบไฟล์ ext2 / 3/4 คุณสามารถจำลองพฤติกรรม BSD ที่คุณอธิบายโดยใช้bsdgroupsตัวเลือกการเมานท์บนพาร์ติชัน จากmount(1)หน้าคน:

grpid|bsdgroups and nogrpid|sysvgroups
              These options define what group id a newly  created  file  gets.
              When  grpid  is  set,  it takes the group id of the directory in
              which it is created; otherwise (the default) it takes the  fsgid
              of  the current process, unless the directory has the setgid bit
              set, in which case it takes the gid from the  parent  directory,
              and also gets the setgid bit set if it is a directory itself.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.