Clear
Lead Graphic Papers

เพิ่มความปลอดภัยให้ SSH Server ด้วย Key Authentication

ผู้เขียน: เจษฎา ช้างสีสังข์
วันที่เผยแพร่: 21 พ.ย. 2554
ปรับปรุงล่าสุด: 21 พ.ย. 2554

Share on Facebook Share on Twitter Share on Google+

Secure Shell (SSH) คือ โพรโทคอล (Protocol) ที่ใช้ในการติดต่อสื่อสารระหว่างเครื่องคอมพิวเตอร์บนระบบเครือข่ายผ่าน พอร์ท (Port) หมายเลข 22 ซึ่งโพรโทคอล SSH มีวัตถุประสงค์หลักเพื่อให้ผู้ใช้งานสามารถเข้าควบคุมหรือสั่งการเครื่อง คอมพิวเตอร์ที่ให้บริการ SSH ตามสิทธิของผู้ใช้งานซึ่งได้มาจากการพิสูจน์ตัวตนด้วยการล็อกอิน (Login) ด้วยการใช้ชื่อผู้ใช้และรหัสผ่าน โดยผ่านช่องทางการสื่อสารที่มีการรักษาความมั่นคงปลอดภัยด้วยการเข้ารหัสลับ ข้อมูล (Encryption) ซึ่งถูกออกแบบมาเพื่อใช้แทนที่การสื่อสารข้อมูลบนระบบเครือข่ายที่ส่งข้อมูล แบบไม่ได้เข้ารหัสลับ (Plaintext) เช่น Telnet, Rlogin หรือ FTP ปัจจุบันโพรโทคอล SSH มีสองเวอร์ชั่นคือ SSH-1 และ SSH-2 (ถูกพัฒนาจาก SSH-1 เพื่อแก้ไขช่องโหว่หรือข้อผิดพลาดที่ทำให้ผู้โจมตีสามารถโจมตีเข้ามายัง เครื่องคอมพิวเตอร์ที่ให้บริการ SSH ได้ [1])

การทำงานของโพรโทคอล SSH จะทำงานในลักษณะไคลเอนต์และเซิร์ฟเวอร์ (Client-Server) โดยรูปแบบการใช้งานจะประกอบไปด้วยโปรแกรม 2 ส่วนคือ โปรแกรมส่วนที่ทำหน้าที่เป็นเครื่องที่ให้บริการ (Server) จะถูกติดตั้งลงที่เครื่องคอมพิวเตอร์ที่ต้องการให้บริการ SSH เช่น โปรแกรม OpenSSH-Server บนระบบปฏิบัติการ Linux โดยส่วนใหญ่แล้วเครื่องคอมพิวเตอร์ที่ติดตั้งโปรแกรมที่ให้บริการ SSH จะติดตั้งเพื่ออำนวยความสะดวกแก่ผู้ใช้งานร่วมกับบริการอื่นๆ ควบคู่ไป เช่น บริการเว็บเซิร์ฟเวอร์ หรือบริการอัพโหลดไฟล์ เป็นต้น และโปรแกรมอีกส่วนจะทำหน้าที่เป็นผู้เชื่อมต่อ (Client) ไปยังเครื่องคอมพิวเตอร์ที่ให้บริการ SSH เช่น โปรแกรม PuTTY [2] บนระบบปฏิบัติการ Windows หรือ โปรแกรม OpenSSH-Client บนระบบปฏิบัติการ Linux

