Ads 468x60px

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

เปรียบเทียบ 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 ~]$

Blogger templates