บังคับให้เจ้าของไฟล์และโฟลเดอร์ที่สร้างขึ้น


21

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

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

ดังนั้น:

มีตัวเลือกอื่นที่ฉันพลาดเพื่อให้แน่ใจว่าไฟล์และไดเรกทอรีย่อยทั้งหมดมีเจ้าของเหมือนกันหรือไม่?

ฉันคาดว่าฉันสามารถท่องไดเรคทอรีทั้งหมดด้วย cron-job เป็นระยะ ๆ แต่นั่นทำให้ฉันไม่มีประสิทธิภาพสำหรับสิ่งที่สำคัญที่สุดคือคำสั่งเพียงไฟล์เดียว

ฉันพบตัวอย่างโดยใช้ INOTify แต่นั่นทำให้ฉันมีการบำรุงรักษาสูงเนื่องจากต้องใช้สคริปต์

ฉันไม่สามารถทราบได้ว่า ACL สามารถช่วยฉันในการบังคับให้เป็นเจ้าของได้หรือไม่

มีวิธีที่ฉลาดกว่านี้หรือไม่?

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


ฉันไม่คิดว่าฉันเข้าใจสิ่งที่คุณพยายามจะบอกฉัน คุณสามารถทำอย่างละเอียด?
Martin Nielsen

สำหรับการตั้งค่าไฟล์และไดเรกทอรีย่อยทั้งหมดที่มีกลุ่ม & ความเป็นเจ้าของเหมือนกันทำไมไม่ใช้chown -hR owner:group?
Pandya

เป็นไปได้ แต่เนื่องจากมีการสร้างไฟล์ใหม่อยู่ตลอดเวลาและเรากำลังพูดถึงไฟล์เป็นล้าน ๆ จึงต้องมีงาน cron ที่ท่องไดเรกทอรีทั้งหมดเป็นระยะ ถ้าฉันหายไปบางจุด
Martin Nielsen


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

คำตอบ:


12

การตั้งค่าการใช้ค่าเริ่มต้น "โดยอัตโนมัติ" จะต้องมีไดเรกทอรีทำตัวเหมือนsetuid setgidอย่างไรก็ตามในขณะนี้สามารถกำหนดค่าบน FreeBSD, ระบบ UNIX และ Linux อื่น ๆ u+sก็ไม่สนใจ อย่างไรก็ตามในกรณีของคุณอาจมีวิธีแก้ไขปัญหาอื่น

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

ดังนั้นโดยทั่วไปจากสิ่งที่ฉันเห็นคุณต้องการควบคุมการเข้าถึงไดเรกทอรีโดยใช้กลไกกลุ่ม อย่างไรก็ตามสิ่งนี้ไม่ต้องการให้คุณ จำกัด สิทธิ์ในโครงสร้างไดเรกทอรีทั้งหมด จริงๆแล้ว--xบิตการประมวลผลไดเรกทอรีอาจเป็นสิ่งที่คุณต้องการ ผมขอยกตัวอย่างให้คุณ สมมติว่า ...

  • กลุ่มควบคุมการเข้าถึงไปยังไดเรกทอรีgroup_dirourgroup
  • คนเท่านั้นในการเข้าถึงกลุ่มสามารถourgroupgroup_dir
  • user1และเป็นของuser2ourgroup
  • umask เริ่มต้นคือ 0022

... พิจารณาการตั้งค่าต่อไปนี้:

drwxrws---    root:ourgroup   |- group_dir/
drwxr-sr-x    user1:ourgroup  |---- group_dir/user1_submission/
drwxr-sr-x    user2:ourgroup  |---- group_dir/user2_submission/
-rw-r--r--    user2:ourgroup  |-------- group_dir/user2_submission/README

ที่นี่สมมติว่าทุกรายการถูกสร้างโดยเจ้าของ