ถึงแม้โพรโทคอล SSH จะมีข้อดีในเรื่องของการรักษาความมั่นคงปลอดภัยโดยมีการเข้ารหัสลับข้อมูล และมีการล็อกอินก่อนการเข้าใช้งาน แต่ก็ยังพบว่ามีโอกาสสูงที่จะถูกโจมตีจากผู้ไม่หวังดี เนื่องจากผลลัพธ์และความสำเร็จในการเข้าโจมตีอาจหมายถึงการได้รับสิทธิในการ เข้าควบคุมและสั่งการเครื่องคอมพิวเตอร์ที่ให้บริการนั้นทันที โดยลักษณะการโจมตีที่เกิดขึ้นมักจะมาจากการใช้เทคนิคในการเข้าโจมตีที่ เครื่องคอมพิวเตอร์ที่ให้บริการโดยตรง เช่นการโจมตีด้วยวิธีการสุ่มรหัสผ่าน (Brute-force) เพื่อพยายามเข้าสู่ระบบเครื่องคอมพิวเตอร์ที่ให้บริการ SSH ซึ่งหากผู้ใช้งานหรือผู้ดูแลระบบตั้งค่ารหัสผ่านในการล็อกอินง่ายเกินไปก็จะ ทำให้โอกาสในการโจมตีสำเร็จง่ายมากขึ้น โดยแนวทางในการป้องกันที่ได้ผลลัพธ์ดีที่สุดคือการรู้ทันการโจมตีและรู้วิธี ในการป้องกันการโจมตีดังกล่าว ซึ่งหนึ่งในวิธีการป้องกันที่ผู้ดูแลระบบส่วนใหญ่นิยมใช้ และจะกล่าวถึงในบทความนี้ คือ การเปลี่ยนวิธีการล็อกอินจากวิธีการปกติที่ใช้รหัสผ่าน เป็นการใช้เทคนิคการใช้คู่กุญแจ (Key Authentication) [3] ซึ่งเป็นรูปแบบการเข้ารหัสแบบอสมมาตร (Asymmetric-key cryptography) โดยมีการสร้างคู่กุญแจ ซึ่งจะประกอบไปด้วยกุญแจสาธารณะ (Public Key) และ กุญแจส่วนตัว (Private Key) มีหลักการทำงานคือ ถ้าใช้กุญแจ A ในการเข้ารหัสลับ จะต้องใช้กุญแจ B ในการถอดรหัสลับ โดยการเข้ารหัสและถอดรหัสดังกล่าวจะใช้ฟังก์ชันทางคณิตศาสตร์เข้ามาช่วย [4] ซึ่งการใช้หลักการดังกล่าวในการพิสูจน์ตัวตนของผู้ใช้งานกับเครื่อง คอมพิวเตอร์ที่ให้บริการ SSH จะช่วยป้องกันการโจมตีด้วยวิธีการ Brute-force จากผู้โจมตีได้ และยังสามารถเพิ่มความมั่นคงปลอดภัยจากการใช้งาน Key Authentication ได้โดยการเข้ารหัสลับ Private key ด้วยรหัสผ่านอีกขั้นตอนหนึ่ง เพื่อป้องกันบุคคลอื่นนำกุญแจดังกล่าวไปใช้งาน ซึ่งวิธีการใช้งาน SSH ด้วยวิธีการ Key Authentication สามารถอธิบายได้ดังนี้

วิธีการใช้งาน Secure Shell (SSH) ด้วย Key Authentication

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

ตัวอย่างการใช้งาน SSH Key Authentication

จำลองระบบดังนี้
เครื่องผู้ใช้งานฝั่งไคลเอนต์ :

  • ใช้ระบบปฏิบัติการ Ubuntu 11.04
  • โปรแกรมที่ใช้คือ OpenSSH-Client
เครื่องคอมพิวเตอร์ที่ให้บริการ SSH :
  • ใช้ระบบปฏิบัติการ Ubuntu Server 11.04
  • โปรแกรมที่ใช้คือ OpenSSH-Server
  • IP Address เป็น 10.10.10.10
  • มี Account ของผู้ใช้เป็น user01 และมี Home directory เป็น /home/user01 ( สามารถเขียนแทนด้วยเครื่องหมาย “~” )
หมายเหตุ: คำสั่งการใช้งาน SSH อาจมีความแตกต่างกันตามโปรแกรมที่ใช้งาน ซึ่งในที่นี้จะใช้คำสั่งของโปรแกรม OpenSSH [5]

1. สร้าง Key Pair ที่เครื่องของผู้ใช้งาน

ทำการสร้าง Key Pair เพื่อจะได้ Public Key และ Private Key
1.1 ใช้คำสั่ง ssh-keygen ด้วยรูปแบบดังนี้

ssh-keygen [-b bits] -t type [-f output_keyfile]


[-b bits] เป็นการระบุขนาดบิตของ Key ที่สร้าง หากไม่มีการกำหนดโปรแกรมจะใช้ค่าตั้งต้นคือ 2048 บิต
-t เป็นการกำหนดรูปแบบของ Key โดยค่าที่เป็นไปได้คือ rsa1 เป็นการกำหนดโพรโทคอล RSA Version 1 rsa และ dsa เป็นการกำหนดโพรโทคอล RSA และ DSA Version 2 ตามลำดับ
[-f output_keyfile] เป็นการกำหนดชื่อไฟล์ของ Key ที่สร้าง โดยผู้ใช้งานสามารถระบุไดเรกทอรีที่ต้องการเก็บ Key ลงไปด้วยได้ หากไม่ได้กำหนด โปรแกรมจะสร้าง Key ไว้ที่ไดเรกทอรี ~/.ssh/ โดยจะสร้าง Private Key เป็นไฟล์ชื่อ id_rsa และสร้าง Public Key เป็นไฟล์ชื่อ id_rsa.pub

