ดังนั้นเซิร์ฟเวอร์ของเราจึงถูกตั้งค่าดังนี้:
โครงสร้างโฟลเดอร์

/asicคือโฟลเดอร์ของโปรเจ็กต์ใหญ่ของเรา เป็นโปรเจ็/200Tกต์ย่อยของโปรเจ็กต์ใหญ่นั้น และโฟลเดอร์ที่อยู่ใต้/200Tนั้น/lbhคือไดเร็กทอรีส่วนตัวของผู้ปฏิบัติงานแต่ละคนที่ทำงานในโครงการย่อย /asic, /200T, /lbhทั้งหมดถูกสร้างขึ้นโดยrootและกำหนดค่าคุณสมบัติใหม่โดยรูทผ่านchmod -Rและchown -R. /asicและ/200Tเป็นเจ้าของโดยrootและอยู่ในกลุ่มasicและ200Tตามลำดับในขณะ/lbhที่เป็นเจ้าของโดยบัญชีผู้ใช้ของผู้ปฏิบัติงานและเป็นสมาชิกของกลุ่มlbhasic

ความคิดคือเนื้อหาที่ภายใน/asicและ/200Tสามารถมองเห็นได้โดยทั้งหมด personell การทำงานในasicและ200Tพวกเขาก็ยังไม่สามารถมีสิทธิ์ในการเขียนทั้ง 2 directories-- ถ้าพวกเขาต้องการที่จะสร้างบางสิ่งบางอย่างที่พวกเขาจะต้องทำภายในไดเรกทอรีของตัวเอง ( /lbhและชอบ ). เมื่อผู้ปฏิบัติงานสร้างบางสิ่งในไดเร็กทอรีของตนเอง เราต้องการให้พนักงานคนอื่นในโครงการย่อยเดียวกันสามารถอ่านสิ่งใหม่นั้นได้ แต่ไม่สามารถแก้ไขได้โดยบังเอิญ ตัวอย่างเช่นlbhเพิ่งสร้างไฟล์testbench.vและโฟลเดอร์/resultsภายใต้/asic/200T/lbh. บุคคลอื่น ( glj) ใน200Tโครงการย่อยควรสามารถอ่าน/asic/200T/lbh/testbench.vและ/asic/200T/lbh/resultsเขียนได้ หากgljต้องการแก้ไข เขาจะต้องคัดลอกไปยังไดเร็กทอรีของเขาเอง/asic/200T/gljแล้วจึงดำเนินการดังกล่าว

เพื่อให้บรรลุเป้าหมายข้างต้น เราต้องการการอนุญาตของไดเร็กทอรีที่สร้างโดยlbhto be drwxr-s---และ files เป็นrwxr-s---ค่าเริ่มต้น อย่างไรก็ตาม ความเป็นจริงมีลักษณะดังนี้:
ไฟล์และโฟลเดอร์ที่สร้างโดย lbh และ root

ส่งผลให้พนักงานแต่ละคนสามารถเขียนลงในโฟลเดอร์และไฟล์ของทุกคนได้ ซึ่งเป็นสิ่งที่เราพยายามหลีกเลี่ยง umaskของrootมี0022และผู้ใช้ปกติumask0002

คำถามของฉัน:

  1. เหตุใดไฟล์ที่สร้างโดยผู้ใช้ (เช่น/lbh) ภายใต้ไดเร็กทอรีส่วนบุคคล (เช่นlbh) ละเว้นการdrwxr-s--- อนุญาตของโฟลเดอร์ส่วนบุคคลและตั้งค่าเริ่มต้นเป็น (d)rwxrwsr-x?
  2. มีวิธีที่ปลอดภัยในการให้คนงานสร้างไฟล์และโฟลเดอร์ด้วย (d)rwxr-s--- โดยค่าเริ่มต้นหรือไม่? การขอให้ผู้ใช้chmodทุกคนดำเนินการทุกอย่างด้วยตนเอง ทุกครั้งเป็นเรื่องที่ยุ่งยากเกินไป และฉันกังวลว่าการเปลี่ยนค่าเริ่มต้นumaskอาจนำไปสู่ปัญหาที่น่าประหลาดใจใหม่ๆ ตามมาได้

ขอบคุณมาก!


แก้ไข: โครงสร้างโฟลเดอร์และการอนุญาตของไฟล์ที่สร้างโดย lbh และ root มีลักษณะดังนี้:

[[email protected]<machine> lbh]$ ls -al
total 16
drwxr-s---. 4 lbh  200T 4096 Oct  1 02:40 .
drwxr-sr-x. 4 root 200T 4096 Oct  1 02:18 ..
drwxrwsr-x. 2 lbh  200T 4096 Oct  1 02:26 aaa_lbh
drwxr-sr-x. 2 root 200T 4096 Oct  1 02:26 aaa_root
-rw-rw-r--. 1 lbh  200T    0 Oct  1 02:38 file_lbh.txt
-rw-r--r--. 1 root 200T    0 Oct  1 02:40 file_root.txt
[[email protected]<machine> lbh]$ pwd
/asic/200T/lbh
[[email protected]<machine> lbh]$ cd ..
[[email protected]<machine> 200T]$ ls -al
total 16
drwxr-sr-x. 4 root 200T 4096 Oct  1 02:18 .
drwxr-x---. 3 root asic 4096 Oct  1 02:16 ..
drwxr-sr-x. 2 root 200T 4096 Oct  1 02:18 aaa
drwxr-s---. 4 lbh  200T 4096 Oct  1 02:40 lbh
[[email protected]<machine> 200T]$ pwd
/asic/200T
[[email protected]<machine> 200T]$ 

