|
|
|||||||
กล่าวนำ
เมื่อกล่าวถึง 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. เมื่อสมศักดิ์ทำการตรวจเมล์ ขั้นตอนของการเชื่อมต่อของระบบเครือข่ายเป็นไปได้ดังนี้
- โปรแกรมตรวจสอบเมล์จะเชื่อมต่อกับ localhost (เครื่องสมศักดิ์) ผ่านพอร์ต 110
- การเชื่อมต่อดังกล่าวจะถูกถ่ายโอนไปยังระบบ SSH ของเครื่องสมศักดิ์ผ่านพอร์ต SSH (หมายเลข 22) ไปยังเครื่องเซิร์ฟเวอร์ SSH
- โพรเซสของเซิร์ฟเวอร์ SSH ที่ดูแลการเชื่อมต่อของสมศักดิ์จะถ่ายโอนการเชื่อมต่อนี้ไปยังพอร์ต 110 (POP3) ของเครื่อง intranet_mail.server.com
- สมศักดิ์สามารถรับ-ส่ง เมล์ผ่านเครื่อง intranet_mail.server.com ได้ตามปรกติเหมือนอยู่ที่บริษัท
หมายเหตุ จากรูปที่ 1 การเชื่อมต่อจะถูกแบ่งเป็นสองส่วนคือ ส่วนของการเชื่อมต่อเครื่องลูกข่ายกับเซิร์ฟเวอร์ SSH เป็นส่วนที่ได้รับการเข้ารหัสอย่างปลอดภัย และส่วนที่สองคือการเชื่อมไปยังเครื่องเซิร์ฟเวอร์ปลายทาง โดยการเชื่อมต่อช่วงนี้เป็นการเชื่อมต่อแบบปรกติไม่มีการเข้ารหัสใดๆ ทั้งสิ้น
นอกจากตัวอย่างการขอใช้บริการเมล์ผ่านพอร์ต 110 แล้วระบบ Port Forwarding ของ SSH ยังสนับสนุนการเข้ารหัสของการเชื่อมต่อบริการอื่นในระบบ TCP/IP เช่น Telnet NTP SMTP DNS HTTP NNTP RPC FTP หรือ IMAP4 เป็นต้น
สำหรับผู้ใช้งานระบบ
- ความต้องการของระบบ
สิ่งที่ต้องการสำหรับการสร้าง SSH Tunnel ชนิดนี้สำหรับผู้ใช้งานระบบ ได้แก่
- โปรแกรม SSH client ซึ่งมีทั้งในระบบปฏิบัติการ Windows (SSH จาก เอกสารอ้างอิง [2]) และระบบปฏิบัติการตระกูลยูนิกซ์ หรือลีนุกซ์ (เช่น SSH จาก เอกสารอ้างอิง [3] หรือ OpenSSH จาก เอกสารอ้างอิง [4])
- เครื่องเซิร์ฟเวอร์ SSH สำหรับขอบริการถ่ายโอนการเชื่อมต่อ
- รายละเอียดของพอร์ต (well-known port) และหมายเลขไอพี*ของเซิร์ฟเวอร์ปลายทางที่ต้องการขอใช้บริการ
หมายเหตุ * สามารถใช้ชื่อเครื่องแทนที่หมายเลขไอพีได้ แต่ชื่อเครื่องดังกล่าวต้องสามารถเปลี่ยนเป็นไอพีได้
- รูปแบบของคำสั่ง
ในที่นี้จะกล่าวเฉพาะการใช้งานคำสั่งของโปรแกรม SSH ในระบบยูนิกซ์เท่านั้น หากต้องการศึกษาวิธีการที่ใช้กับระบบ Windows ศึกษาได้จาก เอกสารอ้างอิง [5] รูปแบบของคำสั่งของการสร้างการเชื่อมต่อแบบ Port Forwarding แสดงได้ดังนี้ssh -L forward_port:server_application:application_port user@server_ssh
ค่าออปชันของคำสั่ง ความหมาย-L บ่งบอกว่าการเชื่อมต่อนี้เป็น Port Forwarding แบบ Local forward_port พอร์ตที่ต้องการเปิดภายในเครื่องผู้ใช้บริการ * server_application ไอพีของเซิร์ฟเวอร์ที่ต้องการใช้บริการ** application_port พอร์ต (Well-know port) ของเซิร์ฟเวอร์ที่เปิดให้บริการ user รายชื่อผู้ขอใช้บริการระบบ SSH จากเครื่องเซิร์ฟเวอร์ SSH server_ssh ไอพีของเครื่องเซิร์ฟเวอร์ SSH ** หมายเหตุ
* ควรมีหมายเลขพอร์ตที่สูงกว่า 1024 และไม่ควรเป็นพอร์ตชนิด well-known เพื่อป้องกันปัญหาของสิทธิการเปิดใช้งานพอร์ตในกรณีที่ไม่ใช้ผู้ดูแลระบบ (root)
** server_ssh และ server_application อาจจะเป็นเครื่องเดียวกัน หรือต่างกันก็ได้
ตัวอย่างเช่นssh -L 8001:http.host.com:80 me@ssh.host.com
ความหมายของคำสั่งนี้คือ ต้องการสร้าง 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 แสดงได้ดังนี้
OpenSSH SSH ความหมาย-C +C บีบอัดข้อมูลระหว่างการถ่ายโอนข้อมูล -N -S ไม่ทำการใช้งาน shell หลังจากเข้าสู่ระบบ SSH -f -f ทำงานเป็น Backgroud Process หลังจากผ่านกระบวนการ Authentication 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 ขั้นตอนของการเชื่อมต่อของระบบเครือข่ายเป็นไปได้ดังนี้
- โปรแกรมเว็บบราวเซอร์ของลูกค้าขอการเชื่อมต่อไปยังเครื่อง my_ssh.server.com ผ่านพอร์ต 8000
- การเชื่อมต่อดังกล่าวจะถูกถ่ายโอนไปยังระบบ SSH ของเครื่องสมศักดิ์จากเครื่อง my_ssh.server.com ผ่านพอร์ต SSH (หมายเลข 22)
- โพรเซสของเครื่องสมศักดิ์ที่ดูแลการเชื่อมต่อนี้จะถ่ายโอนการเชื่อมต่อไปยังพอร์ต 80(http) ของเครื่องสมศักดิ์เพื่อแชร์ข้อมูลให้ลูกค้าผ่านการเชื่อมต่อ SSH Tunnel นี้
สำหรับผู้ใช้งานระบบ
- ความต้องการของระบบ
สิ่งที่ต้องการสำหรับการสร้าง SSH Tunnel ชนิดนี้สำหรับผู้ใช้งานระบบคล้ายกับแบบแรก ได้แก่- รูปแบบของคำสั่ง
ในที่นี้จะกล่าวเฉพาะการใช้งานคำสั่งของโปรแกรม SSH ในระบบยูนิกซ์เท่านั้น หากต้องการศึกษาวิธีการที่ใช้กับระบบ Windows ศึกษาได้จาก [5] รูปแบบของคำสั่งของการสร้างการเชื่อมต่อแบบ Port Forwarding แสดงได้ดังนี้ssh -R forward_port:server_application:application_port user@server_ssh
ค่าออปชันของคำสั่ง ความหมาย-R บ่งบอกว่าการเชื่อมต่อนี้เป็น Port Forwarding แบบ Remote forward_port พอร์ตที่ต้องการเปิดภายในเครื่องผู้ใช้บริการ * server_application ไอพีของเซิร์ฟเวอร์ที่ต้องการใช้บริการ** application_port พอร์ต (Well-know port) ของเซิร์ฟเวอร์ที่เปิดให้บริการ user รายชื่อผู้ขอใช้บริการระบบ SSH จากเครื่องเซิร์ฟเวอร์ SSH server_ssh ไอพีของเครื่องเซิร์ฟเวอร์ SSH ** หมายเหตุ
* ควรมีหมายเลขพอร์ตที่สูงกว่า 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
AllowTcpForwarding NO
ค่าคอนฟิกกูเรชัน ความหมาย ตัวอย่าง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. |