ThaiCERT: Thai Computer Emergency Response Team
ศูนย์ประสานงานการรักษาความปลอดภัยคอมพิวเตอร์ ประเทศไทย 
 
 
 



ชื่อเรื่อง : การเสริมสร้างความปลอดภัยกับระบบ Secure Shell Tunneling
เรียบเรียงโดย : ชวลิต ทินกรสูติบุตร
เรียบเรียงเมื่อ : 3 กุมภาพันธ์ 2546

กล่าวนำ

เมื่อกล่าวถึง SSH ผู้ดูแลระบบ หรือผู้ใช้งานระบบมักจะนึกถึง การให้บริการ user shell ที่มาแทนที่ระบบ telnet (การใช้งานระบบ SSH เบื้องต้นศึกษาจาก เอกสารอ้างอิง [1]) โดยการเข้ารหัสที่เสริมสร้างความปลอดภัยให้กับการใช้งาน นอกเหนือจากคุณสมบัติหลักของ SSH ที่กล่าวไปแล้วนั้น SSH ยังมีความสามารถอื่นๆ อีกที่น่าสนใจ และเป็นประโยชน์ต่อการเพิ่มความปลอดภัยให้กับการใช้งานระบบเครือข่าย คุณสมบัติหนึ่งที่น่าสนใจคือ SSH Tunnel ในบทความนี้จะกล่าวถึง การตั้งค่า และการประยุกต์ใช้ SSH Tunnel กับการขอใช้บริการอื่นๆ เพื่อเพิ่มความปลอดภัยมากยิ่งขึ้น

SSH Tunnel

SSH Tunnel คือ การสร้างช่องทางของการเชื่อมต่อในระบบเครือข่ายแบบ TCP/IP ที่เป็นการรับส่งข้อมูลที่ไม่ได้เข้ารหัสลับ (Plain text) ให้ปลอดภัยมากขึ้น โดยการเข้ารหัสในระบบ SSH ระหว่างเครื่องลูกข่าย และเครื่องเซิร์ฟเวอร์ การสร้าง SSH Tunnel สามารถประยุกต์ใช้กับการเชื่อมต่อได้หลายแบบ เช่น POP3 SMTP หรือ HTTP เป็นต้น ระบบ SSH อาศัยหลักการทำงานของ Port Forwarding สำหรับสร้าง SSH Tunnel หัวข้อต่อไปจะกล่าวถึงรายละเอียดโดยสังเขปของระบบ Port Forwarding

Port Forwarding

Port Forwarding เป็นกระบวนการหนึ่งภายในระบบ SSH (ในฝั่งเซิร์ฟเวอร์) ที่ทำการปรับเปลี่ยนหมายเลขพอร์ตของการเชื่อมต่อจากเครื่องลูกข่ายเครื่องหนึ่งไปเป็นหมายเลขพอร์ตอื่น และทำการถ่ายโอนการเชื่อมต่อ (Connection Forwarding) ดังกล่าวไปยังเครื่องลูกข่ายอีกเครื่องหนึ่ง ระบบ Port Forwarding ของ SSH แบ่งได้เป็นสองประเภท ดังนี้

I. Local Port Forwarding

รูปแบบการทำงานแบบนี้จะอาศัย Connection Forwarding สองส่วน ได้แก่ ส่วนของเครื่องลูกข่าย (Local) และส่วนของเครื่องเซิร์ฟเวอร์ที่ให้บริการ SSH เพื่อความเข้าใจระบบการทำงานของการสร้าง SSH Tunnel ชนิดนี้ จะอธิบายผ่านตัวอย่างดังต่อไปนี้

