Python3 :: Cisco Configuration Audit Tools

พอดีอยากรู้ว่า Cisco device นั้นเวลาทำ SNMP คุยกันด้วย Community String นั้นทำยังไง แล้วการตั้งค่านั้นปลอดภัยมั๊ย เลยต้องจัดกันสักหน่อย เริ่มต้นกันเลยจะได้ไม่ต้องคอย

เตรียมเครื่องมือกันก่อน เราจะใช้งาน Module 2 ตัวดังนี้นะครับ

  1. CraSSH ซึ่งเป็น Module ที่เอาไว้ทำ Remote Management กับอุปกรณ์ของ Cisco
  2. Logging ซึ่งจะเอาไว้เก็บ Log ที่ได้จากการทำงานของตัวโปรแกรมนะครับ
สำหรับตัว Logging นั้นมีมาอยู่แล้วกับ Python เราไม่ต้องติดตั้งเพิ่มนะครับ แต่สำหรับ CraSSH ต้องติดตั้งเพิ่มครับ โดยใช้คำสั่งด้านล่างสำหรับติดตั้งครับ



pip install crassh

เสร็จแล้วมาเริ่มกันเลยครับ

import crassh
import logging

banner = '''
  ______                _____          ____                    __  _             ___          ___ __          
 / ___(_)__ _______    / ___/__  ___  / _(_)__ ___ _________ _/ /_(_)__  ___    / _ |__ _____/ (_) /____  ____
/ /__/ (_-</ __/ _ \  / /__/ _ \/ _ \/ _/ / _ `/ // / __/ _ `/ __/ / _ \/ _ \  / __ / // / _  / / __/ _ \/ __/
\___/_/___/\__/\___/  \___/\___/_//_/_//_/\_, /\_,_/_/  \_,_/\__/_/\___/_//_/ /_/ |_\_,_/\_,_/_/\__/\___/_/   
                                         /___/                                                                
'''
# Logger here
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%d/%m/%Y %H:%M:%S')
logger = logging.getLogger('Cisco-Auditor')
logger.setLevel(logging.INFO)

# Create a file handler
handler = logging.FileHandler('Audit.log')
handler.setFormatter(formatter)

# add the handlers to the logger
logger.addHandler(handler)

router = ["CiscoIP1", "CiscoIP2", "CiscoIP3"]
youraddress = 'MyIP'
username = 'user'
password = '123456'
cmd01 = 'sh run | include snmp-server'
# cmd02 = 'access-list 1 permit host ' + youraddress

print(banner)
print('Configuration Auditor scaning...')
logger.info("Configuration Auditor Program Started.")

for device in router:
    try:
        hostname = crassh.connect(device, username, password, enable=True, enable_password='enpass')
        logger.info("Connected device {} [{}]".format(hostname, device))
        if hostname == 'False':
            continue
        logger.info("scaning {} [{}]".format(hostname, device))
        check = crassh.send_command(cmd01, hostname)
        if 'public' in check:
            logger.warning("Found Default Community String on {} [{}]".format(hostname, device))
        crassh.disconnect()

    except:
        logger.error('Can not connect to [{}]'.format(device))
        print('Connection Failed: timed out')
        pass
print('done !')
logger.info('Configuration Auditor Program Stop')
logger.removeHandler(handler)

========================================================================
ส่วนอธิบายการสร้าง Format สำหรับเก็บ Log ของโปรแกรม
========================================================================
จะอธิบายทีละส่วนนะครับ 2 บรรทัดแรกก็เป็นการประกาศว่าเราจะเรียกใช้ Module CraSSH กับ Logging

บรรทัดที่ 12 จะเป็นการสร้างตัวแปรชื่อ Formatter ให้เก็บค่า Log นะครับว่ารูปแบบการเก็บ Log จะเป็นแบบไหน จะกำหนดให้เขียน Log ยังไง ในส่วนนี้ผมใช้รูปแบบคือ วัน/เดือน/ปี ชม.:นาที:วินาที - ชื่อ Logger  - Log Level - เนื้อหาของ Log หรือในโค้ดนี้เรียกว่า Message ครับ

บรรทัดที่ 13 เป็นการสร้างตัวแปรชื่อ logger โดยกำหนดชื่อของ Logger ไว้ซึ่งกำหนดให้เป็นชื่อของ Script ของเราก็ได้ครับ (จริง ๆ ตั้งชื่ออะไรก็ได้ครับ) โดยค่านี้จะถูกใส่ลงไปในส่วนของ name ในบรรทัดที่ 12 นั่นเองครับ

ส่วนต่อไปเป็นส่วนของการสร้างไฟล์ Handler นะครับ

ในบรรทัดที่ 17 เราจะสร้างตัวแปรชื่อ handler ขึ้นมาโดยกำหนดค่าเริ่มต้นให้เป็นประเภท filehandler ที่ logger สามารถเขียนเนื้อ log ลงไปได้เรียกง่าย ๆ ก็คือให้กำหนดชื่อของ log file นั่นเองครับ

ในบรรทัดที่ 18 เป็นการกำหนดให้ handler เขียน log format ตามที่เราได้กำหนดไว้ในบรรทัดที่ 12 นั่นเอง

========================================================================
ส่วนของการเชื่อมต่อกับ Cisco Router
========================================================================
บรรทัดที่ 23 ในกรณีที่เรามี Cisco Router หลาย ๆ ตัวนะครับสามารถเพิ่มหมายเลข IP เข้าไปในส่วนนี้ได้นะครับ
บรรทัดที่ 25-26 ให้ใส่ username กับ password ที่ใช้ในการ login Cisco router ลงไปครับ

