การใช้งาน POSIX ACL บทลินุกซ์ ตอนที่ 1

โดยดั้งเดิมการกำหนดสิทธิในการอ่านหรือแก้ไขไฟล์หรือไดเร็คทอรี บน Linux/UNIX นั้น จะถูกกำหนดในรูปแบบของ permission โดยจะแบ่งเป็น สามส่วนใหญ่ๆ คือ user, group และ others แต่การใช้งานโดยทั่วไปแล้ว เช่นผ่าน File Server ถ้าเปรียบเทียบกับการกำหนดสิทธิบน Windows แล้ว บางครั้งเราอาจต้องการกำหนดรายละเอียดย่อยมากกว่านั้น เช่น ให้มากกว่า 1 user หรือ มากกว่า 1 group เข้ามีสิทธิเกี่ยวกับไฟล์เช่น คนนี้อ่านได้อย่างเดียว กลุ่มนี้อ่านได้ แล้วเขียนได้ด้วย ซึ่งรูปแบบ permission จะไม่สามารถทำได้

ถ้าต้องการกำหนดสิทธิโดยละเอียดมากขึ้น บน Linux จะมีคุณสมบัติ POSIX ACL หรือ Extended ACL ให้สามารถเรียกใช้งานได้ โดยคุณสมบัตินี้ติดตั้งมากับ Linux นานพอสมควร  โดยไม่ต้องติดตั้งโปรแกรมอะไรเพิ่มเติม

ระบบทดสอบ
ในเครื่องทดสอบนี้เราจะสร้างบัญชีผู้ใช้งานและกลุ่มขึ้นมาดังนี้

uid=500(engineer1) gid=500(engineer) groups=500(engineer),100(users)
uid=501(engineer2) gid=500(engineer) groups=500(engineer),100(users)
uid=502(engineer3) gid=500(engineer) groups=500(engineer),100(users)
uid=503(sales1) gid=501(sales) groups=501(sales),100(users)
uid=504(sales2) gid=501(sales) groups=501(sales),100(users)
uid=505(sales3) gid=501(sales) groups=501(sales),100(users)

สร้างไดเร็คทอรีทดสอบ ACL เริ่มต้นด้วย getfacl
เริ่มทดสอบเราจะใช้ root เป็นคนสร้างไดเร็คทอรีขึ้นมาเป็น /share แล้วสร้างไดเร็คทอรีย่อยในนี้เป็น engineer-data ซึ่งจะเป็นที่สำหรับเก็บไฟล์ของกลุ่มผู้ใช้งาน engineer

[root@acl-test ~]# cd /share
[root@acl-test share]# mkdir engineer-data
[root@acl-test share]# ls -l
total 4
drwxr-xr-x 2 root root 4096 2008-08-27 05:49 engineer-data
[root@acl-test share]# getfacl engineer-data/
# file: engineer-data/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

เราสามารถใช้คำสั่ง getfacl เพื่อดูว่าไฟล์หรือไดเร็คทอรีนั้นมี POSIX ACL เป็นอย่างไร ซึ่งดีฟอลต์แล้วจะ ACL ที่ได้จากการสร้างไฟล์เริ่มตั้นจะมีการกำหนด 3 อย่าง ซึ่งตรงกับ permission ดั้งเดิมของ Linux/UNIX นั่นเอง

การแสดงผลของคำสั่ง getfacl จะแสดงเป็นบรรทัด โดยบรรทัดที่เริ่มต้นด้วยเครื่องหมาย # จะเป็นคำอธิบาย ส่วนบรรทัดอื่นๆ จะมีการแบ่งแต่ละฟิลด์ด้วยเครื่องหมาย :  โดยฟิลด์แรกจะเป็นประเภทการกำหนดสิทธิว่าจะเป็น user, group, other ส่วนฟิลด์ต่อมาจะเป็นชื่อ user หรือ group แต่ถ้าไม่มีก็จะเป็นการกำหนดสิทธิเจ้าของไฟล์นั่นเอง ฟิลด์สุดท้ายจะกำหนดสิทธิที่ทำได้

