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



ชื่อเรื่อง : การตั้งค่า และใช้งานโปรแกรม XINETD
เรียบเรียงโดย : ชวลิต ทินกรสูติบุตร
เรียบเรียงเมื่อ : 18 ตุลาคม 2545

กล่าวนำ

        ในระบบปฏิบัติการลีนุกซ์บางระบบ เช่น Red Hat เวอร์ชั่นตั้งแต่ 7.0 ขึ้นไป เป็นต้น จะติดตั้งโปรแกรม xinetd ให้ทำงานแทนการใช้งานโปรแกรม inetd และ tcpd เดิม ซึ่งโปรแกรม inetd เป็นโปรแกรมที่ควบคุมโปรแกรมที่ให้บริการในระบบเครือข่ายบนระบบปฏิบัติการยูนิกซ์ เมื่อมีการเรียกใช้บริการที่โปรแกรม inetd ควบคุมอยู่ เช่น ftp, telnet เป็นต้น (ผ่านการควบคุมของไฟล์ /etc/inetd.conf) และถูกกำหนดให้เรียกใช้โปรแกรม tcpd เพื่อตรวจสอบความถูกต้องของไอพีที่เรียกใช้บริการว่า ถูกต้องตามกฎที่ตั้งไว้ในไฟล์ /etc/hosts.allow และ /etc/hosts.deny หรือไม่ โปรแกรม inetd จะเรียกใช้โปรแกรม tcpd เพื่อตรวจสอบความถูกต้องของไอพีที่เรียกใช้บริการ หากถูกต้องโปรแกรม inetd จึงจะเรียกใช้โปรแกรมระบบเครือข่ายดังกล่าวนั้นอีกทอดหนึ่ง แสดงการทำงานทั้งหมดได้ตามรูปที่ 1

รูปที่ 1 รูปแสดงขั้นตอนการทำงานของโปรแกรม INETD และ TCPD เมื่อมีการเรียกใช้งาน ftp จากเครือข่าย

 

โปรแกรม xinetd มีคุณสมบัติที่น่าสนใจ ดังนี้

การตั้งค่าของโปรแกรม xinetd

ในที่นี้จะอ้างอิงถึงการตั้งค่าในระบบปฏิบัติการลีนุกซ์ Red Hat 7.2 เป็นหลัก ไฟล์หลักที่กำหนดการทำงานของโปรแกรม xinetd ประกอบด้วยสองส่วนคือ

defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
only_from = localhost
}
includedir /etc/xinetd.d

กฎเกณฑ์ และค่าของระบบที่สำคัญ

ไฟล์ระบบของโปรแกรม xinetd กำหนดให้มีตัวกระทำ (Operator) ทั้งหมด 3 ตัว ดังตารางที่ 1

Operators ความหมาย
= กำหนดค่าของระบบใดๆ ให้เท่ากับค่าที่ระบุ
+= เพิ่มค่าที่ระบุ ให้กับค่าของระบบ
-= ลบค่าที่ระบุ ให้กับค่าของระบบ

ตารางที่ 1 Operator ของไฟล์ระบบในโปรแกรม xinetd

ค่าคุณสมบัติที่น่าสนใจต่อระบบในโปรแกรม xinetd แสดงได้ดังตารางที่ 2

ค่าคุณสมบัติ ความหมาย
flags บ่งบอกคุณสมบัติเพิ่มเติมของแต่ละ service โดยค่า และความหมายของคุณสมบัตินี้ขึ้นกับเวอร์ชันของโปรแกรม xinetd สามารถศึกษาได้จากคำสั่ง man xinetd.conf ตัวอย่างของค่าคุณสมบัติ เช่น
  • NODELAY : ถ้า service เป็นประเภท tcp service แล้ว API socket จะตั้งค่า TCP_NODELAY เพื่อใช้ในการเชื่อมต่อของแต่ละ service ระหว่างการใช้งาน
  • IPv6 : เพื่อบ่งบอกว่า service นั้นให้บริการบนระบบเครือข่ายทีซีพี/ไอพี ชนิด IPV6
log_type บ่งบอกถึงรูปแบบการเก็บล็อกของ service ต่างๆ ที่ภายใต้โปรแกรม xinetd มีสองแบบคือ
  • SYSLOG syslog_facility [syslog_level]
    ผลของล็อกจะเก็บผ่าน syslog ที่บ่งบอก facility จากค่า syslog_facility ได้แก่ daemon, auth, authpriv, user และ local0-7 ค่าระดับของล็อก (Log level) จะบ่งบอกผ่านค่า syslog_level ได้แก่ emerg, alert, crit, err, warning, notice, info และ debug
  • FILE file [soft_limit [hard_limit]]
    ผลของล็อกจะเก็บในไฟล์ที่กำหนดผ่านชื่อไฟล์ file โดยมีคุณสมบัติเพิ่มเติม คือ soft_limit, hard_limit