"ถ้านายสมศักติ์ต้องการตรวจสอบเมล์จากระบบอินทราเน็ต (Intranet) ที่บ้านของตนเอง มันเป็นไปได้ยากที่สมศักดิ์จะเข้ามาใช้ระบบอินทราเน็ตนี้ได้โดยตรงผ่านระบบอินเทอร์เน็ตอย่างปลอดภัย (ยกเว้นจะมีการใช้ระบบ VPN ) แต่แนวทางหนึ่งที่จะช่วยสมศักดิ์ได้คือการสร้าง SSH Tunnel แบบ Local Port Forwarding จากเครื่องของสมศักดิ์ผ่านเครือข่ายอินตอร์เน็ต ไปยังเครื่องเซิร์ฟเวอร์ที่ให้บริการ SSH ของบริษัท เพื่อถ่ายโอนการเชื่อมต่อไปยังเครื่องเมล์เซิร์ฟเวอร์ของระบบอินทราเน็ต (โดยมีข้อแม้ว่าเครื่องเซิร์ฟเวอร์ทั้งสองต้องติดต่อถึงกันได้) " รูปแบบของการเชื่อมต่อของเหตุการณ์ตัวอย่างแสดงได้ดังรูปที่ 1 ด้านล่างนี้

รูปที่ 1 แสดงตัวอย่างการใช้งาน Local Port Forwarding

ขั้นตอนโดยสังเขปของการสร้างการเชื่อมต่อข้างต้นเป็นดังนี้

1. สมศักดิ์เข้าสู่เซิร์ฟเวอร์ SSH ที่มีออปชันของการเรียกใช้บริการแบบ Local Port Forwarding ตัวอย่างคำสั่งในระบบยูนิกซ์ ดังนี้คือ

# ssh -L 110:intranet_mail.server.com:110 somsak@my_ssh.server.com

2. ผลที่ได้หลังจากสมศักดื์เข้าสู่ระบบของเซิร์ฟเวอร์ SSH คือ เครื่องของสมศักดิ์จะเปิดพอร์ตหมายเลข 110 (POP3) และเครื่องเซิร์ฟเวอร์ SSH จะจัดเตรียมระบบสำหรับการถ่ายโอนการเชื่อมต่อของสมศักติ์ไปยังเครื่อง intranet_mail.server.com

3. ก่อนการตรวจสอบเมล์สมศักดิ์ต้องตั้งค่าโปรแกรมตรวจสอบเมล์ (เช่น Outlook) ของตนเองให้ IP ของเครื่องเมล์เซิร์ฟเวอร์เป็น localhost

4. เมื่อสมศักดิ์ทำการตรวจเมล์ ขั้นตอนของการเชื่อมต่อของระบบเครือข่ายเป็นไปได้ดังนี้

หมายเหตุ จากรูปที่ 1 การเชื่อมต่อจะถูกแบ่งเป็นสองส่วนคือ ส่วนของการเชื่อมต่อเครื่องลูกข่ายกับเซิร์ฟเวอร์ SSH เป็นส่วนที่ได้รับการเข้ารหัสอย่างปลอดภัย และส่วนที่สองคือการเชื่อมไปยังเครื่องเซิร์ฟเวอร์ปลายทาง โดยการเชื่อมต่อช่วงนี้เป็นการเชื่อมต่อแบบปรกติไม่มีการเข้ารหัสใดๆ ทั้งสิ้น

นอกจากตัวอย่างการขอใช้บริการเมล์ผ่านพอร์ต 110 แล้วระบบ Port Forwarding ของ SSH ยังสนับสนุนการเข้ารหัสของการเชื่อมต่อบริการอื่นในระบบ TCP/IP เช่น Telnet NTP SMTP DNS HTTP NNTP RPC FTP หรือ IMAP4 เป็นต้น

สำหรับผู้ใช้งานระบบ

ความหมายของคำสั่งนี้คือ ต้องการสร้าง SSH Tunnel แบบ Local Port Forwarding เพื่อขอใช้บริการเว็บ (พอร์ต 80) จากเครื่อง http.host.com ผ่านการถ่ายโอนการเชื่อมต่อของเครื่อง ssh.host.com มายังผู้ใช้บริการชื่อ me ที่เปิดพอร์ต 8001 รอรับการขอบริการจากโปรแกรมประยุกต์ของเครื่องผู้ใช้บริการ การเรียกใช้งานเว็บของเครื่อง http.host.com ผ่านเว็บบราวเซอร์นั้นทำได้โดยการใส่ค่า URL เป็น http://localhost:8001
ออปชันอื่นที่น่าสนใจของโปรแกรม OpenSSH และ SSH สำหรับการทำงานของ SSH Tunnel แสดงได้ดังนี้

