Ads 468x60px

วันจันทร์ที่ 10 ตุลาคม พ.ศ. 2554

เปรียบเทียบ RAID-0 จากคำสั่ง mdadm และ lvm ตอนที่ 3

เปรียบเทียบ RAID-0 จากคำสั่ง mdadm และ lvm ตอนที่ 3
ในตอนสุรปนี้ จะเพิ่มผลลัพธ์จากการรันคำสั่ง sysbench เพื่อทดสอบ fileio ทั้งการอ่านและเขียนไฟล์แบบ sequential, random

ก่อนการรัน sysbench เพื่อทดสอบ ต้องสร้างไฟล์ (prepare) ใน mount point ของ filesystem ที่ต้องการทดสอบ เช่นถ้า mount ไว้ที่ /mnt/lv0/ ต้อง cd เข้าไปในพาธนี้แล้วรันคำสั่ง
[root@fc10-disk ~]# cd /mnt/lv0/
[root@fc10-disk lv0]# sysbench --test=fileio prepare
Sequential Read test (seqrd) รันคำสั่ง
[root@fc10-disk ~]# sysbench --test=fileio --file-test-mode=seqrd run
Sequential Write test (seqwr) รันคำสั่ง
[root@fc10-disk ~]# sysbench --test=fileio --file-test-mode=seqwr run
Random Read test (rndrd) รันคำสั่ง
[root@fc10-disk ~]# sysbench --test=fileio --file-test-mode=rndrd run
Random Write test (rndwr) รันคำสั่ง
[root@fc10-disk ~]# sysbench --test=fileio --file-test-mode=rndwr run
ผลลัพธ์การรันคำสั่ง dd ในตอนที่ผ่านมา จะใกล้เคียงกับการรัน Sequential Write test
ตารางสรุปผลการทดสอบ

/dev/sdc1 /dev/sdd1 mdadm linear mdadm stripe LVM linear LVM stripe
xfs (blocks) 195,263,012 195,263,012 390,585,600 390,585,344 390,578,176 390,577,152
dd (MB/s) 52.00 47.10 52.70 96.50 51.80 94.80
seqrd (MB/s) 58.08 60.71 57.71 115.78 58.22 104.64
seqrw (MB/s) 43.76 38.96 46.89 85.04 47.92 84.15
rndrd (MB/s) 3.92 3.96 3.92 4.34 3.97 4.31
rndwr (MB/s) 0.61 0.69 2.88 2.08 2.91 2.08
คงไม่สรุปใดๆ ทั้งสิ้น เกี่ยวกับผลลัพธ์ที่ได้ ว่าคอนฟิก mdadm หรือ lvm เร็วกว่ากัน เพราะตัวเลขออกมาใกล้เคียงกัน อีกทั้งการทดสอบนี้ อาจไม่ตรงกับหลักการทางสถิติ เช่น ทดลองรันไม่กี่ครั้ง หรือในขณะที่รันทดสอบอาจมี process อื่นๆ ในเครื่องรันขึ้นมาทำงาน (ทั้งๆ ที่พยายามลดให้เหลือน้อยที่สุดแล้ว) และด้วยคุณสมบัติของ mdadm และ LVM ที่แตกต่างกัน ทางเลือกคงขึ้นอยู่กับลักษณะการใช้งานของแต่ละเครื่องว่าเป็นอย่างไร …
แต่…ถ้าให้เลือก ความเห็นส่วนตัว ผมเลือก LVM ครับ

เปรียบเทียบ RAID-0 จากคำสั่ง mdadm และ lvm ตอนที่ 2

เปรียบเทียบ RAID-0 จากคำสั่ง mdadm และ lvm ตอนที่ 2
ในตอนแรก เปรียบเทียบ RAID-0 จากคำสั่ง mdadm และ lvm ตอนที่ 1 เราได้ทดลองใช้คำสั่ง mdadm เพื่อคอนฟิกดิสก์เป็นแบบ linear และ stripe ซึ่งให้ผลลัพธ์ความเร็วในการเขียนข้อมูลแตกต่างกัน ในตอนนี้จะลองใช้คำสั่ง LVM บ้าง เพื่อสร้างคอนฟิกแบบ linear และ stripe เพื่อเป็นการเปรียบเทียบกัน

สร้าง LVM Physical Volume และ Volume Group

ก่อนอื่นเราต้องคอนฟิกดิสก์แต่ละพารทิชั่น ทำเป็น Physical Volume และ Volume Group สุดท้ายค่อยเลือกว่าจะสร้าง Logical Volume เป็นแบบ linear หรือ stripe
[root@fc10-disk ~]# pvcreate /dev/sdc1 /dev/sdd1
  Wiping software RAID md superblock on /dev/sdc1
  Physical volume "/dev/sdc1" successfully created
  Wiping software RAID md superblock on /dev/sdd1
  Physical volume "/dev/sdd1" successfully created
ตรวจสอบสถานะของ physical volume
[root@fc10-disk ~]# pvdisplay
  "/dev/sdc1" is a new physical volume of "186.31 GB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc1
  VG Name
  PV Size               186.31 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               ...
  "/dev/sdd1" is a new physical volume of "186.31 GB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd1
  VG Name
  PV Size               186.31 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               ...
คอนฟิกรวมทั้งสอง physical volume สร้างเป็น volume group เดียวกัน
[root@fc10-disk ~]# vgcreate VG_1 /dev/sdc1 /dev/sdd1
  Volume group "VG_1" successfully created
ตรวจสอบสถานะของ volume group
[root@fc10-disk ~]# vgdisplay
  --- Volume group ---
  VG Name               VG_1
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               372.61 GB
  PE Size               4.00 MB
  Total PE              95388
  Alloc PE / Size       0 / 0
  Free  PE / Size       95388 / 372.61 GB
  VG UUID               ...

คำสั่ง lvcreate สร้าง logical volume แบบ linear

คอนฟิกนี้จะใช้คำสั่ง lvcreate เพื่อสร้างดิสก์สองก้อนเป็นแบบ linear ซึ่งหลักการเขียนข้อมูลจะเหมือนกันคือ ข้อมูลจะถูกเขียนลงบนตัวแรกให้เต็มก่อนแล้วค่อยเขียนตัวถัดไป
การระบุออปชั่น –extents 100%free คือให้ใช้พื้นที่ทั้งหมดของ volume group สร้างเป็น logical volume
[root@fc10-disk ~]# lvcreate --extents 100%free VG_1 --name LV_0
  Logical volume "LV_0" created
ผลลัพธ์ที่ได้จะสร้าง logical volume ชื่อ /dev/VG_1/LV_0 ขึ้นมา ซึ่งเรานำมาสร้าง filesystem แล้วมา mount ใช้งานได้
รันคำสั่ง lvdisplay ตรวจสอบสถานะของดิสก์
[root@fc10-disk ~]# lvdisplay --maps
  --- Logical volume ---
  LV Name                /dev/VG_1/LV_0
  VG Name                VG_1
  LV UUID                eOdh1C-nSw3-wLjd-fuPz-Y6HA-rNvU-nWaOfY
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                372.61 GB
  Current LE             95388
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
  --- Segments ---
  Logical extent 0 to 47693:
    Type                linear
    Physical volume     /dev/sdc1
    Physical extents    0 to 47693
  Logical extent 47694 to 95387:
    Type                linear
    Physical volume     /dev/sdd1
    Physical extents    0 to 47693
สร้าง filesystem เป็นแบบ xfs และ mount เข้ากับพาธที่สร้าง
[root@fc10-disk ~]# mkfs.xfs -f /dev/VG_1/LV_0
[root@fc10-disk ~]# mkdir /mnt/lv0
[root@fc10-disk ~]# mount /dev/VG_1/LV_0 /mnt/lv0
ดูขนาดของ filesystem ที่สร้างได้
[root@fc10-disk ~]# cd /mnt/lv0/
[root@fc10-disk lv0]# df -k .
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VG_1-LV_0
                     390578176      4256 390573920   1% /mnt/lv0
ทดสอบการเขียนไฟล์ขนาด 2 GB บนคอนฟิก “linear”
[root@fc10-disk lv0]# dd if=/dev/zero of=file-2g.bin bs=1000000 count=2000
2000+0 records in
2000+0 records out
2000000000 bytes (2.0 GB) copied, 38.6144 s, 51.8 MB/s
ความเร็วที่ได้จะใกล้เคียงกับการเขียนไฟล์ลงดิสก์ก้อนเดียว
ยกเลิกการ mount ดิสก์ และลบ logical volume แบบ linear
[root@fc10-disk lv0]# cd
[root@fc10-disk ~]# umount /mnt/lv0
[root@fc10-disk ~]# lvremove /dev/VG_1/LV_0
Do you really want to remove active logical volume "LV_0"? [y/n]: y
  Logical volume "LV_0" successfully removed

คำสั่ง lvcreate สร้าง logical volume แบบ stripe

คอนฟิกนี้จะใช้คำสั่ง lvcreate เพื่อสร้าง logical volume เป็นแบบ stripe เพื่อให้เวลาเขียนข้อมูลแยกการเขียนลงดิสก์ทั้งสองก้อนพร้อมๆ กัน ทำให้ความเร็วที่ได้เพิ่มขึ้น
ในที่นี้เราต้องระบุจำนวน stripe หรือจำนวนดิกส์ที่จะเขียนข้อมูลพร้อมๆ กัน ในที่นี้เรามี physical volume อยู่ 2 ก้อน ก็ระบุเป็นตัวเลข 2
[root@fc10-disk ~]# lvcreate --extents 100%free --stripes 2 VG_1 --name LV_0
  Using default stripesize 64.00 KB
  Logical volume "LV_0" created
ตรวจสอบสถานะของ logical volume แบบ stripe
[root@fc10-disk ~]# lvdisplay --maps
  --- Logical volume ---
  LV Name                /dev/VG_1/LV_0
  VG Name                VG_1
  LV UUID                JJuw2a-4C6O-4DED-jqCO-qTRF-iDw0-VPeatg
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                372.61 GB
  Current LE             95388
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     512
  Block device           253:0
  --- Segments ---
  Logical extent 0 to 95387:
    Type                striped
    Stripes             2
    Stripe size         64 KB
    Stripe 0:
      Physical volume   /dev/sdc1
      Physical extents  0 to 47693
    Stripe 1:
      Physical volume   /dev/sdd1
      Physical extents  0 to 47693
สร้าง filesystem เป็นแบบ xfs และ mount เข้ากับพาธที่สร้างไว้
[root@fc10-disk ~]# mkfs.xfs -f /dev/VG_1/LV_0
[root@fc10-disk ~]# mount /dev/VG_1/LV_0 /mnt/lv0
ดูขนาดของ filesystem ที่สร้างได้
[root@fc10-disk ~]# cd /mnt/lv0/
[root@fc10-disk lv0]# df -k .
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VG_1-LV_0
                     390577152      4640 390572512   1% /mnt/lv0
