วันจันทร์ที่ 13 ธันวาคม พ.ศ. 2553

คอนฟิกลีนุกซ์ Disk Quota ตอนที่ 2

คอนฟิกลีนุกซ์ Disk Quota ตอนที่ 2

หลัง จากที่เปิดการใช้งาน disk quota กับ /home แล้ว ในตอนที่ 2 นี้จะอธิบายการกำหนดปริมาณการใช้งานดิสก์ของผู้ใช้งานแต่ละคน (user quota)

วิธีตรวจสอบค่า disk quota

เราสามารถตรวจสอบค่า quota ที่ถูกกำหนดไว้ ได้สองวิธีคือ

1. เป็น root แล้วใช้คำสั่ง repquota วิธีนี้จะแสดงรายงานของผู้ใช้งานทั้งหมด ทั้งการกำหนดค่า quota พร้อมทั้งขนาดของดิสก์ที่ผู้ใช้งานแต่ละรายใช้ไป

ตัวอย่างการใช้ repquota

[root@server ~]# repquota /home
*** Report for user quotas on device /dev/sda6
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 17676 0 0 4 0 0
user1 -- 44 0 0 8 0 0
user2 -- 24 0 0 6 0 0

2. ผู้ใช้ธรรมดาร (normal user) สามารถใช้คำสั่ง quota เพื่อตรวจสอบค่าการใช้งานดิสก์ของตัวเองได้

ตัวอย่างการใช้คำสั่ง quota

[user1@server ~]$ quota
Disk quotas for user user1 (uid 500): none

การกำหนด disk quota ของผู้ใช้งาน (user quota)

คอนฟิกเริ่มต้นหลังจากรันคำสั่ง quotacheck และ quotaon จะมีการตรวจสอบขนาดดิสก์ที่ถูกใช้ไป ของผู้ใช้งานแต่ละคน แต่ยังไม่มีการกำหนดค่าสูงสุดที่ใช้ได้ สังเกตค่าตัวเลขจะเป็น 0 ซึ่งเป็นค่าที่แสดงว่าไม่มีการจำกัดปริมาณการใช้งาน

ใช้คำสั่ง edquota ด้วย root เพื่อกำหนด disk quota ของผู้ใช้แต่ละคน โดยคำสั่งนี้จะเปิดโปรแกรม vi เพื่อให้เราแก้ไขค่าต่างๆ ของการใช้งานดิสก์ของผู้ใช้งานได้

ตัวอย่างการกำหนด disk quota ของ user1

[root@server ~]# edquota -u user1
Disk quotas for user user1 (uid 500):
Filesystem blocks soft hard inodes soft hard
/dev/sda6 44 0 0 8 0 0

ความหมายของค่าต่างๆ มีดังนี้

เราสามารถจำกัดปริมาณการใช้งาน disk quota ได้สองแบบ คือ

1. กำหนดเป็นขนาดพื้นที่ดิสก์ที่ใช้งานได้ มีหน่วยเป็น blocks คำนวณคร่าวๆ 1 block คือ 1 kilo bytes
2. กำหนดเป็นจำนวนไฟล์ที่สร้างขึ้นได้ มีหน่วยเป็น inodes หนึ่งไฟล์ใช้ 1 inode

โดยทั่วไปนิยมกำหนดเป็นแบบแรกมากกว่า คือกำหนดขนาดพื้นที่ดิสก์ที่สามารถใช้งานได้

ส่วนค่าที่กำหนดมีสองระดับคือ

1. soft เป็นปริมาณที่อนุญาตให้ใช้เกินค่านี้ได้ แต่จะอยู่ในระยะเวลาที่กำหนด (grace)
2. hard เป็นค่าสูงสุดที่ใช้ได้ ผู้ใช้งานไม่สามารถสร้างไฟล์เพิ่มเติมมากกว่านี้ได้อีกแล้ว

ตัวอย่างการกำหนดให้ user1 สามารถใช้พื้นที่ดิสก์ได้แบบ soft เท่ากับ 100 MB และแบบ hard ได้เท่ากับ 200 MB

[root@server ~]# edquota -u user1
Disk quotas for user user1 (uid 500):
Filesystem blocks soft hard inodes soft hard
/dev/sda6 44 100000 200000 8 0 0
[root@server ~]# repquota -a
*** Report for user quotas on device /dev/sda6
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 17676 0 0 4 0 0
user1 -- 44 100000 200000 8 0 0
user2 -- 24 0 0 6 0 0

ทดลองสร้างไฟล์ด้วย user

ล็อกอินเป็น user1 เพื่อตรวจสอบแล้วทดลองสร้างไฟล์ขึ้นมา