log_on_success บ่งบอกรายละเอียดข้อมูลการใช้งานของแต่ละ service ที่จะถูกเก็บสู่ไฟล์ล็อก หลังจากที่เริ่มทำงาน หรือภายหลังจากผู้ใช้ผ่านขั้นตอนการล็อกอิน
  • PID : ค่า Process ID ของ service
  • HOST : ไอพีของผู้ใช้งาน service
  • USERID : User ID ของผู้ใช้งาน service
  • EXIT : เวลาที่ผู้ใช้ยกเลิกการใช้งาน service
  • DURATION :ช่วงเวลาการใช้งาน service
log_on_failure บ่งบอกรายละเอียดข้อมูลการใช้งานของแต่ละ service ที่จะถูกเก็บสู่ไฟล์ล็อก เมื่อการร้องขอใช้ service ผิดไปจากกฎระเบียบที่กำหนดในค่าระบบของโปรแกรม xineted
  • HOST, USERID : มีความหมายเดียวกับค่าใน log_on_success
  • ATTEMPT : บ่งบอกถึงรายระเอียด และประเภทของการพยายามเรียกใช้งาน service ที่ผิดพลาด
no_access บ่งบอกถึงเครื่องลูกข่ายที่ไม่ต้องการให้ใช้งาน service สามารถบ่งบอกได้ในรูปแบบของ Domain Name หรือไอพี คล้ายกับการกำหนดในไฟล์ hosts.deny ของ tcpwrapper
only_from บ่งบอกถึงเครื่องลูกข่ายที่ต้องการให้ใช้งาน service สามารถบ่งบอกได้ในรูปแบบเดียวกับ no_access
port บ่งบอกถึงหมายเลขพอร์ตที่ service เปิดให้บริการ
protocol ชนิดของโพรโตคอลของ service
server บ่งบอกถึงไฟล์โปรแกรมของ service
server_args ค่าอาร์กิวเมนต์เพิ่มเติมของโปรแกรม ในคุณสมบัติ server
instances บ่งบอกจำนวนโพรเซสสูงสุดของ service ที่ทำงานในช่วงเวลาเดียวกัน
disable
บ่งบอกว่า service มีการเปิดให้บริการหรือไม่ ถ้าค่าเป็น yes หมายถึงงดให้บริการ และ no หมายถึงเปิดให้บริการ
cps บ่งบอกถึงจำนวนครั้งของการเชื่อมต่อสูงสุด ต่อวินาที
access_times

บ่งบอกช่วงเวลาที่เปิดให้บริการ service โดยรูปแบบของค่าคือ ชั่วโมง:นาที(ที่เริ่มให้บริการ)-ชั่วโมง:นาที(ที่หยุดให้บริการ)
เข่น ต้องการเปิดให้บริการตั้งแต่ 12 นาฬิกา ถึง 13 นาฬิกา ค่าของระบบคือ
access_time = 12:00 - 13:00

rlimit_cpu

บ่งบอกถึงจำนวนของ CPU seconds สูงสุดที่ให้กับแต่ละ service
rlimit_stack

บ่งบอกถึงจำนวนของ stack สูงสุดที่ให้กับแต่ละ service

per_source บ่งบอกจำนวนการเชื่อมต่อสูงสุดของการใช้งาน service จากเครื่องลูกข่ายเดียวกัน
 

ตารางที่ 2 แสดงค่าคุณสมบัติที่น่าสนใจของระบบในโปรแกรม xinetd

ตัวอย่างของไฟล์ในไดเรกทอรี /etc/xinetd.d/ ที่กำหนดการให้บริการของโปรแกรม ftp

service ftp
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.ftpd
server_args = -l
instances = 4
access_times = 7:00-12:30 13:30-21:00
nice = 10
only_from = 192.168.1.0/24
}

ค่าคุณสมบัติ ความหมาย
instances = 4 กำหนดให้ยอมรับการขอใช้บริการ ftp พร้อมกันได้สูงสุด 4 โปรเซส
access_times = 7:00-12:30 13:30-21:00 การให้บริการ ftp จะเปิดให้ผู้ใช้สามารถใช้ได้เฉพาะเวลา 7:00-12:30 และ 13:30-21:00
only_from = 192.168.1.0/24 ยอมรับการใช้บริการผ่านไอพีที่มาจากผู้ใช้ในวง 192.168.1.0/24
log_type = FILE /var/log/servicelog กำหนดให้เก็บไฟล์ล็อกของการใช้งาน xinetd ที่ /var/log/servicelog แทน /var/log/message
log_on_success = HOST PID USERID DURATION EXIT การกำหนดค่าที่ต้องการเก็บในไฟล็อก หลังจากการเข้าใช้ประสบความสำเร็จ
log_on_failure = HOST USERID RECORD การกำหนดค่าที่ต้องการเก็บในไฟล์ล็อก หลังจากการเข้าใช้ที่ล้มเหลว

คุณสมบัติเพิ่มเติมของ Xinetd กับการปรับเปลี่ยนการเชื่อมต่อ (Redirect Features)

