วันเสาร์ที่ 24 กันยายน พ.ศ. 2559

กำหนดค่าไฟร์วอล shorewall บนระบบปฏิบัติการ ubuntu server

หลังจากที่ผู้เขียนได้ทดลอง กำหนดค่าคอนฟิค ubuntu และ kvm แบบ nat ให้ทำการ forward port ได้เรียบร้อยแล้วในเนื้อหาที่ผ่านมา สำหรับบทความนี้ยังเป็นเรื่องราวต่อเนื่องเหมือนเดิม เพราะระบบปฏิบัติการ ubuntu server ต้องการเปิดไฟร์วอลเพื่อป้องกันการโจมตีจากผู้ไม่ประสงค์ดี ทั้งยังเป็นการป้องกันตัวเครื่องเซิร์ฟเวอร์เองไม่ให้เปิดช่วงโหว่ให้มีใครสามารถบุกรุกเข้ามาใช้งานในระบบของเราได้

วันนี้จะพาไปแนะนำการใช้งานไฟร์วอลง่าย ๆ นั่นก็คือ shorewall ที่สามารถทำงานได้บนระบบปฏิบัติการลินุกส์ได้เป็นอย่างดี โดยเราจะรัน shorewall บนเครื่อง guest เป็น  Ubuntu 14.04.5 LTSนั่นเอง โดยเราเข้าไปดูคอนฟิกตัวอย่างที่ไฟร์วอล shorewall แนะนำมาให้ดังนี้


/usr/share/doc/shorewall/examples/one-interface


zones  เป็นตัวกำหนดว่าเราจัดแบ่งระบบไฟร์วอลเป็นแบบไหน ในตัวอย่างเป็นการกำหนดให้ fw เป็นตัวไฟร์วอล(firewall) และตัวเน็ต(net)เป็นตัวไอพีเวอร์ชั่น 4

#ZONE   TYPE    OPTIONS 
fw      firewall
net     ipv4

interfaces เป็นส่วนสำคัญในการกำหนดค่าให้ว่ามีอินเทอร์เฟสใดอยู่บ้างในโฮสต์(host) ตามตัวอย่างมีเพียงอินเทอร์เฟสเดียวคือ eth0

#ZONE   INTERFACE       OPTIONS
net     eth0            dhcp,tcpflags,logmartians,nosmurfs,sourceroute=0

policy เป็นส่วนของนโยบายที่จะบังคับระหว่าง ต้นทาง(source) และปลายทาง(destination) ว่าจะให้ทำงานยังไง จากค่าดีฟอลต์นโยบายกำหนดให้ต้นทางจากไฟร์วอล($FW) ไปยังเน็ต(net)ได้รับการยอมรับ(ACCEPT) ส่วนนโยบายจากเน็ต(net)ไปยังปลายทางอื่น ๆ(all) ให้ดร็อปทั้งหมดและบันทึกล็อกเป็นข้อมูล(info) ส่วนนโยบายสุดท้ายหรือเราเรียกว่านโยบายปิด(close policy) ให้ปฏิเสธ(reject)ทั้งหมด


#SOURCE         DEST            POLICY          LOG LEVEL       LIMIT:BURST
$FW             net             ACCEPT
net             all             DROP            info
# The FOLLOWING POLICY MUST BE LAST
all             all             REJECT          info
rules เป็นส่วนที่สำคัญหรือเรียกว่ากฏของไฟร์วอลที่จะกำหนดให้ว่า ต้องการให้บริการเซอร์วิสใดบ้าง จากตัวอย่างต้องการเปิดบริการ เวบไซต์ที่พอร์ต 80 และอนุญาตให้ใช้งาน ssh mที่พอร์ต 22 เป็นต้น

# Drop packets in the INVALID state
Invalid(DROP)  net              $FW             tcp


# Drop Ping from the "bad" net zone.. and prevent your log from being flooded..
Ping(DROP)      net             $FW


# Permit all ICMP traffic FROM the firewall TO the net zone
ACCEPT          $FW             net             icmp
ACCEPT           net               $FW          tcp  80 
ACCEPT           net               $FW          tcp  22

ข้างต้นเป็นการกำหนดค่าคอนฟิกเบื้องต้นให้กับไฟร์วอล เมื่อเราสั่งให้ไฟร์วอลทำงาน ระบบจะสร้างชุด iptables rule ต่าง ๆ มากมายพร้อมทั้งยังป้องกันการโจมตีจากโฮสต์ต่าง ๆ ได้ผลดีเป็นอย่างยิ่ง ด้านล่างสุดเป็นตัวอย่างที่นำมาให้ดูหลังจากเปิดไฟร์วอลให้ทำงาน