ทดสอบการเขียนไฟล์ขนาด 2 GB บนคอนฟิก “linear”
[root@fc10-disk lv0]# dd if=/dev/zero of=file-2g.bin bs=1000000 count=2000
2000+0 records in
2000+0 records out
2000000000 bytes (2.0 GB) copied, 21.0913 s, 94.8 MB/s
ความเร็วที่ได้ใกล้เคียงกับผลรวมของความเร็วในการเขียนข้อมูลลงดิสก์แต่ละก้อน
ยกเลิกการ mount ดิสก์ และลบ logical volume แบบ “stripe”
[root@fc10-disk lv0]# cd
[root@fc10-disk ~]# umount /mnt/lv0
[root@fc10-disk ~]# lvremove /dev/VG_1/LV_0
Do you really want to remove active logical volume "LV_0"? [y/n]: y
  Logical volume "LV_0" successfully removed

ลบ LVM Volume Group, Physical Volume

หลังจากทดสอบเรียบร้อย ถ้าต้องการลบคอนฟิก LVM ออกสามารถทำได้ดังนี้
ใช้คำสั่ง vgremove เพื่อลบ Volume Group
[root@fc10-disk ~]# vgremove /dev/VG_1
  Volume group "VG_1" successfully removed
ใช้คำสั่ง pvremove เพื่อลบ physical volume
[root@fc10-disk ~]# pvremove /dev/sdc1 /dev/sdd1
  Labels on physical volume "/dev/sdc1" successfully wiped
  Labels on physical volume "/dev/sdd1" successfully wiped

เปรียบเทียบ RAID-0 จากคำสั่ง mdadm และ lvm ตอนที่ 1

เปรียบเทียบ RAID-0 จากคำสั่ง mdadm และ lvm ตอนที่ 1
เกิดความสงสัยขึ้นมา ขณะคอนฟิกเซิร์ฟเวอร์ที่มีดิสก์หลายๆ ก้อน เพื่อทำหน้าที่เป็น file server ว่า ระหว่างการใช้ mdadm และ lvm เพื่อรวมดิสก์แต่ละก้อนเข้าด้วยกันทำเป็น RAID-0 อย่างไหนจะเร็วกว่ากัน เลยทดสอบและนำผลลัพธ์แต่ละคอนฟิกมาเปรียบเทียบกัน
และเพื่อความครบถ้วนของการเปรียบเทียบ เลยทดสอบคอนฟิกทั้งเป็นแบบ linear และ stripe (RAID-0) จากการใช้คำสั่งทั้งสองด้วย โดยแยกเป็นสองบทความ ในตอนแรกจะใช้คำสั่ง mdadm ก่อน

หมายเหตุ
  • โดยทั่วไป คำว่า RAID-0 หมายถึงการคอนฟิกแบบ stripe
  • ข้อควรระวังการเลือกใช้คอนฟิก RAID-0 เพียงอย่างเดียว ถ้าดิสก์ก้อนใดก้อนนึงเสียไป มีโอกาสทำให้ข้อมูลบางส่วนหรือทั้งหมดเสียหายได้ โดยทั่วไปนิยมคอนฟิก RAID-0 ทับไปบนคอนฟิก RAID-1 หรือ RAID-5 เพื่อทำเป็น RAID-10, หรือ RAID-50
  • ความเสียหายของข้อมูลเมื่อดิสก์ก้อนหนึ่งเสีย ในการคอนฟิกแต่ละแบบจะไม่เหมือนกันเช่น ถ้าคอนฟิกเป็นแบบ “linear” การกู้ข้อมูลกลับคืนมาจะมีโอกาสมากกว่า เพราะข้อมูลส่วนใหญ่จะถูกเขียนลงบนดิสก์ก้อนเดียว แต่ข้อเสียของ “linear” คือความเร็วในการเขียนข้อมูลจะน้อยกว่าแบบ “stripe”

ทดสอบดิสก์แต่ละก้อน

ก่อนจะเริ่มคอนฟิก RAID-0 ขอเริ่มทดสอบดิสก์ทีละตัว เพื่อดูความเร็วคร่าวๆ ในการเขียนข้อมูล
ตัวอย่างการสร้างพาร์ทิชั่นของดิสก์แต่ละก้อน
[root@fc10-disk ~]# fdisk -l /dev/sdc
...
   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1       24321   195358401   83  Linux
[root@fc10-disk ~]# fdisk -l /dev/sdd
...
   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1               1       24321   195358401   83  Linux
สร้าง filesystem เป็นแบบ xfs ในแต่ละพาร์ทิชั่น และ mount เข้ากับพาธที่สร้าง
[root@fc10-disk ~]# mkfs.xfs -f /dev/sdc1
[root@fc10-disk ~]# mkfs.xfs -f /dev/sdd1
[root@fc10-disk ~]# mkdir /mnt/sdc1
[root@fc10-disk ~]# mkdir /mnt/sdd1
[root@fc10-disk ~]# mount /dev/sdc1 /mnt/sdc1
[root@fc10-disk ~]# mount /dev/sdd1 /mnt/sdd1
ทดสอบการเขียนไฟล์ขนาด 2 GB ในแต่ละพาร์ทิชั่น
[root@fc10-disk sdc1]# cd /mnt/sdc1/
[root@fc10-disk sdc1]# dd if=/dev/zero of=file-2g.bin bs=1000000 count=2000
2000+0 records in
2000+0 records out
2000000000 bytes (2.0 GB) copied, 38.4796 s, 52.0 MB/s
[root@fc10-disk sdd1]# cd /mnt/sdd1/
[root@fc10-disk sdd1]# dd if=/dev/zero of=file-2g.bin bs=1000000 count=2000
2000+0 records in
2000+0 records out
2000000000 bytes (2.0 GB) copied, 42.4467 s, 47.1 MB/s
ได้ความเร็วประมาณ 50 MB/s
ยกเลิกการ mount ดิสก์แต่ละก้อน
[root@fc10-disk sdd1]# cd
[root@fc10-disk ~]# umount /mnt/sdc1
[root@fc10-disk ~]# umount /mnt/sdd1

คำสั่ง mdadm สร้างดิสก์แบบ linear