บรรทัดที่ 27 คือชุดคำสั่งที่เราจะส่งไปให้ Router ประมวลผลนะครับ โดยในที่นี้เราจะใช้คำสั่ง 'show running | include snmp-server' ส่งไปที่ Cisco router นะครับเพื่อเรียกดู Config ที่กำลังทำงานอยู่ ณ ขณะที่รันโปรแกรม

========================================================================
เริ่มต้นการทำงานของโปรแกรม
========================================================================
ในบรรทัดที่ 31-32 นั้นเราจะแสดงผลออกทางหน้าจอว่าโปรแกรมของเราเริ่มทำงานแล้ว และบันทึกการทำงานลงไปที่ log file ที่ได้สร้างไว้

บรรทัดที่ 34 ให้โปรแกรมวนลูปเข้าไปตรวจสอบตาม router ต่าง ๆ ที่หน่วยงานมี

บรรทัดที่ 36 จะเป็นการสร้างการเชื่อมต่อไปยังอุปกรณ์ Cisco router ที่เราต้องการ โดยจะมีตัวแปรดังนี้
  1. device คือตัวแปรที่จะเก็บค่าหมายเลข IP ของ router เอาไว้
  2. username คือตัวแปรที่เก็บค่า username เอาไว้
  3. password คือตัวแปรที่เก็บค่า password เอาไว้
  4. enable=True คือตัวแปรที่บอกว่าหาก router นั้น ๆ ติดอยู่ที่ขั้นตอนของการใส่รหัสผ่านจะอนุญาตให้โปรแกรมใช้คำสั่ง enable เพื่อป้อนรหัสผ่านอีกชั้นลงไป
  5. enable_password='enpass' คือตัวแปรที่ใช้เก็บรหัสผ่านของ router ที่เราต้องการใช้งานซึ่งเป็น string ในเคสนี้ผมใช้รหัสผ่านว่า enpass นั่นเอง
บรรทัดที่ 37 ให้ทำการบันทึก log ลงไปหากสามารถเชื่อมต่อไปยัง router ได้ หากไม่ได้แล้วติด error จะวิ่งไปทำ except ที่บรรทัดที่ 46-49 แล้วหยุดการทำงาน

บรรทัดที่ 38 หากทำการเชื่อมต่อไปยัง router ไม่ได้ในส่วนของ hostname จะมีค่าเป็น False ซึ่งในส่วนนี้ผมเขียนดักไว้แบบโง่ ๆ เลยว่าถ้า hostname มีค่าเป็น False ให้ข้าม router ตัวนี้ไปทำตัวถัดไปได้เลยครับ

บรรทัดที่ 40 ทำการบันทึก log ว่าโปรแกรมกำลังจะสแกนหาช่องโหว่ที่เกิดจากการ config ไม่ดีของ admin นั่นเอง 

บรรทัดที่ 41 เป็นการส่งคำสั่งที่เราเขียนไว้ในบรรทัดที่ 27 ไปให้ router ประมวลผล แล้วนำผลลัพธ์ที่ได้มาเก็บไว้ในตัวแปรที่ชื่อว่า check

บรรทัดที่ 42 ถ้าหากพบคำว่า public อยู่ในบรรทัดที่เป็นการตั้งแต่ SNMP-Server ให้บันทึก log ลงในไฟล์ตามบรรทัดที่ 43

ถ้าหากไม่พบความผิดพลาดในส่วนนี้ให้ตัดการเชื่อมต่อได้


โดยโปรแกรมก็จะทำงานวนซ้ำกับ router ตัวถัดไป จนวนครบ router ทุกตัวจากนั้นจะแสดงผลคำว่า done ! ถือเป็นอันเสร็จสิ้นการทำงาน

บรรทัดที่ 51-52 จะเป็นการบันทึก log ลงไปว่าโปรแกรมทำงานเสร็จแล้ว จะได้แยกได้ว่าในแต่ละรอบทำตรงไหนถึงตรงไหน แล้วทำการปิด log นั่นเอง

ง่ายใช่มั๊ยครับ

เอาละดึกละ ณ ขณะที่เขียนบทความนี้ก็ 11.28 pm แล้วครับ เดี๋ยวผมไปนอนก่อน ว่างแล้วจะมาเขียนใหม่นะครับ หลับฝันดีครับ


มาต่อให้อีกหน่อย ผลลัพธ์จากการใช้งานโปรแกรมนี้ดูจากเนื้อ Log ที่ทดลองจะเป็นตามรูปด้านล่างนะครับ


ขอปิดหมายเลข IP นะครับเนื่องจากเป็น Public IP เข้าถึงได้เลยจึงต้องปกปิดไว้เดี๋ยวจะงานเข้าครับ


No comments:

Post a Comment

วิธีการติดตั้ง และตั้งค่า Apache2 พร้อมเปิดใช้งาน HTTPS ด้วยวิธี Self-Sign บน Ubuntu 18.04.1 LTS

ดีจร้า วันนี้ช่วงเช้าว่างเลยมาเขียนบทความเพิ่มเติมเกี่ยวกับการติดตั้ง และตั้งค่า Apache2 ให้สามารถใช้งานผ่าน HTTPS ได้กันมาเริ่มกันเลยครับ ...