วิธีให้สิทธิ์ในการอ่านเขียน แต่ไม่ลบไฟล์


12

ฉันต้องการให้ผู้ใช้สามารถสร้างการเขียนและอ่านไฟล์ในไดเรกทอรีผู้ใช้อื่น ๆ แต่ไม่มีตัวเลือกในการลบไฟล์หลังจากที่สร้าง (ตัวอย่างเช่นไม่สามารถใช้งานได้ที่นี่ ... ):

ฉันมีผู้ใช้ที่manager มีไดเรกทอรีrepository
ฉันมีผู้ใช้worker1ที่ต้องเขียนไฟล์ไป/manager/repositoryแต่ไม่สามารถลบไฟล์
ฉันมีผู้ใช้worker2ที่ต้องเขียนไฟล์ไป/manager/repository แต่ไม่สามารถลบไฟล์ที่
ฉันมีผู้ใช้worker3ที่ต้องเขียนไฟล์ไป/manager/repository แต่ไม่สามารถ ลบไฟล์

แต่worker 1-2-3ไม่สามารถลบไฟล์หลังจากที่สร้างขึ้นเท่านั้นmanagerและrootสามารถลบไฟล์ที่worker 1-2-3สร้างขึ้นได้

ฉันลองใช้chownและใช้chmodกลเม็ดน้อยในการใช้บิตที่ไม่สำเร็จ


1
อย่าworker*ให้ผู้ใช้เขียนไปยังไดเรกทอรีในวิธีการบางอย่าง? คุณพูดถึงความคิดเห็นที่ล็อกไฟล์ไปที่นี่ดังนั้นหมายความว่ามีการเปิดตัวไฟล์ปฏิบัติการบางไฟล์เพื่อสร้างไฟล์ที่นี่? ถ้าเป็นเช่นนั้นคุณสามารถให้สิทธิ์workerกลุ่มsudoเพื่อเรียกใช้ไฟล์ปฏิบัติการmanagerได้ จากนั้นไฟล์ปฏิบัติการจะสร้างบันทึกเป็นmanagerผู้ใช้ที่คนงานสามารถอ่านได้
Centimane

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

คำตอบ:


8

ซึ่งแตกต่างจาก Windows ไม่มีสิทธิ์ลบที่แตกต่างกันภายใต้ Unix / Linux สิทธิ์ในการลบ (หรือสร้างหรือเปลี่ยนชื่อ) ไฟล์ถูกผูกไว้กับไดเรกทอรีที่มี ลบสิทธิ์การเขียนสำหรับผู้ทำงาน/manager/repository/เพื่อปฏิเสธคนงานที่จะสร้างลบและเปลี่ยนชื่อไฟล์

โปรดทราบว่ามันเป็นไปไม่ได้ที่จะอนุญาตให้สร้างไฟล์ แต่จะปฏิเสธการลบของพวกเขา


วิธีการลบสิทธิ์การเขียนเป็นไฟล์จะเขียนตลอดเวลามันเป็นไฟล์บันทึก
user63898