II. Remote Port Forwarding
รูปแบบของ Port Forwarding ชนิดนี้จะทำงานตรงกันข้ามกับแบบแรก คือ เครื่องลูกข่ายจะเป็นฝั่งรอรับการเชื่อมต่อ (LISTEN state) จากเครื่องปลายทาง ผ่านการถ่ายโอนการเชื่อมต่อของเครื่องเซิร์ฟเวอร์ SSH ผลที่ได้คือ เครื่องเซิร์ฟเวอร์ SSH เปิดพอร์ตเพื่อการรอรับการเชื่อมต่อจากภายนอก และเมื่อมีการเชื่อมต่อจากพอร์ตดังกล่าว เครื่องเซิร์ฟเวอร์จะถ่ายโอนการเชื่อมต่อนั้นไปยังเครื่องลูกข่ายแทน เช่นเดียวกันกับข้างต้น เพื่อความเข้าใจระบบการทำงานของการสร้าง SSH Tunnel ชนิดนี้ จะอธิบายผ่านตัวอย่างดังต่อไปนี้

"ถ้าสมศักดิ์มีความจำเป็นต้องแชร์ข้อมูลจากเครื่องของตนเองที่บริษัทในระบบอินทราเน็ตให้กับลูกค้าผ่านระบบเครือข่ายอินเทอร์เน็ต มันคงเป็นไปได้ยากหากไม่มีการใช้ Connection Tunnel โดยเฉพาะ เช่น VPN สำหรับการเชื่อมต่อดังกล่าว อีกทางเลือกหนึ่งของสมศักดิ์คือ การสร้างการ SSH Tunnel แบบ Remote Port Forwarding ผ่านเครื่องเซิร์ฟเวอร์ SSH ของบริษัทตน โดยการเปิดพอร์ตสำหรับรอรับการขอการเชื่อมต่อจากเครื่องของลูกค้าผ่านระบบเครือข่ายอินเทอร์เน็ต เพื่อถ่ายโอนการเชื่อมต่อไปยังพอร์ตในเครื่องของสมศักดิ์ที่บริษัทอีกทอดหนึ่ง" รูปแบบของการเชื่อมต่อของเหตุการณ์ตัวอย่างแสดงได้ดังรูปที่ 2 ด้านล่างนี้

รูปที่ 2 แสดงตัวอย่างการใช้งาน Remote Port Forwarding

ขั้นตอนโดยสังเขปของการสร้างการเชื่อมต่อข้างต้นเป็นดังนี้

1. สมศักดิ์เข้าสู่เซิร์ฟเวอร์ SSH ที่มีออปชันของการเรียกใช้บริการแบบ Remote Port Forwarding ตัวอย่างคำสั่งในระบบยูนิกซ์ ดังนี้คือ

# ssh -L 8000:localhost:80 somsak@my_ssh.server.com

2. ผลที่ได้หลังจากสมศักดื์เข้าสู่ระบบของเซิร์ฟเวอร์ SSH คือ เครื่องของสมศักดิ์จะเปิดพอร์ตหมายเลข 80 (http) และเครื่องเซิร์ฟเวอร์ SSH เปิดพอร์ต 8000 เพื่อรอรับการเชื่อมต่อจากเครื่องลูกค้า

3. ลูกค้าสามารถถ่ายโอนข้อมูลได้โดยสร้างการเชื่อมต่อผ่านพอร์ต 8000 ของเครื่องเซิร์ฟเวอร์ SSH ในที่นี้ยกตัวอย่างให้ลูกค้าใช้เว็บบราวเซอร์เรียกใช้ข้อมูลดังกล่าว โดยใส่ URL เป็น http://my_ssh.server.com:8000 ขั้นตอนของการเชื่อมต่อของระบบเครือข่ายเป็นไปได้ดังนี้