คอนฟิกแรกจะใช้คำสั่ง mdadm เพื่อสร้างดิสก์เป็นแบบ “linear” ซึ่งเป็นการนำพื้นที่ดิสก์ทั้งสองก้อนมาต่อเรียงกัน เวลาเขียนข้อมูลจะเขียนบนดิสก์ตัวเดียวก่อน ถ้าก้อนแรกเต็มถึงจะเขียนดิสก์อีกก้อน
[root@fc10-disk ~]# mdadm --create --verbose /dev/md0 --level=linear --raid-devices=2 /dev/sdc1 /dev/sdd1
mdadm: chunk size defaults to 64K
mdadm: array /dev/md0 started.
ตรวจสอบสถานะของดิสก์
[root@fc10-disk ~]# mdadm --detail /dev/md0
/dev/md0:
        Version : 0.90
  Creation Time : Sun Jun  7 12:35:05 2009
     Raid Level : linear
     Array Size : 390716672 (372.62 GiB 400.09 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0
    Persistence : Superblock is persistent
    Update Time : Sun Jun  7 12:35:05 2009
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0
       Rounding : 64K
           UUID : 450c959b:c5d34b87:792b422a:65152846
         Events : 0.1
    Number   Major   Minor   RaidDevice State
       0       8       33        0      active sync   /dev/sdc1
       1       8       49        1      active sync   /dev/sdd1
สร้าง filesystem เป็นแบบ xfs และ mount เข้ากับพาธที่สร้าง
[root@fc10-disk ~]# mkfs.xfs -f /dev/md0
[root@fc10-disk ~]# mkdir /mnt/md0
[root@fc10-disk ~]# mount /dev/md0 /mnt/md0/
ดูขนาด filesystem ที่สร้างได้
[root@fc10-disk ~]# cd /mnt/md0/
[root@fc10-disk md0]# df -k .
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/md0             390585600      4256 390581344   1% /mnt/md0
ทดสอบการเขียนไฟล์ขนาด 2 GB บนคอนฟิก “linear”
[root@fc10-disk md0]# dd if=/dev/zero of=file-2g.bin bs=1000000 count=2000
2000+0 records in
2000+0 records out
2000000000 bytes (2.0 GB) copied, 37.9349 s, 52.7 MB/s
ความเร็วที่ได้จะใกล้เคียงกับการเขียนไฟล์ลงดิสก์ก้อนเดียว
ยกเลิกการ mount ดิสก์ และปิด (stop) การใช้ดิสก์แบบ linear
[root@fc10-disk md0]# cd
[root@fc10-disk ~]# umount /mnt/md0
[root@fc10-disk ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
[root@fc10-disk ~]# cat /proc/mdstat
Personalities : [linear]
unused devices: <none>

คำสั่ง mdadm สร้างดิสก์แบบ  stripe (RAID-0)

คอนฟิกที่สอง จะใช้คำสั่ง mdadm เพื่อคอนฟิกดิกส์สองกันเป็นแบบ stripe หรือ RAID-0 เวลาเขียนข้อมูลจะเขียนลงบนดิสก์ทั้งสองก้อนพร้อมกัน ทำให้ความเร็วเพิ่มขึ้น
หมายเหตุ การระบุออปชั่น “–level” เป็นแบบ “stripe” หรือ “raid-0″  ให้ผลเหมือนกัน
[root@fc10-disk ~]# mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/sdc1 /dev/sdd1
mdadm: chunk size defaults to 64K
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=linear devices=2 ctime=Sun Jun  7 13:28:06 2009
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=linear devices=2 ctime=Sun Jun  7 13:28:06 2009
Continue creating array? y
mdadm: array /dev/md0 started.
ตรวจสอบสถานะของดิสก์
[root@fc10-disk ~]# mdadm --detail /dev/md0
/dev/md0:
        Version : 0.90
  Creation Time : Sun Jun  7 13:40:02 2009
     Raid Level : raid0
     Array Size : 390716672 (372.62 GiB 400.09 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0
    Persistence : Superblock is persistent
    Update Time : Sun Jun  7 13:40:02 2009
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0
     Chunk Size : 64K
           UUID : 1ee50769:2becc762:fb9a3596:c284b115
         Events : 0.1
    Number   Major   Minor   RaidDevice State
       0       8       33        0      active sync   /dev/sdc1
       1       8       49        1      active sync   /dev/sdd1
สร้าง filesystem เป็นแบบ xfs และ mount เข้ากับพาธที่สร้างไว้
[root@fc10-disk ~]# mkfs.xfs -f /dev/md0
[root@fc10-disk ~]# mount /dev/md0 /mnt/md0/
ดูขนาด filesystem ที่สร้างได้
[root@fc10-disk ~]# cd /mnt/md0/
[root@fc10-disk md0]# df -k .
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/md0             390585344      4640 390580704   1% /mnt/md0
ทดสอบความเร็วการเขียนข้อมูลบนดิสก์ RAID-0
[root@fc10-disk md0]# dd if=/dev/zero of=file-2g.bin bs=1000000 count=2000
2000+0 records in
2000+0 records out
2000000000 bytes (2.0 GB) copied, 20.7292 s, 96.5 MB/s
ความเร็วที่ได้ใกล้เคียงกับผลรวมของความเร็วในการเขียนข้อมูลลงดิสก์แต่ละก้อน
ยกเลิกการ mount ดิสก์ และปิด (stop) การใช้ดิสก์แบบ “stripe”
[root@fc10-disk md0]# cd
[root@fc10-disk ~]# umount /mnt/md0
[root@fc10-disk ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
[root@fc10-disk ~]# cat /proc/mdstat
Personalities : [linear] [raid0]
unused devices: <none>

สร้าง Storage Server ง่ายๆ ด้วย FreeNAS

สร้าง Storage Server ง่ายๆ ด้วย FreeNAS
เดี๋ยวนี้เดินตามร้านคอมพิวเตอร์เริ่มมีอุปกรณ์ประเภท NAS (Network Attached Storage Server) ขายเป็น box สำเร็จรูป เพื่อผู้ใช้นำไปสำรองข้อมูล แชร์ไฟล์ได้หลายเครื่อง แถมบางยี่ห้อสามารถรันโปรแกรม BitTorrent เพื่อโหลดไฟล์ได้
แทนที่จะซื้อ box ใหม่ ลองหาเครื่องเก่าๆ ที่ยังพอใช้งานได้อยู่ หากขนาดพื้นที่ดิสก์เก่าไม่พอ ก็ซื้อเฉพาะฮาร์ดดิสก์เท่านั้น แล้วติดตั้งโปรแกรม FreeNAS ภายในไม่ถึง10 นาที  (ไม่รวมเวลาดาวน์โหลดไฟล์ iso ขนาด 130 กว่า MB นะ) คุณก็จะได้ Storage Server ไว้ใช้ อย่างง่ายดาย คุณสมบัติ (features) เพียบ…
คำเตือน
  • FreeNAS จะล้าง (Format) ข้อมูลทั้งหมดในดิสก์ของเครื่อง
  • การทดลองรันแบบ LiveCD ค่าคอนฟิกที่สร้างทั้งหมดจะหายไป เมื่อมีการรีบู๊ตหรือปิดเครื่อง

FreeNAS เป็นโปรแกรม Open Source พัฒนาขึ้นมาบน FreeBSD รองรับการใช้งานได้หลากหลายเช่น CIFS (Samba), FTP, NFS, TFTP, AFP, RSYNC, Unison, iSCSI (initiator and target) and UPnP. สามารถคอนฟิกดิสก์เป็นแบบ RAID (0, 1, 5), ZFS, disk encryption ได้
การใช้งานผ่าน Web Interface สามารถลองใช้แบบ LiveCD หรือติดตั้งลงบนดิสก์
ในเริ่มต้น แนะนำในลองใช้แบบ LiveCD เพื่อดูคุณสมบัติต่างๆ ของโปรแกรม
เลือกดาวน์โหลดไฟล์เวอร์ชั่นล่าสุดของ Stable Releases (ล่าสุดที่เขียนคือ 0.7.2) หากเครื่องสามารถลงแบบ 64-bit ได้ แนะนำให้เลือก FreeNAS-amd64-LiveCD-0.7.2.5543.iso ถ้าไม่ได้ ก็ใช้เวอร์ชั่น 32-bit คือ FreeNAS-i386-LiveCD-0.7.2.5543.iso
ไฟล์ที่ดาวน์โหลดจะเป็นแบบ iso คือต้องนำมา burn ลง cd ก่อนแล้วนำไปใช้บู๊ตเครื่อง
ในบทความนี้จะทดลองใน VMware Server
หน้าจอบู๊ตเครื่อง

หน้าจอ Console แสดงข้อมูลคอนฟิกเบื้องต้น พร้อมใช้งาน

เมื่อบู๊ตเครื่องมาถึงขั้นตอนนี้ คุณก็มี Storage Server พร้อมใช้แล้ว หากต้องการแก้ไขคอนฟิก ก็ใส่ตัวเลขเมนู เพื่อเข้าไปแก้ไขได้ เช่นต้องการแก้ไข IP address สามารถทำได้โดยเข้าเมนู 2) Set LAN IP address
คำแนะนำ หากต้องการนำไปใช้งานจริง ต้องเลือกเมนู 9) Install/Upgrade to hard drive/flash device, etc. เพื่อเลือกติดตั้ง FreeNAS ลงบนดิสก์เลย
ดีฟอลต์ IP address คือ 192.168.1.250
เปิด browser เพื่อเริ่มใช้งาน FreeNAS
หน้าเว็บล็อกอินของ FreeNAS  ใส่ค่า Username, Password เริ่มต้นคือ admin, freenas

หน้าเว็บแสดงข้อมูล System Information

หน้าเว็บการจัดการดิสก์ (Disks Management)
ไปที่เมนู Disks -> Management เพื่อแสดงข้อมูลดิสก์ที่โปรแกรม FreeNAS รู้จัก
เริ่มต้นจะไม่มีดิสก์ใดแสดงเลย ต้องกดเครื่องหมาย + ด้านขวามือเพื่อเพิ่มดิสก์ที่มีอยู่ในเครื่อง ให้ FreeNAS รู้จัก

Add Disk

หน้าเว็บการเพิ่มดิสก์

หลังจากเพิ่มดิสก์ ต้องกดปุ่ม [Apply changes] เพื่อให้คอนฟิกที่เพิ่มเข้าไปมีผล

 

Format Disk

ไปที่เมนู Disks -> Format เพื่อ Format Disk
Disk: เลือกดิสก์ที่จะ format
File system: เลือก “UFS (GPT and Soft Updates”
Volume Label: ใส่ชื่อ Volume
กดปุ่ม [Format disk]
หน้าเว็บแสดงการ Format Disk

หลังจาก Format เครื่องแล้ว ต้อง mount ดิสก์ขึ้นมาใช้งานด้วย

 

Mount Disk

ไปที่เมนู Disks -> Mount Point กดเคื่องหมาย + เพื่อเริ่มการ mount ดิสก์
เลือก Disk และใส่ค่า Mount point name แล้วกด Add
หน้าเว็บ Disks Mount Point – Add

กดปุ่ม [Apply changes] เพื่อให้คอนฟิกที่เพิ่มมีผล หน้าเว็บแสดงการ mount point

 

CIFS/SMB Settings

หากต้องการแชร์ไฟล์แบบ Samba เพื่อให้เครื่อง Windows อื่นๆ มองเห็น ก็สามารถทำได้ง่ายๆ โดยไปที่เมนู Services -> CIFS/SMB
ในหน้า Settings คลิ้กเลือก [x] Enable แล้วใส่ค่าคอนฟิกต่างๆ เสร็จเรียบร้อยด้านล่างกดปุ่ม [Save and Restart]
หน้าเว็บแสดงการเปิด Services CIFS/SMB

ในหน้าเว็บเดียวกันนี้ คลิ้กแท็ป [Shares] เพื่อคอนฟิกชื่อและดิสก์ที่ใช้แชร์ไฟล์
กดเครื่องหมาย + เพื่อเพิ่มการ Share
ใส่ Name, Comment เลือก Path จาก Mount Point แล้วกดปุ่ม [Add]

หลังจากแก้ไข กดปุ่ม [Apply changes] เพื่อให้คอนฟิกใหม่มีผล

ทดลองเรียก Share Drive จากเครื่อง Windows

แนะนำการใช้งานโปรแกรม Secure Shell (SSH)

แนะนำการใช้งานโปรแกรม Secure Shell (SSH)
SSH  (Secure Sell) คือโปรแกรมสำหรับล็อกอินและรันคำสั่งที่เครื่องปลายทางได้ โดยไม่จำเป็นต้องไปใช้งานที่หน้าจอคอนโซลของเครื่อง จุดประสงค์หลักของโปรแกรมคือทำหน้าที่แทนโปรแกรมประเภท rlogin, rsh หรือ telnet โดยจะมีการเข้ารหัสข้อมูล (encrypted) เพื่อความปลอดภัยของข้อมูลที่ส่งระหว่าง SSH Client และ SSH Server

ชุดโปรแกรมที่ติดตั้งมากับลีนุกซ์ส่วนใหญ่คือ OpenSSH ประกอบด้วยเซิร์ฟเวอร์และไคลเอนต์
เครื่องปลายทางรันเซอร์วิส SSH Server เพื่อรองรับการล็อกอิน จากโปรแกรมประเภท SSH Client โดยคอนฟิกไฟล์หลักของเซิร์ฟเวอร์จะอยู่ในไดเร็กทอรี /etc/ssh/ ไฟล์คอนฟิกหลักคือไฟล์ /etc/ssh/sshd_config
คำแนะนำ โปรแกรม PuTTY เป็นโปรแกรมประเภท SSH Client ที่สามารถรันได้บน Microsoft Windows ด้วยคุณสมบัติมากมาย รองรับทั้ง Secure Shell, Telnet และสามารถทำหน้าที่เป็น Terminal ผ่านทาง Serial หรือ COM Port ได้ด้วย (เช่นเดียวกับ HyperTerminal) และที่สำคัญสามารถงานใช้ได้ฟรีอย่างถูกต้อง (free software)
ในบทความนี้จะแนะนำวิธีการใช้คำสั่ง Secure Shell บนลีนุกซ์เป็นหลัก โดยตัวอย่างทั้งหมดจะทดสอบบน Fedora 9

เริ่มต้นใช้งาน SSH Client (begin_ssh_client)

เริ่มต้นทดลองใช้คำสั่ง ssh เพื่อล็อกอินไปยังเครื่องรีโมต ด้วยการพิมพ์คำสั่ง ssh แล้วตามด้วย IP Address หรือ Hostname ของเครื่องรีโมตปลายทาง
ตัวอย่างการล็อกอินไปที่เครื่องรีโมตครั้งแรก
[user1@client ~]$ ssh 192.168.0.1
The authenticity of host '192.168.0.1 (192.168.0.1)' can't be established.
RSA key fingerprint is 5a:f2:9f:1b:8a:.....
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.1' (RSA) to the list of known hosts.
user1@192.168.0.1's password:
Last login: Thu Oct  2 10:46:39 2008 from 192.168.0.15
[user1@server ~]$
ถ้าเพิ่งเริ่มล็อกอินไปยังเครื่องรีโมตครั้งแรก จะมีข้อความเกี่ยวกับ RSA key ขึ้นมาถามว่า yes หรือ no การตอบ yes คือการยอมรับคีย์ (RSA key) จากเซิร์ฟเวอร์ปลายทางมา เพื่อใช้ในการเข้ารหัสระหว่างไคลเอนต์และเซิร์ฟเวอร์ ต้องตอบ yes อย่างเดียวเท่านั้นเพื่อยอมรับคีย์นี้ ถ้าตอบ no ไปก็ไม่สามารถล็อกไปยังเครื่องปลายทางได้
เมื่อตอบ yes ไป คีย์ที่ได้รับมา เครื่องไคลเอนต์จะเก็บคีย์นี้ไว้ในรายชื่อที่เรียกว่า ‘known hosts’ โดยจะบันทีกเป็นไฟล์อยู่ในไดเร็กทอรี $HOME/.ssh/ ($HOME คือ home directory ของผู้ที่ใช้คำสั่งบนเครื่องไคลเอนต์)
ตัวอย่างไฟล์ที่เก็บ known hosts
[user1@client1 ~]$ cat .ssh/known_hosts
192.168.0.1 ssh-rsa AAAAB..........................
ประการหนึ่งที่เก็บรายชื่อ known hosts ไว้ ด้วยเหตุผลทางด้านความปลอดภัย (Security) โดยคีย์ที่เก็บไว้ในไฟล์นี้สามารถใช้ในการเปรียบเทียบกับคีย์ที่ได้รีบมา ใหม่จากเซิร์ฟเวอร์ ว่าตรงกันหรือไม่ เพื่อยืนยันในครั้งต่อที่ล็อกอินเข้าไปเครื่องเดิมนี้ว่า เป็นเครื่องที่ถูกต้อง ใช่ที่เราต้องการจริงๆ ไม่ใช่เครื่องอื่นๆ ที่ปลอมแปลง IP Address มาตรงกัน
ตัวอย่างการล็อกอินไปที่เครื่องที่ถูกปลอมแปลง IP Address โดยจะมีข้อความฟ้องว่าคีย์ที่ได้มาไม่ถูกต้อง
[user1@client ~]$ ssh 192.168.0.1
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
5a:f2:9f:...
Please contact your system administrator.
Add correct host key in /home/user1/.ssh/known_hosts to get rid of this message.
Offending key in /home/user1/.ssh/known_hosts:1
RSA host key for 192.168.0.1 has changed and you have requested strict checking.
Host key verification failed.
วิธีการแก้ไขถ้าเจอข้อความแบบนี้ คือต้องตรวจสอบดูก่อนว่าเครื่องปลายทางที่เราจะล็อกเข้าไปนั้นเป็นเครื่อง ที่ถูกต้องจริงๆ โดยเปรียบเทียบคีย์ของ Secure Shell ซึ่งถูกเก็บไว้ในไฟล์ /etc/ssh/ssh_host_rsa_key.pub ซึ่งอาจมีการเปลี่ยนแปลงได้ ด้วยการติดตั้งลีนุกซ์ใหม่ หรือใช้คำสั่ง ssh-keygen ในการสร้างคีย์ใหม่
ถ้าดูแล้วเป็นเครื่องที่ถูกต้องจริงๆ วิธีการแก้ไขคือแก้ไฟล์ $HOME/.ssh/known_hosts โดยลบบรรทัดที่มี IP Address ของเครื่องปลายทางออกไป แล้วพิมพ์คำสั่ง ssh อีกครั้ง จะมีข้อความถาม yes หรือ no เหมือนครั้งแรก เพื่อเก็บคีย์ใหม่เข้าไปในไฟล์ known_hosts อีกครั้ง
คำเตือน แต่ถ้าตรวจสอบเครื่องปลายทางแล้วไม่ถูกต้อง อาจเป็นเครื่องของคนที่พยายามเจาะระบบด้วยการปลอมแปลง IP Address ก็เป็นได้เพื่อคอยดักเก็บรหัสของเรา เพราะฉะนั้นห้ามทำตามวิธีด้านบนเด็ดขาด ให้ปรึกษาคนดูแลระบบเพื่อแก้ไขโดยด่วน

ระบุชื่อ user ที่ต้องการล็อกอิน (Specify user login)

โดยดีฟอลต์เมื่อใช้คำสั่ง ssh บนไคลเอนต์ เพื่อล็อกไปยังเซิร์ฟเวอร์ โปรแกรม ssh จะพยายามล็อกอินด้วย username ของคนที่รันคำสั่ง เช่นผู้ใช้ที่ชื่อว่า user1 พิมพ์คำสั่ง ssh 192.168.0.1 จะเป็นการล็อกอินไปที่เครื่อง 192.168.0.1 ด้วยชื่อผู้ใช้ user1
ถ้าต้องการระบุเป็นชื่ออื่น สามารถใช้ออปชั่น ‘-l’ แล้วตามด้วยชื่อผู้ใช้ปลายทาง หรือพิมพ์ ในรูปแบบ user@hostname  เช่น ต้องการล็อกอินไปยังปลายทางด้วยชื่อผู้ใช้ user2 สามารถทำได้สองวิธีแล้วแต่ถนัดดังนี้
วิธีแรก ใช้ออปชั่น ‘-l’ แล้วตามด้วยชื่อผู้ใช้ปลายทาง
[user1@client ~]$ ssh -l user2 192.168.0.1
user1@192.168.0.1's password:
Last login: Thu Oct  2 11:22:24 2008 from 192.168.0.15
[user2@server ~]$
วิธีที่สอง ใช้รูปแบบ user@hostname
[user1@client ~]$ ssh user2@192.168.0.1
user1@192.168.0.1's password:
Last login: Thu Oct  2 11:23:13 2008 from 192.168.0.15
[user2@server ~]$

การรันคำสั่งบนเครื่องปลายทางด้วย SSH (Run remote command with SSH)

ในบางครั้งเราต้องการเพียงแค่รันคำสั่งบนเครื่องปลายทาง เช่นต้องการตรวจสอบสถานะการทำงานของเครื่องปลายทางด้วยคำสั่ง uptime และ free แทนที่ต้องล็อกอินเข้าไปที่เครื่องปลายทางเลย สามารถใช้คำสั่ง ssh แล้วระบุคำสั่งที่ต้องการรันบนเครื่องรีโมตได้เลย โดยให้อยู่ในเครื่องหมาย single-quote ‘
ตัวอย่างการรันคำสั่งบนเครื่องปลายทางด้วย ssh
[user1@client ~]$ ssh user2@192.168.0.1 'uptime; echo; free'
user1@192.168.0.1's password:
 16:01:39 up 2 days, 13:17,  4 users,  load average: 0.03, 0.02, 0.00
             total       used       free     shared    buffers     cached
Mem:        515064     235620     279444          0      48516     102124
-/+ buffers/cache:      84980     430084
Swap:       987956         52     987904

SSH – Secure Shell ล็อกอินด้วย Public Key Authentication

SSH – Secure Shell ล็อกอินด้วย Public Key Authentication
จากที่ได้ แนะนำการใช้งานโปรแกรม Secure Shell (SSH) เพื่อล็อกอินไปยังเครื่องอื่นนั้น โดยดีฟอลต์แล้วจะต้องใส่รหัสผ่าน (password) ก่อนที่จะล็อกเข้าไปยังเครื่องปลายทางได้ หรือรันคำสั่งบนเครื่องปลายทางได้
แต่ในบางครั้งการที่ต้องใส่รหัสผ่านทุกครั้งทำให้ไม่สะดวกในการใช้งาน ตัวอย่างเช่นต้องล็อกอินไปยังหลายๆ เครื่องอยู่เป็นประจำ หรือการเขียน Shell Script เพื่อล็อกอินไปยังเครื่องต่างๆ เพื่อรันคำสั่งที่ต้องการ   ในที่นี้จะแนะนำการล๊อกอินไปยังเครื่องปลายทางโดยไม่ต้องใส่รหัสผ่าน แต่อาศัยการล็อกด้วย Public Key Authentication

การตรวจสอบสิทธิในการล็อกอินโดยใช้ Public Key Authentication ในตัวอย่างของบทความนี้จะคอนฟิกในระดับ user คือจะคอนฟิก user1 บนเครื่องไคลเอนต์ (Client) เพื่อจะล็อกอินไปเป็น user2 บนเซิร์ฟเวอร์ (Server) โดยไม่ต้องใส่รหัสผ่าน ขั้นตอนที่ต้องทำมีดังนี้
หมายเหตุ ตัวอย่างในบทความนี่ทดสอบบน Fedora 9 ซึ่งคอนฟิกดีฟอลต์จะอนุญาตให้สามารถล็อกอินแบบ Public Key Authentication ได้ หากคุณใช้ลีนุกซ์เวอร์ชั่นอื่นๆ ถ้าทำตามแล้วไม่ได้ ลองตรวจสอบไฟล์คอนฟิกของ ssh server ซึ่งอยู่ในไฟล์ /etc/ssh/sshd_config โดยคอนฟิกที่ต้องเปิดไว้คือ PubkeyAuthentication และ AuthorizedKeysFile

สร้าง Public/Private Key ของ user1 บนเครื่องไคลเอนต์

ล๊อกอินเป็น user1 บนเครื่องไคลเอนต์แล้วใช้คำสั่ง ssh-keygen เพื่อสร้าง Public/Private Key
ตัวอย่างการใช้คำสั่ง ssh-keygen
[user1@client ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory '/home/user1/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa.
Your public key has been saved in /home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
fd:5c:11.......... user1@client
สองไฟล์ที่ถูกสร้างจากการรันคำสั่ง ssh-keygen จะถูกเก็บไว้ในไดเร็คทอรี .ssh/ โดยจะมีไฟล์
  • id_rsa เป็นไฟล์ที่เก็บ Private Key ซี่งเป็นคีย์ที่เป็นความลับไม่แนะนำให้เปิดเผยไฟล์นี้ให้คนอื่นเห็น สังเกตได้จากสิทธิของไฟล์ (permission) จะเป็น 600
  • id_rsa.pub เป็นไฟล์ที่เก็บ Public Key ซึ่งเป็นคีย์ที่สามารถเปิดเผยให้คนอื่นเห็นได้ แล้วใช้ในการเข้ารหัสข้อมูลเพื่อยืนยันว่าเป็นตัวเราจริงๆ โดยเราจะ copy ไฟล์นี้ไปยัง user2 บนเครื่องปลายทาง

ไฟล์ authorized_keys ของ user2 บนเครื่องเซิร์ฟเวอร์

ขั้นตอนต่อไปคือ copy ไฟล์ Public Key ของ user1 จากเครื่องไคลเอนต์  ไปเก็บไว้ในไฟล์ authorized_keys ของ user2 บนเครื่องเซิร์ฟเวอร์ ซึ่งจะเป็นไฟล์ที่เก็บ Public Key ของ user ต่างๆ ที่มีสิทธิล๊อกอินมาเป็น user นี้โดยไม่ต้องใส่รหัส
วิธีการ copy ไฟล์  Public Key จากไคลเอนต์ไปยังเซิร์ฟเวอร์ สามารถทำได้โดยใช้คำสั่ง scp บนเครื่องไคลเอนต์
ตัวอย่างการ copy ไฟล์ จากเครื่องไคลเอนต์ไปยังเซิร์ฟเวอร์โดยใช้คำสั่ง scp
[user1@client ~]$ scp .ssh/id_rsa.pub user2@server:
user2@server's password:
id_rsa.pub                              100%  394     0.4KB/s   00:00
หมายเหตุ อย่าลืมเครื่องหมาย :  (colon) หลังคำว่า server เพื่อระบุว่าเป็นการ copy ระหว่างเครื่อง
ขั้นต่อไปล๊อกอินเป็น user2 บนเครื่องเซิร์ฟเวอร์ แล้วใช้คำสั่ง ls ดู จะเห็นไฟล์ที่ถูก copy มา ให้ใช้คำสั่ง cat เพื่อนำคีย์ในไฟล์นี้ไปต่อท้ายไฟล์ authorized_keys ของ user2
หมายเหตุ ต้องสร้างไดเร็คทอรี .ssh/ ของ user2 ไว้ก่อนที่จะสร้างหรือเพิ่มเติมไฟล์ authorized_keys ตามตัวอย่างด้านล้างนี้ได้
คำเตือน ระมัดระวังการใช้คำสั่ง cat เพื่อนำข้อมูลไปต่อท้ายไฟล์ต้องใช้เครื่องหมายมากกว่าสองอันติดกัน >> 
ตัวอย่างการสร้างไดเร็คทอรี .ssh/ และการเพิ่ม authorized_keys บนเซิร์ฟเวอร์
[user2@server ~]$ ls -l
total 4
-rw-r--r-- 1 user2 users 394 2008-10-10 15:09 id_rsa.pub
[user2@server ~]$ mkdir .ssh
[user2@server ~]$ chmod 700 .ssh/
[user2@server ~]$ cat id_rsa.pub >> .ssh/authorized_keys

ทดลองล็อกอินโดยใช้ Public Key Authentication

ทดลองใช้ user1 บนเครื่องไคลเอนต์ไปยัง user2 บนเครื่องเซิร์ฟเวอร์ โดยรูปแบบการใช้งานยังเหมือนเดิมไม่เปลี่ยนแปลง จะเห็นว่าไม่ต้องใส่รหัสผ่าน (password) อีกต่อไปแล้ว
[user1@client ~]$ ssh user2@server
[user2@server ~]$

ปัญหาการใช้ SSH Public Key Authentication บน Solaris

ปัญหาการใช้ SSH Public Key Authentication บน Solaris
พยายามคอนฟิก Public Key Authentication เพื่อ login เข้าสู่เครื่องที่ติดตั้ง Solaris อยู่นาน ก็ไม่สามารถทำได้ แต่ในที่สุดก็สามารถหาปัญหาได้ เลยมาแชร์ประสบการณ์เผื่อจะเป็นประโยชน์

ทดสอบปัญหา

เริ่มต้นเพิ่ม user บนเครื่องที่ติดตั้ง Solaris 10 สมมติว่าชื่อ user1
[root@solaris ~]# useradd user1
[root@solaris ~]# id user1
uid=502(user1) gid=1(other) groups=1(other)
แก้ไข home ของ user1 ให้อยู่ใน /export/home/ และสร้างไดเร็คทอรี
[root@solaris ~]# cat /etc/passwd
...
user1:x:502:1::/export/home/user1:/bin/sh
[root@solaris ~]# cd /export/home
[root@solaris home]# mkdir user1
[root@solaris home]# chown user1 user1/
[root@solaris home]# su - user1
[user1@solaris ~]$ pwd
/export/home/user1
ต้องการให้ admin1 จากเครื่องที่ติดตั้ง linux สามารถ ssh ด้วย public key authentication เป็น user1 บนเครื่อง Solaris ได้
สร้าง public, private key ของ admin1
[admin1@linux ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/admin1/.ssh/id_rsa):
Created directory '/home/admin1/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/admin1/.ssh/id_rsa.
Your public key has been saved in /home/admin1/.ssh/id_rsa.pub.
[admin1@linux ~]$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtMbbgeFnn6vEo3IAVh... admin1@linux
copy ไฟล์ id_rsa.pub ของ admin1 ไปใส่ไว้ในไฟล์ authorized_keys ของ user1 บนเครื่อง Solaris
[user1@solaris ~]$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtMbbgeFnn6vEo3IAVh... admin1@linux
ทดสอบ ssh จากเครื่อง linux
[admin1@linux ~]$ ssh -l user1 solaris
The authenticity of host 'solaris (192.168.1.2)' can't be established.
RSA key fingerprint is ...
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'solaris' (RSA) to the list of known hosts.
Password:
ขึ้นให้ใส่ password ไม่สามารถ login ด้วย public key authentication ได้

วิธีการแก้ไขปัญหา

หลังจากพยายามอยู่นาน ก็พบว่า ssh จะตรวจสอบสถานะ password ของผู้ใช้ด้วย ซึ่งถ้าดูในไฟล์ /etc/shadow จะเห็นว่า user1 จะถูก lock อยู่
[root@solaris ~]# cat /etc/shadow
...
user1:*LK*:::::::
ฟิลด์ที่สองในไฟล์ /etc/shadow คือ encrypted password คำอธิบายจาก man ของ shadow คือ
# man shadow
...
     password        An encrypted password for the user generated
                     by crypt(3C), a lock string to indicate that
                     the login is not accessible, or  no  string,
                     which  shows  that  there is no password for
                     the login.
                     The lock string is defined as  *LK*  in  the
                     first four characters of the password field.
...
การแก้ไขคือ ลบตัวอักษร LK ออก เช่นให้เหลือแต่เครื่องหมาย *
[root@solaris ~]# cat /etc/shadow
...
user1:*:::::::
ทดสอบ ssh จากเครื่อง linux อีกครั้ง ก็จะได้ตามที่ต้องการ
[admin1@linux ~]$ ssh -l user1 solaris
[user1@solaris ~]$

ติดตั้ง Sun Freeware บน Solaris

ติดตั้ง Sun Freeware บน Solaris
เว็บไซต์ Sunfreeware.com เป็นแหล่งรวม free software ที่ถูก compile ให้อยู่ในรูปแบบ package (.pkg)  ทำให้สะดวกต่อการติดตั้งบน Solaris  ไฟล์ที่มีให้ดาวน์โหลดมีตั้งแต่ Solaris 2.5 จนถึงเวอร์ชั่นล่าสุด Solaris 10 ทั้งสำหรับรันบนเครื่อง SPARC และ Intel (x86)
การดาวน์โหลดไฟล์เพื่อนำมาติดตั้งมีขั้นตอนดังนี้
  • เลือกเวอร์ชั่นของ Solaris เป็น SPARC หรือ Intel x86 (Pick Processor/OS)
  • เลือก Package ที่จะติดตั้ง
  • อ่านรายละเอียดของ Package นั้น เช่น ต้องติดตั้งโปรแกรมอะไรก่อน (Dependencies)
  • คลิ้กดาวน์โหลดไฟล์ที่ต้องใช้
บทความนี้ขอนำเสนอตัวอย่างการติดตั้ง apache-2.2.11 โดยจะทดลองบน Solaris  10(x86)

เลือกเวอร์ชั่นของ Solaris

คลิ้กเลือก x86/Solaris 10
Sunfreeware Pick Processor/OS

เลือก Package

คลิ้กเลือก apache-2.2.11
Sunfreeware - Select Package

อ่านรายละเอียด Package

รายละเอียดของ apache-2.2.11-sol10-x86-local.gz มีดังนี้
apache-2.2.11-sol10-x86-local.gz Apache 2 – the popular web server – installs in /usr/local/apache2. Dependencies: expat, libiconv, openldap, sasl, zlib, openssl-0.9.8k, and either the libgcc-3.4.6 or gcc-3.4.6. Documentation can be found in /usr/local/apache2/doc/apache2. The configuration files in /usr/local/apache2/conf must be edited to fit your site’s needs, including ssl support.
Sunfreeware - Package Details
จากรายละเอียด
  • การติดตั้ง apache จะถูกติดตั้งไว้ใน /usr/local/apache2
  • ต้องดาวน์โหลดไฟล์อื่นๆ ด้วย (Dependencies) ในที่นี้มี expat, libiconv, openldap, sasl, zlib, openssl-0.9.8k สามารถคลิ้กลิ้งค์ที่ชื่อไฟล์ได้เลย โดยแต่ละไฟล์อาจมี Dependencies ที่ต้องลงอีก สามารถอ่านรายละเอียดของแต่ละไฟล์ เช่น libiconv ต้องใช้  db-4.2.52.NC
  • สำหรับ libgcc_s.so.1 สามารถเลือกไฟล์ติดตั้ง ได้สองแบบคือ libgcc-3.4.6 คือ gcc-3.4.6 แบบแรกไฟล์ libgcc-3.4.6 จะขนาดเล็กกว่าแต่มีเฉพาะ library ที่จำเป็นต้องใช้ ไม่มี compiler เพื่อใช้คอมไพล์โปรแกรมเหมือน gcc-3.4.6 ได้
คลิ้กลิงค์ที่ไฟล์ต่างๆ เพื่อดาวน์โหลดไฟล์ทั้งหมดที่ต้องใช้

ติดตั้ง package

สำหรับการติดตั้ง apache-2.2.11 ถ้าคลิ้กลิ้งค์ไปเรื่อยๆ ตาม Dependencies ไฟล์ที่ต้องใช้มีดังนี้ (24 May 2009)
# ls -l
total 47568
-rw-r--r--   1 user1    other    7873798 May 24 21:20 apache-2.2.11-sol10-x86-local.gz
-rw-r--r--   1 user1    other    3942221 May 24 21:20 db-4.2.52.NC-sol10-intel-local.gz
-rw-r--r--   1 user1    other     299057 May 24 21:20 expat-2.0.1-sol10-x86-local.gz
-rw-r--r--   1 user1    other     526342 May 24 21:20 libgcc-3.4.6-sol10-x86-local.gz
-rw-r--r--   1 user1    other    1451349 May 24 21:20 libiconv-1.11-sol10-x86-local.gz
-rw-r--r--   1 user1    other    6436151 May 24 21:20 openldap-2.4.11-sol10-x86-local.gz
-rw-r--r--   1 user1    other    3174076 May 24 21:20 openssl-0.9.8k-sol10-x86-local.gz
-rw-r--r--   1 user1    other     540742 May 24 21:20 sasl-2.1.21-sol10-x86-local.gz
รัน gzip เพื่อ unzip ไฟล์
# gzip -dv *.gz
apache-2.2.11-sol10-x86-local.gz:        75.3% -- replaced with apache-2.2.11-sol10-x86-local
db-4.2.52.NC-sol10-intel-local.gz:       84.1% -- replaced with db-4.2.52.NC-sol10-intel-local
expat-2.0.1-sol10-x86-local.gz:  65.7% -- replaced with expat-2.0.1-sol10-x86-local
libgcc-3.4.6-sol10-x86-local.gz:         71.7% -- replaced with libgcc-3.4.6-sol10-x86-local
libiconv-1.11-sol10-x86-local.gz:        36.8% -- replaced with libiconv-1.11-sol10-x86-local
openldap-2.4.11-sol10-x86-local.gz:      72.1% -- replaced with openldap-2.4.11-sol10-x86-local
openssl-0.9.8k-sol10-x86-local.gz:       71.3% -- replaced with openssl-0.9.8k-sol10-x86-local
sasl-2.1.21-sol10-x86-local.gz:  71.4% -- replaced with sasl-2.1.21-sol10-x86-local
รัน pkgadd เพื่อติดตั้ง package ต่างๆ
หมายเหตุ ไม่จำเป็นต้องรัน pkgadd เพื่อติดตั้งไฟล์ตาม Dependencies
# pkgadd -d apache-2.2.11-sol10-x86-local
The following packages are available:
  1  SMCap2211     apache
                   (x86) 2.2.11
Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: all
Processing package instance <SMCap2211> from </usr/local/src/apache-2.2.11-sol10-x86-local>
apache(x86) 2.2.11
The Apache Group
Using </usr/local> as the package base directory.
## Processing package information.
## Processing system information.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
## Checking for setuid/setgid programs.
Installing apache as <SMCap2211>
## Installing part 1 of 1.
/usr/local/apache2/bin/ab
/usr/local/apache2/bin/apachectl
/usr/local/apache2/bin/apr-1-config
/usr/local/apache2/bin/apu-1-config
/usr/local/apache2/bin/apxs
/usr/local/apache2/bin/checkgid
/usr/local/apache2/bin/dbmmanage
/usr/local/apache2/bin/envvars
/usr/local/apache2/bin/envvars-std
/usr/local/apache2/bin/htcacheclean
/usr/local/apache2/bin/htdbm
/usr/local/apache2/bin/htdigest
/usr/local/apache2/bin/htpasswd
/usr/local/apache2/bin/httpd
...
...
...
/usr/local/doc/apache/docs/manual/vhosts/name-based.html.ja.utf8
/usr/local/doc/apache/docs/manual/vhosts/name-based.html.ko.euc-kr
/usr/local/doc/apache/docs/manual/vhosts/name-based.html.tr.utf8
/usr/local/doc/apache/httpd.spec
[ verifying class <none> ]
Installation of <SMCap2211> was successful.
# pkgadd -d expat-2.0.1-sol10-x86-local
The following packages are available:
  1  SMCexpat     expat
                  (x86) 2.0.1
Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: all
Processing package instance <SMCexpat> from </usr/local/src/expat-2.0.1-sol10-x86-local>
expat(x86) 2.0.1
James Clark et al
Using </usr/local> as the package base directory.
## Processing package information.
## Processing system information.
   1 package pathname is already properly installed.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
The following files are already installed on the system and are being
used by another package:
* /usr/local/bin <attribute change only>
* - conflict with a file which does not belong to any package.
Do you want to install these conflicting files [y,n,?,q] y
## Checking for setuid/setgid programs.
Installing expat as <SMCexpat>
## Installing part 1 of 1.
/usr/local/bin/xmlwf
/usr/local/doc/expat/COPYING
/usr/local/doc/expat/Changes
/usr/local/doc/expat/MANIFEST
/usr/local/doc/expat/README
...
...
...
/usr/local/lib/libexpat.so.0 <symbolic link>
/usr/local/lib/libexpat.so.0.4.0
/usr/local/lib/libexpat.so.1 <symbolic link>
/usr/local/lib/libexpat.so.1.5.2
/usr/local/man/man1/xmlwf.1
[ verifying class <none> ]
Installation of <SMCexpat> was successful.
# pkgadd -d libiconv-1.11-sol10-x86-local
The following packages are available:
  1  SMCliconv     libiconv
                   (x86) 1.11
Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: all
Processing package instance <SMCliconv> from </usr/local/src/libiconv-1.11-sol10-x86-local>
libiconv(x86) 1.11
Bruno Haible
Using </usr/local> as the package base directory.
## Processing package information.
## Processing system information.
   6 package pathnames are already properly installed.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
The following files are already installed on the system and are being
used by another package:
* /usr/local/share <attribute change only>
* /usr/local/share/doc <attribute change only>
* - conflict with a file which does not belong to any package.
Do you want to install these conflicting files [y,n,?,q] y
## Checking for setuid/setgid programs.
Installing libiconv as <SMCliconv>
## Installing part 1 of 1.
/usr/local/bin/iconv
/usr/local/doc/libiconv/ABOUT-NLS
/usr/local/doc/libiconv/AUTHORS
/usr/local/doc/libiconv/COPYING.LIB
/usr/local/doc/libiconv/ChangeLog
...
...
/usr/local/share/doc/iconv.1.html
/usr/local/share/doc/iconv.3.html
/usr/local/share/doc/iconv_close.3.html
/usr/local/share/doc/iconv_open.3.html
/usr/local/share/doc/iconvctl.3.html
[ verifying class <none> ]
Installation of <SMCliconv> was successful.
# pkgadd -d openssl-0.9.8k-sol10-x86-local
The following packages are available:
  1  SMCossl     openssl
                 (x86) 0.9.8k
Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: all
Processing package instance <SMCossl> from </usr/local/src/openssl-0.9.8k-sol10-x86-local>
openssl(x86) 0.9.8k
The OpenSSL Group
Using </usr/local> as the package base directory.
## Processing package information.
## Processing system information.
   1 package pathname is already properly installed.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
## Checking for setuid/setgid programs.
Installing openssl as <SMCossl>
## Installing part 1 of 1.
/usr/local/doc/openssl/CHANGES
/usr/local/doc/openssl/CHANGES.SSLeay
/usr/local/doc/openssl/FAQ
/usr/local/doc/openssl/INSTALL
/usr/local/doc/openssl/INSTALL.DJGPP
...
...
...
/usr/local/ssl/misc/c_hash
/usr/local/ssl/misc/c_info
/usr/local/ssl/misc/c_issuer
/usr/local/ssl/misc/c_name
/usr/local/ssl/openssl.cnf
[ verifying class <none> ]
Installation of <SMCossl> was successful.
# pkgadd -d db-4.2.52.NC-sol10-intel-local
The following packages are available:
  1  SMCdb     db
               (intel) 4.2.52.NC
Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: all
Processing package instance <SMCdb> from </usr/local/src/db-4.2.52.NC-sol10-intel-local>
db(intel) 4.2.52.NC
Sleepycat Software
Using </usr/local> as the package base directory.
## Processing package information.
## Processing system information.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
## Checking for setuid/setgid programs.
Installing db as <SMCdb>
## Installing part 1 of 1.
/usr/local/BerkeleyDB.4.2/bin/db_archive
/usr/local/BerkeleyDB.4.2/bin/db_checkpoint
/usr/local/BerkeleyDB.4.2/bin/db_deadlock
/usr/local/BerkeleyDB.4.2/bin/db_dump
/usr/local/BerkeleyDB.4.2/bin/db_load
...
...
...
/usr/local/BerkeleyDB.4.2/lib/libdb-4.2.la
/usr/local/BerkeleyDB.4.2/lib/libdb-4.2.so
/usr/local/BerkeleyDB.4.2/lib/libdb-4.so <symbolic link>
/usr/local/BerkeleyDB.4.2/lib/libdb.a
/usr/local/BerkeleyDB.4.2/lib/libdb.so <symbolic link>
[ verifying class <none> ]
Installation of <SMCdb> was successful.
# pkgadd -d libgcc-3.4.6-sol10-x86-local
The following packages are available:
  1  SMClgcc346     libgcc
                    (x86) 3.4.6
Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: all
Processing package instance <SMClgcc346> from </usr/local/src/libgcc-3.4.6-sol10-x86-local>
libgcc(x86) 3.4.6
FSF
Using </usr/local> as the package base directory.
## Processing package information.
## Processing system information.
   1 package pathname is already properly installed.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
## Checking for setuid/setgid programs.
Installing libgcc as <SMClgcc346>
## Installing part 1 of 1.
/usr/local/lib/libg2c.so <symbolic link>
/usr/local/lib/libg2c.so.0 <symbolic link>
/usr/local/lib/libg2c.so.0.0.0
/usr/local/lib/libgcc_s.so <symbolic link>
/usr/local/lib/libgcc_s.so.1
/usr/local/lib/libstdc++.so.6 <symbolic link>
/usr/local/lib/libstdc++.so.6.0.3
[ verifying class <none> ]
Installation of <SMClgcc346> was successful.
# pkgadd -d openldap-2.4.11-sol10-x86-local
The following packages are available:
  1  SMColdap     openldap
                  (x86) 2.4.11
Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: all
Processing package instance <SMColdap> from </usr/local/src/openldap-2.4.11-sol10-x86-local>
openldap(x86) 2.4.11
The OpenLDAP Group
Using </usr/local> as the package base directory.
## Processing package information.
## Processing system information.
   7 package pathnames are already properly installed.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
## Checking for setuid/setgid programs.
Installing openldap as <SMColdap>
## Installing part 1 of 1.
/usr/local/bin/ldapadd <symbolic link>
/usr/local/bin/ldapcompare
/usr/local/bin/ldapdelete
/usr/local/bin/ldapexop
/usr/local/bin/ldapmodify
...
...
...
/usr/local/var/openldap-data/__db.005
/usr/local/var/openldap-data/alock
/usr/local/var/openldap-data/dn2id.bdb
/usr/local/var/openldap-data/id2entry.bdb
/usr/local/var/openldap-data/log.0000000001
[ verifying class <none> ]
Installation of <SMColdap> was successful.
# pkgadd -d sasl-2.1.21-sol10-x86-local
The following packages are available:
  1  SMCsasl     sasl
                 (x86) 2.1.21
Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: all
Processing package instance <SMCsasl> from </usr/local/src/sasl-2.1.21-sol10-x86-local>
sasl(x86) 2.1.21
The SASL Team
Using </usr/local> as the package base directory.
## Processing package information.
## Processing system information.
   7 package pathnames are already properly installed.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
## Checking for setuid/setgid programs.
Installing sasl as <SMCsasl>
## Installing part 1 of 1.
/usr/local/doc/sasl2/AUTHORS
/usr/local/doc/sasl2/COPYING
/usr/local/doc/sasl2/ChangeLog
/usr/local/doc/sasl2/INSTALL
/usr/local/doc/sasl2/NEWS
...
...
...
/usr/local/man/man8/sasldblistusers2.8
/usr/local/man/man8/saslpasswd2.8
/usr/local/sbin/saslauthd
/usr/local/sbin/sasldblistusers2
/usr/local/sbin/saslpasswd2
[ verifying class <none> ]
Installation of <SMCsasl> was successful.

ตรวจสอบ package ที่ติดตั้ง

รันคำสั่ง pkginfo เพื่อตรวจสอบ package ที่ติดตั้ง ดูเฉพาะที่มีชื่อ SMC
# pkginfo | grep SMC
application SMCap2211                        apache
application SMCdb                            db
application SMCexpat                         expat
application SMClgcc346                       libgcc
application SMCliconv                        libiconv
application SMColdap                         openldap
application SMCossl                          openssl
application SMCsasl                          sasl
system      SUNWmgts                         Trusted Extensions, SMC
application SUNWtsmc                         Trusted Extensions SMC Server

รันเว็บเซิร์ฟเวอร์ apache

ใช้คำสั่ง apachectl เพื่อรัน apache
# /usr/local/apache2/bin/apachectl start
# ps -ef | grep apache
  daemon  1016  1011   0 22:13:43 ?           0:00 /usr/local/apache2/bin/httpd -k start
  daemon  1013  1011   0 22:13:43 ?           0:00 /usr/local/apache2/bin/httpd -k start
  daemon  1012  1011   0 22:13:43 ?           0:00 /usr/local/apache2/bin/httpd -k start
  daemon  1015  1011   0 22:13:43 ?           0:00 /usr/local/apache2/bin/httpd -k start
  daemon  1014  1011   0 22:13:43 ?           0:00 /usr/local/apache2/bin/httpd -k start
    root  1011     1   0 22:13:42 ?           0:00 /usr/local/apache2/bin/httpd -k start

เพิ่มความปลอดภัยให้ Solaris 10 แบบง่าย

เพิ่มความปลอดภัยให้ Solaris 10 แบบง่าย
วันนี้ขอเขียนเกี่ยวกับ Solaris 10 ซะหน่อย ช่วงนี้ได้รับมอบหมายให้เพิ่มความปลอดภัย (secure) ให้กับเครื่อง Solaris  แต่มีข้อแม้ไม่อยากให้ลง JASS (Solaris Security Toolkit) ก็เลยลองทำดู และเรียบเรียงมาเป็นบทความให้ผู้สนใจทั่วไป
การเพิ่มความปลอดภัยในบทความนี้  คือการปิดเซอร์วิสที่ไม่ได้ใช้งานโดยไม่กระทบกับงานที่ลูกค้าใช้  ซึ่งนอกจากจะปิดช่องโหว่ที่อาจเกิดขึ้นแล้ว ยังได้ free memory เพิ่มคืนมาอีกด้วย

ปิด remote services ตอนติดตั้ง Solaris

วิธีการหนึ่งที่ช่วยปิดเซอร์วิสเก่าๆ สำหรับการ remote services ไม่ว่าจะเป็น telnet, rlogin, ftp  เหลือแค่ Secure Shell (SSH) สามารถทำได้ตั้งแต่ระหว่างการติดตั้ง Solaris ในหน้าจอที่เลือก “Enabling remote services” ให้เลือก [x] No สำหรับ “Remote services enabled
Solaris 10 Installation - Disable Remote Services

ปิดเซอร์วิส CDE-Login (X Window)

หากคุณไม่เคยเดินไปที่หน้าจอคอนโซลของเครื่อง login เข้า CDE หรือ W Window แล้ว  สามารถปิดเซอร์วิสนี้ไปได้เลย เหลือแค่เป็นคอนโซล แบบ text ธรรมดา ให้สามารถ login ได้
ใช้คำสั่ง svcs เพื่อตรวจสอบสถานะ cde-login
# svcs cde-login
 STATE          STIME    FMRI
 online         13:34:58 svc:/application/graphical-login/cde-login:default
ตัวอย่างหน้าจอ cde-login
Solaris 10 - CDE Login
ใช้คำสั่ง svcadm disable เพื่อปิดเซอร์วิส cde-login
# svcadm disable cde-login
ตรวจสอบสถานะ cde-login หลังจากปิดเซอร์วิสแล้ว
# svcs cde-login
 STATE          STIME    FMRI
 disabled       13:36:59 svc:/application/graphical-login/cde-login:default
ตัวอย่าง text console login หลังจากปิดเซอร์วิส cde-login
After Disable CDE Login

ปิดเซอร์วิส Sun Java Web Console

Sun Java Web Console เป็นเซอร์วิสของ Solaris เพื่อสร้างเป็นจุดรวมของโปรแกรมประเภท system management ผ่านทาง web-based โดยผู้ใช้สามารถเรียกผ่าน https ได้
Sun Java Web Console
หากเราใช้แต่ command line เพื่อแก้ไขคอนฟิกเครื่อง เราสามารถปิดเซอร์วิสนี้ได้
ใช้คำสั่ง svcs เพื่อตรวจสอบสถานะ webconsole
# svcs webconsole
 STATE          STIME    FMRI
 online         14:01:06 svc:/system/webconsole:console
ใช้คำสั่ง svcadm disable เพื่อปิดเซอร์วิส webconsole
# svcadm disable webconsole
ตรวจสอบสถานะ webconsole หลังจากปิดเซอร์วิสแล้ว
# svcs webconsole
 STATE          STIME    FMRI
 disabled       14:41:47 svc:/system/webconsole:console

คอนฟิก Solaris IP Filter

คอนฟิก Solaris IP Filter
บทความนี้กล่าวถึงวิธีการใช้คำสั่ง ipf เพื่อสร้าง rule ของ Solaris IP Filter แบบง่ายๆ เพื่อใช้กำหนด packet เข้าออกเครื่อง

Solaris IP Filter เป็นโปรแกรม Firewall ที่ควบคุม packet เข้า/ออก เครื่องที่ติดตั้ง Solaris ได้
ipf เป็นคำสั่งที่ใช้ในการแก้ไขกฎ (rule) ของ Solaris IP Filter
หมายเหตุ
  • ตัวอย่างในบทความนี้ทดสอบบนเครื่องที่ติดตั้ง Solaris 10 10/09 s10x_u8wos_08a X86
  • ทดสอบกับเครื่องที่สามารถคอนโซลหน้าจอได้เท่านั้น เพราะถ้าคอนฟิก rule ของ Firewall ผิดพลาด อาจทำให้คุณไม่สามารถ remote เช่น Secure Shell ได้

1. เปิด (Start) เซอร์วิส ipfilter

โดยดีฟอลต์จากการติดตั้ง เซอร์วิส IP Filter จะถูกปิดการใช้งาน
ใช้คำสั่ง svcs ตรวจสอบสถานะ
# svcs -av | grep ipfilter
disabled       -             15:25:36      - svc:/network/ipfilter:default
ใช้คำสั่ง svcadm เพื่อเปิดการเซอร์วิส
# svcadm enable ipfilter
# svcs -av | grep ipfilter
online         -             15:27:14      - svc:/network/ipfilter:default

2. เปิดคุณสมบัติ (Enable) IP Filter

ขั้นต่อมา ใช้คำสั่ง ipf -E เพื่อเปิดคุณสมบัติ IP Filter
# ipf -E

3. ทดลองการสร้าง rule แบบง่ายๆ

สร้างไฟล์ /etc/ipf/ipf.conf เพื่อกำหนด rule ที่ต้องการ
ตัวอย่างเช่น ต้องการสร้าง rule เพื่อกำหนดให้เฉพาะเครื่องที่มี IP 192.168.1.2 เท่านั้นที่สามารถ ping (ICMP) เข้ามาที่เครื่องทางพอร์ต e1000g0 ได้
# cat /etc/ipf/ipf.conf
block in on e1000g0 proto icmp from any to any
pass in on e1000g0 proto icmp from 192.168.1.2/32 to any
หลังจากสร้างไฟล์เรียบร้อย พิมพ์คำสั่ง ipf -f ตามด้วยไฟล์ ipf.conf เพื่อเริ่มการบังคับใช้ rule ที่สร้างขึ้น
# ipf -f /etc/ipf/ipf.conf
*** 4. ลบ (Flush) rule ออกไป ***
หากต้องการยกเลิก rule ที่สร้างขึ้น ใช้คำสั่ง ipf -F เพื่อ ลบ (flush) rule ที่มีออกไป
# ipf -F a

5. ปิดคุณสมบัติ (Disable) IP Filter

ใช้คำสั่ง ipf -D เพื่อปิดคุณสมบัติ IP Filter
# ipf -D

ตัวอย่าง rule

มีตัวอย่างการสร้างไฟล์ ipf.conf เพื่อกำหนด rule แบบต่างๆ /usr/share/ipfilter/examples/

คอนฟิก SNMP บน Solaris 10

คอนฟิก SNMP บน Solaris 10
SNMP เป็นเครื่องมือหนึ่งที่สามารถใช้ดูการทำงานของเครื่อง เก็บประวัติการใช้ resource ต่างๆ ของเครื่อง ไม่ว่าจะเป็น CPU, Memory, Disk, Network แล้วสามารถนำมาใช้สร้างเป็นกราฟ รายงาน เพื่อวางแผนการเพิ่ม hardware เมื่อจำเป็นได้
ในบทความนี้จะอธิบายวิธีการคอนฟิกและรัน SNMP Server บน Solaris 10 เพื่อให้สามารถใช้โปรแกรม SNMP เช่น MRTG, Cacti, NMS  มาเก็บค่าต่างๆ ได้

ระบบทดสอบ

บทความนี้ทดสอบบน Solaris 10 (x86) 10/09
# cat /etc/release
                       Solaris 10 10/09 s10x_u8wos_08a X86
           Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
                        Use is subject to license terms.
                           Assembled 16 September 2009

รันเซอร์วิส sma

โปรแกรมชุด SNMP หรือ System Management Agent ใน Solaris 10 ได้มาจาก Net-SNMP ซึ่งเป็น freeware โดยจะถูกติดตั้งใน path ที่ชื่อ /usr/sfw/ ดังนี้น เวลารันคำสั่ง อาจต้องมีการระบุ PATH เพิ่มเติม
System Management Agent บน Solaris 10 ถูกควบคุมด้วยเซอร์วิสที่ชื่อ sma
ใช้คำสั่ง svcs เพื่อตรวจสอบว่ารันเซอร์วิส sma อยู่หรือไม่
# svcs -a | grep sma
disabled       13:50:30 svc:/application/management/sma:default
หมายเหตุ ต้องระบุออปชั่น ‘-a’ เพื่อดูชื่อเซอร์วิสทั้งหมด ทั้งที่ enable และ disable ไว้
ไฟล์คอนฟิกของ SNMP Server คือ /etc/sma/snmp/snmpd.conf
# cat /etc/sma/snmp/snmpd.conf
...
###########################################################################
#
# SECTION: Access Control Setup
#
#   This section defines who is allowed to talk to your running
#   snmp agent.
# rocommunity: a SNMPv1/SNMPv2c read-only access community name
#   arguments:  community [default|hostname|network/bits] [oid]
rocommunity  public
...
ดีฟอลต์ SNMP Community String แบบ read-only คือ “public” แนะนำให้เปลี่ยน เช่นเปลี่ยนเป็น “test_public_read”
# cat /etc/sma/snmp/snmpd.conf
...
rocommunity  test_public_read
...
ใช้คำสั่ง svcadm เพื่อรันเซอร์วิส sma
# svcadm enable svc:/application/management/sma:default
# svcs -a  | grep sma
online         14:18:37 svc:/application/management/sma:default
ใช้คำสั่ง ps เพื่อตรวจสอบ process ของ snmpd (SNMP Server)
# ps -ef | grep snmp
    root  1008     1   0 14:18:38 ?           0:00 /usr/sfw/sbin/snmpd
ทดลองใช้คำสั่ง snmpwalk เพื่อ walk ค่าต่างๆ ผ่านทาง SNMP
# /usr/sfw/bin/snmpwalk -v 1 -c test_public_read 127.0.0.1 system
SNMPv2-MIB::sysDescr.0 = STRING: SunOS sol10u8-zfs64a 5.10 Generic_141445-09 i86pc
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.3
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (12062) 0:02:00.62
SNMPv2-MIB::sysContact.0 = STRING: "System administrator"
SNMPv2-MIB::sysName.0 = STRING: sol10u8-zfs64a
SNMPv2-MIB::sysLocation.0 = STRING: "System administrators office"
SNMPv2-MIB::sysServices.0 = INTEGER: 72
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (64) 0:00:00.64
SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB
SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB
...

เพิ่มดิสก์ใหม่บน Solaris 10

เพิ่มดิสก์ใหม่บน Solaris 10
เช่นเดียวกับระบบปฏิบัติการ OS อื่นๆ เมื่อมีการเพิ่มดิสก์ก้อนใหม่เข้าไปในเครื่องที่ติดตั้ง Solaris 10 ต้องมีกระบวนการ หรือต้องรันคำสั่งก่อนที่จะเริ่มใช้ดิสก์ก้อนใหม่ได้

ในบทความนี้ทดสอบการเพิ่มดิสก์ก้อนใหม่ 1 ก้อน บน Solaris 10 (x86)
ใช้คำสั่ง format เพื่อดูว่า Solaris มองเห็นดิสก์อะไรบ้าง
# format
Searching for disks...done
AVAILABLE DISK SELECTIONS:
       0. c1t0d0 <DEFAULT cyl 4866 alt 2 hd 255 sec 63>
          /pci@0,0/pci1000,30@10/sd@0,0
       1. c1t1d0 <DEFAULT cyl 4867 alt 2 hd 255 sec 63>
          /pci@0,0/pci1000,30@10/sd@1,0
Specify disk (enter its number):
ดิสก์ก้อนใหม่ที่เพิ่มเข้ามาคือดิสก์หมายเลข 1 “c1t1d0″
พิมพ์หมายเลขของดิสก์แล้วกด [Enter] เพื่อเข้าสู่โหมดจัดการของดิสก์ก้อนที่ระบุ
Specify disk (enter its number): 1
selecting c1t1d0
[disk formatted]
FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
พิมพ์คำสั่ง partition เพื่อเข้าสู่โหมดการแบ่ง partition
format> partition
WARNING - This disk may be in use by an application that has
          modified the fdisk table. Ensure that this disk is
          not currently in use before proceeding to use fdisk.
หากเจอข้อความ WARNING แบบด้านบน ให้พิมพ์คำสั่ง fdisk เพื่อแก้ไข
format> fdisk
No fdisk table exists. The default partition for the disk is:
  a 100% "SOLARIS System" partition
Type "y" to accept the default partition,  otherwise type "n" to edit the
 partition table.
y
format>
พิมพ์คำสั่ง partition อีกครั้ง
format> partition
PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit
partition>
พิมพ์คำสั่ง print เพื่อแสดงการแบ่ง partition
partition> print
Current partition table (original):
Total disk cylinders available: 4866 + 2 (reserved cylinders)
Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 4865       37.28GB    (4866/0/0) 78172290
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0
partition>
เริ่มต้น ทดลองสร้าง partition 0 มีขนาด 10 GB
partition> 0
Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0
Enter partition id tag[unassigned]:
Enter partition permission flags[wm]:
Enter new starting cyl[0]:
Enter partition size[0b, 0c, 0e, 0.00mb, 0.00gb]: 10gb
ใช้คำสั่ง print เพื่อแสดง partition
partition> print
Current partition table (unnamed):
Total disk cylinders available: 4866 + 2 (reserved cylinders)
Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0 - 1305       10.00GB    (1306/0/0) 20980890
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 4865       37.28GB    (4866/0/0) 78172290
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0
หลังจากแก้ไข partition พิมพ์คำสั่ง label เพื่อบันทึกข้อมูลลงดิสก์
partition> label
Ready to label disk, continue? y
partition> ^D
กดปุ่ม [Ctrl]+[D] เพื่อออกจากคำสั่ง format
ใช้คำสั่ง newfs เพื่อสร้าง filesystem บน partition ที่เพิ่งสร้างขึ้น
หมายเหตุ ชื่อไฟล์ device ของดิสก์ c1t1d0 – partition 0 คือ /dev/rdsk/c1t1d0s0
# newfs /dev/rdsk/c1t1d0s0
newfs: construct a new file system /dev/rdsk/c1t1d0s0: (y/n)? y
Warning: 870 sector(s) in last cylinder unallocated
/dev/rdsk/c1t1d0s0:     20980890 sectors in 3415 cylinders of 48 tracks, 128 sectors
        10244.6MB in 214 cyl groups (16 c/g, 48.00MB/g, 5824 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
 32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
 20055584, 20154016, 20252448, 20350880, 20449312, 20547744, 20646176,
 20744608, 20843040, 20941472
แนะนำให้ใช้คำสั่ง fsck เพื่อตรวจสอบความถูกต้องของ filesystem ที่สร้างขึ้น ต้องไม่มีข้อความ error ใดๆ
# fsck -y /dev/rdsk/c1t1d0s0
** /dev/rdsk/c1t1d0s0
** Last Mounted on
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3a - Check Connectivity
** Phase 3b - Verify Shadows/ACLs
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cylinder Groups
2 files, 9 used, 10331200 free (16 frags, 1291398 blocks, 0.0% fragmentation)
สร้าง mount point สำหรับ partition ใหม่
# mkdir /mnt/new-disk0
# mount /dev/rdsk/c1t1d0s0 /mnt/new-disk0
mount: /dev/rdsk/c1t1d0s0 not a block device
สำหรับ Solaris เวลาใช้คำสั่ง newfs หรือ fsck ชื่อ device ที่ระบุคือ /dev/rdsk/… แต่เวลาใช้คำสั่ง mount ต้องระบุชื่อ device เป็น /dev/dsk/…
# mount /dev/dsk/c1t1d0s0 /mnt/new-disk0
ใช้คำสั่ง df เพื่อตรวจสอบ mount point
# df -h
Filesystem             size   used  avail capacity  Mounted on
/dev/dsk/c1t0d0s0       34G   3.7G    30G    11%    /
/devices                 0K     0K     0K     0%    /devices
ctfs                     0K     0K     0K     0%    /system/contract
proc                     0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
swap                   1.6G   932K   1.6G     1%    /etc/svc/volatile
objfs                    0K     0K     0K     0%    /system/object
sharefs                  0K     0K     0K     0%    /etc/dfs/sharetab
/usr/lib/libc/libc_hwcap1.so.1
                        34G   3.7G    30G    11%    /lib/libc.so.1
fd                       0K     0K     0K     0%    /dev/fd
swap                   1.6G     8K   1.6G     1%    /tmp
swap                   1.6G    20K   1.6G     1%    /var/run
/dev/dsk/c1t0d0s7      1.9G   210M   1.6G    12%    /export/home
/dev/dsk/c1t1d0s0      9.9G    10M   9.7G     1%    /mnt/new-disk0
หากใช้งาน partition ใหม่ได้ถูกต้องเรียบร้อยแล้ว ต้องเพิ่มคอนฟิกเข้าไปในไฟล์ /etc/vfstab เพื่อให้เวลาบู๊ตเครื่องใหม่ มีการ mount partition ใหม่นี้โดยอัตโมมัติ
# cat /etc/vfstab
#device         device          mount           FS      fsck    mount   mount
#to mount       to fsck         point           type    pass    at boot options
#
fd      -       /dev/fd fd      -       no      -
/proc   -       /proc   proc    -       no      -
/dev/dsk/c1t0d0s1       -       -       swap    -       no      -
/dev/dsk/c1t0d0s0       /dev/rdsk/c1t0d0s0      /       ufs     1       no      -
/dev/dsk/c1t0d0s7       /dev/rdsk/c1t0d0s7      /export/home    ufs     2       yes     -
/devices        -       /devices        devfs   -       no      -
sharefs -       /etc/dfs/sharetab       sharefs -       no      -
ctfs    -       /system/contract        ctfs    -       no      -
objfs   -       /system/object  objfs   -       no      -
swap    -       /tmp    tmpfs   -       yes     -
# new disk
/dev/dsk/c1t1d0s0       /dev/rdsk/c1t1d0s0      /mnt/new-disk0  ufs     2       yes     -

Blogger templates