ยินดีต้อนรับสู่ show running-config ครับ

บล็อก show running-config นี้สร้างไว้เพื่อเป็นแหล่งรวบรวมเทคนิคการตั้งค่าอุปกรณ์เครือข่าย Cisco ไม่ว่าจะเป็น Cisco IOS Router, Cisco Catalyst Swtich, Cisco ASA Firewall, Cisco Mars เป็นต้น รวมทั้งอาจจะมีเทคนิคการตั้งค่าอุปกรณ์ในยี่ห้ออื่น ๆ บ้างเล็กน้อยครับ

ซึ่งบทความในบล็อกนี้ก็จะรวบรวมมาจากประสบการณ์ส่วนตัวของกระผมเองครับ (หากมีข้อผิดพลาดก็ขออภัยไว้ล่วงหน้าเลยละกันนะครับ) และก็อยากใช้พื้นที่แห่งนี้เป็นแหล่งในการแลกเปลี่ยนความรู้ รวมไปถึงวิธีการหรือเทคนิคการตั้งค่าอุปกรณ์เครือข่าย กับทุก ๆ คนครับ

Friday, March 18, 2011

การบล็อกเวปไซต์ที่ไม่ต้องการ บน Cisco ASA Firewall

Configure Policy Block Website on Cisco ASA Firewall

asa block web

          ในวันนี้พอดีมีเพื่อน ๆ ถามเข้ามาถึงการตั้งค่า การบล็อกเวปไซต์โดยใช้ Cisco ASA Firewall เข้ามา ก็เลยจะขอแนะนำการตั้งค่าตามที่ว่ามาละกันนะครับ โดยปกติแล้วในการที่จะบล็อกเวปไซต์ใด ๆ ไม่ว่าจะบนเราเตอร์หรือบน Firewall จะไม่สามารถใช้เพียง access-list ในการบล็อกได้ เนื่องจาก access-list นั้นมีความสามารถในการทำงานในระดับ Layer 3 และ Layer 4 เท่านั้น ในการนี้เราจึงต้องใช้เครื่องมืออื่น ๆ ที่สามารถทำงานได้ถึงระดับ Layer 7 หรือ Application Layer ซึ่งก็คือการใช้ Modular Policy Framework นั่นเองครับ

          Modular Policy Framework นั้นมีความสามารถในการทำงานที่หลากหลาย รองรับการทำงานถึงในระดับ Application Layer แต่หนึ่งในความสามารถที่จะมาแนะนำให้เพื่อน ๆ รู้จักในวันนี้ นั่นก็คือ การทำ HTTP inspect โดยใช้ Regular Expression บน Cisco ASA Firewall นั่นเองครับ และสำหรับเพื่อน ๆ ที่ยังไม่รู้จักหรือยังไม่เคยตั้งค่า Cisco ASA Firewall ก็ขอให้ติดตามบทความ : การตั้งค่า Cisco ASA Firewall ขั้นพื้นฐาน ก่อนนะครับ

          แต่ในการใช้งาน Modular Policy Framework นั้นจะค่อนข้างที่จะซับซ้อน ซึ่งอาจจะต้องอาศัยเวลาและความคุ้นเคยในการใช้งาน จึงจะจับทางได้ว่าใช้งานอย่างไร ซึ่งสำหรับในวันนี้ ผมก็ขออนนุญาติที่จะยังไม่ลงลึกไปถึงเรื่อง Modular Policy Framework นะครับ แต่โดยคร่าว ๆ ในการใช้งาน Modular Policy Framework นี้ ก็จะประกอบไปด้วยเครื่องมือ ดังนี้ครับ

  • class-map ใช้สำหรับคัดเลือกทราฟิกที่ต้องการจะตรวจสอบ
  • policy-map ใช้สำหรับกำหนด Policy ไปยังทราฟิกที่ต้องการ

          และในการที่จะบล็อกเวปไซต์นั้น เรายังต้องอาศัยเครื่องมืออีกอย่าง นั่นก็คือ Regular Expression หรือที่เรียกว่า Regex ซึ่งเป็นเครื่องมือที่ใช้สำหรับการเปรียบเทียบทราฟิกที่คัดเลือกมาว่ามีคำที่กำหนดไว้หรือไม่ ซึ่งเราจะนำ Regex มาใช้ในการระบุถึงเวปไซต์ที่ต้องการจะบล็อกนั่นเองครับ และสำหรับใครที่อยากทราบรายละเอียดเกี่ยวกับ Regex เพิ่มเติม ก็เชิญคลิ้กที่นี่เลยครับ http://www.cisco.com/regex

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

          ในขั้นตอนแรกนี้ ก็จะเป็นการสร้าง Regex ขึ้นมา เพื่อที่จะใช้ในการระบุถึงเวปไซต์ที่เราต้องการจะบล็อกครับ