พิมพ์คำสั่งดังนี้
ssh-keygen -t rsa -b 1024 -f ~/.ssh/user01-key
จาก คำสั่งข้างต้นจะเป็นการสร้าง Key Pair ชนิด RSA Version 2 มีขนาด 1024 บิต และถูกสร้างไว้ที่ไดเรกทอรี ~/.ssh/ ซึ่งจะปรากฎไฟล์ user01-key และ user01-key.pub

1.2 หลังจากพิมพ์คำสั่งแล้วกดปุ่ม Enter จากนั้นโปรแกรมจะให้ใส่ค่า Passphrase หรือรหัสผ่านที่ใช้ในการเข้ารหัสลับเพื่อป้องกันการใช้งาน Private Key จากผู้ไม่หวังดี ซึ่งทุกครั้งที่มีการใช้งาน Private Key จะต้องใส่ Passphrase นี้เพื่อปลดล็อคจึงจะใช้งานได้ โดยผลลัพธ์ที่ได้หลังจากการใช้คำสั่งจะพบว่ามีไฟล์ user01-key (Private Key) และ user01-key.pub (Public Key) อยู่ที่ /home/user01/ หรือ ~/


1.3 เมื่อสร้าง Key เสร็จ ควรปรับปรุงสิทธิในการเข้าถึง Key เช่นกำหนดสิทธิให้ผู้ใช้งานสามารถอ่านและเขียน Private Key ได้เท่านั้น และกำหนดสิทธิให้ผู้ใช้อื่น สามารถอ่าน Public Key ได้อย่างเดียว

คำสั่งในการตั้งค่าสิทธิให้ผู้ใช้งานเท่านั้นที่สามารถอ่านและเขียน Private Key ได้มีดังนี้
chmod 600 user01-key

คำสั่งในการตั้งค่าสิทธิให้ผู้อื่นสามารถอ่าน Public Key ได้อย่างเดียวมีดังนี้
chmod 644 user01-key.pub

ตัวอย่างคำสั่งการสร้าง Key
user01@test:/home/user01$ ssh-keygen -t rsa -b 1024 -f ~/.ssh/user01-key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user01/.ssh/user01-key.
Your public key has been saved in /home/user01/.ssh/user01-key.pub.
The key fingerprint is:
48:34:5a:68:a0:77:a1:3e:b8:55:20:25:51:8c:f5:fe user01@test


หากต้องการเปลี่ยน Passphrase สามารถทำได้โดยใช้คำสั่ง ssh-keygen โดยกำหนพารามิเตอร์ -p และระบุตำแหน่งของ Private Key ด้วยพารามิเตอร์ -f
ตัวอย่างคำสั่งการเปลี่ยน Passphrase ที่ล็อกการใช้งาน Private Key
user01@test:/home/user01$ ssh-keygen -p -f /home/user01/.ssh/user01-key
Enter old passphrase:
Key has comment '/home/user01/.ssh/user01-key'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.

2. คัดลอก Public Key ไปยังเครื่องคอมพิวเตอร์ที่ให้บริการ SSH

2.1 คัดลอก Public Key ไปยังเครื่องคอมพิวเตอร์ที่ให้บริการ SSH ด้วยคำสั่ง

scp ~/.ssh/user01-key.pub user01@10.10.10.10
หมายเหตุ: คำสั่ง scp (Secure copy) เป็นคำสั่งในการคัดลอกไฟล์ไปยังเครื่องคอมพิวเตอร์ปลายทาง โดยข้อมูลที่ส่งจะผ่านช่องทางที่มีการเข้ารหัสลับ ซึ่งความหมายของคำสั่งข้างต้นคือการคัดลอกไฟล์ชื่อ user01-key.pub ที่อยู่ใน ~/.ssh/ ไปที่ /home/user01/ ของเครื่องคอมพิวเตอร์ปลายทางที่มี IP Address 10.10.10.10


2.2 ให้ผู้ใช้งานล็อกอินเข้าไปยังเซิร์ฟเวอร์ที่ให้บริการ SSH จากนั้นทำการย้าย Public Key ของตน ไปไว้ที่ไดเรกทอรี ~/.ssh/ แล้วเปลี่ยนชื่อจาก user01-key.pub เป็น authorized_keys ด้วยคำสั่งดังนี้

mv user01-key.pub ~/.ssh/authorized_keys
หมายเหตุ: การเพิ่ม Public Key มากกว่า 1 key เข้าไปยังระบบของผู้ใช้งาน สามารถทำได้โดยการนำ Public Key ใหม่มาต่อท้ายเนื้อหาในไฟล์ authorized_keys ด้วยคำสั่ง
cat ~/user01-key2.pub >> ~/.ssh/authorized_keys


