อนุญาตให้เจ้าของสร้าง & อ่านไฟล์ แต่ไม่แก้ไขหรือลบ


17

ฉันต้องการให้สิทธิ์ผู้ใช้ในการสร้างและอ่านไฟล์ในไดเรกทอรีเฉพาะ แต่ไม่สามารถแก้ไขหรือลบไฟล์ได้ หากผู้ใช้สามารถต่อท้ายไฟล์ที่ใช้ได้ แต่ฉันไม่ต้องการ นี่คือบน Ubuntu Linux

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

เพื่อให้ชัดเจนอย่างยิ่งฉันต้องการสิ่งต่อไปนี้:

  • echo hello> test # สำเร็จเนื่องจากไม่มีการทดสอบและอนุญาตให้สร้างได้
  • echo hello >> test # สามารถประสบความสำเร็จหรือล้มเหลวขึ้นอยู่กับว่าอนุญาตให้ผนวกท้ายได้หรือไม่
  • echo hello2> test # ล้มเหลวเนื่องจากมีการทดสอบอยู่แล้วและไม่อนุญาตให้แก้ไข
  • cat test # สำเร็จเนื่องจากการอ่านได้รับอนุญาต
  • การทดสอบ rm # ล้มเหลวเนื่องจากไม่อนุญาตให้ลบ

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


1
ไฟล์จะถูกสร้างว่างเสมอ เมื่อคุณทำเช่นecho > testนั้นเชลล์จะopen("test", O_WRONLY|O_CREAT|O_TRUNC)สร้างไฟล์ขึ้นมาจากนั้นเรียกใช้งานechoเพื่อเขียนเนื้อหาเพื่อทำการแก้ไข ตอนนี้คุณสามารถอนุญาตให้เฉพาะ open (WR) แรกที่จะประสบความสำเร็จ
Stéphane Chazelas

@ StéphaneChazelas - แก้ไขเพื่อให้ความกระจ่างว่าอนุญาตให้ผนวกได้
paj28

คำตอบ:


16

คุณสามารถใช้bindfsเช่น:

$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/

ไดเร็กทอรีนั้นเป็นของ stephane โดยมี group stephane (stephane เป็นสมาชิกเท่านั้น) นอกจากนี้โปรดทราบtว่าจะป้องกันไม่ให้ผู้ใช้เปลี่ยนชื่อหรือลบรายการที่พวกเขาไม่ได้เป็นเจ้าของ

$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir

เราbindfs dirเป็นเจ้าของสิทธิ์และสิทธิ์สำหรับไฟล์และไดเรกทอรี ไฟล์ทั้งหมดจะปรากฏเป็นของroot(แม้ว่าจะอยู่ในไดเรกทอรีจริงพวกเขายังคงเป็นเจ้าของโดย stephane)

ไดเรกทอรีที่ได้รับdrwxrwxr-x root stephaneสิทธิ์ในขณะที่ไฟล์ประเภทอื่น ๆ ได้รับ-rw-r--r-- root stephaneคน

$ ls -ld dir
drwxrwxr-t   2 root     stephane   4096 Aug 12 12:28 dir

ตอนนี้การสร้างไฟล์ใช้งานได้เพราะไดเรกทอรีเขียนได้:

$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file

อย่างไรก็ตามไม่สามารถทำการเขียน ครั้งที่สองopen()ในไฟล์นั้นเนื่องจากเราไม่ได้รับอนุญาต:

$ echo test > dir/file
zsh: permission denied: dir/file

(โปรดทราบว่าไม่อนุญาตการผนวกที่นั่น (ไม่ใช่ส่วนหนึ่งของข้อกำหนดเริ่มต้นของคุณ))

ข้อ จำกัด : ในขณะที่คุณไม่สามารถลบหรือเปลี่ยนชื่อรายการdirเนื่องจากtบิตไดเรกทอรีใหม่ที่คุณสร้างขึ้นจะไม่มีtบิตนั้นดังนั้นคุณจะสามารถเปลี่ยนชื่อหรือลบรายการในนั้นได้


มันยอดเยี่ยมมาก! ขอบคุณที่สละเวลาในการแก้ไขปัญหาอันสง่างาม ฉันเคยได้ยิน bindfs มาก่อน แต่นี่เป็นครั้งแรกที่ฉันใช้มันจริง ๆ
paj28

4

chattr +aตัวเลือกที่จะช่วยให้การผนวกเท่านั้น ไฟล์อาจมีการเปลี่ยนแปลงในลักษณะนั้น แต่โดยการเพิ่มเท่านั้น (เช่นการต่อบรรทัด) ไฟล์เหล่านั้น คุณไม่สามารถลบไฟล์ที่มีอยู่ แต่สร้างไฟล์ใหม่ สิ่งนี้อาจตรงกับความต้องการของคุณ:

sudo chattr -R +a /dir/to/apply/to

จาก man chattr

ไฟล์พร้อมชุด `a 'สามารถเปิดได้เฉพาะในโหมดต่อท้ายเพื่อการเขียนเท่านั้น เฉพาะ superuser หรือกระบวนการที่มีความสามารถ CAP_LINUX_IMMUTABLE เท่านั้นที่สามารถตั้งค่าหรือล้างแอตทริบิวต์นี้

(โปรดทราบว่ามันใช้กับไดเรกทอรีด้วย)

ดังนั้นรายการของคุณจะเป็นดังนี้:

echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed

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

หากไดเรกทอรีนั้นมีแอตทริบิวต์ไฟล์จะทำงานตามนั้นแม้ว่าจะไม่มีการตั้งค่าแอตทริบิวต์ไว้อย่างชัดเจนก็ตาม ปัญหาคือไฟล์ในส่วนย่อยใหม่ เช่น dir1 คือchattr +aแล้วฉันสามารถสร้างไฟล์ไม่ได้รับอนุญาตให้ลบมันสามารถผนวก ถ้าฉันสร้าง dir1 / dir2 จากนั้นฉันสามารถทำตามที่ฉันได้โปรดใน dir2
Fiximan

1
น่าเสียดายที่: dpaste.com/042XQ7X
paj28

อ๊ะขอโทษ - ฉันทำแบบทดสอบผิดก่อนหน้านี้
Fiximan

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