การปรับเปลี่ยนการเชื่อมต่อของการขอใช้บริการผ่านโปรแกรม xinetd เป็นคุณสมบัติอย่างหนึ่งที่เป็นประโยชน์มาก ตัวอย่างของการใข้งานคุณสมบัตินี้แสดงได้ตามรูปที่ 2

รูปที่ 2 แสดง การร้องขอ ssh บน xinetd ที่อาศัยคุณสมบัติ redirect

จากรูปที่ 2 เครื่องลูกข่ายร้องขอการใช้บริการโปรแกรม ssh จากเครื่อง foo1.com ซึ่งถูกกำหนดให้การให้บริการโปรแกรม ssh ถูกควบคุมโดยโปรแกรม xinetd และกำหนดให้การร้องขอการใช้บริการโปรแกรม ssh ปรับเปลี่ยนไปใช้บริการที่เครื่อง foo2.com แทน ดังนั้นเสมือนว่าเครื่องลูกข่ายได้ขอใช้บริการโปรแกรม ssh จากเครื่อง foo1.com แต่ที่จริงแล้วการให้บริการนี้จะถูกควบคุมจากเครื่อง foo2.com โดยที่การเชื่อมต่อระหว่างเครื่องลูกข่ายกับเครื่อง foo1.com ก็ยังคงอยู่ กระบวนการเช่นนี้คล้ายคลึงกับการทำงานของ Transparent Proxy ตัวอย่างไฟล์ /etc/xinetd.d/ssh ของเครื่อง foo1.com ที่รองรับการทำงานตามตัวอย่างในรูปที่ 2 คือ

service ssh
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/sshd
server_args = -i
log_on_success += DURATION USERID
log_on_failure += USERID
nice = 10
redirect = foo2.com 22
disable = yes
}

คุณสมบัติเพิ่มเติมของ Xinetd กับการกำหนดการเชื่อมต่อ (Bind Feature)

โปรแกรม xinetd มีคุณสมบัติในการกำหนดการเชื่อมต่อของไอพีในแต่ละบริการได้ การทำงานนี้จะมีประโยชน์กับเครื่องที่มีอุปกรณ์เชื่อมต่อระบบเครือข่าย (Network Interface) อย่างน้อยสองตัวขึ้นไป ตัวอย่างเช่น หากในองค์กรหนึ่งต้องการเปิดให้บริการ FTP ภายใน และภายนอกองค์กร แนวทางการใช้โปรแกรม xinetd กับความต้องการนี้คือ การแยกการให้บริการ FTP ออกเป็นสองส่วน คือ ส่วนของภายใน และภายนอกองค์กร ผ่านการตั้งค่า bind (ต้องกำหนดค่า id เสมอเพื่อแยกแยะความแตกต่างของ FTP ทั้งสองส่วน) รูปที่ 3 แสดงรูปแบบการทำงานของโปรแกรม xinetd ที่ให้บริการ FTP server ซึ่งกำหนดให้ไอพีภายในเป็น 192.168.1.1 และไอพีภายนอกเป็น 212.198.253.142

รูปที่ 3 แสดงการเปิดให้บริการ FTP ทั้งภายใน และภายนอกองค์กร ที่ใช้คุณสมบัติ bind

ตัวอย่างไฟล์ /etc/xinetd.d/ftp ที่รองรับการทำงานตามตัวอย่างในรูปที่ 3 คือ

service ftp
{
id = ftp-public
wait = no
user = root
server = /usr/sbin/in.ftpd
server_args = -l
instances = 4
nice = 10
only_from = 0.0.0.0/0
bind = 212.198.253.142
}
service ftp
{
id = ftp-internal
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.ftpd
server_args = -l
only_from = 192.168.1.0/24
bind = 192.168.1.1
}

บทสรุป

ค่าคุณสมบัติที่ยกตัวอย่างในบทความนี้เป็นเพียงบางส่วนของค่าทั้งหมดที่ xinetd มีให้ ค่าคุณสมบัติแต่ละค่านั้นมีประโยชน์ต่อการปรับแต่งการให้บริการที่แตกต่างกัน ดังนั้นการเลือกใช้ค่าคุณสมบัติใดๆ นั้น ผู้ดูแลระบบควรศีกษาให้เข้าใจก่อนนำมาปรับใช้ตามความเหมาะสมในแต่ละระบบ โปรแกรม xinetd เวอร์ชั่นปัจจุบัน (2.3.9 ณ. วันที่ 23 กันยายน 2545) ได้รับการปรับปรุงให้ใช้ได้กับระบบยูนิกซ์เกือบทุกประเภท ดังนั้นเป็นแนวทางที่ดีและเหมาะสม หากระบบได้รับการปรับเปลี่ยนการให้บริการของบริการต่างๆ จากเดิมที่ผ่านโปรแกรม inetd และ tcpwrapper ไปเป็นโปรแกรม xinetd


แหล่งข้อมูล

http://www.linuxfocus.org/English/November2000/article175.shtml
http://www.xinetd.org/
http://www.redhat.com/docs/manuals/linux/RHL-7.3-Manual/ref-guide/ch-tcpwrappers.html



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

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