2.3 กำหนดสิทธิในการเข้าถึง Public Key ให้เหมาะสม เช่น

กำหนดให้ผู้อื่นสามารถอ่านไฟล์ได้เท่านั้น ด้วยคำสั่ง chmod 644 authorized_keys

3. ตั้งค่าการเชื่อมต่อของโปรแกรม OpenSSH-Client

การตั้งค่าการเชื่อมต่อของโปรแกรม OpenSSH-Client ที่เครื่องผู้ใช้งาน ทำให้เกิดความสะดวกในการเรียกคำสั่งในการเชื่อมต่อไปยังเครื่องคอมพิวเตอร์ทีให้บริการ SSH โดยผู้ใช้งานสามารถกำหนดค่าเบื้องต้นในการเชื่อมต่อ เช่น ตำแหน่งของ Private Key หรือ IP Address ของเครื่องคอมพิวเตอร์ที่ให้บริการ SSH ซึ่งทำได้โดยการสร้างไฟล์ชื่อ config ไว้ที่ไดเรกทอรี ~/.ssh ของผู้ใช้ จากนั้นกำหนดค่าดังตัวอย่างลงในไฟล์

Host server
Hostname 10.10.10.10
User user01
IdentitiesOnly yes
IdentityFile ~/.ssh/user01-key

จากการตั้งค่าข้างต้น เป็นการกำหนดชื่อที่ใช้แทนการตั้งค่าเพื่อใช้เข้าถึงเครื่องปลายทาง โดยที่:

  • Hostname คือการกำหนดชื่อหรือ IP Address ที่ระบุที่อยู่ของเครื่องคอมพิวเตอร์ที่ให้บริการ SSH
  • User คือการกำหนดชื่อผู้ใช้งานที่จะใช้ ล็อกอินไปยังเครื่องคอมพิวเตอร์ที่ให้บริการ SSH
  • IdentityFile เป็นการกำหนดที่อยู่ของ Private Key

จากนั้นผู้ใช้งานสามารถทดสอบการเชื่อมต่อไปยังเครื่องคอมพิวเตอร์ที่ให้บริการ SSH ได้ด้วยคำสั่ง ssh server ตัวอย่างการใช้งานคำสั่ง ssh-server

user01@test:/home/user01/.shh# ssh server
Enter passphrase for key 'user01-key':

ซึ่งหลังจากการใช้คำสั่งแล้ว ระบบจะให้ใส่ Passphrase ของ Private Key ในกรณีที่ไม่ได้ตั้งค่าการเชื่อมต่อในไฟล์ config ผู้ใช้งานสามารถกำหนดการเข้าถึงเครื่องคอมพิวเตอร์ที่ให้บริการ SSH ได้โดยตรง ด้วยรูปแบบคำสั่งดังนี้

ssh [-i private_key_file] username@hostname

Option -i หมายถึง การระบุที่อยู่ Private Key ของผู้ใช้งาน

ตัวอย่างการใช้งาน
ssh -i ~/.ssh/user01-key user01@10.10.10.10

จากคำสั่งข้างต้น เป็นการล็อกอินไปยังเครื่องคอมพิวเตอร์ที่ให้บริการ SSH โดยมี IP Address เป็น 10.10.10.10 ด้วย account ของผู้ใช้งานชื่อ user01 และใช้ Private Key ที่กำหนดไว้ที่ไฟล์ ~/.ssh/user01-key

4. ตั้งค่าการทำงานของโปรแกรม OpenSSH-server

โดยปกติแล้วโปรแกรม OpenSSH-Server จะมีการกำหนดค่าตั้งต้นของโปรแกรมให้ใช้การล็อกอินด้วยรหัสผ่าน ซึ่งผู้ดูแลระบบสามารถปรับปรุงการตั้งค่าเพื่อให้สอดคล้องกับการใช้งาน Key Authentication ด้วยการปรับแต่งค่าที่ไฟล์ /etc/ssh/sshd_config โดยมีรายละเอียดดังนี้

PasswordAuthentication no
PubkeyAuthentication yes
RSAAuthentication yes

จากนั้น Restart โปรแกรม Openssh-server ด้วยคำสั่ง

/etc/init.d/sshd restart


อ้างอิง

[1] http://en.wikipedia.org/wiki/Secure_Shell
[2] http://www.chiark.greenend.org.uk/~sgtatham/putty/
[3] http://en.wikipedia.org/wiki/Key_authentication
[4] http://th.wikipedia.org/wiki/วิทยาการเข้ารหัสลับ
[5] http://www.openssh.com/

Clear