実践ネット自動化スクリプト集

Pythonで実現するネットワーク機器の操作ログ自動収集と簡易解析

Tags: Python, ネットワーク自動化, 操作ログ, 監査証跡, Netmiko, ログ解析

はじめに

システムの運用において、ネットワーク機器の操作ログ(監査証跡とも呼ばれます)の収集と管理は非常に重要です。誰が、いつ、どのような操作を行ったかを記録することは、セキュリティインシデント発生時の原因究明や、コンプライアンス要件への対応に不可欠となります。

しかし、多くのネットワーク機器では、操作ログは機器内部のバッファに保存されるか、Syslogサーバーに転送されるのが一般的ですが、これらのログを定期的に収集し、意味のある情報として活用するには、手動での作業や専用ツールの導入が必要になる場合があります。

特に、多数の機器を管理している環境や、既存のインフラ自動化ワークフローにネットワーク部分を組み込みたいと考えているシステムエンジニアやインフラエンジニアの方にとって、Pythonを使った操作ログの自動収集と簡易解析は、効率化に向けた有効なアプローチとなります。

本記事では、Pythonを用いてネットワーク機器から操作ログを自動的に取得し、基本的な解析を行うための実践的なスクリプト作成手法をご紹介します。

なぜネットワーク機器の操作ログ自動収集が必要か

ネットワーク機器の操作ログを自動収集することには、いくつかの重要なメリットがあります。

Pythonを使った操作ログ自動収集の基本

ネットワーク機器から操作ログを収集する最も一般的な方法は、SSH経由で機器に接続し、特定のコマンドを実行して結果を取得することです。Pythonでは、paramikonetmikoといったライブラリがSSH接続とコマンド実行に広く利用されます。特にnetmikoは、様々なベンダーのネットワーク機器に対応しており、コマンド実行後のプロンプト判定やページャー処理などを自動で行ってくれるため、ネットワーク自動化スクリプト作成に適しています。

ここでは、netmikoを使った基本的な操作ログ収集スクリプトの例を示します。

import netmiko
import time
import os

# 接続情報の設定例
# 実際には環境変数や設定ファイル、認証情報管理ツールから取得することを推奨します。
DEVICE = {
    'device_type': 'cisco_ios', # 接続する機器のベンダータイプに合わせて変更
    'host': 'your_network_device_ip',
    'username': 'your_username',
    'password': 'your_password',
    # 'port': 22, # デフォルトは22
    # 'secret': 'your_enable_password', # 特権EXECモードに移行する場合
}

# ログを取得するためのコマンド
# 機器のベンダーやOSによってコマンドは異なります。
# 例: Cisco IOS -> 'show logging'
# 例: Juniper Junos -> 'show system messages'
# 例: FortiGate -> 'execute log filter field type 1 action 1 && execute log display'
LOG_COMMAND = 'show logging' # 環境に合わせて変更してください

def get_device_operation_log(device_info, log_command):
    """指定された機器から操作ログを取得する関数"""
    print(f"Connecting to {device_info['host']}...")
    try:
        with netmiko.ConnectHandler(**device_info) as ssh_conn:
            # 特権EXECモードに移行が必要な場合
            # ssh_conn.enable()

            print(f"Executing command: '{log_command}'")
            # コマンド実行。結果は文字列として返されます。
            output = ssh_conn.send_command(log_command)

            print("Log collected successfully.")
            return output

    except netmiko.NetmikoTimeoutException:
        print(f"Error: Connection to {device_info['host']} timed out.")
        return None
    except netmiko.NetmikoAuthenticationException:
        print(f"Error: Authentication failed for {device_info['host']}.")
        return None
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
        return None

if __name__ == "__main__":
    # デバイス情報リスト (複数の機器に対応する場合)
    # 実際の運用では、このリストを外部ファイルやデータベースから読み込むことが考えられます。
    devices = [
        {
            'device_type': 'cisco_ios',
            'host': '192.168.1.100',
            'username': 'admin',
            'password': os.environ.get('CISCO_PASSWORD'), # 環境変数から取得
            'secret': os.environ.get('CISCO_ENABLE'),
        },
        # 必要に応じて他の機器情報を追加
        # {
        #     'device_type': 'juniper_junos',
        #     'host': '192.168.1.101',
        #     'username': 'admin',
        #     'password': os.environ.get('JUNIPER_PASSWORD'),
        # }
    ]

    for device in devices:
        log_output = get_device_operation_log(device, LOG_COMMAND)

        if log_output:
            # 取得したログをファイルに保存する例
            hostname = device.get('host').replace('.', '_') # ファイル名に利用
            timestamp = time.strftime("%Y%m%d%H%M%S")
            filename = f"{hostname}_operation_log_{timestamp}.txt"
            log_dir = "collected_logs"
            os.makedirs(log_dir, exist_ok=True) # ディレクトリがなければ作成
            filepath = os.path.join(log_dir, filename)

            with open(filepath, 'w') as f:
                f.write(log_output)
            print(f"Log saved to {filepath}")

            # ここで簡易解析に進むことも可能です(後述)
            # analyze_log(log_output) # 例
        else:
            print(f"Failed to collect log from {device['host']}")