ตัวอย่าง
ciscoasa(config)# regex web1 "[Ff][Aa][Cc][Ee][Bb][Oo][Oo][Kk]\.[Cc][Oo][Mm]"
ciscoasa(config)# regex web2 "[Yy][Aa][Hh][Oo][Oo]\.[Cc][Oo][Mm]"

          จากตัวอย่างด้านบน เป็นการสร้าง Regex ขึ้นมา ชื่อว่า "web1" และ "web2" เพื่อที่จะใช้ในการระบุถึงเวปไซต์ทั้ง 2 เวปไซต์ คือ "facebook.com" และ "yahoo.com" ตามลำดับครับ โดยจากตัวอย่างจะเห็นว่าในการระบุชื่อเวปจะมีการใส่ตัวอักษรทั้งตัวใหญ่และตัวเล็กเป็นคู่ ๆ ไป ทั้งนี้ก็เพื่อที่จะให้ Cisco ASA Firewall สามารถ ตรวจสอบชื่อเวปไซต์ได้ไม่ว่าผู้ใช้จะใช้ตัวอักษรตัวใหญ่หรือตัวเล็กก็ตามครับ (เนื่องจาก Cisco ASA Firewall จะมองว่าตัวอักษรตัวใหญ่และตัวอักษรตัวเล็กเป็นอักษรคนละตัวกัน)

          เมื่อทำการสร้าง Regex เรียบร้อยแล้ว ในขั้นตอนต่อมาจะเป็นการสร้าง class-map type regex เพื่อที่จะนำเอา Regex ที่สร้างไว้ในขั้นตอนที่ผ่านมาไปใช้งานกับ Modular Policy Framework ต่อไปครับ

ตัวอย่าง
ciscoasa(config)# class-map type regex match-any classregex
ciscoasa(config-cmap)# match regex web1
ciscoasa(config-cmap)# match regex web2
ciscoasa(config-cmap)# exit

          จากตัวอย่างด้านบน เป็นการสร้าง class-map type regex ที่มีชื่อว่า "classregex" โดยมีการใช้ keyword "match-any" ซึ่งในส่วนนี้สามารถจะเลือกเป็น "match-any" หรือ "match-all" ได้ครับ โดยจะต่างกัน ดังนี้

  • match-any เปรียบเสมือนการใช้ฟังก์ชั่น "OR" คือ ทราฟิกจะต้องตรงเงื่อนไขด้านล่างอย่างน้อยหนึ่งเงื่อนไข
  • match-all เปรียบเสมือนการใช้ฟังก์ชั่น "AND" คือ ทราฟิกจะต้องตรงกับเงื่อนไขด้านล่างทั้งหมด

          ในส่วนนี้ที่เราเลือกใช้ "match-any" ก็เนื่องจากเราต้องการคัดเลือกทราฟิกที่ตรงกับเงื่อนไขด้านล่างเพียงหนึ่งเงื่อนไข ซึ่งก็คือให้ตรงกับ Regex ใด Regex หนึ่งก็ได้ครับ

          จากนั้นจะเป็นการสร้าง class-map type inspect http เพื่อที่จะคัดเลือกทราฟิกให้ตรงกับที่เราต้องการตรวจสอบ และเพื่อที่จะนำไปใช้กับการกำหนด HTTP Policy ในขั้นตอนต่อไปครับ

