File Permission
ความสัมพันธ์ของ UID กับ username และ GID กับ groupname
ในระบบลินุกซ์ ใช้วิธีในการยืนยันตัวตนและสิทธิ์ที่ได้รับของผู้ที่จะเข้ามาในระบบโดยผ่านกระบวนการล็อกอิน โดยใช้ username เพื่อระบุผู้ใช้ที่จะเข้ามาในระบบและ password ของผู้ใช้คนนั้นเพื่อยืนยันการเข้าสู่ระบบ ซึ่ง username ของผู้ใช้ในสมัยก่อนอนุญาตให้มี username ได้ยาวมากที่สุดเพียงแปดตัวอักษร แต่ในปัจจุบันรวมถึงลินุกซ์ อนุญาตให้ใช้ username ได้ยาวมากที่สุดถึง 256 ตัวอักษร
สมมติในระบบมีผู้ใช้คนหนึ่งชื่อ sample พิจารณาไฟล์ /etc/passwd ที่ระบุชื่อผู้ใช้ชื่อ sample
sample:x:100:200:Sample account:/home/sample:/bin/bash
อธิบายฟิลด์ต่างๆ ได้ดังนี้ (แต่ละฟิลด์คั่นด้วยเครื่องหมาย ':' )
Field | Description |
sample | ชื่อ username คือ sample |
x | เป็นรหัสผ่านซี่งจะเก็บค่าไว้ในไฟล์ /etc/shadow |
100 | เป็น User ID หรือ UID ซึ่งลินุกซ์จะใช้ในการอ้างถึงเจ้าของไฟล์นั้นๆ |
200 | อ้างถึง GID ซึ่งลินุกซ์ใช้ในการบอกกรุ๊ปของผู้ใช้คนนี้ |
Sample account | รายละเอียดอื่นๆ เพิ่มเติมของผู้ใช้ชื่อ sample |
/home/sample | เป็นโฮมไดเรกทอรีของผู้ใช้ sample |
/bin/bash | เชลล์หลักของผู้ใช้ |
และผู้ใช้ที่ชื่อ sample อยู่ในกรุ๊ป staff พิจารณาไฟล์ /etc/group
staff:x:200:
อธิบายถึงฟิลด์ต่างๆ ได้ดังนี้
Field | Description |
staff | กรุ๊ปชื่อ staff |
x | ใช้ในการระบุรหัสผ่านให้กับกรุ๊ป |
200 | เป็น Group ID หรือ GID |
ผู้ใช้ชื่อ sample มี UID เป็น 100 และกรุ๊ปเป็น staff ซึ่งมี GID เป็น 200 ซึ่ง UID และ GID เป็นเลขจำนวนจริงขนาด 16 บิตมีค่าตั้งแต่ 0 จนถึง 65535 บางระบบอาจมี UID หรือ GID เป็นเลข 32 บิตได้ มนุษย์จะใช้ตัวอักษรในการอ้างถึง ส่วนลินุกซ์ จะอ้างถึงเป็นตัวเลขเสมอ เป็นแนวความคิดที่ไม่ซับซ้อนและใช้ได้มีประสิทธิภาพมาก โดย UID และ GID ของผู้ใช้จะกำหนดสิทธิ์ในการเข้าถึงไฟล์ในระบบ โดยจับคู่กันระหว่างชื่อผู้ใช้กับ UID และกรุ๊ป กับ GID
ถ้าผู้ใช้สองคนมี UID เหมือนกัน ลินุกซ์จะถือว่าผู้ใช้สองคนนี้เป็นคนเดียวกันแม้ว่า username และ password จะต่างกัน เนื่องมาจากเป็นคนเดียวกันในระบบทำให้มีสิทธิ์เหมือนกันทุกอย่าง เช่นสามารถลบไฟล์ของอีกคนหนึ่งก็ได้ สามารถหยุดโพรเซสของอีกคนหนึ่งได้ (ความหมายของคำว่าอีกคนหนึ่งในที่นี้คือใช้ username คนละชื่อ) ความไม่รอบคอบในลักษณะนี้อาจจะทำให้ระบบทำงานได้ไม่ถูกต้องและมีผลในแง่ความปลอดภัยของระบบ
ผู้ใช้ในระบบที่ UID เป็น 0 คือ Superuser หรือผู้ดูแลระบบมีสิทธิ์ทุกอย่างในระบบ ซึ่งเป็นจุดประสงค์หลักของผู้บุกรุกในการพยายามที่จะทำให้ตัวเองมีสิทธิ์เทียบเท่าผู้ดูแลระบบไม่วิธีใดก็วิธีหนึ่ง ผู้ดูแลระบบควรจะป้องกันไว้ด้วยวิธีต่างๆ เช่น
ในการเปลี่ยนผู้ใช้ในระบบไปเป็นผู้ใช้คนอื่น ลินุกซ์มีคำสั่งที่เกี่ยวข้องสองคำสั่ง คำสั่งแรกคือ SU ซึ่งย่อมาจากคำว่า Substitute User ใช้ในการเปลี่ยน UID ตัวอย่างการใช้งานเช่น
$ whoami
sample
$ su - test
password: -------
$ whoami
test
$
การใช้คำสั่ง SU ต้องใช้ password ของผู้ที่ต้องการจะเปลี่ยนไป อีกคำสั่งหนึ่งที่ควรจะนำไปใช้งานมากกว่าคือ SUDO ซึ่งสามารถกำหนดได้ว่าจะให้เปลี่ยนไปเป็นใครได้บ้าง มีสิทธิ์และขอบเขตแค่ไหนในระบบ
ความแตกต่างระหว่าง File permission กับ Directory permission
ลินุกซ์มองทุกสิ่งทุกอย่างในระบบเป็นไฟล์ ดังนั้น File permission จึงเป็นเรื่องสำคัญที่สุดต่อการใช้งาน และมักจะพบว่าเป็นความผิดพลาดเบื้องต้น ที่ผู้ดูแลระบบมองข้ามหรือไม่สนใจอยู่บ่อยครั้งทำให้ระบบเกิดจุดอ่อนได้ง่าย
คำสั่ง ls ใช้ในการแสดงไฟล์หรือไดเรกทอรีที่มีในระบบ สมมติตัวอย่างการใช้คำสั่ง ls -l เพื่อแสดงไฟล์ test ในระบบ
-rwxr-xr-- 1 sample staff 852 Jul 9 10:10 test
ไฟล์ชื่อ test มีเจ้าของเป็น sample และอยู่ในกรุ๊ปที่ชื่อ staffอธิบายถึงความหมายในฟิลด์ต่างๆ ได้ดังนี้
Field | Description |
-rwxr-xr-- | file permission |
1 | จำนวน hard link ของไฟล์นี้ |
sample | user ที่เป็นเจ้าของไฟล์ |
staff | กรุ๊ป |
852 | ขนาดของไฟล์ หน่วยเป็นไบต์ |
Jul 9 | วันที่มีการแก้ไขล่าสุด |
10:10 | เวลาที่มีการแก้ไขล่าสุด |
test | ชื่อไฟล์ |
การพิจารณาวันเวลาที่มีการบันทึกในไฟล์และไดเรกทอรีในระบบก็เป็นเรื่องสำคัญที่ไม่ควรมองข้าม ใช้ในการตรวจสอบหาลำดับเวลาเมื่อเกิดเหตการณ์ผิดปกติกับระบบ ระบบการบันทึกวันและเวลาของไฟล์ใน ลินุกซ์มีวันและเวลาในการบันทึกทั้งหมดสามรูปแบบคือ
รูปแบบ | ชื่อย่อ | การใช้คำสั่ง ls | คำอธิบาย |
modify time | mtime | ls -l | วันเวลาที่มีการแก้ไขครั้งล่าสุด |
access time | atime | ls -lu | วันเวลาที่มีการแก้ไขวันและเวลาโดยใช้ system call ของระบบเช่น utime() เป็นต้น (โดยมากมักไม่ได้ใช้ แต่มักจะใช้ในการวิเคราะห์ไฟล์ในระดับลึกลงไป) |
change time | ctime | ls -lc | วันเวลาที่แก้ไขโดยระบบปฏิบัติการเมื่อมีการเปลี่บนแปลงโครงสร้างของไฟล์ ซึ่งโดยปกติ ค่าจะไม่มีการเปลี่ยนแปลง |
พิจารณา File permission -rwxr-xr-- ได้ว่า
- | r | w | x | r | - | x | r | - | - |
type | owner (user) | group | others |
ในแต่ละส่วนอธิบายเพิ่มเติม
Description | คำอธิบาย |
type | บอกถึงชนิดของไฟล์ |
owner (user) | สิทธิ์ในการเข้าถึงไฟล์ของเจ้าของไฟล์ |
group | สิทธิ์ในการเข้าถึงไฟล์ของผู้ใช้ในระบบที่อยู่ในกรุ๊ปที่ระบุไว้ |
others | สิทธื์ในการเข้าถึงไฟล์ของทุกคนในระบบที่ไม่ใช่เจ้าของไฟล์และไม่ได้อยู่ในกรุ๊ป เดียวกันกับ group ที่ระบุไว้ |
โดยที่ types จะอธิบายถึงชนิดของไฟล์
types | ความหมาย |
- | ไฟล์ปกติ |
d | ไดเรกทอรี |
c | ดีไวซ์แบบ character |
b | ดีไวซ์แบบ block |
l | symbolic link |
s | socket |
p | FIFO |
ความหมายของ permission หรือสิทธิ์ในการเข้าถึงไฟล์ปกติที่ไม่ใช่ไดเรกทอรี คือ
File | ||
Character | Permission | ความหมาย |
r | READ | สามารถเปิดไฟล์และอ่านเนื้อความในไฟล์ได้ |
w | WRITE | สามารถเพิ่มข้อความ ลบข้อความ หรือเปลี่ยนแปลงเนื้อความในไฟล์ได้ |
x | EXECUTE | จะใช้ในกรณีที่ไฟล์นี้สามารถทำงานได้หรือสั่งให้ทำงานได้ ซึ่งจะมีสิทธื์ในการทำงานนี้ปรากฏอยู่ |
แต่เมื่อนำมาใช้กับไดเรกทอรีจะมีสิทธิ์ในอีกความหมายหนึ่งดังนี้
Directory | ||
Character | Permission | ความหมาย |
r | READ | สามารถใช้คำสั่ง ls ในการดูไฟล์ภายในไดเรกทอรีได้ |
w | WRITE | สามารถเพิ่มไฟล์ ลบไฟล์ เปลี่ยนชื่อไฟล์ที่อยู่ในไดเรกทอรีได้ |
x | EXECUTE | สามารถใช้คำสั่ง cd ทำการเปลี่ยนไดเรกทอรีปัจจุบันเข้าไปได้ หรือใช้ในการเปิดไฟล์ภายในไดเรกทอรีรวมไปถึงไดเรกทอรีย่อยภายใน |
การทำความเข้าใจเรื่อง permission หรือสิทธิ์ในการเข้าถึงทั้งไฟล์หรือไดเรกทอรี เป็นสิ่งจำเป็น เพราะจะช่วยแก้ปัญหาที่เกิดขึ้นได้อย่างรวดเร็ว มีประเด็นสำคัญที่ควรให้ความสนใจบางประเด็นเช่น
ความหมายของ Sticky bit
มีบิตพิเศษอีกหนึ่งบิตเรียกว่า Sticky ซึ่งในปัจจุบันจะใช้กับไดเรกทอรีเท่านั้นมีความหมายคือ ไดเรกทอรีใดก็ตามที่มีบิตที่เรียกว่า Sticky bit อยู่ หมายถึงไฟล์ในไดเรกทอรีจะมีการเปลี่ยนแปลง ลบ เปลี่ยนชื่อ เพิ่มเนื้อหาได้เฉพาะบุคคลสามคนนี้เท่านั้นคือ
มักใช้ในไดเรกทอรี /tmp ของลินุกซ์
การคำนวณเลขฐานแปดของ File permission
ในการใช้งาน ไม่ว่าจะเป็นการอ่าน การเปลี่ยนแปลง permission ของไฟล์ใดๆ ในระบบนั้น มักจะระบุ permission ของไฟล์ในรูปเลขฐานแปดแทนการเขียนว่า -rwxr-xr-- เพราะสะดวกกว่า สรุปเป็นตารางในรูปแบบเพื่อช่วยจำได้ว่า
special | owner | group | others | |||||||||
SUID | S | 4 | ||||||||||
SGID | S | 2 | r | w | x | r | w | x | r | w | x | |
Sticky | T | 1 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | |
วิธีการดูตาราง คือในฟิลด์ special จะรวมเลขเป็นแนวตั้งลงมา ส่วนฟืลด์ owner, group และ others จะรวมเลขเป็นแนวนอน ตัวอย่างเช่น จาก permission เป็น -rwxr-xr-- เมื่อนำมาจับใส่ในตารางจะได้เป็น
special | owner | group | others | |||||||||
SUID | - | 4 | ||||||||||
SGID | - | 2 | r | w | x | r | - | x | r | - | - | |
Sticky | - | 1 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | |
0 | 7 | 5 | 4 |
ซึ่งไม่มีบิตพิเศษไม่ว่าจะเป็น SUID, SGID และ sticky-bit ใดๆ ดังนั้นอ่านเฉพาะตัวอักษรที่มี แล้วนำมารวมกัน ดังนั้นเริ่มบิตแรกไม่มีบิตพิเศษใด ดังนั้นเป็น 0 จากนั้นช่อง owner รวมได้ 7 ของ group ได้ 5 และถัดมาเป็น others ได้ 4 นำมาเขียนเรียงกันได้ดังนั้น -rwxr-xr-- มีคำตอบเป็น 0754
หรืออีกตัวอย่างหนึ่ง เช่น -r-sr-xr-x จับใส่ในตารางได้เป็น
special | owner | group | others | |||||||||
SUID | S | 4 | ||||||||||
SGID | - | 2 | r | - | x | r | - | x | r | - | x | |
Sticky | - | 1 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | |
4 | 5 | 5 | 5 |
ในกรณีที่มีบิตพิเศษ ให้แทนที่บิตพิเศษด้วย EXECUTE หรือ x จากนั้นคำนวณด้วยวิธีการเดิม เห็นว่ามีบิตพิเศษเป็น SUID ดังนั้นได้เป็น 4 ถัดมาเป็น owner รวมกันได้ 5 ส่วน group รวมกันได้ 5 และ others ก็ 5 เช่นเดียวกัน ดังนั้น -r-sr-xr-x มีคำตอบเป็น 4555
สิทธิ์ที่ได้ของ Effective UID ของโพรเซสในการเข้าถึงไฟล์ในระบบ
โพรเซสบนยูนิกซ์ในเวลาใดๆ จะมีหมายเลขประจำที่บอกให้ทราบถึงสิทธิ์ในการเข้าถึงไฟล์ และ/หรือ ไดเรกทอรีใดๆ ในระบบของโพรเซส เรียกว่า Effective UID หรือ EUID โดยปกติจะมีค่าเท่ากัน UID ของผู้ที่สั่งให้โพรเซสในระบบยูนิกซ์ทำงาน ตัวอย่างเช่นสั่งให้โปรแกรม passwd ทำงาน โดยปกติเมื่อผู้ใช้สั่งให้โปรแกรม passwd ทำงาน โพรเซสจะมี EUID เท่ากับ UID ของคนที่สั่งให้โปรแกรมนี้ทำงานขึ้นมา และ EUID นี้เองจะเป็นตัวกำหนดและบอกว่าโพรเซสใดจะมีสิทธิ์ในระบบมากน้อยแค่ไหน ดังรูป
รูปที่ 1 แสดง EUID เมื่อสั่งให้โปรแกรมทำงาน
แต่บางครั้งจำเป็นต้องใช้สิทธิ์มากกว่าที่มีอยู่ ในการเข้าถึงไฟล์สำคัญ ไม่ว่าจะเป็นการอ่านการเขียนไฟล์สำคัญของระบบ ซึ่งโดยทั่วไปผู้ใช้ทั่วไปไม่มี ยกตัวอย่างเช่นโปรแกรม passwd ซึ่งเป็นโปรแกรมทีใช้ในการเปลี่ยนรหัสผ่านของผู้ใช้ในระบบ ซึ่งทราบกันดีว่าข้อมูลของผู้ใช้ในระบบทุกคนจะเก็บไว้ในไฟล์ /etc/passwd และรหัสผ่านเก็บในไฟล์ /etc/shadow ซึ่งอนุญาตให้เฉพาะผู้ดูแลระบบหรือ root มีสิทธิ์ในการเขียนไฟล์สองไฟล์นี้ ดังนั้นตามกฎเกณฑ์ของระบบเมื่อจะทำการเปลี่ยนรหัสผ่านของตนเอง เมื่อสั่งให้โปรแกรม passwd ทำงาน จะได้โพรเซสของ passwd ขึ้นมาซึ่งจะมี EUID เท่ากับ UID ของผู้ใช้ในระบบไม่ใช่ผู้ดูแลระบบที่มีสิทธิ์อ่านเขียนไฟล์ ดังนั้นจะไม่สามารถเปลี่ยนรหัสผ่านได้
ดังนั้นจึงมีวิธีการที่เรียกว่า SUID และ SGID ในการเพื่มความสามารถในการทำงานภายใต้กฏเกณฑ์ดังกล่าวนี้ เพื่อแก้ปัญหาที่เกิดขึ้นนี้ ยูนิกซ์รวมไปถึงลินุกซ์ได้ออกแบบให้โพรเซสที่ทำงานนั้นมีกฏยกเว้นในการเปลี่ยนให้ EUID เป็นผู้ใช้คนอื่นได้ หรือใช้สิทธิ์จาก EUID ของคนอื่นได้เช่นจากตัวอย่างของโปรแกรม passwd นั้นเมื่อผู้ใช้ในระบบสั่งให้โปรแกรมทำงานจะมี EUID เท่ากับ UID ของผู้ใช้ที่สั่งให้โปรแกรม passwd ทำงานแต่ในกรณีนี้ต้องการให้โพรเซส passwd (เมื่อโปรแกรมทำงานจะเรียกได้ว่าเป็นโพรเซส) ใช้สิทธิ์ของผู้ดูแลระบบหรือ root ในการเข้าถึงไฟล์สำคัญสองไฟล์ ดังนั้นจึงจำเป็นต้องเปลี่ยนให้ EUID ของโพรเซสจาก UID ของผู้ใช้ที่สั่งให้โปรแกรมทำงานไปเป็น UID ของผู้ดูแลระบบหรือ root
โปรแกรมที่มีการเปลี่ยน UID ขณะที่มีการทำงานหรือเมื่อเป็นโพรเซสเรียกว่าโปรแกรม SUID โดยจะใช้วิธีการเปลี่ยน UID ให้ตรงกับเจ้าของโปรแกรมนั้นๆ โดยอย่างในตัวอย่างนี้คือ passwd ซึ่งเจ้าของไฟล์นี้คือ root ดังนั้นเมื่อโปรแกรมทำงานจะได้โพรเซสที่มี EUID เป็น root หรือเจ้าของโปรแกรม passwd ซึ่งจะไม่ใช่ผู้ใช้ที่สั่งให้โปรแกรม passwd ทำงานอย่างในกรณีทั่วไป ดังรูป
รูปที่ 2 การทำงานของโปรแกรม SUID
สำหรับ SGID ใช้แนวความคิดเดียวกันแต่เปลี่ยนจากเจ้าของไฟล์เป็น group เดียวกับไฟล์นั้นๆ
สำหรับการระบุ SUID และ SGID จะระบุในตำแหน่งเดียวกับ EXECUTE ใน permission ของไฟล์หรือโปรแกรมในระบบตัวอย่างเช่นโปรแกรม passwd
-r-sr-xr-x 1 root root 13476 Aug 7 2001 /usr/bin/passwd
จะเห็นว่ามีเครื่องหมายว่า 's' ใช้ในการระบุ SUID ของโปรแกรม passwd และตัวอย่างโปรแกรมที่มี SGID เช่น
-r-xr-sr-x 1 root root 4562 Aug 8 2001 /tmp/samples
ผู้ดูแลระบบมักจะเข้าใจผิดว่าแนวความคิดดังกล่าวนี้ ทำให้เกิดจุดอ่อนขึ้นในระบบ แต่ในความเป็นจริงแล้ว จุดอ่อนจะเกิดได้จากสองจุดเท่านั้นคือ
ซึ่งจะเห็นได้ว่าไม่ใช่ปํญหาของแนวความคิดในการมีทั้ง SUID และ SGID เพราะว่าความผิดพลาดเกิดจากผู้ดูแลระบบที่ไม่รอบคอบและไม่ตรวจสอบว่าไฟล์ในระบบมีไฟล์ที่มี SUID และ SGID มากน้อยแค่ไหนในระบบ และไม่ทราบถึงขอบเขตการทำงานของโปรแกรมที่มีรูปแบบที่ต้องใช้แนวความคิดนี้ในการทำงาน
ปัญหาของความผิดพลาดที่เกิดขึ้นบ่อยครั้งสำหรับ SUID ยกตัวอย่างการใช้คำสั่งดังต่อไปนี้
$ cp /bin/sh /tmp/test
$ chmod 4755 /tmp/test
$ /tmp/test
$ whoami
root
$
โดยปกติโปรแกรม /bin/sh จะมีเจ้าของเป็น root เมื่อทำการสำเนาโดยใช้คำสั่ง cp แล้วจากนั้นทำการเปลี่ยนสิทธิ์ให้กับไฟล์ที่ได้ทำการสำเนา โดยให้มี SUID ดังนั้นเมื่อสั่งให้โปรแกรมทำงานจะได้ EUID เป็นเจ้าของไฟล์นั้นหรือ root และเนื่องจากว่าโปรแกรมนี้คือ /bin/sh ซึ่งเป็นเชลล์ของระบบดังนั้นจึงสามารถทำอะไรกับระบบได้ทุกอย่างเทียบเท่ากับสิทธิ์ของผู้ดูแลระบบ อย่างไรก็ดี ใน ลินุกซ์ไม่อนุญาตให้เกิดการทำงานตามที่แสดงในตัวอย่างได้แล้ว แต่ตัวอย่างดังกล่าวก็แสดงให้เห็นได้เป็นอย่างดีว่า SUID มีประโยชน์ถ้านำไปใช้งานได้อย่างถูกต้อง แต่จะเป็นภัยต่อระบบถ้าผู้ดูแลระบบไม่รอบคอบเพียงพอ
วิธีการหลีกเลี่ยงและป้องกันปัญหาที่เกิดจาก SUID และ SGID ตัวอย่างเข่น
# find / \( -perm -4000 -o -perm -2000 \) -print
# mount /dev/hda3 /share -o nosuid
umask ในลินุกซ์
umask ย่อมาจากคำว่า user file-creation mode mask เป็นเลขฐานแปดจำนวนสี่บิตใช้สำหรับตัดสินใจสำหรับ permission ของไฟล์ที่สร้างใหม่ในระบบ ในลินุกซ์ได้กำหนดค่า umask ไว้ในไฟล์ /etc/bashrc โดยใช้คำสั่ง
umask 0022
การใช้งาน umask อธิบายได้ว่าค่าเลขฐานแปดที่ตามหลังคำสั่ง umask เป็นค่าที่ใช้ในการนำไปทำการ XOR กับค่าดีฟอลต์ในการสร้างไฟล์ในระบบซึ่งจะเป็นค่าที่กำหนดภายในเคอร์เนล ซึ่งมีค่าดังตาราง
ลักษณะของไฟล์ | ค่าดีฟอลต์ของ permission ของระบบ |
ไฟล์ปกติที่ไม่ใช่โปรแกรม | 0666 |
โปรแกรมใช้งานในระบบ | 0777 |
ค่า umask ที่กำหนดโดยผู้ใช้ระบบจะนำไป XOR กับค่าดีฟอลต์ในการสร้างไฟล์ของระบบ ตัวอย่างเช่นถ้าใช้ค่า umask เป็น 0022 ดังนั้นไฟล์ที่ไม่ใช่โปรแกรมที่สร้างใหม่จะมี permission เป็น 0644 หรือ -rw-r--r--
default file-creation | 0666 | XOR |
umask | 0022 | |
result | 0644 |
หรือตัวอย่างในการสร้างโปรแกรมใหม่จะมี permission เป็น 0755 หรือ -rwxr-xr-x ดังตาราง
default file-creation | 0777 | XOR |
umask | 0022 | |
result | 0755 |
ปกติมักนิยมใช้ค่าที่มากับระบบ แต่ถ้าผู้ดูแลระบบต้องการความยืดหยุ่นก็อาจจะปรับค่าที่มากับระบบได้
ขอบคุณข้อมูลจากคุณ เลอศักดิ์ ลิ้มวิวัฒน์กุล thaicert
ไม่มีความเห็น