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

現場で役立つPythonネットワーク自動化:セキュリティポリシーの自動適用と検証

Tags: Python, ネットワーク自動化, セキュリティポリシー, Netmiko, 検証, CLI, API, IaC, CI/CD

はじめに

システムエンジニアやインフラエンジニアの皆様にとって、インフラ全体の自動化は喫緊の課題であり、その中でネットワーク機器の設定・管理自動化は避けて通れない領域です。特に、セキュリティポリシーの適用や変更は、設定ミスが重大なインシデントにつながる可能性が高いため、正確性と迅速性が求められます。

しかし、ネットワーク機器の操作経験が限定的な場合、CLI(コマンドラインインターフェース)を直接操作することにハードルを感じる方もいらっしゃるかもしれません。幸い、Pythonは豊富なライブラリと柔軟性により、ネットワーク機器との連携を容易にし、セキュリティポリシーの自動適用と検証を効率的に行うための強力なツールとなります。

本記事では、Pythonを使ってネットワーク機器のセキュリティポリシー、特にアクセスリスト(ACL)設定を自動化し、さらに設定が意図した通りに反映されているかを確認する検証手法について、具体的なコード例を交えながら解説します。手動での設定作業における課題を克服し、より信頼性の高い運用を実現するための実践的なアプローチをご紹介します。

手動設定の課題と自動化のメリット

ネットワークセキュリティポリシー、例えばアクセスリスト(ACL)やファイアウォールルールなどを手動で設定する際には、以下のような課題が伴います。

これらの課題に対して、Pythonを用いた自動化は大きなメリットをもたらします。

Pythonによるセキュリティポリシー自動化のアプローチ:CLI vs API

Pythonを使ってネットワーク機器にセキュリティポリシーを設定する主なアプローチは、CLIを利用する方法と、機器が提供するAPI(Application Programming Interface)を利用する方法の2つに大別されます。

  1. CLIベースのアプローチ:

    • SSHやTelnet(非推奨)などのプロトコルを利用して機器にログインし、CLIコマンドを送信して設定を行います。
    • 既存の機器の多くがCLIをサポートしており、導入しやすい方法です。
    • Pythonライブラリとしては、paramiko(SSHクライアント)、netmiko(様々なベンダーのCLIに対応した抽象化ライブラリ)などが広く使われます。
    • ただし、コマンドの実行結果をパースして必要な情報を抽出する処理が必要になる場合が多く、機器のOSバージョンやベンダーによってコマンド出力形式が異なるため、スクリプトの保守性が課題となることがあります。
  2. APIベースのアプローチ:

    • 機器が提供するRESTConf, NETConf, Vendor-specific REST APIなどを利用して、構造化されたデータ形式(JSON, XMLなど)で設定の取得や変更を行います。
    • 設定はデータモデルとして扱われるため、CLIコマンドの差異に影響されにくく、冪等性(操作を何度実行しても同じ結果が得られる性質)の高い自動化を実現しやすいです。
    • Pythonライブラリとしては、汎用的なHTTPクライアントであるrequests(REST API向け)、NETConfクライアントであるncclientなどがあります。
    • 新しい機器やモダンなOSでサポートされる傾向があり、すべての機器で利用できるわけではありません。

本記事では、多くの現場で利用されているCLIベースのアプローチを中心に解説しつつ、APIベースのアプローチについても触れます。

CLIベースの自動化(Netmikoを用いたACL設定例)

Netmikoは、様々なネットワーク機器ベンダーのCLI操作を抽象化してくれる便利なライブラリです。SSH接続、コマンド送信、プロンプト待機、ページング処理などを自動で行ってくれます。ここでは、Netmikoを使ってCisco IOS機器にACLを設定し、設定が投入されたかを確認する簡易的なスクリプト例を示します。

事前準備

Netmikoライブラリをインストールしておきます。

pip install netmiko

接続対象の機器情報と設定コマンドを用意します。

スクリプト例:ACL設定投入と簡易検証

from netmiko import Netmiko
import time

# 接続情報
device_info = {
    'device_type': 'cisco_ios', # 機器タイプを指定 (cisco_ios, juniper_junos, etc.)
    'host': 'your_device_ip_or_hostname',
    'username': 'your_username',
    'password': 'your_password',
    'secret': 'your_enable_password', # enableモードに入る場合
    'port': 22, # SSHポート
    'verbose': False, # デバッグ出力
}

# 設定投入コマンドリスト
# 標準ACL 10 を設定する例
config_commands = [
    'enable',
    'configure terminal',
    'access-list 10 permit 192.168.1.0 0.0.0.255',
    'access-list 10 deny any',
    'end',
    'write memory', # 設定の保存
]

# 設定確認コマンドリスト
# 設定されたACL 10 の内容を表示する例
verify_commands = [
    'show running-config | section access-list 10',
]