ต้องขอขอบพระคุณบจก.ไทย พรอสเพอรัส ไอที ผู้นำด้านการให้บริการระบบ gps ติดตามรถ สมบูรณ์แบบคุ้มค่า ทนทาน ผ่านมาตรฐานกสทชและกรมการขนส่งทางบก

# Generated by iptables-save v1.4.21 on Sat Sep 24 21:07:16 2016
*raw
:PREROUTING ACCEPT [5964:4496168]
:OUTPUT ACCEPT [4748:554229]
-A PREROUTING -p udp -m udp --dport 10080 -j CT --helper amanda
-A PREROUTING -p tcp -m tcp --dport 21 -j CT --helper ftp
-A PREROUTING -p udp -m udp --dport 1719 -j CT --helper RAS
-A PREROUTING -p tcp -m tcp --dport 1720 -j CT --helper Q.931
-A PREROUTING -p tcp -m tcp --dport 6667 -j CT --helper irc
-A PREROUTING -p udp -m udp --dport 137 -j CT --helper netbios-ns
-A PREROUTING -p tcp -m tcp --dport 1723 -j CT --helper pptp
-A PREROUTING -p tcp -m tcp --dport 6566 -j CT --helper sane
-A PREROUTING -p udp -m udp --dport 5060 -j CT --helper sip
-A PREROUTING -p udp -m udp --dport 161 -j CT --helper snmp
-A PREROUTING -p udp -m udp --dport 69 -j CT --helper tftp
-A OUTPUT -p udp -m udp --dport 10080 -j CT --helper amanda
-A OUTPUT -p tcp -m tcp --dport 21 -j CT --helper ftp
-A OUTPUT -p udp -m udp --dport 1719 -j CT --helper RAS
-A OUTPUT -p tcp -m tcp --dport 1720 -j CT --helper Q.931
-A OUTPUT -p tcp -m tcp --dport 6667 -j CT --helper irc
-A OUTPUT -p udp -m udp --dport 137 -j CT --helper netbios-ns
-A OUTPUT -p tcp -m tcp --dport 1723 -j CT --helper pptp
-A OUTPUT -p tcp -m tcp --dport 6566 -j CT --helper sane
-A OUTPUT -p udp -m udp --dport 5060 -j CT --helper sip
-A OUTPUT -p udp -m udp --dport 161 -j CT --helper snmp
-A OUTPUT -p udp -m udp --dport 69 -j CT --helper tftp
COMMIT
# Completed on Sat Sep 24 21:07:16 2016
# Generated by iptables-save v1.4.21 on Sat Sep 24 21:07:16 2016
*nat
:PREROUTING ACCEPT [18:928]
:INPUT ACCEPT [18:928]
:OUTPUT ACCEPT [4:247]
:POSTROUTING ACCEPT [4:247]
COMMIT
# Completed on Sat Sep 24 21:07:16 2016
# Generated by iptables-save v1.4.21 on Sat Sep 24 21:07:16 2016
*mangle
:PREROUTING ACCEPT [5964:4496168]
:INPUT ACCEPT [5964:4496168]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4748:554229]
:POSTROUTING ACCEPT [4748:554229]
:tcfor - [0:0]
:tcin - [0:0]
:tcout - [0:0]
:tcpost - [0:0]
:tcpre - [0:0]
-A PREROUTING -j tcpre
-A INPUT -j tcin
-A FORWARD -j MARK --set-xmark 0x0/0xff
-A FORWARD -j tcfor
-A OUTPUT -j tcout
-A POSTROUTING -j tcpost
COMMIT
# Completed on Sat Sep 24 21:07:16 2016
# Generated by iptables-save v1.4.21 on Sat Sep 24 21:07:16 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:Broadcast - [0:0]
:Drop - [0:0]
:Reject - [0:0]
:dynamic - [0:0]
:fw2net - [0:0]
:logdrop - [0:0]
:logflags - [0:0]
:logreject - [0:0]
:net2fw - [0:0]
:reject - [0:0]
:shorewall - [0:0]
:smurflog - [0:0]
:smurfs - [0:0]
:tcpflags - [0:0]
-A INPUT -i eth0 -j net2fw
-A INPUT -i lo -j ACCEPT
-A INPUT -j Reject
-A INPUT -j LOG --log-prefix "Shorewall:INPUT:REJECT:" --log-level 6
-A INPUT -g reject
-A FORWARD -j Reject
-A FORWARD -j LOG --log-prefix "Shorewall:FORWARD:REJECT:" --log-level 6
-A FORWARD -g reject
-A OUTPUT -o eth0 -j fw2net
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -j Reject
-A OUTPUT -j LOG --log-prefix "Shorewall:OUTPUT:REJECT:" --log-level 6
-A OUTPUT -g reject
-A Broadcast -m addrtype --dst-type BROADCAST -j DROP
-A Broadcast -m addrtype --dst-type MULTICAST -j DROP
-A Broadcast -m addrtype --dst-type ANYCAST -j DROP
-A Drop
-A Drop -j Broadcast
-A Drop -p icmp -m icmp --icmp-type 3/4 -m comment --comment "Needed ICMP types" -j ACCEPT
-A Drop -p icmp -m icmp --icmp-type 11 -m comment --comment "Needed ICMP types" -j ACCEPT
-A Drop -m conntrack --ctstate INVALID -j DROP
-A Drop -p udp -m multiport --dports 135,445 -m comment --comment SMB -j DROP
-A Drop -p udp -m udp --dport 137:139 -m comment --comment SMB -j DROP
-A Drop -p udp -m udp --sport 137 --dport 1024:65535 -m comment --comment SMB -j DROP
-A Drop -p tcp -m multiport --dports 135,139,445 -m comment --comment SMB -j DROP
-A Drop -p udp -m udp --dport 1900 -m comment --comment UPnP -j DROP
-A Drop -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A Drop -p udp -m udp --sport 53 -m comment --comment "Late DNS Replies" -j DROP
-A Reject
-A Reject -j Broadcast
-A Reject -p icmp -m icmp --icmp-type 3/4 -m comment --comment "Needed ICMP types" -j ACCEPT
-A Reject -p icmp -m icmp --icmp-type 11 -m comment --comment "Needed ICMP types" -j ACCEPT
-A Reject -m conntrack --ctstate INVALID -j DROP
-A Reject -p udp -m multiport --dports 135,445 -m comment --comment SMB -j reject
-A Reject -p udp -m udp --dport 137:139 -m comment --comment SMB -j reject
-A Reject -p udp -m udp --sport 137 --dport 1024:65535 -m comment --comment SMB -j reject
-A Reject -p tcp -m multiport --dports 135,139,445 -m comment --comment SMB -j reject
-A Reject -p udp -m udp --dport 1900 -m comment --comment UPnP -j DROP
-A Reject -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A Reject -p udp -m udp --sport 53 -m comment --comment "Late DNS Replies" -j DROP
-A fw2net -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A fw2net -p icmp -j ACCEPT
-A fw2net -j ACCEPT
-A logdrop -j DROP
-A logflags -j LOG --log-prefix "Shorewall:logflags:DROP:" --log-level 6 --log-ip-options
-A logflags -j DROP
-A logreject -j reject
-A net2fw -m conntrack --ctstate INVALID,NEW,UNTRACKED -j dynamic
-A net2fw -m conntrack --ctstate INVALID,NEW,UNTRACKED -j smurfs
-A net2fw -p tcp -j tcpflags
-A net2fw -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A net2fw -p tcp -m conntrack --ctstate INVALID -j DROP
-A net2fw -d 192.168.122.33/32 -p tcp -m tcp --dport 22 -m comment --comment SSH -j ACCEPT
-A net2fw -d 192.168.122.33/32 -p udp -m udp --dport 53 -m comment --comment DNS -j ACCEPT
-A net2fw -d 192.168.122.33/32 -p tcp -m tcp --dport 53 -m comment --comment DNS -j ACCEPT
-A net2fw -d 192.168.122.33/32 -p icmp -m icmp --icmp-type 8 -m comment --comment Ping -j ACCEPT
-A net2fw -p tcp -m tcp --dport 80 -j ACCEPT
-A net2fw -j Drop
-A net2fw -j LOG --log-prefix "Shorewall:net2fw:DROP:" --log-level 6
-A net2fw -j DROP
-A reject -m addrtype --src-type BROADCAST -j DROP
-A reject -s 224.0.0.0/4 -j DROP
-A reject -p igmp -j DROP
-A reject -p tcp -j REJECT --reject-with tcp-reset
-A reject -p udp -j REJECT --reject-with icmp-port-unreachable
-A reject -p icmp -j REJECT --reject-with icmp-host-unreachable
-A reject -j REJECT --reject-with icmp-host-prohibited
-A shorewall -m recent --set --name %CURRENTTIME --mask 255.255.255.255 --rsource
-A smurflog -j LOG --log-prefix "Shorewall:smurfs:DROP:" --log-level 6
-A smurflog -j DROP
-A smurfs -s 0.0.0.0/32 -j RETURN
-A smurfs -m addrtype --src-type BROADCAST -g smurflog
-A smurfs -s 224.0.0.0/4 -g smurflog
-A tcpflags -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -g logflags
-A tcpflags -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -g logflags
-A tcpflags -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -g logflags
-A tcpflags -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -g logflags
-A tcpflags -p tcp -m tcp --sport 0 --tcp-flags FIN,SYN,RST,ACK SYN -g logflags
COMMIT
# Completed on Sat Sep 24 21:07:16 2016

ไม่มีความคิดเห็น:

โพสต์ความคิดเห็น