เช่นจากการสร้างไดเร็คทอรี engineer-data ด้วย root สิทธิที่จะได้คือ

  • user::rwx    เจ้าของไฟล์ user มีสิทธิในการ read, write, execute
  • group::r-x  กลุ่มเจ้าของไฟล์มีสิทธิในการ read, execute แต่ไม่สามารถ write ได้
  • other::r-x   ส่วนคนอื่นๆ มีสิทธิในการ read, execute แต่ไม่สามารถ write ได้

เพิ่มสิทธิของกลุ่มด้วย setfacl
เราต้องการให้ผู้ใช้งานที่อยู่ในกลุ่ม engineer สามารถเข้าไปเขียนและแก้ไขไฟล์ในได้เร็คทอรีนี้ได้ เราสามารถทำได้โดยแก้ไข ACL โดยใช้คำสั่ง setfacl ดังนี้

[root@acl-test share]# setfacl -m group:engineer:rwx engineer-data/
[root@acl-test share]# ls -l
total 4
drwxrwxr-x+ 2 root root 4096 2008-08-27 05:55 engineer-data
[root@acl-test share]# getfacl engineer-data/
# file: engineer-data/
# owner: root
# group: root
user::rwx
group::r-x
group:engineer:rwx
mask::rwx
other::r-x

ใช้คำสั่ง setfacl ด้วยออปชั่น –m เพื่อระบุว่าต้องการแก้ไข (modify) ACL ของไฟล์ที่ต้องการ ซึ่งจากตัวอย่างเราจะเพิ่ม group:engineer:rwx ซึ่งจะหมายถึงอนุญาตให้ผู้ใช้ในกลุ่ม engineer เข้าไปแก้ไขไฟล์ในนี้ได้

สังเกตว่าเมื่อเวลาใช้คำสั่ง ls –l เพื่อดูไฟล์ จะปรากฎเครื่องหมาย + อยู่หลัง permission ด้วย ซึ่งแสดงว่าไฟล์หรือไดเร็คทอรีมีการกำหนด ACL เพิ่มเติม เราสามารถใช้คำสั่ง getfacl เพื่อดูรายละเอียดได้

ทดสอบการเขียนไฟล์ด้วยบัญชีผู้ใช้ engineer ทดลองเข้าไปเพิ่มไฟล์หรือสร้างไดเร็คทอรีขึ้นมา ซึ่งจะสามารถสร้างได้จากตัวอย่าง

[engineer1@acl-test ~]$ cd /share/engineer-data/
[engineer1@acl-test engineer-data]$ touch file1.txt
[engineer1@acl-test engineer-data]$ mkdir dir1
[engineer1@acl-test engineer-data]$ ls -l
total 4
drwxr-xr-x 2 engineer1 engineer 4096 2008-08-27 05:57 dir1
-rw-r--r-- 1 engineer1 engineer    0 2008-08-27 05:56 file1.txt
[engineer1@acl-test engineer-data]$ getfacl file1.txt
# file: file1.txt
# owner: engineer1
# group: engineer
user::rw-
group::r--
other::r—
[engineer1@acl-test engineer-data]$ getfacl dir1/
# file: dir1/
# owner: engineer1
# group: engineer
user::rwx
group::r-x
other::r-x

จากการทดสอบ engineer1 จะสามารถสร้าง แก้ไข หรือลบไฟล์ต่างๆ ในไดเร็คทอรีนี้ได้ แต่ปัญหาจะเกิดขึ้นคือ ผู้ใช้อื่นๆ ที่อยู่ในกลุ่ม engineer เหมือนกันจะไม่สามารถเข้าไปแก้ไขไฟล์ต่างๆ ที่ engineer1 สร้างขึ้นได้ เช่นทดสอบโดยใช้ engineer2 เพื่อเข้าไปลบไฟล์ที่ engineer1 สร้างขึ้น

