Samba Security
Samba เป็นซอฟต์แวร์ที่ช่วยให้สามารถแชร์ไฟล์และเครื่องพิมพ์บนลินุกซ์ให้กับระบบปฏิบัติการวินโดวส์ 95, 98, 2000, NT รวมทั้ง smbclient อื่น เช่น linux, unix อื่นๆ ได้ การทำงานของ Samba ประกอบไปด้วยส่วนประกอบหลักๆ ดังนี้
รูปที่ 1 แสดงรูปแบบทั่วไปในการใช้งาน Samba server
โดยทั่วไปไฟล์ configuration ของ samba จะถูกเก็บไว้ที่ /etc/samba/smb.conf ไฟล์นี้จะเป็นตัวควบคุมการทำงานทั้งหมดของ samba ดังนั้นการแก้ไขใดๆ จึงควรกระทำด้วยความระมัดระวัง เพราะหากเกิดความผิดพลาดอาจจะทำให้เกิดการรั่วไหลของข้อมูลได้ เช่น การอนุญาตให้ผู้ใช้สามารถเข้าใช้งานได้โดยไม่ต้องใส่ username และ password
การแก้ไข configuration ของ samba นั้นสามารถทำได้ 2 วิธีคือ แก้ไขไฟล์โดยตรงที่ /etc/samba/smb.conf หรือติดตั้ง SWAT ซึ่งจะช่วยให้สามารถแก้ไข configuration ผ่านทางเว็บได้ (default port = 901/tcp) ซึ่งหากมีการใช้งาน SWAT ควรจำกัดการเข้าถึงเฉพาะผู้ดูแลระบบเท่านั้น เช่น ควบคุมให้เข้าถึงได้เฉพาะจากไอพีที่ระบุไว้ หรือยกเลิกการใช้งาน SWAT เมื่อเสร็จสิ้นการแก้ไข configuration
หมายเหตุ:
configuration ของ Samba นั้นมีรายละเอียดค่อนข้างมาก เอกสารฉบับนี้จะนำเสนอออปชันในส่วนที่เกี่ยวข้องกับความปลอดภัยเท่านั้น ซึ่งมีรายละเอียดดังต่อไปนี้
1. Authentication Security
เมื่อ Samba แชร์ไฟล์หรือเครื่องพิมพ์ให้แก่ผู้ใช้และไม่อนุญาตให้ guest เข้ามาใช้งาน ผู้ใช้จะต้องทำการยืนยันตัวตนกับ Samba ซึ่ง Samba มีวิธีในการเลือกการยืนยันตัวตนผ่านทางออปชัน security ซึ่งสามารถเลือกได้ 4 แบบดังนี้
หมายเหตุ: หากมีการระบุออปชั่น Public = yes หรือ Guest ok = yes ใน /etc/samba/smbd.conf แล้ว และไม่ว่าจะระบุ security เป็นออปชันใด Samba ก็จะไม่ทำการตรวจสอบรหัสผ่านที่ส่งมาจากไคลเอ็นต์ (client) แต่อย่างใด
2. Passwords
การที่ผู้ใช้จะสามารถเข้าถึงไดเรกทอรีหรือเครื่องพิมพ์ที่แชร์ไว้ได้นั้น ผู้ใช้จะต้องมี unix account บนเครื่องเซิร์ฟเวอร์ที่ให้บริการ Samba เสียก่อน โดยปกติ Samba สนับสนุนการตรวจสอบตัวตนผู้ใช้ทั้งในแบบที่มีการเข้ารหัส (Encrypted) และไม่มีการเข้ารหัส (Non-encrypted) โดยการตั้งค่า
encrypt passwords = [yes|no]
โดยหากมีค่าเป็น no ตัว Samba จะทำการตรวจสอบรหัสผ่าน(และ username) จากไฟล์ /etc/passwd แต่หากมีค่าเป็น yes ตัว Samba จะทำการตรวจสอบรหัสผ่าน(และ username) จากไฟล์ /etc/samba/smbpasswd แทน ทั้งนี้หากไฟล์ /etc/samba/smbpasswd ไม่มีอยู่จริง ก็จะทำให้ไม่มีผู้ใช้รายใดสามารถเข้าใช้งานแชร์ทั้งหมดได้ (โดยปกติจะไม่มีไฟล์นี้อยู่ ผู้ดูแลระบบจะต้องสร้างไฟล์นี้ขึ้นเอง ซึ่งจะกล่าวถึงรายละเอียดในลำดับต่อไป)
การใช้งานออปชัน encrypt passwords นั้น จะขึ้นอยู่กับความสามารถของระบบปฎิบัติการที่เป็นไคลเอนต์ว่า สนับสนุนการเข้ารหัสหรือไม่ ดังนี้
ตารางที่ 1 แสดงระบบปฏิบัติการต่างๆ กับความสามารถในการส่งรหัสผ่านแบบเข้ารหัสOperating System |
Encrypted or Non-encrypted |
---|---|
Windows 95 |
Non-encrypted |
Windows 95 with SMB Update |
Encrypted |
Windows 98 |
Encrypted |
Windows NT 3. x |
Non-encrypted |
Windows NT 4.0 before SP 3 |
Non-encrypted |
Windows NT 4.0 after SP 3 |
Encrypted |
ในกรณีที่ตั้งค่า encrypt passwords = no ซึ่งหมายถึง Samba จะต้องทำการตรวจสอบรหัสผ่านและรายชื่อผู้ใช้จากไฟล์ /etc/passwd ผู้ดูแลระบบจะสังเกตได้ว่าในไฟล์ /etc/passwd นั้นมี default account อยู่จำนวนมาก เช่น root, bin, daemon, shutdown ซึ่งหมายความว่า account ที่ติดมากับระบบดังกล่าว สามารถเป็นผู้ใช้ที่ถูกต้องในระบบของ Samba ได้ด้วย ดังนั้นจึงขอแนะนำให้ทำการยกเลิกการใช้งาน account ที่ติดมากับระบบ โดยการตั้งค่าออปชัน invalid users ไว้ที่ส่วน [global] ดังเช่น
[global]
invalid users = root bin daemon adm sync shutdown \
halt mail news uucp operator gopher \
nobody mailnull rpm ntp
อย่างไรก็ตาม Samba ได้แนะนำให้ใช้ออปชัน encrypt passwords = yes แทนเพราะจะทำให้มีความปลอดภัยมากกว่า ทั้งนี้ผู้ดูแลระบบจำเป็นต้องสร้างไฟล์ /etc/samba/smbpasswd ขึ้นมา เพื่อรองรับการทำงานในโหมดดังกล่าว ซึ่งสามารถทำได้ 2 วิธีด้วยกันคือ
cat /etc/passwd | /usr/bin/mksmbpasswd.sh > /etc/samba/smbpasswd
สำหรับระบบที่ให้บริการ Samba service และใช้ออปชัน encrypt passwords = yes ซึ่งจำเป็นต้องสร้าง account ของระบบขึ้นมาก่อนนั้น ในบางครั้ง account ดังกล่าวไม่ต้องการใช้งาน shell ในระบบเลย มีการใช้งานเฉพาะในส่วนของการขอใช้บริการของ Samba server เท่านั้น ดังนั้นผู้ดูแลระบบควรทำการยกเลิกการใช้งาน account ของระบบดังกล่าว โดยแก้ไขไฟล์ /etc/passwd แล้วเพิ่มเครื่องหมาย colon (:) ไปที่ต้นบรรทัดของบรรทัดที่ระบุชื่อ account ที่ไม่ต้องการให้เข้าใช้งานในระบบ เช่น
:lersak:x:503:500::/home/lersak:/bin/bash
นอกจากนี้การที่ Samba สร้างไฟล์รหัสผ่านของตัวเองแยกออกมาจากของระบบทำให้ผู้ใช้สามารถมีรหัสผ่านที่แตกต่างกันได้ อย่างไรก็ตามเพื่อป้องกันไม่ให้ผู้ใช้ของ Samba ทำการตั้งรหัสผ่านเป็น null (ไม่มีค่าใดๆ) ผู้ดูแลระบบควรตั้งค่าออปชัน null passwords = no เพื่อป้องกันเหตุการณ์ดังกล่าวได้
นอกจากนั้น ผู้ดูแลระบบที่ตั้งค่า encrypt passwords = yes จำเป็นอย่างยิ่งที่จะต้องตั้งค่า permission ของไฟล์ /etc/samba/smbpasswd ให้มีค่าเป็น 0600 เพื่อป้องกันการ crack password จากไฟล์ดังกล่าว
3. Networking Options
มี configuration ที่เกี่ยวข้องกับเครือข่ายที่ควรพิจารณาแก้ไขดังต่อไปนี้
hosts allow = 192.168.1.
hosts deny = 192.168.1.226/255.255.255.255
โดยค่าที่สามารถระบุได้ใน hosts allow, hosts deny คือ
- hostname เช่น hosts allow = example.nectec.or.th
- ip address เช่น hosts allow = 192.168.1.22
- domain เช่น hosts allow = .nectec.or.th exact.nectec.or.th
(.nectec.or.th หมายถึง ทุกเครื่องที่อยู่ภายใต้โดเมน nectec.or.th)- netgroup โดยปกติใช้ได้กับเครือข่ายที่ติดตั้ง NIS, NIS+ เท่านั้น เช่น hosts allow = @localnet
- subnet เช่น hosts allow = 192.168.1. (192.168.1. หมายถึง 192.168.1.0/24)
- ALL ซึ่งหมายถึง ip ใดก็ได้
- EXCEPT เป็นการยกเว้นค่าที่ต้องการ เช่น hosts deny = ALL EXCEPT 192.168.1.
อย่างไรก็ตาม Samba มีกฎในการนำค่า configuration ของ host allow, hosts deny ไปใช้งานดังนี้
- ถ้าไม่มีการระบุ hosts allow หรือ hosts deny ตัว Samba จะถือว่าเป็นการอนุญาตให้ใช้งานได้อย่างอิสระ (เสมือน hosts allow = ALL)
- ถ้ามีการระบุ hosts allow, hosts deny ใน [global] ค่าดังกล่าวจะมีผลกับทุกๆ แชร์ แม้ว่าจะมีการระบุ hosts allow, deny ในแต่ละแชร์ซึ่งการระบุในแต่ละแชร์ดังกล่าวจะถือว่าไม่มีผลแต่อย่างใด
- ถ้ามีการระบุ hosts allow แต่ไม่ได้ระบุ hosts deny จะถือว่า ค่าที่นอกเหนือจากที่ระบุใน hosts allow จะมีสถานะเป็น deny โดยอัตโนมัติ
- ในทำนองเดียวกัน ถ้ามีการระบุ hosts deny แต่ไม่ได้ระบุ hosts allow จะถือว่า ค่าที่นอกเหนือจากที่ระบุใน hosts deny จะมีสถานะเป็น allow โดยอัตโนมัติ
- ถ้ามีค่า เช่น ip address หรือ subnet ถูกระบุในทั้ง hosts allow และใน hosts deny จะถือว่าค่าดังกล่าวมีสถานะเป็น deny
4. Filesystem Options
configuration ในส่วนนี้จะเกี่ยวข้อง filesystem ซึ่งผู้ดูแลระบบจำเป็นต้องเข้าใจและนำไปใช้ให้เหมาะสมกับระบบของตน
รูปที่ 2 การแสดงผลใน windows explorer เมื่อใช้ออปชัน hide dot files = yes
[data]
path = /home/samba/data
browseable = yes
guest ok = no
writeable = yes
case sensitive = no
hide files = /*.java/*README*/
รูปที่ 3 การแสดงผลใน windows explorer เมื่อใช้ออปชัน hide files
โดยการกำหนดชื่อไฟล์ที่ต้องการซ่อนนั้นสามารถใช้ pattern matching ได้ อย่างไรก็ตามหากผู้ใช้ระบบปฏิบัติการวินโดวส์ที่ตั้งค่าให้สามารถ view hidden files ผ่านทาง windows explorer ได้ก็จะสามารถมองเห็นไฟล์ดังกล่าวได้ด้วยดังรูปที่ 3
[data]
path = /home/samba/data
browseable = yes
guest ok = no
writeable = yes
case sensitive = no
veto files = /*.java/*README*/
รูปที่ 4 การแสดงผลใน windows explorer เมื่อใช้ออปชัน veto files
[data]
path = /home/samba/data
browseable = yes
guest ok = no
writeable = yes
case sensitive = no
dont descend = folder1 folder2
รูปที่ 5 การแสดงผลใน windows explorer เมื่อใช้ออปชัน follow symlinks = no
5. File Permissions and Attributes
6. การควบคุมการเข้าถึงแชร์
ผู้ดูแลระบบควรจำกัดการเข้าถึงแชร์ใดๆ ให้ใช้งานได้เฉพาะผู้ที่สมควรได้รับสิทธิ์เท่านั้น โดยมีออปชันที่เกี่ยวข้องดังนี้
valid users = myuid, lersak, @staff
ระบุให้เฉพาะผู้ใช้ที่มีชื่อในรายการนี้เท่านั้น จึงจะสามารถเข้าถึงดิสก์ที่แชร์ไว้ได้ (ใช้ @ สำหรับทั้ง group)
** หากรายชื่อผู้ใช้ที่กำหนดไว้ใน valid users ไปปรากฏซ้ำกับรายชื่อใน invalid users ก็จะถือว่าผู้ใช้รายนั้นถูกจัดในกลุ่ม invalid usersinvalid users = kitisak, @guest
แสดงรายชื่อผู้ใช้ที่ไม่มีสิทธิ์เข้าใช้งานแชร์writable = yes
writeable = yes
write ok = yes
read only = no
ออปชันทั้งสี่แบบด้านบนนี้ให้ผลลัพธ์เหมือนกัน คืออนุญาตให้ผู้ใช้สามารถสร้างไฟล์หรือไดเร็กทอรีขึ้นมาใหม่ได้read list = choawalit, kitisak
แสดงรายชื่อผู้ใช้ที่มีสิทธิ์ใช้งานแชร์แบบอ่านเท่านั้น ไม่สามารถทำการแก้ไขใดๆ ได้ หากว่าผู้ใช้ใน read list มีชื่อใน list อื่น เช่น write list, read only, writeable ก็จะถือว่าผู้ใช้นั้นมีสิทธิ์เป็น read only เท่านั้นwrite list = lersak, phuwadon, siriwan
เป็นการให้สิทธิ์ write แก่ผู้ใช้ที่มีชื่อในรายการนี้ แม้ว่าจะมีการระบุว่า read only = yes ก็ตามpublic = no
guest ok = no
ออปชัน public และ guest ok สามารถใช้แทนกันได้ ซึ่งหากกำหนดค่าเป็น yes ก็จะทำให้สามารถเข้าใช้งานดิสก์ที่แชร์ไว้โดยไม่ต้องล็อกอินhosts equiv =
เป็นออปชันที่เป็นอันตรายอย่างยิ่ง ผู้ดูแลระบบควรตรวจสอบให้แน่ใจว่าไม่มีการระบุออปชันนี้ในไฟล์ /etc/samba/smb.conf เป็นอันขาด เพราะในออปชัน hosts equiv ดังกล่าวจะกำหนดรายชื่อผู้ใช้และโฮสต์ที่สามารถเข้าใช้งานดิสก์ที่แชร์ไว้โดยไม่ต้องใช้รหัสผ่าน (คล้ายกับไฟล์ hosts.equiv ของ Unix)
7. คำแนะนำเกี่ยวกับความปลอดภัยอื่นๆ
ผู้ดูแลระบบจะต้องระมัดระวังในการให้ write permission ของไฟล์ /etc/samba/smb.conf แก่ผู้ใช้รายอื่น เพราะหากผู้ใช้สามารถแก้ไขข้อมูลในไฟล์ smb.conf ได้ เช่น อาจจะเพิ่มออปชัน root preexec = , root postexec = ซึ่งเป็นการระบุให้รันคำสั่งที่ต้องการด้วยสิทธิ์ของ root ผู้ใช้รายดังกล่าวก็สามารถครอบครองระบบได้โดยง่าย
ดังนั้นจึงควรแก้ไขค่า permission ของไฟล์ /etc/samba/smb.conf ดังนี้
chown root.root /etc/samba/smb.conf
chmod 600 /etc/samba/smb.conf
อย่างไรก็ตามผู้ดูแลระบบควรระมัดระวังเมื่อติดตั้ง SWAT เวอร์ชั่นที่ติดมากับ Red Hat linux version ที่ต่ำกว่า 7.0 เพราะ SWAT จะทำการแก้ไข permission ของไฟล์ /etc/samba/smb.conf เป็น 664 แตกต่างจาก SWAT ที่ติดมากับ Red Hat 7.0 ขึ้นไปนั้นไม่มีช่องโหว่ดังกล่าวแล้ว แต่ผู้บุกรุกยังสามารถติดตั้ง SWAT เวอร์ชันที่มีช่องโหว่เองได้
สิ่งที่สำคัญคือ ผู้ดูแลระบบจะต้องตั้งค่าออปชันดังต่อไปนี้ในทุกๆ แชร์ เพื่อกำหนดสิทธิ์ให้ชัดเจนว่า ผู้ใช้รายใดจะสามารถเข้ามาใช้งานได้และสามารถใช้งานในระดับใดได้บ้าง
valid users =
writeable =
read list =
write list =
hosts allow =
hosts deny =
หมายเหตุ :
ขอบคุณข้อมูลดีๆจาก :thaicert
ขอบคุณ คับ