การตั้งค่าสิทธิ์เริ่มต้นสำหรับไฟล์ที่สร้างขึ้นใหม่และไดเร็กทอรีย่อยภายใต้ไดเร็กทอรีใน Linux?


100

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

ฉันรู้ว่าฉันสามารถใช้umask 006ในการปิดสคริปต์ต่างๆของฉันได้ แต่ฉันไม่ชอบวิธีการนั้นเนื่องจากผู้ใช้หลายคนเขียนสคริปต์ของตัวเองและอาจลืมตั้งค่า umask ด้วยตัวเอง

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

อัปเดต : ฉันคิดว่ามันสามารถทำได้ด้วยPOSIX ACLโดยใช้ฟังก์ชันเริ่มต้น ACL แต่ตอนนี้ฉันอยู่เหนือหัวไปหน่อย หากใครสามารถอธิบายวิธีใช้ ACL เริ่มต้นได้ก็คงจะตอบคำถามนี้ได้ดี


1
POSIX ACL นั้นดี แต่ 60% ของเครื่องที่คุณพบจะไม่เปิดใช้งานสำหรับระบบไฟล์บางระบบขึ้นอยู่กับการแจกจ่าย นี่คือคำแนะนำและตัวอย่างที่ดีมาก: suse.de/~agruen/acl/linux-acls/online
Tim Post

1
คุณหมายถึงเอกสารเดียวกันกับที่ฉันเชื่อมโยง :) ฉันยังไม่มีการเปลี่ยนแปลงในการอ่าน แต่ขอขอบคุณสำหรับปัญหาเกี่ยวกับความพร้อมใช้งาน
David Dean

1
ลิงก์ในความคิดเห็นของ Tim Post ดูเหมือนจะตายไปแล้ว แต่ด้วย Internet Archive ฉันสามารถดูและตรวจสอบได้ว่าvanemery.com/Linux/ACL/POSIX_ACL_on_Linux.htmlมีเอกสารเดียวกันทุกประการ ฉันจะแก้ไขคำถามเพื่ออัปเดตลิงก์
rmunn

คำตอบ:


78

เพื่อให้ได้ความเป็นเจ้าของที่ถูกต้องคุณสามารถตั้งค่าบิต setuid ของกลุ่มบนไดเร็กทอรีด้วย

chmod g+rwxs dirname

เพื่อให้แน่ใจว่าไฟล์ที่สร้างในไดเร็กทอรีเป็นของกลุ่ม จากนั้นคุณควรตรวจสอบให้แน่ใจว่าทุกคนทำงานด้วย umask 002 หรือ 007 หรืออะไรบางอย่างในลักษณะนั้น - นี่คือสาเหตุที่ Debian และระบบ linux อื่น ๆ จำนวนมากได้รับการกำหนดค่าด้วยกลุ่มต่อผู้ใช้ตามค่าเริ่มต้น

ฉันไม่รู้วิธีบังคับใช้สิทธิ์ที่คุณต้องการหาก umask ของผู้ใช้แรงเกินไป


23
นี่ไม่ได้ให้วิธีแก้ปัญหาจริงๆ - เขาถามเกี่ยวกับสิทธิ์ไม่ใช่การเป็นเจ้าของและวิธีเดียวที่จะทำได้คือACLs
Yarin

3
"... ให้แน่ใจว่าทุกคนใช้ umask 002 หรือ 007 หรืออะไรทำนองนั้น" - มันค่อนข้างยืดเยื้อ .... คุณทำให้ Postfix, Dovecot, Clam และ Spam Assassin ทำสิ่งนี้ได้อย่างไร?
jww

2
สิ่งที่ไม่+sเป็นส่วนหนึ่งทำอย่างไร ขอบคุณ.
tommy.carstensen

1
ในกรณีนี้หมายถึงตั้ง ID กลุ่ม กล่าวคือเราใช้ g + s เพื่อตั้งค่าบิต SGID ฉันพูดว่า "ในกรณีนี้" เพราะ + s รวมกับ g สำหรับกลุ่ม สามารถใช้ + s สำหรับการตั้งค่าบิต SUID (setuid)
Bastion

58

นี่คือวิธีดำเนินการโดยใช้ ACL เริ่มต้นอย่างน้อยก็ใน Linux

ขั้นแรกคุณอาจต้องเปิดใช้งานการสนับสนุน ACL บนระบบไฟล์ของคุณ หากคุณใช้ ext4 แสดงว่าเปิดใช้งานแล้ว ระบบไฟล์อื่น ๆ (เช่น ext3) จำเป็นต้องติดตั้งด้วยaclตัวเลือก ในกรณีนั้นให้เพิ่มตัวเลือกใน/etc/fstabไฟล์. ตัวอย่างเช่นหากไดเร็กทอรีอยู่บนระบบไฟล์รูทของคุณ:

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1

จากนั้นนับใหม่:

mount -oremount /

ตอนนี้ใช้คำสั่งต่อไปนี้เพื่อตั้งค่า ACL เริ่มต้น:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory

