|
|
|||||||
ชื่อเรื่อง : การเสริมสร้างความปลอดภัยด้วยโปรแกรม
Stunnel
เรียบเรียงโดย : ชวลิต ทินกรสูติบุตร
เรียบเรียงเมื่อ : 20 พฤษภาคม 2546
กล่าวนำ
จากบทความเรื่อง การเสริมสร้างความปลอดภัยกับระบบ
Secure Shell Tunneling [1] ที่กล่าวถึงการสร้างช่องทางการรับ/
ส่งข้อมูลโดยอาศัยการเข้ารหัสในระบบ Secure Shell (SSH) ([2],[3]) ซึ่งสามารถนำไปใช้งานกับโพรโตคอลหลากหลายชนิด เช่น POP3 หรือ
HTTP เป็นต้น บทความนี้จะแนะนำการประยุกต์ใช้ระบบ Secure Socket Layer (SSL) [4]
ในการเข้ารหัสข้อมูล โดยจะอธิบายถึงการกำหนดค่าและการประยุกต์ใช้ stunnel เพื่อให้เป็นอีกช่องทางหนึ่งที่สามารถนำมาใช้สร้างการเชื่อมต่อที่ปลอดภัย
วิธีการที่จะกล่าวถึงนี้มีรูปแบบการทำงานเช่นเดียวกับระบบ SSH
Stunnel
Stunnel เป็นโปรแกรมสำหรับสร้างการเชื่อมต่อแบบ TCP ที่อาศัยหลักการของ SSL สำหรับการเข้ารหัสข้อมูลที่รับ/ส่งระหว่างโพรโตคอล หรือโปรแกรมประยุกต์ที่ให้บริการผ่านระบบเครือข่าย โดยไม่จำเป็นต้องแก้ไขโค้ดของโปรแกรมใดๆ ทั้งสิ้น เนื่องจาก Stunnel ต้องอาศัยกระบวนการทำงานของระบบ SSL ในการเข้ารหัสข้อมูลของสร้างการเชื่อมต่อ ดังนั้นก่อนการติดตั้งโปรแกรม Stunnel ระบบจำเป็นต้องได้รับการติดตั้งโปรแกรมที่ให้บริการ SSL ในบทความนี้จะใช้โปรแกรม OpenSSL ซึ่งเป็นโปรแกรมให้บริการ SSL ที่นิยม และแจกฟรี (ศึกษาจาก [4])
ขั้นตอนการติดตั้งโปรแกรม Stunnel
ตัวอย่างขั้นตอนในบทความนี้ทดสอบในระบบปฏิบัติการ Red Hat 8.0 หากผู้ใช้คนใดใช้ระบบปฏิบัติการอื่น สามารถนำขั้นตอนทั้งหมดไปประยุกต์ใช้ได้ตามความเหมาะสม
หลักการทำงานของ Stunnel
Stunnel ใช้หลักการทำงานของลูกข่าย-แม่ข่าย (Clinet-Server Model) ดังนั้น Stunnel จะสามารถทำงานได้สองโหมดคือ Client Mode และ Server Mode การทำงานทั้งสองแบบจะอาศัยหลักการของ Port Forwarding เช่นเดียวกับ SSH Tunneling เพื่อเปลี่ยนการเชื่อมต่อของโพรโตคอล หรือโปรแกรมบริการพื้นฐานให้อยู่ภายใต้การทำงานของการเข้ารหัสแบบ SSL ของโปรแกรม Stunnel ศึกษาตัวอย่างต่อไปนี้เพื่อความเข้าใจกระบวนการทำงานของ Stunnel ที่เพิ่มมากขึ้น
"ถ้านายสมศักติ์เป็นผู้ดูแลระบบที่มีความจำเป็นต้องเปิดให้บริการ telnet กับเครื่องลูกข่าย แต่นายสมศักดิ์รู้ดีว่าการให้บริการ telnet นั้นอาจจะไม่ปลอดภัยจากการถูกดักจับรหัสผ่าน ดังนั้นนายสมศักดิ์จึงป้องกันการดักจับรหัสโดยกำหนดให้การเชื่อมต่อของ telnet อยู่ภายใต้การทำงานของโปรแกรม Stunnel รูปแบบการทำงานของระบบนี้แสดงได้ดังรูปที่ 1 "

