ผมพบว่าตัวอย่างนี้ชื่อ: ACL และหน้ากากในลินุกซ์ ในบทความนี้ตัวอย่างต่อไปนี้แสดงให้เห็นซึ่งฉันคิดว่าช่วยให้เข้าใจว่า ACL และumask
การโต้ตอบซึ่งกันและกัน
พื้นหลัง
เมื่อไฟล์ถูกสร้างขึ้นบนระบบลินุกซ์สิทธิ์เริ่มต้น0666
ถูกนำมาใช้ในขณะที่เมื่อไดเรกทอรีถูกสร้างสิทธิ์เริ่มต้น0777
ถูกนำมาใช้
ตัวอย่างที่ 1 - ไฟล์
สมมติว่าเราตั้งค่า umask เป็น 077 และแตะไฟล์ เราสามารถใช้strace
เพื่อดูสิ่งที่เกิดขึ้นจริงเมื่อเราทำสิ่งนี้:
$ umask 077; strace -eopen touch testfile 2>&1 | tail -1; ls -l testfile
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
-rw-------. 1 root root 0 Sep 4 15:25 testfile
ในตัวอย่างนี้เราจะเห็นว่าการเรียกของระบบopen()
นั้นได้รับการอนุญาต 0666 แต่เมื่อumask 077
เคอร์เนลถูกนำไปใช้แล้วการอนุญาตต่อไปนี้จะถูกลบออก ( ---rwxrwx
) และเราจะเหลือด้วยrw-------
aka 0600
ตัวอย่าง - 2 ไดเรกทอรี
แนวคิดเดียวกันนี้สามารถนำไปใช้กับไดเรกทอรีได้ยกเว้นว่าแทนที่จะได้รับอนุญาตเริ่มต้นคือ 0666 พวกเขาจะเป็น 0777
$ umask 022; strace -emkdir mkdir testdir; ls -ld testdir
mkdir("testdir", 0777) = 0
drwxr-xr-x 2 saml saml 4096 Jul 9 10:55 testdir
คราวนี้เรากำลังใช้mkdir
คำสั่ง คำสั่งเรียกแล้วโทรระบบmkdir
mkdir()
ในตัวอย่างข้างต้นเราจะเห็นว่าmkdir
คำสั่งที่เรียกว่าการเรียกmkdir()
ระบบด้วยสิทธิ์ defaul 0777
( rwxrwxrwx
) เวลานี้ที่มี umask ของ022
การอนุญาตต่อไปนี้จะถูกลบ ( ----w--w-
) ดังนั้นเราจึงเหลือ 0755 ( rwxr-xr-x
) เมื่อสร้างไดเรกทอรี
ตัวอย่างที่ 3 (การใช้ ACL เริ่มต้น)
ตอนนี้เรามาสร้างไดเรกทอรีและสาธิตสิ่งที่เกิดขึ้นเมื่อมีการใช้ ACL เริ่มต้นพร้อมกับไฟล์ข้างใน
$ mkdir acldir
$ sudo strace -s 128 -fvTttto luv setfacl -m d:u:nginx:rwx,u:nginx:rwx acldir
$ getfacl --all-effective acldir
# file: acldir
# owner: saml
# group: saml
user::rwx
user:nginx:rwx #effective:rwx
group::r-x #effective:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:nginx:rwx #effective:rwx
default:group::r-x #effective:r-x
default:mask::rwx
default:other::r-x
ตอนนี้มาสร้างไฟล์aclfile
กัน:
$ strace -s 128 -fvTttto luvly touch acldir/aclfile
# view the results of this command in the log file "luvly"
$ less luvly
ตอนนี้รับสิทธิ์ของไฟล์ที่สร้างขึ้นใหม่:
$ getfacl --all-effective acldir/aclfile
# file: acldir/aclfile
# owner: saml
# group: saml
user::rw-
user:nginx:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
mask::rw-
ขอให้สังเกตหน้ากาก เหตุใดจึงไม่mask::rwx
เหมือนเมื่อสร้างไดเรกทอรี
ตรวจสอบluvly
ล็อกไฟล์เพื่อดูว่ามีการใช้การอนุญาตเริ่มต้นใดในการสร้างไฟล์:
$ less luvly |grep open |tail -1
10006 1373382808.176797 open("acldir/aclfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 <0.000060>
นี่คือสิ่งที่ทำให้สับสนเล็กน้อย ด้วยชุดหน้ากากrwx
เมื่อไดเรกทอรีถูกสร้างขึ้นคุณจะคาดหวังว่าพฤติกรรมเดียวกันสำหรับการสร้างไฟล์ แต่มันไม่ได้ผล มันเป็นเพราะเมล็ดจะเรียกฟังก์ชั่นที่มีสิทธิ์เริ่มต้นของopen()
0666
เพื่อสรุป
- ไฟล์จะไม่ได้รับอนุญาตให้ดำเนินการ (ปิดบังหรือมีประสิทธิภาพ) ไม่สำคัญว่าเราใช้วิธีใด: ACL, umask หรือ mask & ACL
- ไดเรกทอรีสามารถได้รับอนุญาตดำเนินการ แต่ขึ้นอยู่กับวิธีการตั้งค่าเขตข้อมูลการหลอกลวง
- วิธีเดียวที่จะดำเนินการชุดสิทธิ์สำหรับไฟล์ที่อยู่ภายใต้การอนุญาตของ ACL
chmod
คือการตั้งค่าด้วยตนเองโดยใช้
อ้างอิง
mask::rw-
คุณจะได้รับ แต่นั่นไม่ใช่คำถามของคุณใช่ไหม