. ในขณะที่ใช้จะเป็นจริงระบบที่ทันสมัยมากสนับสนุน ACLs ขยาย (NFSv4 ACLs เป็นการสนับสนุนจาก FreeBSD, Solaris หรือ Linux (แพทช์ Richacl) ที่ให้ความสามารถในการที่คล้ายกันเป็น Windows NT ACL ของการกระจาย Linux หุ้นของคุณมีโอกาสที่จะไม่ได้มันแม้ว่า.
Stéphane Chazelas

@ user63898 คุณลบสิทธิ์การเขียนจากไดเรกทอรีที่ไฟล์นั้นอยู่ไม่ใช่จากไฟล์เอง
GnP

6

ก่อนอื่นตรวจสอบให้แน่ใจว่าได้เปิดใช้งาน ACL ในระบบของคุณแล้วเรียกใช้คำสั่งนี้

setfacl -d -R -m user::rwx,user:worker1:---,user:worker2:---,user:worker3:--- \
/manager/repository

มันทำงานอย่างไร

  • /manager/repositoryคำสั่งนี้จะให้ให้อ่านเขียนและผู้สิทธิ์สำหรับเจ้าของในไดเรกทอรี มันจะเพิกถอนสิทธิ์ทั้งหมดสำหรับworker1, และworker2worker3

  • สิ่งนี้จะช่วยให้ผู้ใช้รายอื่นเข้าถึงแบบอ่านและเขียน แต่จะปฏิเสธการเข้าถึงแบบลบ


จากman setfacl:

-d, --default
       All  operations  apply to the Default ACL.

-R, --recursive
       Apply operations to all files and directories recursively.

-m, --modify
       Options to modify the ACL of a file or directory.

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

ใช่เมื่อฉันพยายามสร้างไฟล์จาก worker1 touch /manager/repository/x.txt ฉันได้รับ: touch: ไม่สามารถแตะ `/manager/repository/x.txt ': ปฏิเสธสิทธิ์
user63898

ยังคงได้รับสิทธิ์ปฏิเสธเมื่อฉันทำ ls -ld พื้นที่เก็บข้อมูล im ได้รับ: drwxrwxr-t 2 ผู้จัดการผู้ใช้ 4096 ก.ย. 7 11:30 พื้นที่เก็บข้อมูล /
user63898

เมื่อทำการ setfacl -d -R -m user :: rwx ผู้ใช้: worker1: --- พื้นที่เก็บข้อมูล / จากนั้นพยายามสร้างไฟล์จาก worker1 touch /manager/repository/x.txt im ได้รับ: touch: ไม่สามารถแตะ `/ manager /repository/x.txt ': ปฏิเสธการอนุญาต
user63898

5
นี่จะไม่อนุญาตให้บางคนเขียนไฟล์เปล่าที่นี่หรือ เช่นเดียวกับการecho " " > $fileปิดบังเนื้อหาไฟล์ด้วย "" ซึ่งเป็นเทคนิคการเขียน แต่จะลบเนื้อหาอย่างมีประสิทธิภาพ ดูเหมือนว่าธุรกรรมซื้อคืนจริงเช่น svn จะเป็นทางออกที่ดีที่สุดที่นี่
Centimane

3

ในการทำเช่นนั้นด้วยสิทธิ์คุณต้องมีระบบที่รองรับ ACL ซึ่งคล้ายกับ NFSv4 ACL ตัวอย่างเช่นบน FreeBSD หากระบบไฟล์ติดตั้งด้วยnfsv4aclsแฟล็กคุณสามารถทำได้:

mkdir testdir
chown manager:worker-group testdir
chmod 775 testdir
setfacl -m group@:D::deny testdir

หากต้องการปฏิเสธการdelete_childอนุญาตให้สมาชิกของworker-groupกลุ่มอย่างชัดเจน

อย่างไรก็ตามโปรดทราบว่าเนื่องจากคนงานจะเป็นเจ้าของไฟล์ที่พวกเขาสร้างพวกเขาจะยังคงสามารถแก้ไข ACLs ที่พวกเขาและโดยให้สิทธิ์ตัวเองdeleteที่จะมีความสำคัญกว่าการdelete_childอนุญาตของไดเรกทอรีหลักและฉันไม่ แน่ใจว่ามีวิธีแก้ไข (อย่างน้อยในระบบไฟล์ UFS บน FreeBSD) เช่นพวกเขาสามารถทำได้:

$ touch file
$ rm -f file
rm: file: Operation not permitted
$ setfacl -m owner@:d::allow file
$ rm -f file
$

0

เพื่อรับสิทธิ์ในการเขียนจาก/manager/repositoryโฟลเดอร์ ดังนั้นผู้ใช้ทั้งหมดที่ไม่ใช่รูทจะสามารถเขียนหรือลบไฟล์จากภายใน/manager/repositoryได้ แต่จะไม่ลบไฟล์ใด ๆ จากไดเรกทอรีนี้

chmod 755 /manager/repository

0

เราสามารถแก้ไขไฟล์และโฟลเดอร์ แต่ไม่สามารถลบได้

หากต้องการลบแอ็ตทริบิวต์ให้รันคำสั่งต่อไปนี้:

สำหรับไฟล์:

$ sudo chattr -R -a file.txt

สำหรับไดเรกทอรี:

$ sudo chattr -R -a dir1/

(1) ตามเอกสารอธิบายaคุณลักษณะหมายถึงผนวกเท่านั้น ผู้ใช้สามารถแก้ไขไฟล์เหล่านี้ได้หรือไม่ (2) ผลกระทบของการตั้งค่าaแอตทริบิวต์ในไดเรกทอรีคืออะไร?
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.