เตรียมเครื่องมือกันก่อน เราจะใช้งาน Module 2 ตัวดังนี้นะครับ
- CraSSH ซึ่งเป็น Module ที่เอาไว้ทำ Remote Management กับอุปกรณ์ของ Cisco
- Logging ซึ่งจะเอาไว้เก็บ Log ที่ได้จากการทำงานของตัวโปรแกรมนะครับ
สำหรับตัว Logging นั้นมีมาอยู่แล้วกับ Python เราไม่ต้องติดตั้งเพิ่มนะครับ แต่สำหรับ CraSSH ต้องติดตั้งเพิ่มครับ โดยใช้คำสั่งด้านล่างสำหรับติดตั้งครับ
pip install crassh
เสร็จแล้วมาเริ่มกันเลยครับ
========================================================================
ส่วนอธิบายการสร้าง 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
========================================================================
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 ที่เราต้องการ โดยจะมีตัวแปรดังนี้
- device คือตัวแปรที่จะเก็บค่าหมายเลข IP ของ router เอาไว้
- username คือตัวแปรที่เก็บค่า username เอาไว้
- password คือตัวแปรที่เก็บค่า password เอาไว้
- enable=True คือตัวแปรที่บอกว่าหาก router นั้น ๆ ติดอยู่ที่ขั้นตอนของการใส่รหัสผ่านจะอนุญาตให้โปรแกรมใช้คำสั่ง enable เพื่อป้อนรหัสผ่านอีกชั้นลงไป
- 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 เข้าถึงได้เลยจึงต้องปกปิดไว้เดี๋ยวจะงานเข้าครับ
ขอปิดหมายเลข IP นะครับเนื่องจากเป็น Public IP เข้าถึงได้เลยจึงต้องปกปิดไว้เดี๋ยวจะงานเข้าครับ
No comments:
Post a Comment