สำหรับผู้ใช้งานระบบ

หมายเหตุ
* ควรมีหมายเลขพอร์ตที่สูงกว่า 1024 และไม่ควรเป็นพอร์ตชนิด well-known เพื่อป้องกันปัญหาของสิทธิการเปิดใช้งานพอร์ตในกรณีที่ไม่ใช้ผู้ดูแลระบบ (root)
** server_ssh และ server_application อาจจะเป็นเครื่องเดียวกัน หรือต่างกันก็ได้

สิ่งที่ต้องคำนึงสำหรับผู้ดูแลระบบ
แม้ว่าการใช้งาน SSH Tunnel จะมีประโยชน์อย่างมากในการเพิ่มความสะดวก และความปลอดภัยแก่ผู้ใช้ แต่อย่างไรก็ตามผู้ดูแลระบบเซิร์ฟเวอร์ SSH ต้องคำนึงถึงความเสี่ยงของ SSH Tunnel ข้อสำคัญข้อหนึ่งคือ "การป้องกันการเชื่อมต่อระหว่าง Private IP ของเครื่องภายในองค์กร กับอินเทอร์เน็ตภายนอกผ่านกระบวนการ NAT (Network Address Translation) นั้นจะไร้ความหมาย ถ้าในระบบมีการเปิดการบริการสร้าง SSH Tunnel" โดยทั่วไปหลังจากการติดตั้งโปรแกรมเซิร์ฟเวอร์ SSH (ทั้ง OpenSSH และ SSH) ระบบจะตั้งค่าเบื้องต้นให้เปิดการให้บริการ Port Forwarding ทั้งสองแบบ และโดยมากแล้วผู้ดูแลระบบมักจะเปิดการให้บริการ SSH กับหมายเลขไอพีใดๆ ก็ได้เพื่อความสะดวกต่อผู้ดูแลระบบในการเข้ามาแก้ไขระบบ โดยมีความคิดว่าการทำงานของ SSH นั้นปลอดภัยมาก ซึ่งเป็นความคิดที่ผิด หากผู้บุกรุกได้รายชื่อของผู้ใช้งานในเครื่องเซิร์ฟเวอร์ SSH ผู้บุกรุกจะอาศัยคุณสมบัติของ SSH Tunnel ในการเจาะระบบ และถ่ายโอนข้อมูลต่างๆ ที่อยู่ภายในองค์กรโดยไม่สนใจว่าเครื่องในองค์กรดังกล่าวจะเป็น Private IP หรือไม่

SSH Tunnel Hardening

แนวการป้องกันความเสี่ยงดังกล่าวนั้นคือ การเสริมสร้างความแข็งแกร่ง (Hardening) ให้กับระบบ SSH โดยการจำกัดสิทธิของการเปิดให้บริการ SSH Tunnel หรือระงับใช้การให้บริการ SSH Tunnel ต่อไปนี้เป็นแนวทางการตั้งค่าเซิร์ฟเวอร์ SSH โดยแบ่งตามประเภทของโปรแกรมดังนี้

AllowTcpForwarding NO

ความหมายของค่าคอนฟิกกูเรชันข้างต้นคือการบ่งบอกให้ระบบ SSH ระงับการให้บริการ SSH Tunnel ทั้งแบบ Remote Port Forwarding และ Local Port Forwarding

ค่าคอนฟิกกูเรชัน
ความหมาย
ตัวอย่าง
AllowTcpForwardingForUsers กำหนดให้รายชื่อผู้ใช้ และจากเครื่องลูกข่ายใดบ้างเข้าใช้บริการ SSH Tunnel ได้

AllowTcpForwardingForUsers cowboyneal@slashdot.org

ระบบอนุญาตให้ผู้ใช้ชื่อ cowboyneal จากเครื่องลูกข่าย slashdot.org ใช้บริการ SSH Tunnel ได้