[engineer2@acl-test ~]$ cd /share/engineer-data/
[engineer2@acl-test engineer-data]$ touch file1
touch: cannot touch `file1': Permission denied

กำหนดดีฟอลต์ ACL ของไฟล์ที่สร้างขึ้น
เพื่อแก้ไขปัญหาที่คนนึงสร้างแล้วคนอื่นๆ ในกลุ่มไม่สามารถแก้ไขหรือลบไฟล์ได้นั้น เราต้องกำหนดดีฟอลต์ ACL ให้กับไดเร็คทอรีนั้น ๆ เช่นใน engineer-data เราต้องการให้ไฟล์หรือไดเร็คทอรีที่สร้างขึ้นในนี้นั้น ทุกคนที่อยู่ในกลุ่ม engineer สามารถแก้ไขไฟล์ที่คนอื่นๆ สร้างได้

ต้องใช้คำสั่ง setfacl เพื่อกำหนด ACL เพิ่มเติม ให้เป็นดีฟอลต์ โดยใช้ออปชั่น –m แล้วเพิ่มเติมคำว่า default ลงไปด้วย

[root@acl-test share]# setfacl -m default:group:engineer:rwx engineer-data/ 
[root@acl-test share]# getfacl engineer-data/
# file: engineer-data/
# owner: root
# group: root
user::rwx
group::r-x
group:engineer:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:engineer:rwx
default:mask::rwx
default:other::r-x

จากการใช้คำสั่ง setfacl เพื่อกำหนด default ACL สำหรับ group เพียงอย่างเดียว แต่ผลลัพธ์ที่ได้จะมีการสร้างดีฟอลต์ของสิทธิประเภท user และ other ขึ้นมาด้วยซึ่งเป็นไปตามกฎเกณฑ์ของ POSIX ACL (ส่วน mask จะขออธิบายในบทความหน้า)

ความหมายของดีฟลอต์ที่ได้มานั้นหมายความว่า ไฟล์หรือไดเร็คทอรีที่สร้างขึ้นนั้นจะมี ACL เป็นไปตามดีฟอลต์ เช่น ไฟล์จะมี ACL สำหรับกลุ่ม engineer เพื่ออนุญาตให้ read, write และ execute ได้

ทดลองสร้างไฟล์และไดเร็คทอรีขึ้นมาด้วย engineer1

[engineer1@acl-test engineer-data]$ touch file2.txt
[engineer1@acl-test engineer-data]$ mkdir dir2
[engineer1@acl-test engineer-data]$ ls -l
total 4
drwxrwxr-x+ 2 engineer1 engineer 4096 2008-08-27 06:17 dir2
-rw-rw-r--+ 1 engineer1 engineer    0 2008-08-27 06:17 file2.txt
[engineer1@acl-test engineer-data]$ getfacl file2.txt
# file: file2.txt
# owner: engineer1
# group: engineer
user::rw-
group::r-x                      #effective:r--
group:engineer:rwx              #effective:rw-
mask::rw-
other::r--
[engineer1@acl-test engineer-data]$ getfacl dir2/
# file: dir2/
# owner: engineer1
# group: engineer
user::rwx
group::r-x
group:engineer:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:engineer:rwx
default:mask::rwx
default:other::r-x

ตอนนี้ engineer2 หรือคนอื่นๆ ที่อยู่ในกลุ่ม engineer เหมือนกัน ก็สามารถแก้ไขไฟล์ที่ engineer1 สร้างได้

ข้อมูลอ้างอิง

2 thoughts on “การใช้งาน POSIX ACL บทลินุกซ์ ตอนที่ 1”

  1. ขอบคุณมากครับ ทำให้ผมได้รู้อะไรเพิ่มเติมอีกเยอะเลย อยากให้มีคนแบบคุณเยอะๆจังเลยครับ ประเทศไทยจะได้เจริญๆ

  2. ขอบคุณครับ เหมาะสำหรับมือใหม่ เรื่อง linux …หาใน google…เจอแต่ต่างชาติเขียนไม่ตรงประเด็น

    ต้องไทยๆ เรานี่แหละ..
    เป็นกำลังใจให้ครับ

Leave a Reply

Your email address will not be published.