รูปที่ 1 แสดงกระบวนการทำงานของโปรแกรม Stunnel สำหรับการขอใช้บริการ telnet
จากรูปที่ 1 เครื่องเซิร์ฟเวอร์เปิดให้บริการ telnet ผ่านพอร์ต 23 ซึ่งควบคุมการให้บริการด้วยโปรแกรม xinetd (ศึกษาการใช้งานโปรแกรม xinetd ได้จาก [6]) และเข้ารหัสข้อมูลด้วยโปรแกรม Stunnel การขอใช้บริการ telnet จากเครื่องลูกข่ายจะต้องผ่านกระบวนการทำงานของโปรแกรม Stunnel ก่อน มิเช่นนั้นกระบวนการขอใช้บริการจะไม่เกิดขึ้น เนื่องจากข้อมูลที่ติดต่อระหว่างเครื่องลูกข่าย และเครื่องเซิร์ฟเวอร์นั้นถูกเข้ารหัสแบบ SSL ทำให้โปรแกรม telnet ธรรมดาไม่เข้าใจข้อมูลที่ถูกเข้ารหัสเหล่านั้น จากตัวอย่างนี้การตั้งค่าระบบแสดงดังขั้นตอนดังต่อไปนี้
ฝั่งเซิร์ฟเวอร์
1. ตั้งค่าการทำงานของระบบ Stunnel ผ่านไฟล์ /etc/stunnel/telnetssl.conf ที่ประกอบด้วยค่าระบบดังกรอบที่ 1
|
cert = /etc/stunnel/me_cert.pem |
กรอบที่ 1 แสดงค่าของระบบในไฟล์ /etc/stunnel/telnetssl.conf
ความหมายของค่าระบบข้างต้นแสดงดังตารางที่ 1 คือ
| ค่าของระบบ | ความหมาย |
| cert | กำหนด Path ของไฟล์ CA ที่สร้างขึ้นเอง ผ่านขั้นตอนที่อ้างอิงจากภาคผนวก |
| pid | กำหนด Path ของไฟล์สำหรับเก็บหมายเลข process id. |
| exec | กำหนด Path ของไฟล์ของโปรแกรมที่เซิร์ฟเวอร์เปิดให้บริการ |
| execargs | คำสั่งที่เรียกใช้สำหรับการเรียกใช้เซิร์ฟเวอร์ ซึ่งรวมถึงชื่อของโปรแกรมเซิร์ฟเวอร์ด้วย เช่น in.intelnetd -i เป็นต้น |
ตารางที่ 1 แสดงความหมายของค่าระบบของกรอบที่ 1
2. จากตัวอย่างนี้กำหนดให้ telnet ซึ่งเข้ารหัสด้วย Stunnel ทำงานภายใต้ระบบ xinetd ขั้นตอนต่อไปเป็นการสร้างไฟล์ค่าระบบชื่อ /etc/xinetd.d/telnet ที่ประกอบด้วยค่าระบบดังกรอบที่ 2
| service telnet { disable = yes flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/stunnel server_args = /etc/stunnel/telnetssl.conf only_from = 10.0.1.0 log_on_failure += USERID HOST ATTEMPT RECORD log_on_success += PID HOST USERID EXIT DURATION } |
กรอบที่ 2 แสดงค่าระบบของไฟล์ /etc/xinetd.d/telnet
การตั้งค่าระบบที่สำคัญคือการตั้งค่า server ให้เรียกใช้งานโปรแกรม /usr/sbin/stunnel และ server_args มีประกอบด้วย argument ของไฟล์ /etc/stunnel/telnetssl.conf ที่สร้างจากขั้นตอนที่ 1 ความหมายของค่าระบบในกรอบที่ 2 ศึกษาเพิ่มเติมใน [6]
3. รีสตาร์ทการให้บริการ xinetd ด้วยคำสั่ง
# /etc/rc.d/init.d/xinted restart
ฝั่งลูกข่าย
1. ตั้งค่าการทำงานของระบบ Stunnel ผ่านไฟล์ /etc/stunnel/stunnel.conf ที่ประกอบด้วยค่าระบบดังกรอบที่ 3
|
pid = /var/run/stunnel.pid [telnetssl] |
ความหมายของค่าระบบเพิ่มเติมแสดงดังตารางที่ 2 คือ
| ค่าของระบบ | ความหมาย |
| client | กำหนดให้การเชื่อมต่อที่ใช้ค่าระบบนี้ทำงานในรูปแบบ client mode |
| [connection_name] | กำหนดชื่อของการเชื่อมต่อ |
| accepthost:port | กำหนดให้การเชื่อมต่อเกิดขึ้นจาก Host และพอร์ตใด |
| connecthost:port | กำหนดให้หลังจากข้อมูลผ่านการเข้ารหัสแบบ SSL จาก Stunnel แล้วส่งผ่านไปยัง Host และพอร์ตใด |
ตารางที่ 2 แสดงความหมายของค่าระบบของกรอบที่ 2
2. สร้างการเชื่อมต่อของ Stunnel ด้วยคำสั่ง
# /usr/sbin/stunnel /etc/stunnel/stunnel.conf
การประยุกต์ใช้ Stunnel ในรูปแบบของ SSL port Forwarding
นอกจากการนำ Stunnel ไปใช้กับการให้บริการ telnet ดังตัวอย่างข้างต้นแล้ว Stunnel ยังสามารถนำไปใช้เข้ารหัสกับการเชื่อมต่อกับการให้บริการในโพรโตคอลอื่นได้อีก เช่น POP, IMAP, หรือ syslog-ng เป็นต้น Port Forwarding นับเป็นลักษณะหนึ่งของการประยุกต์ใช้ Stunnel ในการโอนย้ายการเชื่อมต่อจากโฮสต์หนึ่งไปยังอีกโฮสต์หนึ่ง หรือพอร์ตหนึ่งไปยังอีกพอร์ตหนึ่ง กระบวนการทำงานของ Port Forwarding ของ Stunnel แสดงดังตัวอย่างในรูปที่ 2