ตอนนี้ในการตั้งค่านี้:

  • ourgroupไดเรกทอรีทั้งหมดสามารถเรียกดูได้อย่างอิสระโดยทุกคนใน ทุกคนจากกลุ่มสามารถสร้างย้ายลบไฟล์ได้ทุกที่ภายในgroup_dir(แต่ไม่ลึกกว่า)
  • ทุกคนที่ไม่ได้อยู่ในourgroupนั้นจะถูกบล็อกที่group_dirและจะไม่สามารถจัดการอะไรได้ ตัวอย่างเช่นuser3(ผู้ที่ไม่ได้เป็นสมาชิกของourgroup) ไม่สามารถอ่านได้group_dir/user2_submission/README(แม้ว่าเขาจะได้r--รับอนุญาตในไฟล์เอง)

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

$ setfacl -dRm u::rwX,g::rwX,o::0 group_dir/

ชุดการโทรนี้:

  • rw(x)สิทธิ์เริ่มต้นสำหรับเจ้าของ
  • rw(x)สิทธิ์เริ่มต้นสำหรับกลุ่ม
  • ไม่มีการอนุญาตตามค่าเริ่มต้นสำหรับผู้อื่น โปรดทราบว่าเนื่องจากคนอื่นไม่สามารถเข้าถึงgroup_dirได้จึงไม่สำคัญว่าสิทธิ์ของพวกเขาจะอยู่ที่ใด

ตอนนี้ถ้าฉันสร้างรายการเป็นuser2:

$ touch group_dir/user2_submission/AUTHORS
$ ls -l group_dir/user2_submission/AUTHORS
rw-rw----    user2:ourgroup    group_dir/user2_submission/AUTHORS

ด้วย ACL นี้เราสามารถลองสร้างโครงสร้างก่อนหน้านี้อีกครั้ง:

drwxrws---+    root:ourgroup   |- group_dir/
drwxrws---+    user1:ourgroup  |---- group_dir/user1_submission/
drwxrws---+    user2:ourgroup  |---- group_dir/user2_submission/
-rw-rw----+    user2:ourgroup  |-------- group_dir/user2_submission/README

ที่นี่อีกครั้งแต่ละรายการจะถูกสร้างขึ้นโดยเจ้าของ

นอกจากนี้หากคุณต้องการเพิ่มกำลังไฟ / ความปลอดภัยให้กับผู้ที่ใช้ไดเรคทอรีอีกเล็กน้อยคุณอาจต้องพิจารณาว่าเป็นบิตเหนียว ๆ เช่นนี้จะป้องกันไม่ให้user1ลบuser2_submission(เนื่องจากเขาได้-w-รับอนุญาตgroup_dir):

$ chmod +t group_dir/

ตอนนี้ถ้าuser1พยายามที่จะลบuser2's Operation not permittedไดเรกทอรีเขาจะได้รับที่น่ารัก อย่างไรก็ตามโปรดทราบว่าแม้ว่าสิ่งนี้จะช่วยป้องกันการปรับเปลี่ยนโครงสร้างไดเรกทอรีในgroup_dirไฟล์และไดเรกทอรีด้านล่างยังสามารถเข้าถึงได้:

user1@host $ rm -r user2_submission
Operation not permitted

user1@host $ cat /dev/null > user2_submission/README

user1@host $ file user2_submission/README
user2_submission/README: empty (uh-oh)

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

$ chown g= user2_submission/ -R
or
$ chgrp nobody user2_submission -R

... ด้วยเหตุนี้ทำให้ทุกคนในกลุ่มไม่สามารถใช้งานไดเรกทอรีส่งแบบเต็มได้

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


ACL จะลบล้างสิทธิ์เริ่มต้นหรือไม่ ตัวอย่างเช่นถ้าฉันตั้งค่า $ setfacl -dRm u :: r, g :: rwX, o :: 0 group_dir / แทนที่จะอนุญาตให้เฉพาะสมาชิกของกลุ่มเพื่อสร้างไฟล์เจ้าของจะสามารถแก้ไขไฟล์ได้หรือไม่ ในกลุ่ม? จำเป็นอย่างยิ่งที่ผู้ใช้จะสามารถแก้ไขไฟล์ได้หากพวกเขาเป็นสมาชิกของกลุ่มโดยไม่คำนึงถึงว่าใครเป็นเจ้าของ
Martin Nielsen

