Tuesday, October 17, 2006

Linux Firewalls

SysAdminSummit2006-д илтгэл тавих байсан боловч, монголд байж таараагүй болохоор оролцож чадаагүй билээ. "Unix&Linux Security" талаар сонссон мэдсэнээ хуваалцана гэсэн бодлоо блогоороо дамжуулан хүргэеээ. СисАдминаар ажиллаад 1 жил 6 сар болж байна, туршлага нимгэн болохоор хийж үзсэн гэхээсээ дуулсан, сонссон нь давах тул та бүхэн өршөөгөөрэй. Энэ удаад *nux Firewall-уудын талаар товчхон танилцуулъя.

TCP Wrapper, IPFilter, IPTables/IPChains, PortSentry... гээд Unix төрлийн систем дээр ажилладаг software firewall-уудыг та бүхэн мэдэх байх.

TCP Wrapper(IP-based filtering or access control)- хамгийн өргөн тархсан firewall, inetd-тэй хамт ажилладаг, inetd service-үүд бүгд tcpwrapper-р дамжин ажиллана гэсэн үг юм. Жишээ нь: гаднаас FTP connection үүсэхэд inetd ftpd daemon-г дуудаж ажиллуулахын оронд tcpwrapper-г дуудан түүнд бүх эрхийг шилжүүлнэ, tcpwrapper харин тухайн IP-наас FTP connection үүсэхийг зөвшөөрч байвал ftpd daemon-г дуудаж ажиллуулна.

hosts.allow
hosts.deny

гэсэн 2 файлаас access control rule-г авдаг. Дээр бичсэн дарааллаар эхлээд hosts.allow файлыг, дараа нь hosts.deny файлыг уншина. Эдгээр файлын синтаксийг болон rule яаж бичих талаар та бүхэн интернетээс олон материал олж болох тул энэ талаар энд нуршсангүй.

TCP Wrapper-г зөвхөн трафикийг ажиглахын тулд logging mode-нд ажиллуулах нь бас түгээмэл байдаг. Хэрэв та гаднаас зөвшөөрөгдөөгүй хандалтуудыг мэйлээр хүлээн авах хүсэлтэй бол hosts.allow дотор allow statement-үүдээ жагсаан бичээд hosts.deny файлыг дараах байдалтай үүсгэж болох юм.

ALL: ALL: /usr/bin/mailx -s '%s (%p): connection attempted from %n [%a]' admin@mydomain.com

%s - daemon@hostname
%p - process id
%a - IP address of the remote host
%n - hostname of the remote host, or unknown

Энд мэйл явуулахын оронд ямар ч shell code ажиллуулж болно.

advantage:
- маш энгийн, бас олон платформ дээр ажиллах чадвартай/portable.

disadvantage:
- яалт ч үгүй inetd-тэй ажиллахаар бүтээгдсэн. Apache, sendmail, ssh зэрэг stand-alone daemon-уудын хувьд tcpwrapper library-тай хамт compiled-дсанаар tcpwrapper access control-г ашиглах боломжтой болдог.
- UDP болон RPC дээр тулгуурласан service-үүдийн хувьд тохиромжгүй. TCPWrapper-н оронд host-based FW(Жишээ нь: IPFilter...) ашиглах нь дээр.

IPFilter - kernel-based/кернелийн төвшинд ажилладаг, IP болон Transport Layer Header-г хянах боломжтой.

IPFilter-н kernel module-уудаас гадна ipmon daemon хамт ажиллаж байдаг. Энэ daemon нь IPFilter-н үүсгэсэн device-уудыг байнга сонсож message-г ямар нэг лог файлруу эсвэл syslog-руу хөрвүүлж байдаг. Тийм учраас үйлдлийн систем ачаалахад ipmon daemon автоматаар ачаалагдаж байгаа эсэхийг анхаарах хэрэгтэй.

IPFilter нь:
1. packet filtering (/etc/ipf.rules)
2. NAT (/etc/ipf.nat)
гэсэн хоёр үүргийг гүйцэтгэж чадна.

Filtering rules - "last match and exit" гэсэн дүрмээр явагддаг. Cisco ACL дээр ажиллаад сурчихсан улсуудад энэ мэдээж ойлгомжгүй санагдах байх. Гэхдээ quick түлхүүр үгийн тусламжтайгаар "first match and exit" маягаар ажиллуулж болно.

Жишээ 1: Бүх трафикийг зөвшөөрч, логыг харах (/etc/ipf.rules)

pass in log from any to any
pass out log from any to any

Жишээ 2: Гаднаас зөвхөн SSH трафикийг зөвшөөрч, гадагшаа бүх tcp, udp, icmp трафикийг зөвшөөрөн бусад трафикийг хаах (/etc/ipf.rules)

# don't block loopback interface
pass in quick log lo0 all
pass out quick log lo0 all
# Incoming packets: allow ssh, block the rest
pass in log quick proto tcp from any to any port = 22
block in log quick
# Outgoing packets: all allowed
pass out log quick proto tcp all keep state
pass out log quick proto udp all keep state
pass out log quick proto icmp all keep state

keep state - хариуд нь буцаж ирэх packet-г зөьшөөрөх
note: FTP, rlogin, rsh, rcp зэрэг bi-directional socket ашигладаг програмууд дээр заасан ruleset-р ажиллахгүй, ийм төрлийн программыг ажиллуулахын тулд ipnat.rules файл дотор proxy тохиргоо хийж өгөх хэрэгтэй.

# /etc/ipnat.rules
map eth0 eth0/32 -> eth0/32 proxy port ftp ftp/tcp


disadvantage:
- олон платформ дээр ажиллах чадвартай.
- олон NIC-тэй машинийг сүлжээний FW болгон ашиглах боломжтой.

disadvantage:
- kernel module ачаалах хэрэгтэй болдог.
- rule бичиж сурах нь нилээд тэвчээр, туршлага шаарддаг.

Redhat - xinetd дотор IP-based access controlе-г дэмждэг тул тусад нь tcpwrapper суулгах шаардлагагүй.

Linux - Линуксийн хувьд ipfilter-н оронд бэлэн суучихсан ирдэг iptables/ipchains-г ашиглах нь илүү хялбар байдаг.

Solaris - Solaris8/9 хувьд SunScreen Lite, Solaris10 хувьд IPFilter хамт ирдэг болж байгаа.

NetBSD, FreeBSD - IPFilter суусан ирдэг.

OpenBSD - ipfilter-н дараагийн үе болох PF-г ашигладаг.

PortSentry - нь гадны сэжигтэй трафикийг илрүүлэхээс гадна түүний эсрэг арга хэмжээ авах чадвартай, iptables, ipfilter, tcpwrapper болон kernel routing table-д өөрчлөлт хийж сэжигтэй трафикийг хаах арга хэмжээ авч чадна. Хэн нэг хүн порт скан хийж байвал түүнийг exloit хийхээс өмнө өөрийн router-рүү логин хийж орон сүлжээний түвшинд уг трафикийг хаадаг байхаар тохируулж ч бас болох юм байна.