ตัวอย่าง
ciscoasa(config)# class-map type inspect http match-any classwebblock
ciscoasa(config-cmap)# match request header host regex class classregex
ciscoasa(config-cmap)# exit

          จากตัวอย่างด้านบน เป็นการสร้าง class-map type inspect http ที่มีชื่อว่า "classwebblock" โดยมีการใช้ keyword "match-any" เช่นเดิม ซึ่ง class-map ที่สร้างในขั้นตอนนี้ก็เพื่อที่จะระบุให้ทำการคัดเลือกทราฟิกในเชิงลึก โดยให้ตรวจสอบจาก request ที่ส่งเข้ามา ว่ามี header ตรงตามที่กำหนดไว้ ใน class-map ที่ชื่อ "classregex" หรือไม่ครับ

          ขอเสริมนอกเรื่องสักนิดนะครับ ในขั้นตอนนี้ ถ้ามีการเปลี่ยนโจทย์ จากที่ต้องการบล็อกเวปไซต์ทั้ง 2 เวปไซต์นี้ เป็น ให้ผู้ใช้ภายในสามารถเข้าใช้งานได้เฉพาะ 2 เวปไซต์นี้เท่านั้น ไม่อนุญาติให้เข้าใช้เวปไซต์อื่น ๆ นอกเหนือจาก 2 เวปไซต์นี้ ก็ให้เปลี่ยน keyword ในบรรทัดที่ 2 จากตัวอย่างด้านบน ที่ใช้ว่า "match" เป็น "match not" แทน เพียงเท่านี้ ก็จะเป็นการเลือกทราฟิกอื่น ๆ ที่ไม่ตรงกับ Regex ที่เรากำหนด ไปทำการกำหนด Policy ในขั้นตอนต่อไปแทนครับ

          จากนั้น ในขั้นตอนต่อมา ก็จะเป็นการกำหนด Policy ให้กับทราฟิกที่เราทำการคัดเลือกมานะครับ

ตัวอย่าง
ciscoasa(config)# policy-map type inspect http policyblock   
ciscoasa(config-pmap)# class classwebblock
ciscoasa(config-pmap-c)# drop-connection
ciscoasa(config-pmap-c)# exit
ciscoasa(config-pmap)# exit

          จากตัวอย่างด้านบน เป็นการสร้าง policy-map type inspect http ที่มีชื่อว่า "policyblock" โดยจะทำการกำหนด Policy ให้กับ class-map ที่มีชื่อว่า "classwebblock" ที่ได้ทำการกำหนดไว้ในขั้นตอนที่ผ่านมา โดยถ้าพบว่ามีทราฟิกตรงกับเงื่อนไขใน class-map ที่ชื่อ "classwebblock" เข้ามา ก็ให้ทำการ drop-connection นี้ไปครับ

          ในขั้นตอนต่อมา จะเป็นการสร้าง class-map เพื่อที่จะทำการกำหนดชนิดของทราฟิกที่ต้องการจะตรวจสอบนะครับ เช่น เลือกที่จะตรวจสอบเฉพาะทราฟิกที่ใช้งาน port 80 (http) เท่านั้น เพื่อที่จะได้ไม่ต้องตรวจสอบทราฟิกทั้งหมด ซึ่งจะเป็นการเสียทรัพยากรของอุปกรณ์ไปโดยเปล่าประโยชน์ครับ

ตัวอย่าง
ciscoasa(config)# class-map website
ciscoasa(config-cmap)# match port tcp eq 80
ciscoasa(config-cmap)# exit

          จากตัวอย่างด้านบน เป็นการสร้าง class-map ที่มีชื่อว่า "website" เพื่อที่จะคัดเลือกทราฟิกที่ใช้งาน Port 80 มาตรวจสอบครับ

          จากนั้นในขั้นตอนต่อมา จะเป็นการกำหนด policy-map หลัก เพื่อที่จะกำหนดให้ทำการตรวจสอบทราฟิกตามที่เราต้องการครับ ซึ่ง policy-map ที่สร้างขึ้นมาในขั้นตอนนี้ จะนำไปประกาศใช้บนอินเทอร์เฟสในขั้นตอนต่อไปครับ