คุณไม่จำเป็นต้องลบการอนุญาตทั้งหมดจากเจ้าของสำหรับสิ่งนั้น หากกลุ่มมีสิทธิ์ในการเขียนไฟล์สมาชิกกลุ่มจะสามารถแก้ไขไฟล์ได้ เจ้าของจะได้รับ "สิทธิพิเศษมากกว่านี้อีกเล็กน้อย" ACL ไม่ได้แทนที่สิทธิ์เริ่มต้นเสมอ (ดูเกี่ยวกับสิทธิ์ที่มีประสิทธิภาพของ ACL)
จอห์น WH Smith

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

โดยพื้นฐานแล้วทุกคนที่ไม่ได้อยู่ในกลุ่มนั้นไม่มีสิทธิพิเศษเนื่องจากเขาจะไม่สามารถเข้ามาได้group_dirตั้งแต่แรกไม่ว่าเขาจะเป็นเจ้าของไฟล์หรือไม่ก็ตาม "สิทธิพิเศษ" ที่แท้จริงเท่านั้นที่เจ้าของมีคือเขาอาจเปลี่ยนสิทธิ์ในการสร้างสรรค์ (ซึ่งฉันได้อธิบายรายละเอียดเพิ่มเติมเล็กน้อยในคำตอบของฉัน)
John WH Smith

1
ไม่ได้อย่างแน่นอน. group_dirไดเรกทอรีเป็นเจ้าของโดยroot:ourgroupมี-rwxr-x---ซึ่งหมายความว่ารากเท่านั้นและสมาชิกของourgroupการเข้าถึงอาจมันคือทำอะไรกับไฟล์ที่อยู่ภายใต้มัน หากคุณไม่มี--xสิทธิ์ในไดเรกทอรีคุณจะไม่สามารถเข้าถึงไฟล์ที่อยู่ภายในแม้ว่าคุณจะมีสิทธิ์ของไฟล์เองก็ตาม
John WH Smith

6

มีวิธีที่ชาญฉลาดในการทำเช่นนี้ มันใช้การรวมกันของ set-gid และacls เริ่มต้น เห็นได้ชัดว่าคุณจะต้องมีระบบไฟล์ที่เปิดใช้งาน acl สมมติว่าไดเรกทอรีที่คุณต้องการแชร์อยู่ที่/var/grpdirและสมาชิกของกลุ่มsharingควรสามารถเข้าถึงได้

chown root:sharing /var/grpdir
chmod 2770 /var/grpdir #other can't read or traverse into the directory, set-gid is set
setfacl -d -m u::rwX,g::rwX,o::0 /var/grpdir

ACL เริ่มต้นได้รับการสืบทอดโดยไดเรกทอรีย่อยที่สร้างในไดเรกทอรีที่มี ACLs เริ่มต้น ดังนั้นหมายความว่าไฟล์ใด ๆ ที่สร้างขึ้นใน/var/grpdirจะมีกลุ่มที่ตั้งsharingโดยบิต setgid ของไดเรกทอรี นอกจากนี้จะสืบทอด acls เริ่มต้นซึ่งจะแทนที่การกำหนดค่าเริ่มต้นของสไตล์ linux เนื่องจากเราไม่ได้ระบุ ACLs กับผู้ใช้หรือกลุ่มเฉพาะ ซึ่งหมายความว่าไฟล์ทั้งหมดจะถูกสร้างขึ้นด้วยความเป็นเจ้าของและการอนุญาต<user>:sharing rw-rw----ไดเรกทอรีจะเหมือนกันยกเว้นพวกเขาจะมี ACLs เริ่มต้นของตนเองตั้งค่าเช่นเดียวกับ parent ( /var/grpdir) และแน่นอนว่ามีบิตปฏิบัติการที่ตั้งค่าไว้สำหรับผู้ใช้และกลุ่ม หากคุณลบผู้ใช้ออกจากsharingกลุ่มพวกเขาจะไม่สามารถเข้าถึงไดเรกทอรี (หรือไฟล์ใด ๆ ในนั้นแม้ว่าพวกเขาจะเป็นเจ้าของ)

