17 ตุลาคม 2548

POSIX EAs & ACLs ตอนที่ 2

แนะนำ Access Control Lists บนระบบลินุกซ์


    Access Control Lists คืออะไร ทำไมต้องใช้ ?



    Access Control Lists ที่กล่าวถึงนี้
เป็นการกำหนดสิทธิ์แบบใหม่ ซึ่งระบุไว้ในร่างมาตรฐาน POSIX 1003.1e
และ POSIX
1003.2c
(POSIX ย่อมาจาก Portable Operating System Interface
ส่วนตัว X หมายถึงเกี่ยวพันกับ api ของระบบ Unix
- อ่านเพิ่มเติมได้ที่ http://en.wikipedia.org/wiki/POSIX)
โดยเป็นการขยายความสามารถในการกำหนดสิทธิ์การใช้งานแฟ้มเพิ่มขึ้นจากรูปแบบสิทธิ์ที่ใช้อยู่เดิม
ซึ่งสามารถกำหนดสิทธิ์ได้ถึงระดับผู้ใช้หลายคน
หรือระดับกลุ่มผู้ใช้หลายกลุ่มก็ได้ จึงช่วยให้การใช้งาน ALCs
แบบนี้มีความปลอดภัย แม่นยำ และยืดหยุ่นสูง ส่วนคำว่า EA ก็คือ Extended
Attributes นั่นเอง


    แต่เดิมในยุคที่ลินุกซ์ยังใช้เคอร์เนล 2.4 อยู่นั้น
ACL ยังเป็นเพียง patch เพิ่มเติมสำหรับเคอร์เนลเท่านั้นเอง
นั่นคือ หากใครต้องการใช้งาน ACL
ก็จำเป็นจะต้องทำการแพตช์เคอร์เนลให้รองรับการใช้งาน ACL เสียก่อน
ทำให้ในตอนนั้นยังไม่มีการใช้งาน ACL กันแพร่หลายนัก
จนมาถึงยุคเคอร์เนลรุ่น 2.6 ACL
ก็ถูกรวมเข้าไว้เป็นส่วนหนึ่งของเคอร์เนลเรียบร้อยแล้ว ส่งผลให้ปัจจุบัน
ลินุกซ์ดิสโทรชันแทบทุกค่ายที่มีในปัจจุบันนั้น
มีความสามารถพื้นฐานในการรองรับความสามารถในการกำหนดสิทธิ์ให้กับแฟ้มตามมาตรฐาน
ACL นี้ได้


    สำหรับกลุ่มระบบปฏิบัติการที่รองรับ POSIX ACL ในปัจจุบันก็เช่น


  • IBM AIX

  • FreeBSD

  • SGI Irix

  • Sun Solaris

  • HP Tru64

  • SCO UnixWare

  • Linux รุ่นใหม่ ๆ



    ส่วนระบบแฟ้มที่รองรับการทำงานกับ ACL ได้แก่


  • ReiserFS

  • Ext2

  • Ext3

  • JFS

  • XFS



    ทดลองใช้งาน ACL




    การใช้งาน ACL บนระบบแฟ้มต่าง ๆ นั้น
เราจะต้องทำการเพิ่มตัวเลือก acl 
ในการเมาทน์ระบบแฟ้มก่อนด้วย เช่น

    # mount -o remount,acl /dev/sda1 /

    หรืออาจจะเพิ่มไว้ในแฟ้ม /etc/fstab
ในส่วนตัวเลือกของแต่ละพาร์ติชันเลยก็ได้ เช่น

    /dev/hda7           
/                   
reiserfs   acl,user_xattr       
1 1






    สำหรับบนระบบลินุกซ์ที่ผมทดลองใช้ ACL อันได้แก่ SUSE
Linux OSS 10.0
และ Fedora
Core 3 และ 4 นั้น ทั้ง SUSE และ Fedora ได้เตรียมแพ็กเกจพื้นฐาน acl
ไว้ให้ใช้ในการจัดการกับ ACL เรียบร้อยแล้ว
ซึ่งแพ็กเกจ acl นี้จะให้คำสั่งในการใช้งานกับ acl มา 3 คำสั่ง ได้แก่


  • getfacl - เป็นคำสั่งในการขอดูสิทธิ์ที่อนุญาตในการใช้งานแฟ้มหรือไดเรกทอรี

  • setfacl - เป็นคำสั่งในการตั้งค่าสิทธิ์ที่จะอนุญาตในการใช้งานแฟ้มหรือไดเรกทอรี

  • chacl - เป็นคำสั่งในการเปลี่ยนสิทธิ์ต่าง ๆ ในการใช้งานแฟ้มหรือไดเรกทอรี



    ลองมาเรียกดู acl
ของแฟ้มจากพาร์ติชันที่ไม่ได้เมาทน์ด้วยตัวเลือก acl กันดูสักหน่อยครับ

donga@linux:/media/SHARES> getfacl Logo.svg
# file: Logo.svg
# owner: root
# group: root
user::rw-
group::r--
other::r--


    ส่วนผลลัพธ์การเรียกคำสั่ง ls ได้ผลดังนี้ครับ

donga@linux:/media/SHARES> ls -l Logo.svg
-rw-r--r-- 1 root root 2225 2005-06-21 22:40 Logo.svg


    ในส่วน user::rw- group::r-- และก็ other::r--
ที่ได้จากคำสั่ง getfacl นั้น เรียกว่า ACL Entry ครับ
ซึ่งจากตัวอย่างจะมีเพียง 3 ตัว ตามสิทธิ์ที่อนุญาตแบบเดิม ๆ
ที่เรากำหนดให้กับ user, group และ other นั่นเอง แต่จริง ๆ แล้ว ACL
Entry นั้นมีหลายประเภทนะ ซึ่งพอจะสรุปประเภทและรูปแบบของ ACL Entry
ประเภทต่าง ๆ ได้ตามตารางด้านล่างนี้










































ประเภท ใช้สำหรับ รูปแบบ
owner สิทธิ์ของเจ้าของแฟ้ม/ไดเรกทอรี user::rwx
named user สิทธิ์สำหรับผู้ใช้โดยระบุชื่อผู้ใช้ user:name:rwx
owning group สิทธิ์สำหรับกลุ่มเดียวกันกับเจ้าของแฟ้ม/ไดเรกทอรี group::rwx
named group สิทธิ์สำหรับกลุ่มตามชื่อกลุ่มที่ระบุ group:name:rwx
mask

มาสก์ของสิทธิ์ที่อนุญาต (ขอยกไปอธิบายภายหลัง) mask::rwx
other สิทธิ์สำหรับผู้ใช้อื่น ๆ other::rwx




    ทีนี้ลองมาดูเปรียบเทียบส่วน ACL Entry
ระหว่างแฟ้มที่ใช้ ACL กับไม่ได้ใช้ ACL กันอีกสักตัวอย่าง















พาร์ติชันที่ไม่ได้เมาทน์ด้วยตัวเลือก acl พาร์ติชันที่เมาทน์ด้วยตัวเลือก acl

donga@linux:/media/SHARES> getfacl Logo.svg
# file: Logo.svg
# owner: root
# group: root
user::rw-
group::r--
other::r--


donga@linux:~> getfacl wireless.log
# file: wireless.log
# owner: donga
# group: users
user::rw-
user:nipat:rw-
group::r--
mask::rw-
other::r--





    จะเห็นว่า ในฝั่งขวามือซึ่งเป็นส่วนที่มีการใช้ acl
นั้นจะมีรายละเอียดของ ACL Entry เพิ่มขึ้นมาหลายส่วน
เราลองมาเทียบผลลัพธ์ของ acl ที่เป็น ACL Entry
กับการกำหนดสิทธิ์ที่อนุญาตในรูปแบบเดิมกันดูมั่ง














owner
named user
owning group
mask
other


user::rw-
user:nipat:rw-
group::r--
mask::rw-
other::r--


<-->
 
 
<-->
<-->


  rw-  ==  สิทธิ์ของเจ้าของแฟ้ม
 
 
  rw- == สิทธิ์ของกลุ่มเดียวกันกับเจ้าของแฟ้ม
  --- == สิทธิ์ของผู้ใช้อื่น ๆ





    ลอง ls แฟ้ม wireless.log ดู

donga@linux:~> ls -l wireless.log
-rw-rw-r--+ 1 donga users 598 2005-10-16 22:22 wireless.log


    จะเห็นว่า หลังกลุ่มแอตทริบิวต์ระบุสิทธิ์ มีเครื่องหมาย "+"
ต่อท้ายเข้ามา นั่นหมายถึงแฟ้มนี้มีส่วนสิทธิ์ที่อนุญาตในแบบ ACL
เพิ่มเติมเข้ามานั่นเอง




    เอาละครับ ก่อนจบตอนที่ 2 นี้ เดี๋ยวเรามาทำความรู้จักกับคำสั่ง setfacl ซึ่งเป็นคำสั่งที่ย่อมาจาก set file access control lists
ใช้สำหรับการตั้งค่า ACL ให้กับแฟ้มหรือไดเรกทอรี ว่ามีพารามิเตอร์อะไรกันบ้าง และมีวิธีการใช้งานขั้นต้นอย่างไรบ้าง โดยขออ้างอิงจากพารามิเตอร์ --help ของคำสั่งครับ




   คำสั่ง setfacl





setfacl -- set file access control lists
รูปแบบคำสั่ง: setfacl [-bkndRLP] { -m|-M|-x|-X ... } แฟ้ม/ไดเรกทอรี ...
พารามิเตอร์ต่าง ๆ ได้แก่
-m, --modify=acl แก้ไขค่า acl ปัจจุบันของแฟ้ม/ไดเรกทอรี
-M, --modify-file=file แก้ไขค่า acl ปัจจุบันของแฟ้ม/ไดเรกทอรี โดยใช้ค่าจากรายการ ACL ที่อยู่ในแฟ้มที่ระบุ (=file)
-x, --remove=acl ลบ acl รายการที่กำหนด (=acl) ออกจาก ACL ของแฟ้ม/ไดเรกทอรี
-X, --remove-file=file ลบ acl ออกจากแฟ้ม/ไดเรกทอรี โดยใช้ค่าจากรายการ ACL ที่อยู่ในแฟ้มที่ระบุ (=file)
-b, --remove-all ลบรายการ ACL ทุกรายการออกจากแฟ้ม
-k, --remove-default ลบส่วนรายการปริยายของ ACL (default ACL)
--set=acl ตั้งค่า acl ของแฟ้ม/ไดเรกทอรี โดยทำการแทนที่ค่า acl เดิมที่มีอยู่
--set-file=file ตั้งค่า acl ของแฟ้ม/ไดเรกทอรี โดยใช้ค่าจากรายการ ACL ที่อยู่ในแฟ้มที่ระบุ (=file)
--mask ทำการประมวลผลสิทธิ์ที่ควรได้รับผลกระทบจากค่ามาสก์
-n, --no-mask ไม่ต้องทำการประมวลผลสิทธิ์ที่ควรได้รับผลกระทบจากค่ามาสก์
-d, --default ดำเนินการกับค่ารายการปริยายของ ACL (default ACL)
-R, --recursive กระทำกับแฟ้ม/ไดเรกทอรีย่อยภายในด้วย
-L, --logical ดำเนินการกับแฟ้มในแบบลอจิคอล ซึ่งจะมีการกระทำกับแฟ้มแบบ symbolic link ด้วย
-P, --physical ดำเนินการกับแฟ้มในแบบกายภาพ โดยไม่มีการกระทำกับแฟ้มแบบ symbolic link
--restore=file เรียกคืนค่ารายการ acl ของแฟ้ม/ไดเรกทอรี โดยใช้ค่าจากรายการ ACL ที่อยู่ในแฟ้มที่ระบุ (=file)
(ให้ผลตรงข้ามกับคำสั่ง `getfacl -R')
--test โหมดทดสอบ (ไม่มีการแก้ไขรายการ ACL ใด ๆ)
--version พิมพ์หมายเลขรุ่นและจบการทำงาน
--help แสดงข้อความช่วยเหลือ


    สำหรับการใช้งานคำสั่ง setfacl อย่างง่าย ก็เช่น

    - ต้องการกำหนดให้ผู้ใช้ชื่อ nipat ซึ่งไม่ได้เป็นกลุ่มผู้ใช้เดียวกันกับเรา ให้สามารถทำการอ่านและเขียนแฟ้ม wireless.log ซึ่งเราเป็นเจ้าของได้
และไม่ให้ผู้ใช้อื่นมีสิทธิ์ใด ๆ ในแฟ้มนี้ เราสามารถใช้คำสั่ง setfacl ได้ดังนี้

> setfacl -m user:nipat:rw wireless.log

    - ในกรณีที่รายการ acl user:nipat ของแฟ้ม wireless.log ยังไม่มีอยู่ คำสั่งนี้จะทำการเพิ่มรายการ acl user:nipat เข้าไป

    - แต่ถ้าแฟ้ม wireless.log มีรายการ acl user:nipat อยู่แล้ว คำสั่งนี้จะเป็นการแก้ไขสิทธิ์ของ acl user:nipat




    และสุดท้ายของตอนนี้ ก็มาดูคำสั่ง getfacl กันครับ


   คำสั่ง getfacl



getfacl -- get file access control lists
รูปแบบคำสั่ง: getfacl [-dRLP] file ...
พารามิเตอร์ต่าง ๆ ได้แก่
--access ให้แสดงเฉพาะรายการ acl ของแฟ้ม/ไดเรกทอรีเท่านั้น
-d, --default ให้แสดงเฉพาะรายการ acl ที่เป็นปริยายของแฟ้ม/ไดเรกทอรีเท่านั้น (default ACL)
--omit-header ไม่ต้องแสดงหมายเหตุส่วนหัว
--all-effective แสดงสิทธิ์ที่ได้รับทั้งหมด
--no-effective แสดงสิทธิ์ที่ไม่ได้รับทั้งหมด
--skip-base ข้ามแฟ้มที่มีเฉพาะรายการ acl พื้นฐาน (สิทธิ์แบบเดิม ๆ ที่ใช้กับคำสั่ง chmod)
-R, --recursive เรียกดูกับแฟ้ม/ไดเรกทอรีย่อยภายในด้วย
-L, --logical ดำเนินการกับแฟ้มในแบบลอจิคอล ซึ่งจะมีการกระทำกับแฟ้มแบบ symbolic link ด้วย
-P --physical ดำเนินการกับแฟ้มในแบบกายภาพ โดยไม่มีการกระทำกับแฟ้มแบบ symbolic link
--tabular ใช้รูปแบบการแสดงผลโดยการแบ่งช่องด้วยแท็บ
--numeric แสดงค่าหมายเลขของผู้ใช้/หมายเลขกลุ่มผู้ใช้
--absolute-names ไม่ต้องเครื่องหมาย '/' ที่นำหน้าพาธออก
--version พิมพ์หมายเลขรุ่นและจบการทำงาน
--help แสดงข้อความช่วยเหลือ


    สำหรับการใช้งานคำสั่ง getfacl อย่างง่าย ก็เช่น


> getfacl wireless.log
# file: wireless.log
# owner: donga
# group: users
user::rw-
user:nipat:rw-
group::r--
mask::rw-
other::r--

   ซึ่งก็เป็นสั่งให้แสดงค่าของรายการ acl ที่กำหนดให้กับแฟ้ม wireess.log นั่นเอง





   
เอาละครับ สำหรับตอนนี้ผมขอพักแค่นี้ก่อนละกัน
เดี๋ยวตอนหน้าเราค่อยมาต่อกันในเรื่อง mask ว่าเกี่ยวข้องกับ acl อย่างไร
การใช้ acl กับแฟ้มและไดเรกทอรีมีผลเหมือนหรือแตกต่างกันอย่างไร เดี๋ยวมาว่ากันตอนหน้าครับ
ตอนนี้เบลอแล้ว (html จัดหน้ายากชะมัด :P :lol:)







ข้อมูลอ้างอิง: http://acl.bestbits.at/about.html

1 ความคิดเห็น:

DrRider กล่าวว่า...

โห post ยาวดีนะครับ ดูท่ามีประโยชน์และยืดหยุ่นกับงานในองค์กรมากทีเดียว