และgetfaclผลลัพธ์ของไดเร็กทอรีและไฟล์มีดังนี้:

[[email protected]<machine> Desktop]$ getfacl /asic
getfacl: Removing leading '/' from absolute path names
# file: asic
# owner: root
# group: asic
user::rwx
group::r-x
other::---

[[email protected]<machine> Desktop]$ getfacl /asic/200T/
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/
# owner: root
# group: 200T
# flags: -s-
user::rwx
group::r-x
other::r-x

[[email protected]<machine> Desktop]$ getfacl /asic/200T/lbh
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/lbh
# owner: lbh
# group: 200T
# flags: -s-
user::rwx
group::r-x
other::---

[[email protected]<machine> Desktop]$ getfacl /asic/200T/lbh/aaa_lbh/
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/lbh/aaa_lbh/
# owner: lbh
# group: 200T
# flags: -s-
user::rwx
group::rwx
other::r-x

[[email protected]<machine> Desktop]$ getfacl /asic/200T/lbh/aaa_root/
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/lbh/aaa_root/
# owner: root
# group: 200T
# flags: -s-
user::rwx
group::r-x
other::r-x

[[email protected]<machine> Desktop]$ getfacl /asic/200T/lbh/file_lbh.txt 
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/lbh/file_lbh.txt
# owner: lbh
# group: 200T
user::rw-
group::rw-
other::r--

[[email protected]<machine> Desktop]$ getfacl /asic/200T/lbh/file_root.txt 
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/lbh/file_root.txt
# owner: root
# group: 200T
user::rw-
group::r--
other::r--

[[email protected]<machine> Desktop]$ touch hello.txt
[[email protected]<machine> Desktop]$ mkdir hi 
[[email protected]<machine> Desktop]$ ls -al
total 12
drwxr-xr-x.  3 lbh lbh 4096 Oct  9 17:28 .
drwx------. 36 lbh lbh 4096 Oct  9 17:21 ..
-rw-rw-r--.  1 lbh lbh    0 Oct  9 17:27 hello.txt
drwxrwxr-x.  2 lbh lbh 4096 Oct  9 17:28 hi
[[email protected]<machine> Desktop]$ getfacl hi
# file: hi
# owner: lbh
# group: lbh
user::rwx
group::rwx
other::r-x

[[email protected]<machine> Desktop]$ getfacl hello.txt 
# file: hello.txt
# owner: lbh
# group: lbh
user::rw-
group::rw-
other::r--

[[email protected]<machine> Desktop]$ 
answer

Linux ไม่สนับสนุนการสืบทอดสิทธิ์ ดังนั้นคุณจึงไม่สามารถทำตามที่คุณถามในหัวข้อคำถามได้

สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือตั้งค่าเริ่มต้น POSIX ACLซึ่งจะนำไปใช้กับไฟล์และไดเร็กทอรีที่สร้างขึ้นใหม่ทั้งหมด นี่ไม่ใช่การสืบทอด แต่เป็นค่าเริ่มต้น:

setfacl -m default:user:<username>:rwx <dir>
setfacl -m default:group:<groupname>:rwx <dir>

หลังจากนี้ หากใครสร้างไฟล์หรือไดเร็กทอรีใน (แน่นอนว่าหากพวกเขาได้รับอนุญาตให้สร้างวัตถุที่นั่น) วัตถุนั้นจะได้รับ ACL user:<username>:rwxและgroup:<groupname>:rwx. คุณสามารถตั้งค่าการอนุญาตเริ่มต้นสำหรับเจ้าของและเจ้าของกลุ่มโดยการตั้งค่า<username>และ<groupname>เว้นว่างไว้

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

ตรวจสอบ ACL ด้วยgetfacl <dir>. แน่นอนว่าอาจมีค่าเริ่มต้นหลายอย่าง (และดูเหมือนว่าคุณต้องมีกฎหลายข้อ) อย่างน้อย ข้อกำหนดที่ฉันพบมักจะได้รับคำสั่งให้มี ACL กลุ่มเริ่มต้นอย่างน้อยสองรายการ)


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

    chmod g+s <dir>

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

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


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

ตัวอย่างเช่น ใน Windows เมื่อคุณตั้งค่า ACL ของออบเจ็กต์ย่อยเป็น "สืบทอด" การโยง ACL พาเรนต์จะส่งผลต่อลูกหลาน ซึ่งเป็นการสืบทอดที่เหมาะสม