ไฟล์ใหม่ทั้งหมดใน/shared/directoryตอนนี้ควรได้รับสิทธิ์ที่ต้องการ แน่นอนว่ามันขึ้นอยู่กับแอปพลิเคชันที่สร้างไฟล์ด้วย ตัวอย่างเช่นไฟล์ส่วนใหญ่จะไม่สามารถเรียกใช้งานได้โดยทุกคนตั้งแต่เริ่มต้น (ขึ้นอยู่กับอาร์กิวเมนต์โหมดไปจนถึงการเรียกแบบเปิด (2) หรือ creat (2) เช่นเดียวกับเมื่อใช้ umask สาธารณูปโภคบางคนชอบcp, tarและrsyncจะพยายามที่จะรักษาสิทธิ์ของไฟล์ที่มา (s) ซึ่งจะหน้ากากออกเริ่มต้นของคุณ ACL ถ้าแฟ้มแหล่งที่มาไม่ได้เป็นกลุ่มที่สามารถเขียนได้

หวังว่านี่จะช่วยได้!


ดูเหมือนว่าสิ่งนี้ยังคงต้องการความเหมาะสมumaskสำหรับผู้ใช้ทุกคน = / unix.stackexchange.com/questions/71743/…
anatoly techtonik

1
@techtonik อย่างที่ฉันเขียนมันขึ้นอยู่กับแอปพลิเคชันที่สร้างไฟล์ เช่นถ้าคุณใช้cpมันจะพยายามคัดลอกสิทธิ์ของไฟล์ต้นฉบับ ไม่ได้ช่วยให้เมื่อใช้umask cpฉันเคยเห็นปัญหาเดียวกันกับtar. ดูคำถามนี้
pelle

@techtonik ฉันได้เพิ่มประโยคเกี่ยวกับเรื่องนี้ในคำตอบของฉันแล้ว
pelle

1
ใช่ดูเหมือนว่าปัญหาเกิดขึ้นในแอปพลิเคชันโดยบังคับให้ตั้งค่าสิทธิ์เป็น 644 เมื่อการตั้งค่า ACL และ POSIX ที่ถูกต้องของฉันเป็นค่า 664 ทั้งหมดจะเป็นการดีที่จะชี้แจงกลไกทางเลือกนี้สำหรับผู้ที่แก้ไขปัญหา umaskหลายคนไม่ทราบเกี่ยวกับ
anatoly techtonik

ฉันหมายความว่าฉันเสียเวลาไปกับการลองดูว่าฉันไม่ได้ตั้งค่าแฟล็กเมาท์อย่างถูกต้องหรือไม่ (และบน ext4 ไม่สามารถตั้งค่าได้เพราะดูเหมือนว่าจะทำงานโดยอัตโนมัติ) ไม่มีข้อมูลว่าจะตรวจสอบอย่างไรsetfacl works correctly- ฉันคิดว่ามันควรจะล้มเหลว แต่ฉันไม่แน่ใจเพราะคำตอบพลาดจุดนั้น
anatoly techtonik

4

มันน่าเกลียด แต่คุณสามารถใช้คำสั่ง setfacl เพื่อบรรลุสิ่งที่คุณต้องการได้

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

user::rwx
user:user_a:rwx
user:user_b:rwx
...
group::rwx
mask:rwx
other:r-x
default:user:user_a:rwx
default:user:user_b:rwx
....
default:group::rwx
default:user::rwx
default:mask:rwx
default:other:r-x

ตั้งชื่อไฟล์ acl.lst และกรอกชื่อผู้ใช้จริงของคุณแทน user_X

ตอนนี้คุณสามารถตั้งค่า acls เหล่านั้นบนไดเร็กทอรีของคุณได้โดยใช้คำสั่งต่อไปนี้:

setfacl -f acl.lst /your/dir/here

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

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

4

ในเชลล์สคริปต์ของคุณ (หรือ.bashrc) คุณอาจใช้บางสิ่งเช่น:

umask 022

umask เป็นคำสั่งที่กำหนดการตั้งค่าของมาสก์ที่ควบคุมวิธีตั้งค่าสิทธิ์ของไฟล์สำหรับไฟล์ที่สร้างขึ้นใหม่


1
สิ่งนี้ไม่ถูกต้องเนื่องจาก umask จำกัด สิทธิ์ซึ่งไม่สามารถเพิ่มสิทธิ์ได้
ACV

@ACV ละเอียดได้ไหม สิ่งนี้ใช้ได้ผลสำหรับฉันไฟล์ที่สร้างขึ้นใหม่ตอนนี้อนุญาตให้สมาชิกกลุ่มมีสิทธิ์ rw เมื่อฉันทำumask 002ใน. bashrc
Arthur Dent

3
@ArthurDent umask 002จำกัด การเข้าถึงของผู้อื่นโดยปล่อยให้กลุ่มไม่เปลี่ยนแปลง จำไว้ugoว่านั่นคือกลุ่มผู้ใช้อื่น ๆ โปรดจำไว้ว่า umask โดยทั่วไปหมายถึงการลบออกจากค่าเริ่มต้น สำหรับไฟล์: 666 - 002จะหมายถึง 664 ซึ่งหมายความว่ากลุ่มจะไม่ได้รับผลกระทบ
ACV
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.