ซึ่งแตกต่างจากการแก้ไขการอนุญาตเป็นระยะ ๆ ด้วย cronjob การอนุญาตจะซิงค์กันเสมอเนื่องจากมีการอัปเดตตามปกติด้วยไฟล์และไดเรกทอรีที่สร้างขึ้นใหม่ วิธีนี้มีน้ำหนักเบา ไม่จำเป็นต้องใช้ daemons และไม่มีการขัดขวาง IO ในขณะที่แก้ไขการอนุญาตในคราวเดียว


ดังนั้นฉันจะเข้าใจสิ่งนี้อย่างถูกต้อง: ACL จะเขียนทับสิทธิ์ระบบไฟล์ปกติหากคุณไม่ได้ระบุผู้ใช้หรือกลุ่ม?
Martin Nielsen

1
ไม่พวกเขาไม่ได้แก้ไขการอนุญาตใด ๆ ที่ตั้งค่าไว้ในไฟล์แล้ว เมื่อไดเรกทอรีมีการตั้งค่าสิทธิ์อนุญาตเริ่มต้นและไฟล์หรือไดเรกทอรีถูกสร้างขึ้นในไดเรกทอรีนั้นไฟล์ใหม่ / dir จะได้รับสิทธิ์เริ่มต้นตามที่ระบุ ไฟล์ที่คัดลอก / ย้ายไปยังไดเร็กทอรีจะคงสิทธิ์เช่นเดียวกับไฟล์ที่มีอยู่ในไดเรกทอรีก่อนที่จะตั้งค่า acls นอกจากนี้ chmod และ chown ยังคงสามารถใช้งานได้ตามปกติเพื่อปรับเปลี่ยนความเป็นเจ้าของและการอนุญาตหลังจากสร้างไฟล์แล้ว
sirlark

2

ฉันไม่ได้ตระหนักถึงวิธีที่ดีในการทำเช่นนี้ วิธีที่สะอาดที่สุดในทางเทคนิคคือระบบไฟล์ของ FUSE ซึ่งทำเช่นนั้น แน่นอนว่าต้องทำงานมากหากยังไม่มีใครทำเช่นนั้น

ทางเลือก:

  1. ใช้ samba แซมบ้ามีforce userพารามิเตอร์ คุณสามารถส่งออกไดเรกทอรีภายในและติดตั้งในเครื่อง ไม่ทำให้เข้าถึงได้เร็วขึ้น แต่อาจยอมรับได้เนื่องจากมีเฉพาะเครือข่ายวนรอบย้อนกลับเท่านั้นที่เกี่ยวข้อง

  2. ใช้ระบบไฟล์ที่ไม่ใช่ Linux เช่น FAT32 ต้องกำหนดค่านี้เพื่อให้ผู้ใช้บางรายติดตั้งได้ สิทธิ์การเข้าถึงต้องจัดการโดยไดเรกทอรีหลัก


0

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

ในกรณีนี้ฉันคิดว่าทางออกที่ดีที่สุดของคุณคืองาน cron ที่มีแฟล็ก chown -R ตามที่ Pandya กล่าวไว้ วางมันลงบน cron เพื่อวิ่งทุก ๆ นาทีหรือทุกๆห้านาที

หากคุณสามารถอธิบายได้ว่าผู้ใช้ของคุณใช้งานอย่างไรอาจมีวิธีแก้ปัญหาที่ดีกว่า

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


0

คุณสามารถใช้inotify-toolsและเขียนสคริปต์ทุบตีแบบง่าย ๆ ได้ด้านล่าง Inotify จะคอยจับตาดูในไดเรกทอรีของเว็บและทำบางสิ่งบางอย่างเมื่อใดก็ตามที่มีเหตุการณ์เช่น การสร้าง dirเกิดขึ้นภายในสารบบเว็บ มีกิจกรรมมากมายที่มีอยู่ คุณสามารถ google มันหรืออาจจะดูในเว็บไซต์นี้

while inotifywait -m -e CREATE web; do echo "A new directory has been created"; done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.