上記のコードは、指定されたネットワーク機器にSSH接続し、show loggingコマンドを実行してその出力を取得・保存する基本的な流れを示しています。

取得したログの簡易解析

収集した操作ログは、機器によって出力形式が異なります。ログの中から特定の操作(例: configure terminalの実行、特定のユーザーによるログイン成功/失敗など)に関連する行を抽出したり、集計したりすることで、意味のある情報として活用できます。Pythonの文字列操作機能や正規表現ライブラリreがこの解析に役立ちます。

以下に、取得したログから特定のキーワードを含む行を抽出する簡易的な解析例を示します。

import re

def analyze_log(log_content):
    """取得したログ内容を簡易解析する関数"""
    print("\n--- Analyzing Log ---")

    # 解析対象のキーワードリスト (例: 設定変更開始/終了、ログイン成功)
    # 機器のログ形式に合わせて正規表現パターンを調整してください。
    # 例: Cisco IOSのconfig変更開始 -> %SYS-5-CONFIG_I: Configured from console by ...
    # 例: Cisco IOSのログイン成功 -> %SEC-6-IPACCESSLOGP: list 102 permitted tcp ...
    patterns = {
        "CONFIG_CHANGE": r"\%SYS-5-CONFIG_I:.*",
        "LOGIN_SUCCESS": r"User \S+ logged in successfully from \S+", # 例として一般的なパターン
        "LOGIN_FAILURE": r"User \S+ authentication failed from \S+", # 例
    }

    analysis_results = {}

    for key, pattern in patterns.items():
        analysis_results[key] = []
        # re.findall() でパターンに一致する全ての行をリストとして取得
        matches = re.findall(f".*{pattern}.*", log_content, re.MULTILINE)
        analysis_results[key] = matches

    # 解析結果の出力
    for key, matches in analysis_results.items():
        print(f"\n--- {key} Matches ({len(matches)} found) ---")
        if matches:
            for match in matches:
                print(match)
        else:
            print("No matches found.")

    print("--- Analysis Complete ---")
    return analysis_results

# 上記のログ収集スクリプトと連携させる場合
if __name__ == "__main__":
    # ... (ログ収集コードの続き) ...
    for device in devices:
        log_output = get_device_operation_log(device, LOG_COMMAND)

        if log_output:
            # ファイル保存処理 (省略)

            # ログの簡易解析を実行
            analyze_log(log_output)
        else:
            print(f"Failed to collect log from {device['host']}")

この簡易解析関数では、正規表現を用いて特定のパターンを含む行を抽出しています。実際の解析では、ログのタイムスタンプを解析したり、ユーザー名を抽出して集計したり、特定の期間の操作ログをフィルタリングしたりするなど、より複雑な処理が必要になる場合があります。

正規表現パターンは、対象となるネットワーク機器のログ出力形式に合わせて正確に記述する必要があります。機器のマニュアルや実際のログサンプルを確認しながら調整してください。

実践的な考慮事項

本記事で紹介したスクリプトを現場で利用する際には、いくつかの考慮すべき点があります。

さらなる応用に向けて

本記事で紹介した基本を応用することで、より高度な自動化が可能になります。

これらの応用は、システム全体のセキュリティ監視や運用管理体制の強化に貢献します。

まとめ

本記事では、Pythonとnetmikoライブラリを用いて、ネットワーク機器の操作ログを自動収集し、簡易解析を行うための基本的なスクリプト作成方法をご紹介しました。Pythonの高いプログラミング能力と、netmikoのようなネットワーク機器向けライブラリを組み合わせることで、ネットワーク機器に直接慣れていないエンジニアでも、効果的な自動化ツールを開発することが可能です。

操作ログの自動収集と解析は、セキュリティ、コンプライアンス、トラブルシューティングといった様々な側面でシステムの信頼性を向上させます。今回紹介した基本的なスクリプトを基盤として、現場の要件に合わせてカスタマイズし、より実践的な自動化ワークフローを構築していただければ幸いです。

今後は、本記事で触れた認証情報の安全な管理方法や、並列処理による複数機器からの効率的なログ収集など、さらに詳細な技術解説も行っていきたいと考えております。ネットワーク自動化に関心のある皆様の参考になれば幸いです。