DenyTcpForwardingForUsers กำหนดระงับรายชื่อผู้ใช้ และจากเครื่องลูกข่ายใดบ้างที่ไม่สามารถเข้าใช้บริการ SSH Tunnel

DenyTcpForwardingForUsers peelo

ระบบไม่อนุญาตให้ผู้ใช้ชื่อ peelo ใช้บริการ SSH Tunnel ได้

AllowTcpForwardingForGroups กำหนดให้รายชื่อกลุ่มผู้ใช้ใดบ้างเข้าใช้บริการ SSH Tunnel ได้

AllowTcpForwardingForGroups privileged_tcp_forwarders

ระบบอนุญาตให้กลุ่มผู้ใช้ชื่อ privileged_tcp_forwarders ใช้บริการ SSH Tunnel ได้

DenyTcpForwardingForGroups กำหนดระงับกลุ่มรายชื่อผู้ใช้ใดบ้างที่ไม่สามารถเข้าใช้บริการ SSH Tunnel

DenyTcpForwardingForGroups coming_from_outside

ระบบไม่อนุญาตให้กลุ่มผู้ใช้ชื่อ coming_from_outside ใช้บริการ SSH Tunnel ได้

ForwardACL allow กำหนดขอบเขตการใช้งาน SSH Tunnel ในเชิงของ Access List โดยมีความละเอียดมากกว่าค่าคอนฟิกกูเรชันข้างต้น นอกจากจะระบุขอบเขตของผู้ใช้ แล้วค่าคอนฟิกกูเรชันนี้ยังบ่งบอกว่าต้องการกำหนดรูปแบบของการสร้าง SSH Tunnel ให้เป็นแบบ Local หรือ Remote และยังสามารถระบุพอร์ตที่จะให้ทำการ Forwarding ได้อีกด้วย

ForwardACL allow local .*%users \i10\.1\.0\.25%(143|25)

กำหนดให้มีการเปิดให้บริการ SSH Tunnel แบบ Local Port Forwarding ไปยังไอพี 10.1.0.25 ผ่านพอร์ต 143 และ 25 จากผู้ใช้ใดๆ ก็ตามในกลุ่ม users

ForwardACL deny remote .* .*

ระงับการใช้ SSH Tunnel แบบ Remote Port Forwarding จากผู้ใช้ทุกคน

บทส่งท้าย

คุณสมบัติ SSH Tunnel นั้นนับได้ว่ามีประโยชน์มากต่อการสร้างความสะดวก และความปลอดภัยให้กับผู้ใช้ ตัวอย่างการใช้งานข้างต้นเป็นเพียงเบื้องต้น การใช้ SSH Tunnel ยังสามารถประยุกต์กับการทำงานในระบบเครือข่ายที่ซับซ้อน และทำงานกับระบบอื่นได้เกือบทุกประเภท เช่น การออกแบบระบบตรวจจับการบุกรุกแบบ Honey Pot หรือการเสริมสร้างความปลอดภัยของข้อมูลที่ถ่ายโอนผ่าน FTP ของโปรแกรม Dreamwaver เอกสารอ้างอิง [6] เป็นต้น แต่อย่างไรก็ตามกระบวนการนี้ยังมีความเสี่ยงสำคัญที่ต้องคำนึงสำหรับผู้ดูแลระบบ ดังนั้น การระงับการเปิดบริการ SSH Tunnel เป็นทางป้องกันความเสี่ยงได้ดีที่สุด แต่หากระบบในองค์กรมีความต้องการใช้ SSH Tunnel ผู้ดูแลระบบจำเป็นต้องทำการ Harden ระบบ SSH เพื่อจำกัดขอบเขตของการใช้งานบริการ SSH Tunnel

เอกสารอ้างอิง



Home || เอกสารเผยแพร่ || Unix & Linux

ThaiCERT Disclaimer | Copyright © 2001 ThaiCERT(NECTEC). All rights reserved.