[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 44 100000 200000 8 0 0

หมายเหตุ ผลลัพธ์ที่แสดงจากคำสั่ง quota จะเปลี่ยนคำว่า soft เป็นคำว่า quota และเปลี่ยน hard เป็นคำว่า limit

ใช้คำสั่ง dd เพื่อสร้างไฟล์ 50 MB

[user1@server ~]$ dd if=/dev/zero of=file-50M.bin bs=1000000 count=50
50+0 records in
50+0 records out
50000000 bytes (50 MB) copied, 0.726378 s, 68.8 MB/s
[user1@server ~]$ ls -l
total 48884
-rw-r--r-- 1 user1 users 50000000 2009-03-28 16:19 file-50M.bin
[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 48928 100000 200000 9 0 0

ทดลองสร้างอีกไฟล์ที่มีขนาด 60 MB

[user1@server ~]$ dd if=/dev/zero of=file-60M.bin bs=1000000 count=60
60+0 records in
60+0 records out
60000000 bytes (60 MB) copied, 0.860898 s, 69.7 MB/s
[user1@server ~]$ ls -l
total 107544
-rw-r--r-- 1 user1 users 50000000 2009-03-28 16:19 file-50M.bin
-rw-r--r-- 1 user1 users 60000000 2009-03-28 16:20 file-60M.bin
[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 107588* 100000 200000 7days 10 0 0

หลังจากที่สร้างไฟล์ที่สอง เท่ากับว่าผู้ใช้คนนี้ user1 มีการใช้งานดิสก์ไปแล้ว 110 MB ซึ่งมากกว่าค่า soft (quota) ที่กำหนดไว้ ใช้คำสั่ง quota ตรวจสอบ จะเห็นว่ามีเครื่องหมายดอกจัน (*) อยู่หลัง จำนวน blocks ที่ถูกใช้ไป พร้อมทั้งมีค่า 7days ในช่อง grace ขึ้นมา เพื่อแสดงว่า ผู้ใช้งานคนนี้ยังสามารถใช้พื้นที่ดิสก์ได้ต่อไปอีก 7 วัน แต่หลังจากนี้จะไม่อนุญาตให้สร้างได้อีกแล้ว

ทดลองสร้างไฟล์เพิ่มเติม 70 MB จะเห็นว่ายังสามารถใช้ดิสก์เพิ่มเติมได้อยู่ ขนาดรวมตอนนี้ 180MB ตราบเท่าที่ยังไม่เกิน 7days หรือไม่เกิน hard (limit)

[user1@server ~]$ dd if=/dev/zero of=file-70M.bin bs=1000000 count=70
70+0 records in
70+0 records out
70000000 bytes (70 MB) copied, 0.203143 s, 345 MB/s
[user1@server ~]$ ls -l
total 175976
-rw-r--r-- 1 user1 users 50000000 2009-03-28 16:19 file-50M.bin
-rw-r--r-- 1 user1 users 60000000 2009-03-28 16:20 file-60M.bin
-rw-r--r-- 1 user1 users 70000000 2009-03-28 16:25 file-70M.bin
[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 176020* 100000 200000 6days 11 0 0

ทดลองสร้างไฟล์เพิ่มอีก 80 MB

[user1@server ~]$ dd if=/dev/zero of=file-80M.bin bs=1000000 count=80
dd: writing `file-80M.bin': Disk quota exceeded
25+0 records in
24+0 records out
24526848 bytes (25 MB) copied, 0.174226 s, 141 MB/s
[user1@server ~]$ ls -l
total 199956
-rw-r--r-- 1 user1 users 50000000 2009-03-28 16:19 file-50M.bin
-rw-r--r-- 1 user1 users 60000000 2009-03-28 16:20 file-60M.bin
-rw-r--r-- 1 user1 users 70000000 2009-03-28 16:25 file-70M.bin
-rw-r--r-- 1 user1 users 24526848 2009-03-28 16:30 file-80M.bin

มีข้อความ error “Disk quota exceeded” เกิดขึ้น จะเห็นว่าไฟล์ที่สร้างขึ้นใหม่ ไม่สำเร็จ โดย quota จะอนุญาตให้สร้างไฟล์ได้ถึงขนาดพื้นที่ดิสก์รวมไม่เกินค่า hard (limit) เท่านั้น

[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 200000* 100000 200000 6days 12 0 0

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

[user1@server ~]$ rm -f file-80M.bin
[user1@server ~]$ rm -f file-70M.bin
[user1@server ~]$ ls -l
total 107544
-rw-r--r-- 1 user1 users 50000000 2009-03-28 16:19 file-50M.bin
-rw-r--r-- 1 user1 users 60000000 2009-03-28 16:20 file-60M.bin
[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 107588* 100000 200000 6days 10 0 0
[user1@server ~]$ dd if=/dev/zero of=file-80M.bin bs=1000000 count=80
80+0 records in
80+0 records out
80000000 bytes (80 MB) copied, 0.900514 s, 88.8 MB/s
[user1@server ~]$ ls -l
total 185756
-rw-r--r-- 1 user1 users 50000000 2009-03-28 16:19 file-50M.bin
-rw-r--r-- 1 user1 users 60000000 2009-03-28 16:20 file-60M.bin
-rw-r--r-- 1 user1 users 80000000 2009-03-28 16:34 file-80M.bin
[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 185800* 100000 200000 6days 11 0 0

เมื่อใช้ดิสก์เกินค่า soft (quota) เลยระยะเวลา grace

เมื่อใช้พื้นที่ดิสก์เกินค่า soft (quota) ไปแล้ว ผู้ใช้งานยังสามารถสร้างไฟล์ได้เพิ่มเติมอีก ตราบที่ยังไม่เกินค่าเวลา grace ดีฟอลต์คือ 7 วัน แต่ถ้าเกินระยะเวลานี้แล้ว ผู้ใช้งานจะไม่สามารถสร้างไฟล์เพิ่มเติมได้อีกแล้ว

[user1@server ~]$ date
Sat Mar 28 16:38:12 ICT 2009
[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 185800* 100000 200000 6days 11 0 0

สมมติว่าระยะเวลาผ่านไปเกิน 7 วันแล้ว เมื่อใช้คำสั่ง quota ดู จะเห็นว่าช่อง grace เป็นเป็นค่า none

[user1@server ~]$ date
Sat Apr 4 17:00:04 ICT 2009
[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 185800* 100000 200000 none 11 0 0

ผู้ใช้คนนี้จะไม่สามารถสร้างไฟล์ได้เพิ่มอีกแล้ว จะมี error ฟ้องว่า “Disk quota exceeded” ตลอด ซึ่งเป็นเพราะว่า ผู้ใช้คนนี้ใช้เกินค่า soft เกินระยะเวลา grace แล้วนั่นเอง

[user1@server ~]$ dd if=/dev/zero of=file-1M.bin bs=1000000 count=1
dd: writing `file-1M.bin': Disk quota exceeded
1+0 records in
0+0 records out
0 bytes (0 B) copied, 0.00622609 s, 0.0 kB/s
[user1@server ~]$ ls -l
total 185756
-rw-r--r-- 1 user1 users 0 2009-04-04 17:01 file-1M.bin
-rw-r--r-- 1 user1 users 50000000 2009-03-28 16:19 file-50M.bin
-rw-r--r-- 1 user1 users 60000000 2009-03-28 16:20 file-60M.bin
-rw-r--r-- 1 user1 users 80000000 2009-03-28 16:34 file-80M.bin
[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 185800* 100000 200000 none 12 0 0

วิธีการแก้ไข ผู้ใช้คนนี้ต้องลบไฟล์ที่ไม่ใช้งานออกไป จนกว่าขนาดพื้นที่ดิสก์ที่ใช้ จะต่ำกว่าค่า soft ที่ถูกกำหนดไว้

[user1@server ~]$ rm -f file-1M.bin
[user1@server ~]$ rm -f file-50M.bin
[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 136916* 100000 200000 none 10 0 0
[user1@server ~]$ rm -f file-60M.bin
[user1@server ~]$ quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 78256 100000 200000 9 0 0
[user1@server ~]$ dd if=/dev/zero of=file-1M.bin bs=1000000 count=1
1+0 records in
1+0 records out
1000000 bytes (1.0 MB) copied, 0.0120102 s, 83.3 MB/s

คอนฟิกลีนุกซ์ Disk Quota ตอนที่ 1

คอนฟิกลีนุกซ์ Disk Quota ตอนที่ 1

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

โดยดีฟลอต์เซิร์ฟเวอร์ลีนุกซ์ที่ติดตั้ง จะไม่มีการจำกัดพื้นที่ดิสก์ของผู้ใช้งาน แต่ละคนสามารถใช้ได้จนกระทั่งขนาดของดิสก์ไม่เพียงพอ

บทความนี้ขอนำเสนอวิธีการคอนฟิก Disk Quota เพื่อจำกัดปริมาณการใช้งานดิสก์ โดยสามารถทำได้เป็นระดับรายผู้ใช้งาน (user quota) หรือจะแบ่งเป็นกลุ่ม (group quota) ได้

ระบบที่ทดสอบ

การคอนฟิก Disk Quota ต้องทำระดับ mount point โดยต้องเลือกว่าจะเปิดคุณสมบัติ (quotaon) กับ mount point ใด แนะนำให้ตอนติดตั้งลีนุกซ์ แยก partition ที่เป็น /home ต่างหาก ซึ่งเป็น mount point ที่เป็น home directory ของผู้ใช้งาน (user) แล้วเปิด quota เฉพาะ ส่วนนี้

ลีนุกซ์ส่วนใหญ่จะสนับสนุน disk quota ในระดับ kernel อยู่แล้ว แต่ไม่ได้เปิดการใช้งาน (quotaon) ไว้ ในบทความนี้เป็นการทดสอบคอนฟิกกับ /home บน Fedora 10

ตัวอย่างการแบ่ง partition ของเครื่องที่ทดสอบ

[root@server ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 1011960 201320 759232 21% /
/dev/sda1 202219 13513 178266 8% /boot
/dev/sda5 1011928 17680 942844 2% /tmp
/dev/sda6 1011928 18700 941824 2% /home
/dev/sda7 5044156 939604 3848320 20% /usr
/dev/sda8 1019864 37860 930196 4% /var
tmpfs 189632 0 189632 0% /dev/shm

ตัวอย่างไฟล์ /etc/fstab ของเครื่องที่ทดสอบ

[root@server ~]# cat /etc/fstab
/dev/sda1 /boot ext3 defaults 1 2
/dev/sda2 / ext3 defaults 1 1
/dev/sda5 /tmp ext3 defaults 1 2
/dev/sda6 /home ext3 defaults 1 2
/dev/sda7 /usr ext3 defaults 1 2
/dev/sda8 /var ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/sda3 swap swap defaults 0 0

เปิดคุณสมบัติ user quota

เริ่มต้น เราจะทดสอบ user quota ก่อน โดยต้องทำการ remount แล้วเพิ่มออปชั่น userquota

[root@server ~]# mount | grep home
/dev/sda6 on /home type ext3 (rw)
[root@server ~]# mount -o remount,usrquota /home
[root@server ~]# mount | grep home
/dev/sda6 on /home type ext3 (rw,usrquota)

สร้างไฟล์ aquota.user สำหรับเก็บ user quota

[root@server ~]# cd /home
[root@server home]# touch aquota.user
[root@server home]# chmod 600 aquota.user
[root@server home]# ls -l
total 28
-rw------- 1 root root 0 2009-03-28 13:58 aquota.user
drwx------ 2 root root 16384 2009-02-21 21:15 lost+found
drwx------ 3 user1 users 4096 2009-03-29 13:02 user1
drwx------ 3 user2 users 4096 2009-03-29 12:59 user2

รันคำสั่ง quotacheck เพื่อตรวจสอบปริมาณการใช้งานดิสก์ของแต่ละผู้ใช้

[root@server home]# quotacheck -vgum /home
quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
quotacheck: WARNING - Quotafile /home/aquota.user was probably truncated. Cannot save quota settings...
quotacheck: Scanning /dev/sda6 [/home] done
quotacheck: Old group file not found. Usage will not be substracted.
quotacheck: Checked 7 directories and 14 files

ถ้ารันคำสั่ง quotacheck ถูกต้อง จะมีการเขียนข้อมูลลงในไฟล์ aquota.user ใช้คำสั่ง ls ดู จะเห็นว่ามีขนาดเพิ่มขึ้น

[root@server home]# ls -l
total 36
-rw------- 1 root root 7168 2009-03-28 13:59 aquota.user
drwx------ 2 root root 16384 2009-02-21 21:15 lost+found
drwx------ 3 user1 users 4096 2009-03-29 13:02 user1
drwx------ 3 user2 users 4096 2009-03-29 12:59 user2

เปิดคุณสมบัติ quota ด้วยคำสั่ง quotaon

[root@server home]# quotaon -v /home
/dev/sda6 [/home]: user quotas turned on

ใช้คำสั่ง repquota เพื่อแสดงรายงานการใช้งานดิสก์ของแต่ละคน

[root@server home]# repquota /home
*** Report for user quotas on device /dev/sda6
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 17676 0 0 4 0 0
user1 -- 44 0 0 8 0 0
user2 -- 24 0 0 6 0 0

แก้ไขไฟล์ /etc/fstab

เมื่อทดสอบ quota สำเร็จแล้ว สุดท้ายต้องมีการเพิ่มออปชั่นลงไปในไฟล์ /etc/fstab เพื่อให้มีผลหลังจากที่มีการรีบู๊ตเครื่อง

ตัวอย่างการเพิ่มออปชั่น usrquota ที่ /home ในไฟล์ /etc/fstab

[root@server ~]# cat /etc/fstab
/dev/sda1 /boot ext3 defaults 1 2
/dev/sda2 / ext3 defaults 1 1
/dev/sda5 /tmp ext3 defaults 1 2
/dev/sda6 /home ext3 defaults,usrquota 1 2
/dev/sda7 /usr ext3 defaults 1 2
/dev/sda8 /var ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/sda3 swap swap defaults 0 0

ยกเลิกการใช้ user quota

หากต้องการยกเลิกการใช้งาน user quota สามารถทำได้ดังนี้

รันคำสั่ง quotaoff เพื่อปิดการตรวจสอบ quota (ถ้าต้องการปิดการใช้ user quota ชั่วคราว ให้รันคำสั่งนี้ก็เพียงพอแล้ว ไม่ต้องทำขั้นต่อไป)

[root@server ~]# quotaoff -v /home
/dev/sda6 [/home]: user quotas turned off

แก้ไขไฟล์ /etc/fstab โดยลบ usrquota ที่เพิ่มเข้าไปในบรรทัดของ mount point แล้วรันคำสั่ง mount เพื่อ remount ใหม่ แต่ไม่มีออปชั่น usrquota

[root@server ~]# mount | grep home
/dev/sda6 on /home type ext3 (rw,usrquota)
[root@server ~]# mount -o remount /home
[root@server ~]# mount | grep home
/dev/sda6 on /home type ext3 (rw)

ลบไฟล์ aquota.user

[root@server ~]# cd /home/
[root@server home]# ls -l
total 36
-rw------- 1 root root 7168 2009-03-28 14:07 aquota.user
drwx------ 2 root root 16384 2009-02-21 21:15 lost+found
drwx------ 3 user1 users 4096 2009-03-28 14:05 user1
drwx------ 3 user2 users 4096 2009-03-29 12:59 user2
[root@server home]# rm -f aquota.user

ในตอนต่อไปจะกล่าวถึงวิธีการกำหนดค่า quota ของแต่ละผู้ใช้งาน

วันอาทิตย์ที่ 12 ธันวาคม พ.ศ. 2553

Statefull Firewall

Statefull Firewall
เรียบเรียงโดย :
ภูวดล ด่านระหาญ
เผยแพร่เมื่อ : 12 พฤศจิกายน 2544

เอกสารฉบับนี้จะอธิบายถึงความหมายและลักษณะการทำงานของคำว่า "stateful firewall" ซึ่งเป็นรูปแบบหนึ่งของไฟร์วอลล์ที่ผู้ผลิตนำมาใช้ในปัจจุบัน ในการที่จะเข้าใจถึงคำว่า stateful firewall นั้น จำเป็นต้องทำความเข้าใจคำอีก 2 คำ คือคำว่า packet filtering และ proxy server มาก่อน ท่านสามารถอ่านบทความที่อธิบายถึงพื้นฐานของไฟร์วอลล์ทั่วไปได้จาก http://thaicert.nectec.or.th/paper/firewall/fwbasics.php

ในอดีตนั้น โดยทั่วไปมักจะแยกกันโดยชัดเจนระหว่างไฟร์วอลล์แบบ statefull filtering และแบบ application-level proxy server แต่ในปัจจุบันนี้ได้มีสินค้าหลายรุ่นที่ออกมาสู่ตลาด โดยนำข้อดีของทั้งสองอย่างมารวมกัน ซึ่งเราเรียกกันว่า hybrid firewall

การที่จะทำความเข้าใจหลักการทำงานของ stateful firewall ให้ได้ดีนั้น จำเป็นต้องมีความรู้พื้นฐานเกี่ยวกับ 7-layers OSI model ซึ่งแสดงให้เห็นดังภาพที่ 1

ทั้งนี้เราจะพิจารณาเฉพาะ layer ที่ 3,4 และ 7 ซึ่งเกี่ยวข้องกับ TCP/IP เท่านั้น ส่วน layer ที่ 5,6 (session, presentation) นั้น จะใช้งานในส่วนอื่นๆ เช่น LDAP, NetBIOS, Netware ซึ่งอยู่นอกเหนือขอบเขตของเอกสารฉบับนี้

สิ่งที่สำคัญพอๆ กับ OSI model ก็คือการทำความเข้าใจภาพรวมของโครงสร้างของข้อมูลดังที่เห็นในภาพ ในชั้น application layer นั้น ชุดของข้อมูลมีแค่ส่วนของข้อมูลที่ต้องการส่งเท่านั้น แต่ใน layer ชั้นถัดๆ ลงไป ชุดของข้อมูลจะประกอบไปด้วยส่วนของ header และ body โดยส่วนของ header เป็นส่วนที่เกี่ยวข้องกับ layer ชั้นนั้นๆ ในขณะที่ส่วนของ body เป็นส่วนของ body + header ของ layer ชั้นที่อยู่ด้านบน ลักษณะของการกระทำกับข้อมูลดังกล่าวเรียกว่า encapsulation และในชั้นของ transport layer ตัว IP protocol ที่ผู้ใช้เรียกใช้ ซึ่งอาจจะเป็น TCP, UDP, ICMP ก็จะปะส่วน header ของมันรวมไปกับข้อมูล และส่งต่อ segment(ชุดของข้อมูลใน transport layer มักจะเรียกกันว่า segment) ใหม่นี้ไปยัง layer ที่อยู่ด้านล่างถัดไป และที่ชั้น IP layer ข้อมูลทุกอย่างที่มาจาก transport layer จะถูกมองว่าเป็นข้อมูล (data) มันจะแปะส่วน header รวมกับข้อมูลนั้น เพื่อส่งผ่าน packet(ชุดของข้อมูลที่อยู่ในชั้น IP layer มักจะเรยีกกันว่า packet) ไปยัง layer ที่อยู่ด้านล่างถัดไป เมื่อข้อมูลมาถึงชั้น data link layer มันจะแปะส่วน header รวมกับข้อมูลนั้น และในที่สุดข้อมูลก็จะถูกส่งออกไป เมื่อได้รับ packet กระบวนการทำงานย้อนกลับก็เริ่มขึ้น โดยข้อมูลจะถูกส่งไปยัง data link layer เพื่อเก็บข้อมูลที่มันต้องการจาก header จากนั้นก็จะลบส่วนของ header ออก พร้อมทั้งส่งข้อมูลไปยัง IP layer ตัว IP layer เองก็จะอ่านข้อมูลจาก header ลบ header ออก และส่งผ่านข้อมูลไปยัง transport layer และเป็นเช่นนี้จนกระทั่งข้อมูลถูกส่งไปยังชั้นที่ต้องการในที่สุด

กระบวนการที่กล่าวไปแล้วนั้นเป็นสิ่งที่สำคัญสำหรับ simple packet filter, application proxy และ stateful packet-filtering technology ทั้งสามตัวนี้จะต้องเข้าถึงข้อมูลในส่วนของ header ในแต่ละ layer ซึ่งบรรจุข้อมูลที่แตกต่างกันไป โดยข้อมูลเหล่านี้จะถูกใช้เพื่อพิจารณาว่ามันเป็นข้อมูลที่อนุญาตให้ผ่านไป หรือไม่

ชั้น IP layer นั้นเป็นชั้นที่ทั้ง simple packet filter และ stateful filter ใช้เป็นจุดเริ่มต้นในการพิจารณาข้อมูล ซึ่งจุดนี้ที่ผู้ผลิต packet-filtering firewall ใช้เป็นข้อโต้แย้งว่า application proxy ไม่สามารถมองเห็นข้อมูลในชั้น network และ transport layer (ตามมาตรฐานของ OSI stack) ได้ ในปัจจุบัน simple packet filter บางตัวเช่น border router สามารถทำ access filtering ได้ที่ชั้น IP layer นี้ นอกจากนี้ router ส่วนใหญ่ยังสามารถทำงานที่ชั้น transport layer ได้อีกด้วย

สิ่งที่ simple packet filter และ stateful firewall ทำเหมือนกันก็คือ ตรวจสอบข้อมูล header ของ IP packet โดยสิ่งที่ถูกตรวจสอบคือ

  • source address
  • destination address
  • protocol
  • options

policy ของไฟร์วอลล์ส่วนใหญ่มักจะตรวจสอบความถูกต้องของ address (ทั้ง source address และ destination address) ด้วย ยกเว้นกรณีที่ระบุเป็น "all" และข้อมูลในส่วนของ protocol นั้นก็จะเป็นตัวบอกว่า ส่วนของ data นั้นบรรจุข้อมูลชนิดใดอยู่ เช่น TCP, UDP, ICMP หรือบางทีอาจจะเป็น IPSEC, ESP, ISAKMP กระบวนการในการตรวจสอบรูปแบบของ header นั้นจะอยู่ที่ layer ชั้นบนถัดไป และข้อมูลในส่วน options นั้น โดยปกติมักจะไม่มีค่าอะไร แต่อาจจะมี flag ที่แสดงถึง source routing ได้ (source routing ใช้ในกรณีที่ผู้ส่งต้องการให้ผู้รับส่งข้อมูลผ่านเส้นทางที่ผู้ส่งได้กำหนด ไว้) โดยปกติแล้วมักจะถูกใช้โดยผู้บุกรุก ดังนั้น packet filter ส่วนใหญ่จะ drop packet ที่ถูกส่งมาพร้อมกับ flag ดังกล่าว โดยไม่มีการตรวจสอบข้อมูลอย่างอื่นเพิ่มเติม

TCP header บรรจุข้อมูล 3 ส่วนที่สำคัญใน transport layer ไว้คือ source port , destination port และ flags โดยในส่วนของ flag นั้น สามารถประกอบไปด้วย URG(urgent), ACK(acknowledgment), PSH(push), RST(reset), SYN(syncronize) และ FIN(finish) และยังมีส่วนที่สี่ที่บรรจุ sequence number ซึ่งผู้ผลิตบางค่ายนำมาใช้พิจารณาด้วย

สำหรับ flag นั้นเป็นส่วนที่สำคัญมากใน stateful firewall เช่น การทำ TCP 3-way handshake (โปรดอ่านรายละเอียดในหนังสือที่เกี่ยวข้อง TCP/IP ทั่วไป)

UDP header บรรจุข้อมูลเพียงแค่ source port และ destination port เท่านั้นเอง ไม่มีส่วนของ flag และ sequence number แต่อย่างใด เนื่องจาก UDP เป็น connectionless protocol อยู่แล้วนั่นเอง และใน ICMP header นั้น ไม่ได้บรรจุข้อมูล port แต่อย่างใด แต่บรรจุชนิดของ ICMP (ICMP message type) เช่น "Echo request" , "Destination unreachable"

Simple packet filter จะพิจารณา TCP packet เพื่อตรวจสอบว่า

  • packet นั้น มี address ที่ถูกต้องหรือไม่
  • packet นั้น ถูกสร้างมาจาก external address จริงหรือไม่
  • protocol หรือ service นั้น ผ่านการตรวจสอบแล้วหรือไม่
  • option หรือ flag ที่ส่งมานั้น ถูกต้องตามข้อกำหนดหรือไม่

โดยทั่วไป border router มักจะทำหน้าที่ตรวจสอบระหว่างภายในและภายนอกเครือข่าย เพราะมันเป็นอุปกรณ์ที่สามารถบอกได้ว่า packet ถูกสร้างมาจากภายในหรือภายนอก และถ้า packet ถูกส่งมาจากภายนอกแต่มี address เป็นภายใน ก็แสดงว่า packet นั้นถูก spoof address มา และ packet นั้นควรที่จะถูก drop ทิ้งไป และนอกจากนี้ simple packet filter ยังไม่มีข้อมูลที่แสดงถึงการเชื่อมต่อที่เปิดขึ้นก่อนหน้านี้หรือในขณะนี้แต่อย่างใด ดังนั้นสมมติว่ามันได้รับ ACK packet มันก็จะพิจารณาว่า packet นี้ เป็นส่วนหนึ่งของ connection ที่เกิดขึ้นแล้ว และส่วนใหญ่ก็จะส่งต่อ packet ต่อไป จุดนี้ไม่ใช่ปัญหาของ established connection แต่มันเป็นปัญหาในกรณีที่การส่ง ACK packet ดังกล่าวถูกส่งมาโดยเจตนาร้าย (มีโปรแกรมจำนวนมากที่สามารถทำเช่นนี้ได้) เพราะเมื่อเครื่องปลายทางได้รับ ACK มันมักจะส่งสัญญาณ RST กลับไป ซึ่งจะแสดงให้เห็นว่าเครื่องปลายทางนั้นยังเปิดอยู่ และเปิดให้บริการใน port ดังกล่าว(destination port ที่ส่งมาพร้อมกับ ACK packet) บางครั้งยังสามารถใช้ตรวจสอบระบบปฏิบัติการของเครื่องปลายทางได้อีกด้วย (OS fingerprint) เพราะระบบปฏิบัติการในแต่ละระบบนั้นมักจะมีวิธี response ที่แตกต่างกันออกไป

สำหรับ packet-filtering firewall (stateful) แล้วมันก็ทำเช่นเดียวกันกับ simple packet filter แต่มันจะบันทึกข้อมูลเกี่ยวกับ connection ที่เกิดขึ้นลงใน state table ก่อนที่จะส่ง packet นั้นไปยัง IP stack ตัว table นี้จะมีส่วนสำหรับบันทึกข้อมูลสำหรับแต่ละ connection ที่ถูกต้อง โดยปกติจะเก็บข้อมูล source and destination address, protocol, port, flag แต่มีไฟร์วอลล์บางยี่ห้อที่เก็บข้อมูล sequence number เพิ่มด้วย เพื่อใช้ในการตรวจสอบ packet ที่กำลังจะเข้ามาและป้องกันการทำ session hijacking

เมื่อ packet-filtering firewall ได้รับ packet มันจะตรวจสอบข้อมูลกับ state table ว่าเป็นส่วนของ connection ที่สร้างไว้แล้วหรือไม่ โดยจะพิจารณาจากข้อมูล source adderss, destination address, source port, destnation port จะต้องสอดคล้องกับ state table ซึ่งถ้าเป็นส่วนหนึ่งของ connection จริงก็ไม่มีความจำเป็นใดๆ ที่ต้องตรวจสอบซ้ำอีก แต่ในไฟร์วอลล์บางยี่ห้อนั้นจะพิจารณา sequence number ของ packet เพิ่มเติมด้วย เช่น CiscoPIX ในขณะที่ Checkpoint's Firewall-1 ไม่พิจารณา sequence number แต่อย่างใด และเนื่องจากมีการเก็บ history ไว้ใน state table ดังนั้น stateful firewall สามารถ drop/return packet ที่ผิดปกติได้ และถ้า packet ที่ส่งมาเป็นส่วนหนึ่งของ connection ที่สร้างไว้แล้ว มันก็จะส่งผ่านเลย ซึ่งทำให้ประหยัด cost มากกว่าการตรวจสอบ firewall ruleset ใหม่อีกรอบ ดังนั้นจึงทำให้ packet-filtering firewall ทำงานได้เร็วมาก

ถ้า packet ที่ส่งมาไม่ตรงกับ connection ที่สร้างไว้แล้ว และไม่ใช่ SYN packet ตัว packet นั้นๆ ก็จะถูก drop ทิ้งไป และแม้แต่ packet ที่ผสม flag แปลกๆ เช่น SYN/FIN (เป็นกระบวนการหนึ่งในการทำ port scanning) ก็จะถูก drop ทิ้งไปเช่นเดียวกัน ทั้งนี้ไฟร์วอลล์ส่วนใหญ่สามารถบันทึกล็อกได้ด้วย ซึ่งขึ้นอยู่กับการตั้งค่าของผู้ดูแลระบบเองว่าต้องการเก็บข้อมูลใด

ในกรณีที่ packet-filtering firewall ได้รับ UDP packet เนื่องจากไม่มีกระบวนการ 3-way handshake เพราะมันเป็น stateless protocol ไม่มี sequence number แต่มันก็ยังมี source port และ destination port ซึ่งจะถูกสร้างขึ้นใน state table ซึ่งรวมเอา source address , destination address มาไว้ด้วยกัน ทั้งนี้ เนื่องจาก UDP ไม่มี FIN หรือ RST ซึ่งใช้สำหรับยกเลิกการเชื่อมต่อเหมือนกับ TCP ดังนั้นมันจึงต้องมี timeout เพื่อลบข้อมูลออกจาก state table

อย่างไรก็ตามจำเป็นต้องมีวิธีในการลบข้อมูลออกจาก state table โดยเฉพาะสำหรับ TCP connection ซึ่งอาจจะถูกโจมตีโดยการส่ง SYN packet (เรียกอีกอย่างว่า SYN flood) จำนวนมากเข้ามายังไฟร์วอลล์ ซึ่งก่อให้เกิด Denial of Service ได้ เพราะมันทำให้ state table เต็ม ปัญหานี้สามารถแก้ไขได้โดยการตั้ง timeout ของ แต่ละ connection ไว้

สำหรับ application proxy จะทำการตรวจสอบข้อมูลในชั้น network layer และ transport layer และยังสามารถตรวจสอบความถูกต้องในชั้น application layer ได้อีกด้วย ซึ่งทำให้ application proxy สามารถกลั่นกรอง commands, protocol, packet length, authorization, content, invalid header หรือสามารถส่งผ่าน packet ไปได้เลย application proxy เป็น stateful firewall แต่สิ่งที่สร้างความแตกต่างคือ proxy server จะสร้าง IP packet ใหม่ เพื่อส่งต่อไปยังเป้าหมาย ทั้งนี้เพื่อป้องกัน malformed packet และ proxy จะสร้าง packet ใหม่เพื่อส่งต่อก็ต่อเมื่อ packet นั้นผ่านการตรวจสอบแล้ว

ในกรณีของ simple packet filter เราจำเป็นต้องระบุ rule ทั้ง incoming packet และ ทั้ง outgoing packet ในขณะที่ stateful firewall สามารถระบุได้แค่ข้างเดียวเท่านั้นเอง เพราะ packet ที่ return กลับมานั้น จะถือว่าเป็นส่วนหนึ่งของ connection ที่สร้างไว้ก่อนแล้ว แต่ก็มีข้อยกเว้นเหมือนกัน เช่น Checkpoit's Firewall-1 นั้นต้องการการระบุ rule แยกสำหรับการใช้งาน ICMP echo request และ ICMP echo reply

ผู้ผลิดไฟร์วอลล์แต่ละยี่ห้อนั้นมักจะสร้างจุดเด่นที่แตกต่างกัน เช่น

  • Cisco's PIX จะเริ่มต้น connection ด้วยการทำ application-level authentication จากนั้นก็จะส่งต่อไปยัง layer ชั้นที่อยู่ต่ำกว่า โดยจะเริ่มทำการตรวจสอบ stateful ในชั้น network layer และจะไม่มีการตรวจสอบ packet payload ถัดไปอีกเลย ภายหลังจากที่มีการทำ authnticationใน packet แรกแล้ว ดังนั้นจึงถือได้ว่า Cisco's PIX เป็น stateful packet filter
  • Checkpoint's Firewall-1 สามารถทำ application-layer login ได้ แต่ต้องได้รับการแก้ไขค่าบางอย่างเพิ่มเติม นอกจากนี้ยังมี proxy ในตัวด้วย ดังนั้นจึงถือได้ว่า Checkpoint's Firewall-1 เป็น hybrid firewall
  • Axent's Raptor เป็น pure proxy firewall โดยมีคุณสมบัติคล้ายกับ PIX และ Firewall-1 แต่ได้เพิ่มการตรวจสอบระดับ application-layer เข้าไปด้วย ซึ่งทำให้มันมีราคาแพงและมีหลายอย่างที่ต้องทำมาก และยังมี protocol ที่สนับสนุนจำนวนจำกัด นอกจากนี้เนื่องจากมันเป็น application proxy จึงมีข้อจำกัดในเรื่องความยืดหยุ่น ซึ่งต่างกับ stateful firewall
  • Gauntlet Firewall สามารถเป็นได้ทั้ง hybrid, stateful packet filtering หรือ adaptive proxy ได้อีกด้วย

stateful firewall เป็น stateful เพราะมันสามารถตรวจสอบ packet data โดยมีการเทียบกับ history ของแต่ละ connection ได้ ซึ่งผู้ผลิตแต่ละยี่ห้อต่างก็มีวิธีการนำมาปรับใช้ในสินค้าของตัวเองแตกต่างกันไป

วันพุธที่ 1 ธันวาคม พ.ศ. 2553

Juniper

http://www.izitcer.com/?tag=juniper

วันอังคารที่ 19 ตุลาคม พ.ศ. 2553

Find and Copy

find dir/ -name '*.txt' | xargs cp -a --target-directory=dir_txt/ --parents

วันจันทร์ที่ 20 กันยายน พ.ศ. 2553

Uninstall Parallels Virtuozzo for Linux

How to uninstall Parallels Virtuozzo for Linux
1. stop Virtuozzo services
service vz stop
2. uninstall all Virtuozzo packages
rpm -qa|grep swsoft|grep vz|xargs yum remove -y
rpm -qa|grep swsoft|grep -E "virtu|-ez-|-tmpl-"|xargs yum remove -y
3. remove /vz contents (directories: actionlog, backups, lock, private, root, template, vzup2date)
cd /vz/ && mkdir _before_reinstall && mv * _before_reinstall
4. remove configs from /etc
mkdir -p /vz/_before_reinstall/etc && find /etc -name vz\* -exec mv {} /vz/_before_reinstall/etc \;
5. check /etc/grub.conf if it has a proper configuration (no Virtuozzo kernel, Red Hat kernel is default)
6. check /etc/sysctl.conf for tuned parameters which you might not need
7. reboot the server

วันพุธที่ 8 กันยายน พ.ศ. 2553

emarket รายชื่อ email ที่เปิดอ่านเมล์

select DISTINCT email_list_subscribers.emailaddress FROM email_list_subscribers, email_stats_emailopens where email_list_subscribers.subscriberid = email_stats_emailopens.subscriberid order by email_list_subscribers.emailaddress asc;