ตัวอย่าง
ciscoasa(config)# policy-map policyinside
ciscoasa(config-pmap)# class website
ciscoasa(config-pmap-c)# inspect http policyblock
ciscoasa(config-pmap-c)# exit
ciscoasa(config-pmap)# exit

          จากตัวอย่างด้านบน เป็นการสร้าง policy-map ที่มีชื่อว่า "policyinside" โดยเมื่อมีทราฟิกที่ตรงกับ class-map ที่ชื่อว่า "website" เข้ามา ก็ให้ทำการตรวจสอบ โดยใช้ policy-map ที่ชื่อ "policy-block" ครับ

          จากนั้นก็จะเป็นขั้นตอนสุดท้ายแล้วครับ นั่นก็คือการนำ policy-map ที่กำหนดไว้ในขั้นตอนที่ผ่านมาไปประกาศใช้งานบนอินเทอร์เฟสที่เชื่อมต่อไปยังผู้ใช้ภายใน ซึ่งในตัวอย่างนี้จะใช้ อินเทอร์เฟส ที่มีชื่อว่า "inside" นะครับ

ตัวอย่าง
ciscoasa(config)# service-policy policyinside interface inside

          เพียงเท่านี้ก็เสร็จเรียบร้อยแล้วครับ และเมื่อทำการตั้งค่าเรียบร้อยแล้ว เราสามารถตรวจสอบการทำงาน ได้โดยการใช้คำสั่ง "show service-policy" นะครับ

ciscoasa(config)# show service-policy

Global policy:
  Service-policy: global_policy
    Class-map: inspection_default
      Inspect: dns preset_dns_map, packet 95, drop 0, reset-drop 0
      Inspect: ftp, packet 0, drop 0, reset-drop 0
      Inspect: h323 h225 _default_h323_map, packet 0, drop 0, reset-drop 0
      Inspect: h323 ras _default_h323_map, packet 0, drop 0, reset-drop 0
      Inspect: netbios, packet 0, drop 0, reset-drop 0
      Inspect: rsh, packet 0, drop 0, reset-drop 0
      Inspect: rtsp, packet 0, drop 0, reset-drop 0
      Inspect: skinny , packet 0, drop 0, reset-drop 0
      Inspect: esmtp _default_esmtp_map, packet 0, drop 0, reset-drop 0
      Inspect: sqlnet, packet 0, drop 0, reset-drop 0
      Inspect: sunrpc, packet 0, drop 0, reset-drop 0
      Inspect: tftp, packet 0, drop 0, reset-drop 0
      Inspect: sip , packet 0, drop 0, reset-drop 0
      Inspect: xdmcp, packet 0, drop 0, reset-drop 0

Interface inside:
  Service-policy: policyinside
    Class-map: website
      Inspect: http policyblock, packet 3718, drop 8, reset-drop 0

สรุปคำสั่งที่มีการใช้งานครับ
ciscoasa(config)# regex web1 "[Ss][Aa][Nn][Oo][Oo][Kk]\.[Cc][Oo][Mm]"
ciscoasa(config)# regex web2 "[Yy][Aa][Hh][Oo][Oo]\.[Cc][Oo][Mm]"   
ciscoasa(config)# class-map type regex match-any classregex
ciscoasa(config-cmap)# match regex web1
ciscoasa(config-cmap)# match regex web2
ciscoasa(config-cmap)# exit

ciscoasa(config)# class-map type inspect http match-any classwebblock
ciscoasa(config-cmap)# match request header host regex class classregex
ciscoasa(config-cmap)# exit

ciscoasa(config)# policy-map type inspect http policyblock   
ciscoasa(config-pmap)# class classwebblock
ciscoasa(config-pmap-c)# drop-connection
ciscoasa(config-pmap-c)# exit
ciscoasa(config-pmap)# exit

ciscoasa(config)# class-map website
ciscoasa(config-cmap)# match port tcp eq 80
ciscoasa(config-cmap)# exit

ciscoasa(config)# policy-map policyinside
ciscoasa(config-pmap)# class website
ciscoasa(config-pmap-c)# inspect http policyblock
ciscoasa(config-pmap-c)# exit
ciscoasa(config-pmap)# exit

ciscoasa(config)# service-policy policyinside interface inside

2 comments :

  1. ถ้าtraffic ที่วิ่งเข้าออกเป็น 443 จะdetect ได้หรือเปล่าครับ

    ReplyDelete
    Replies
    1. วิธีนี้ไม่ได้ครับ อันนี้เป็นวิธีเก่าที่ใช้กับ ASA ตั้งแต่ดั้งเดิมเลยครับ
      เดี๋ยวนี้จะเป็น CX module ที่สามารถ dryption ssl ได้แล้วครับผม

      Delete