def apply_and_verify_acl(device, config_cmds, verify_cmds):
    """
    指定された機器に設定コマンドを投入し、確認コマンドで検証する関数

    Args:
        device (dict): Netmiko接続情報を含む辞書
        config_cmds (list): 投入する設定コマンドのリスト
        verify_cmds (list): 設定後に実行する確認コマンドのリスト

    Returns:
        tuple: (設定投入結果の文字列, 検証結果の文字列) または エラー発生時は None
    """
    config_output = ""
    verify_output = ""

    try:
        # Netmikoで機器に接続
        print(f"Connecting to {device['host']}...")
        with Netmiko(**device) as net_connect:
            print("Connection successful.")

            # 設定モードに入る (enableモードが必要な場合)
            if 'secret' in device and device['secret']:
                 net_connect.enable()

            # 設定コマンドを投入
            print("Applying configuration...")
            config_output = net_connect.send_config_set(config_cmds)
            print("Configuration applied.")
            print("\n--- Configuration Output ---")
            print(config_output)
            print("--------------------------\n")

            # 設定反映を待つ(必要に応じて)
            time.sleep(5) # 例: 設定反映に時間がかかる場合

            # 検証コマンドを実行
            print("Running verification commands...")
            verify_output = net_connect.send_command(';'.join(verify_cmds)) # 複数コマンドをまとめて実行
            print("Verification complete.")
            print("\n--- Verification Output ---")
            print(verify_output)
            print("--------------------------\n")

            # 検証結果の確認 (簡易的な例)
            # 例えば、verify_outputの中に設定した特定のエントリが含まれているか確認
            expected_entry = 'access-list 10 permit 192.168.1.0 0.0.0.255'
            if expected_entry in verify_output:
                print(f"Verification successful: '{expected_entry}' found.")
                # ここでより詳細なパースや比較を行う
            else:
                print(f"Verification failed: '{expected_entry}' not found.")
                # エラーハンドリングやロールバック処理などを検討

    except Exception as e:
        print(f"An error occurred: {e}")
        # エラー発生時の処理 (例: ロールバック、通知)
        return None, None # エラー時はNoneを返すか、例外を再度発生させる

    return config_output, verify_output

# スクリプト実行
if __name__ == "__main__":
    # 接続情報に実際の値を設定してください
    # device_info['host'] = '192.168.100.1'
    # device_info['username'] = 'admin'
    # device_info['password'] = 'password'
    # device_info['secret'] = 'enable_password'

    config_result, verify_result = apply_and_verify_acl(device_info, config_commands, verify_commands)

    if config_result is not None:
        print("Automation script finished.")
    else:
        print("Automation script failed.")

コード解説と実践的な考慮点

APIベースのアプローチと検証(概念説明)

多くのモダンなネットワーク機器は、設定や状態取得のためのAPIを提供しています。NETConf/RESTConfは、YANGデータモデルに基づいてネットワーク機器の設定や状態をプログラムから操作するための標準的なプロトコルです。APIを利用するメリットは、設定をデータとして扱えるため、CLIの出力パースのような煩雑さがなくなり、設定の適用がより構造的で冪等になりやすい点です。

APIによる設定と検証のイメージ

  1. 設定データの準備: YANGモデルに基づき、適用したいACL設定などをJSONやXML形式のデータとして準備します。
  2. API経由での設定投入: Pythonのrequestsライブラリ(RESTConfの場合)やncclientライブラリ(NETConfの場合)を使って、準備した設定データを機器のAPIエンドポイントへ送信します。APIコールにはHTTPのPUT/PATCHメソッドなどが使用され、これにより指定した設定が機器に反映されます。APIは多くの場合、冪等性をサポートしています。
  3. API経由での状態取得: 設定反映後、同じくAPIを使って機器の現在の設定や状態(例: 適用されたACLリスト)をデータとして取得します。
  4. 検証: 取得した機器の状態データと、期待される設定データをPythonスクリプト内で比較し、設定が正しく反映されているか、あるいは他の設定に影響を与えていないかなどを確認します。

PythonでのAPI利用ライブラリ例

APIベースのアプローチは、CLIに比べてより洗練されており、大規模な環境やモダンな機器の自動化に適しています。特に、状態駆動型(desired state configuration)のアプローチを取りたい場合に有効です。

自動化における「検証」の重要性

単に設定コマンドを投入するだけでは、意図した通りに設定が反映されたか、あるいは他の設定に影響を与えていないかを確認できません。設定自動化を現場で信頼して利用するためには、「検証」のステップが不可欠です。

検証の主な目的は以下の通りです。

検証手法としては、以下のようなものが考えられます。

上記のスクリプト例における検証は非常に基本的なものですが、実運用ではこれらの手法を組み合わせて、検証の網羅性と精度を高めることが重要です。

インフラ自動化全体への組み込み

ネットワークセキュリティポリシーの自動適用と検証は、インフラ自動化全体のワークフローに組み込むことで、その価値を最大限に発揮します。

まとめ

本記事では、Pythonを用いたネットワーク機器のセキュリティポリシー自動適用と検証について、CLIベースのアプローチを中心に解説しました。PythonライブラリであるNetmikoを活用することで、ネットワーク機器への設定投入を自動化できることを示し、さらに設定後の「検証」ステップが自動化の信頼性を高めるために不可欠であることを強調しました。

また、よりモダンで構造的なアプローチとしてAPIベースの自動化にも触れ、NAPALMなどのライブラリが検証の自動化をサポートすることを紹介しました。これらの手法を、IaCツールやCI/CDパイプラインといったインフラ自動化全体の文脈に組み込むことで、システム全体のデリバリー速度と信頼性を向上させることが可能です。

Pythonは、その豊富なライブラリと柔軟性により、ネットワーク機器への直接的な操作経験が限定的でも、インフラ自動化の知識を活かしてネットワーク領域に踏み出すための強力なツールとなります。本記事で紹介した内容が、皆様の現場におけるネットワーク自動化の第一歩、あるいはさらなる推進の一助となれば幸いです。