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
ผลลัพธ์ที่ได้จะเหมือนกับการล็อกอินเข้าไปที่เครื่องปลายทางก่อน แล้วค่อยรันคำสั่งต่างๆ
ขอบคุณครับ ได้ใช้ประโยชน์หลายหัวข้อเลย ^ ^