รูปที่ 2 แสดงตัวอย่างของกระบวนการทำงานของ Port Forwarding ผ่านโปรแกรม Stunnel
การเชื่อมต่อในรูปที่ 2 เริ่มต้นจากเครื่องลูกข่ายหมายเลข IP 10.0.01 ร้องขอการใช้บริการของ daemon (เช่น imapd หรือ fingerd เป็นต้น) จากเครื่อง IP 10.0.0.3 ผ่านการถ่ายโอนข้อมูลของ Stunnel ในเครื่อง IP 10.0.0.2 โดย เครื่อง IP 10.0.0.1 เรียกใช้บริการจาก เครื่อง IP 10.0.0.2 ผ่านพอร์ต 180 โดยข้อมูลที่รับ/ส่งระหว่าง เครื่อง IP 10.0.0.1 และ เครื่อง IP 10.0.0.2 นั้นไม่ถูกเข้ารหัสใดๆ ทั้งสิ้น หลังจากนั้นข้อมูลดังกล่าวจะถูกโอนย้ายการเชื่อมต่อผ่านกระบวนการ Port Forwarding และเข้ารหัสจากโปรแกรม Stunnel ไปยัง เครื่อง IP 10.0.0.3 ผ่านพอร์ต 2323 เมื่อข้อมูลถูกส่งมายัง เครื่อง IP 10.0.0.3 ข้อมูลต้องถูกถอดรหัสด้วยโปรแกรม Stunnel ก่อน แล้วจึงส่งไปยังโปรแกรมเซิร์ฟเวอร์ daemon ที่เปิดพอร์ต 108 การตั้งค่าระบบตามกระบวนในรูปที่ 2 แสดงได้ดังนี้
เครื่อง IP 10.0.0.3
ลักษณะการทำงานของ เครื่อง IP 10.0.0.3 เป็นการทำงานในรูปแบบของ Server Mode การตั้งค่าจะแตกต่างกับระบบในฝั่งเซิร์ฟเวอร์ของรูปที่ 1 โดยโปรแกรม daemon ไม่ได้อยู่ภายใต้การควบคุมของโปรแกรม xinetd ดังนั้นการส่งผ่านข้อมูลไปยังโปรแกรม daemon นั้นใช้เพียงระบบการทำงานของ Port Forwarding เท่านั้น
1. สร้างไฟล์ /etc/stunnel/stunnel.conf ที่ประกอบด้วยค่าระบบดังนี้
|
pid = /var/run/stunnel.pid [telnetssl] |
กรอบที่ 4 แสดงค่าของระบบในไฟล์ /etc/stunnel/telnetssl.conf
2. เปิดการให้บริการของโปรแกรม daemon และสร้างการเชื่อมต่อของ Stunnel ด้วยคำสั่ง
# /usr/sbin/stunnel /etc/stunnel/stunnel.conf
เครื่อง IP 10.0.0.2
รูปแบบการทำงานของ เครื่อง IP 10.0.0.2 จะคล้ายคลึงกับ เครื่อง IP 10.0.0.3 โดยเป็นการทำงานของระบบ Port Forwarding โดยรับการเชื่อมต่อมาจาก เครื่อง IP 10.0.0.1 ผ่านพอร์ต 180 เท่านั้น
1. สร้างไฟล์ /etc/stunnel/stunnel.conf ที่ประกอบด้วยค่าระบบดังนี้
|
pid = /var/run/stunnel.pid [telnetssl] |
กรอบที่ 5 แสดงค่าของระบบในไฟล์ /etc/stunnel/telnetssl.conf
2. สร้างการเชื่อมต่อของ Stunnel ด้วยคำสั่ง
# /usr/sbin/stunnel /etc/stunnel/stunnel.conf
บทส่งท้าย
Stunnel เป็นอีกแนวทางหนึ่งสำหรับการเข้ารหัสข้อมูลเพื่อการเชื่อมต่อการให้บริการในโพรโตคอลอื่นๆ
เช่น telnet, http, imap, pop3, หรือ smtp เป็นต้น เมื่อเทียบกับ SSH Tunnel แล้ว
Stunnel มีข้อด้อยกว่า ในส่วนของการระบุตัวตน (Accountability) และการยืนยันตัวตน
(Authority) ที่ไม่ปรากฎในกระบวนการทำงานของ Stunnel อย่างไรก็ตามเมื่อกล่าวถึงความสะดวก
และคล่องตัวของการใช้งานแล้ว Stunnel นั้นจะเด่นกว่า SSH Tunnel ดังนั้นการประยุกต์ใช้
Secure Tunnel แต่ละแบบนั้นขึ้นกับรูปแบบการใช้งาน และความถนัดของผู้ดูแลระบบตามความเหมาะสม
การสร้าง Certificate Authority (CA) โดยใช้โปรแกรม OpenSSL สำหรับการให้งานกับ
Stunnel
เราสามารถสร้าง CA ได้ในเครื่องของตนเองได้ ผ่านการทำงานของโปรแกรม OpenSSL ในภาคผนวกนี้จะกล่าวถึงการสร้าง CA ในระบบปฎิบัติการ Linux Red Hat 8 การใช้งานคำสั่งต่างๆ ที่จะกล่าวต่อไปนั้นต้องอยู่ภายใต้การทำงานของ root เท่านั้น นอกจากนี้ไฟล์ที่ได้จากกระบวนการนี้ต้องมีสิทธิเป็น 0600 หรือ 0700
1. เข้าสู่ไดเรกทอรี /usr/share/ssl/misc ผ่านคำสั่ง
# cd /usr/share/ssl/misc
2. สร้าง Key ที่สำคัญสำหรับการสร้าง CA ด้วยคำสั่ง
# ./CA -newca
ผลของคำสั่งแสดงได้ดังกรอบผนวกที่ 1
|
CA certificate filename (or enter to create) <กด Enter> Making CA certificate ... |
กรอบผนวกที่ 1 แสดงผลของคำสั่ง ./CA -newca
3. ผลของคำสั่งในข้อที่ 2 คือไดเรกทรอรี่ ./demoCA ที่ประกอบด้วยไฟล์ที่ใช้ในการสร้าง CA
4. สร้างไฟล์ประเภท "Signing Request" ด้วยคำสั่ง
# openssl req -nodes -new -keyout me_key.pem
-out me_req.pem -
days 365 -config ./openssl.cnf
ผลของคำสั่งข้างต้นแสดงได้ดังกรอบผนวกที่ 2
| Generating a 1024 bit RSA private key ......................++++++ .................++++++ writing new private key to 'me_key.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:<ใส่ชื่อย่อของประเทศ> State or Province Name (full name) [Berkshire]:<ใส่ชือจังหวัด> Locality Name (eg, city) [Newbury]:<ใส่ชื่อเมือง> Organization Name (eg, company) [My Company Ltd]:<ใส่ชื่อบริษัท> Organizational Unit Name (eg, section) []:<ใส่ชื่อหน่วยงาน> Common Name (eg, your name or your server's hostname) []:<ใส่ชื่อ> Email Address []: <ใส่อี-เมล์> Please enter the following 'extra' attributes |
กรอบผนวกที่ 2 แสดงผลของคำสั่งในข้อ 4
5. ทำการ sign ไฟล์ที่ได้จากข้อที่ 4 ด้วยคำสั่ง
# openssl ca -config ./openssl.cnf
-policy policy_anything -o
ut me_pubcert.pem -infiles ./me_req.pem
ผลของคำสั่งข้างต้นแสดงได้ดังกรอบผนวกที่ 3
| Using configuration from ../openssl.cnf Enter pass phrase for ./demoCA/private/cakey.pem:<ใส่รหัสสำหรับ key เดียวกันกับกรอบที่ 1> Check that the request matches the signature Signature ok The commonName field needed to be supplied and was missing |
กรอบผนวกที่ 3 แสดงผลของคำสั่งในข้อ 5
6.เพิ่มบรรทัดสุดท้ายของไฟล์ me_key.pem ด้วยบรรทัดว่าง 1 บรรทัดด้วยโปรแกรม text editor เช่น vi หรือ pico เป็นต้น
7. เปิดไฟล์ me_pubcert.pem ด้วยโปรแกรม text editor และทำการลบบรรทัดตั้งแต่บรรทัดแรกจนถึงบรรทัดก่อนหน้าบรรทัดที่ปรากฎประโยค "-----BEGIN CERTIFICATE-----" และเพิ่มบรรทัดว่าง 1 บรรทัดที่บรรทัดสุดท้ายของไฟล์
8. สร้างไฟล์ CA ด้วยคำสั่ง
# cat ./me_key.pem ./me_pubcert.pem > ./me_cert.pem
เอกสารอ้างอิง
| Home
|| เอกสารเผยแพร่ || Encryption
ThaiCERT Disclaimer | Copyright © 2001 ThaiCERT(NECTEC). All rights reserved. |