はじめに
この実験では、Simple Network Management Protocol version 3 (SNMPv3) を使用して、Linux システム上でセキュアなネットワーク監視を実装する方法を学びます。ここでは、SNMP エージェント (snmpd) を設定し、強力な認証と暗号化を強制することで、管理データが転送中に保護されるようにし、古い SNMP バージョンのセキュリティ上の問題を克服することに焦点を当てます。
プロセスは、システムに必要な SNMP エージェントおよびクライアントツールのインストールから始まります。次に、設定ファイル内で直接、セキュアな認証情報を持つ専用の SNMPv3 ユーザーを作成します。最後に、snmpwalk コマンドラインツールを使用して、設定したエージェントに対してセキュアなクエリを実行し、セットアップを検証し、Object Identifiers (OIDs) を使用して特定のシステム情報を取得する方法を探ります。
SNMP エージェントとクライアントツールのインストール
このステップでは、Simple Network Management Protocol (SNMP) を使用したネットワーク監視に必要なコアコンポーネントをインストールします。監視対象のデバイスで実行される SNMP エージェントと、エージェントにクエリを実行するために使用されるクライアントツールの両方をインストールします。
まず、システムのパッケージリストを更新するのが標準的なベストプラクティスです。これにより、リポジトリで利用可能なソフトウェアの最新かつ最もセキュアなバージョンを取得できます。
以下のコマンドを実行して、システム上のパッケージインデックスを更新します。
sudo apt update
Ubuntu のリポジトリからパッケージリストがフェッチされていることを示す出力が表示されます。
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
...
Fetched 1,587 kB in 2s (924 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
パッケージリストが更新されたので、SNMP エージェント (デーモン) とクライアントユーティリティをインストールできます。エージェントは snmpd パッケージによって提供され、クライアントツール (snmpwalk、snmpget など) は snmp パッケージに含まれています。
以下のコマンドを実行して、両方のパッケージをインストールします。-y フラグはインストールを自動的に確認するため、プロンプトは表示されません。
sudo apt install snmpd snmp -y
インストールプロセスにより、必要なファイルがダウンロードおよび設定されます。完了すると、エージェントデーモンである snmpd サービスが自動的に開始されるはずです。
SNMP エージェントが正しく実行されていることを確認するには、systemctl を使用して snmpd サービスのステータスを確認できます。
sudo systemctl status snmpd
出力には、サービスが active (running) であることが示されているはずです。これにより、SNMP エージェントがリクエストを受け付ける準備ができていることが確認できます。
● snmpd.service - Simple Network Management Protocol (SNMP) Daemon.
Loaded: loaded (/lib/systemd/system/snmpd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-10-30 08:30:00 UTC; 5s ago
Main PID: 1234 (snmpd)
Tasks: 1 (limit: 4595)
Memory: 9.8M
CPU: 35ms
CGroup: /system.slice/snmpd.service
└─1234 /usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -f
ステータス画面が表示された場合は、キーボードの
qを押して終了し、コマンドプロンプトに戻ることができます。
エージェントが実行され、クライアントツールがインストールされたことで、SNMP の設定と通信の準備が整いました。
snmpd.conf でセキュアな SNMPv3 ユーザーを作成
このステップでは、SNMPv3 の重要なセキュリティ機能を利用するために、SNMP エージェント (snmpd) を設定します。古いバージョンとは異なり、SNMPv3 は認証 (送信者の身元を確認するため) とプライバシー (データを暗号化するため) をサポートしています。エージェントの設定ファイル /etc/snmp/snmpd.conf に直接新しいユーザーを作成することで、これを実現します。
変更を加える前に、元の設定ファイルのバックアップを作成することが重要なベストプラクティスです。これにより、問題が発生した場合に簡単に復元できます。
以下のコマンドを実行して、設定ファイルをコピーします。
sudo cp /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.bak
次に、メインの設定ファイル /etc/snmp/snmpd.conf を編集して、新しい SNMPv3 ユーザーを追加します。このタスクには nano テキストエディタを使用します。
以下のコマンドを実行して、sudo 権限でファイルを開きます。
sudo nano /etc/snmp/snmpd.conf
ファイルの末尾までスクロールし、以下の行を追加します。これらの行は、強力な認証 (SHA) およびプライバシー (AES) プロトコルを持つ labexuser という名前の新しいユーザーを定義します。
createUser: このディレクティブは SNMPv3 ユーザーを作成します。labexuser: SNMPv3 ユーザーのユーザー名です。SHA: 認証プロトコル (MD5 より安全です)。AuthPassLabEx: 認証パスフレーズ (最低 8 文字が必要です)。AES: プライバシー (暗号化) プロトコル (DES より安全です)。PrivPassLabEx: プライバシーパスフレーズ (最低 8 文字が必要です)。
rwuser: このディレクティブは、privセキュリティレベル (認証とプライバシー) を使用する場合に、ユーザーに OID ツリー全体への読み取り/書き込みアクセスを付与します。
以下の設定ブロックをファイルの末尾にコピーして貼り付けます。
## --- LabEx SNMPv3 ユーザー設定 ---
## 監視用のセキュアな SNMPv3 ユーザーを作成します
createUser labexuser SHA "AuthPassLabEx" AES "PrivPassLabEx"
## 新しいユーザーにプライバシー付きの読み取り/書き込みアクセスを付与します
rwuser labexuser priv
## --- 設定終了 ---
テキストを追加したら、Ctrl+O を押してファイル名を確定するために Enter を押し、最後に Ctrl+X を押して nano を終了します。
これで、SNMPv3 通信のためのセキュアなユーザーの設定が正常に完了しました。次のステップでは、サービスを再起動してこれらの変更を適用します。
snmpd サービスの再起動と確認
このステップでは、前のステップで追加した新しいユーザー設定を適用します。snmpd のような実行中のサービスの構成ファイルを変更した場合、変更は自動的に適用されません。新しい設定を読み込んでロードするには、サービスを再起動する必要があります。
まず、systemctl コマンドを使用して snmpd サービスを再起動します。これにより、現在のプロセスが停止し、labexuser を含む更新された設定で新しいプロセスが開始されます。
sudo systemctl restart snmpd
このコマンドは、正常に実行された場合、通常は何も出力を生成しません。
次に、サービスが問題なく再起動したことを確認することが重要です。/etc/snmp/snmpd.conf ファイルに構文エラーがあった場合、サービスが開始に失敗する可能性があります。現在のステータスを確認して、正しく実行されていることを確認できます。
sudo systemctl status snmpd
サービスが active (running) であることを確認する出力が表示されるはずです。タイムスタンプに注意してください。これは、サービスがごく最近開始されたことを示しているはずです。
● snmpd.service - Simple Network Management Protocol (SNMP) Daemon.
Loaded: loaded (/lib/systemd/system/snmpd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-10-30 08:35:00 UTC; 3s ago
Main PID: 5678 (snmpd)
Tasks: 1 (limit: 4595)
Memory: 10.1M
CPU: 40ms
CGroup: /system.slice/snmpd.service
└─5678 /usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -f
ステータス表示を終了してターミナルに戻るには、
qを押してください。
active (running) ステータスが表示されることは、設定変更が有効であり、SNMP エージェントが新しい labexuser でセキュアな通信の準備ができた状態で実行されていることを確認します。
SNMPv3 ツールでセキュアなクエリを実行
このステップでは、SNMP クライアントツールを使用して、ローカルマシンで実行されている SNMP エージェントに対してセキュアなクエリを実行します。snmpd.conf で設定した labexuser の認証情報を使用して、セキュアな SNMPv3 通信をテストします。これで、セキュアな設定が実際に機能していることを確認できます。
SNMPv3 用の SNMP コマンドには、認証とプライバシーを処理するためにいくつかの特定のフラグが必要です。以下に使用するパラメータの内訳を示します。
-v 3: SNMP バージョン 3 を使用していることを指定します。-l authPriv: セキュリティレベルをauthPrivに設定します。これは、通信に認証とプライバシー (暗号化) の両方が必要であることを意味します。これは最も高いセキュリティレベルです。-u labexuser: 作成したユーザー名であるlabexuserを指定します。-a SHA: 認証プロトコルを SHA として定義します。これはsnmpd.confで設定したプロトコルと一致する必要があります。-A "AuthPassLabEx": 認証パスフレーズを提供します。-x AES: プライバシー (暗号化) プロトコルを AES として定義します。これも設定と一致する必要があります。-X "PrivPassLabEx": プライバシーパスフレーズを提供します。localhost: SNMP エージェントが実行されているターゲットホストです。この場合、それはあなた自身のマシンです。
まず、システムツリー全体をウォークして接続をテストしましょう。snmpwalk コマンドは OID ツリーをトラバースし、ブランチ内のすべてのオブジェクトを返します。
OID 構造の理解: オブジェクト識別子 (OID) は階層的な番号付けシステムを使用します。OID 1.3.6.1.2.1.1 は、標準 SNMP MIB-II の「system」グループを表します。
1.3.6.1= internet1.3.6.1.2= mgmt (management)1.3.6.1.2.1= mib-2 (standard MIB)1.3.6.1.2.1.1= system group (基本的なシステム情報が含まれます)
以下のコマンドを実行して、システム MIB ツリーをウォークします。
snmpwalk -v 3 -l authPriv -u labexuser -a SHA -A "AuthPassLabEx" -x AES -X "PrivPassLabEx" localhost 1.3.6.1.2.1.1
コマンドが成功すると、複数のシステム関連の OID とその値が表示されます。これは、SNMP マネージャーがエージェント (snmpd) と正常に認証され、クエリがセキュアで暗号化されたチャネルを通じて実行されたことを確認します。
SNMPv2-MIB::sysDescr.0 = STRING: Linux labex-vm 5.15.0-XX-generic #XX-Ubuntu SMP ...
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-TC::linux
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (123456) 0:20:34.56
SNMPv2-MIB::sysContact.0 = STRING: Me <me@example.org>
SNMPv2-MIB::sysName.0 = STRING: labex-vm
SNMPv2-MIB::sysLocation.0 = STRING: Sitting on the Dock of the Bay
...
成功した応答は、SNMPv3 のセットアップ全体が正しく機能していることを証明します。間違った認証情報やプロトコルを使用した場合、コマンドは認証エラーで失敗したでしょう。
snmpget を使用した特定の OID のクエリ
このステップでは、snmpget コマンドを使用して、特定のシステム情報を取得する方法を学びます。snmpwalk が OID ツリー全体をトラバースするのに対し、snmpget は正確な情報取得のために特定の オブジェクト識別子 (OID) をクエリするように設計されています。
正常に動作し、セキュアな SNMPv3 セットアップが完了したので、特定のシステム情報をクエリできます。OID は、デバイスの 管理情報ベース (MIB) 内の管理情報の一部を一意に指します。
OID 階層の説明: SNMP OID ツリーは、国際標準 ISO/IEC オブジェクト識別子階層に従っています。
1 (iso)
└── 3 (org)
└── 6 (dod)
└── 1 (internet)
└── 2 (mgmt)
└── 1 (mib-2)
└── 1 (system)
├── 1.0 (sysDescr)
├── 3.0 (sysUpTime)
├── 4.0 (sysContact)
├── 5.0 (sysName)
└── 6.0 (sysLocation)
これが、システム情報が 1.3.6.1.2.1.1 から始まる理由です。これは MIB-II のシステムグループへの標準化されたパスです。
ここでは、特定の、一般的に使用される OID であるシステムの説明をクエリしてみましょう。この OID は、管理対象デバイスの基本的なテキスト説明を取得します。
特定の OID の理解: システムグループ (1.3.6.1.2.1.1) 内では、各情報には特定のサブ識別子があります。
1.3.6.1.2.1.1.1.0= sysDescr.0 (システムの説明)1.3.6.1.2.1.1.3.0= sysUpTime.0 (システムのアップタイム)1.3.6.1.2.1.1.4.0= sysContact.0 (システムの連絡先)1.3.6.1.2.1.1.5.0= sysName.0 (システム名)1.3.6.1.2.1.1.6.0= sysLocation.0 (システムの位置)
末尾の .0 は、これがテーブルエントリではなく、スカラー値 (単一インスタンス) であることを示します。
システムの説明をクエリするには、以下のコマンドを実行します。
snmpget -v 3 -l authPriv -u labexuser -a SHA -A "AuthPassLabEx" -x AES -X "PrivPassLabEx" localhost 1.3.6.1.2.1.1.1.0
出力にはシステムの説明が表示され、SNMPv3 の認証とプライバシーが正しく機能していることが確認されます。
iso.3.6.1.2.1.1.1.0 = STRING: "Linux iZrj9ixg5sv0oem6yeu6aqZ 5.15.0-56-generic ..."
次に、数値 OID 1.3.6.1.2.1.1.3.0 (これは sysUpTime.0 に対応します) を使用してシステムのアップタイムをクエリします。この OID は、システムのネットワーク管理部分が最後に再初期化されてからの時間を報告します。
snmpget -v 3 -l authPriv -u labexuser -a SHA -A "AuthPassLabEx" -x AES -X "PrivPassLabEx" localhost 1.3.6.1.2.1.1.3.0
出力には、アップタイムが「Timeticks」形式 (100 分の 1 秒を表します) で、人間が読める形式とともに表示されます。
iso.3.6.1.2.1.1.3.0 = Timeticks: (48642) 0:08:06.42
最後に、数値 OID をリストすることで、単一のコマンドで複数の OID をクエリできます。ここでは、システムの説明と連絡先情報の両方を、それぞれの数値 OID を使用して取得してみましょう。
数値 OID を使用する理由: 一部の環境では、次のような理由で sysDescr.0 のようなシンボリック名が認識されない場合があります。
- MIB ファイルがロードまたはインストールされていない
- SNMP クライアントの設定に必要な MIB 定義が含まれていない
- 数値 OID を使用することで、異なるシステム間での互換性が保証されます
複数の OID を同時にクエリするには、このコマンドを実行します。
snmpget -v 3 -l authPriv -u labexuser -a SHA -A "AuthPassLabEx" -x AES -X "PrivPassLabEx" localhost 1.3.6.1.2.1.1.1.0 1.3.6.1.2.1.1.4.0
これにより、両方の値が 1 つの応答で返されます。
iso.3.6.1.2.1.1.1.0 = STRING: "Linux iZrj9ixg5sv0oem6yeu6aqZ 5.15.0-56-generic ..."
iso.3.6.1.2.1.1.4.0 = STRING: "Me <me@example.org>"
これらの特定の OID を正常にクエリすることで、セキュアなネットワーク監視のための SNMP のコア機能を示すことができました。これで、デバイスから正確な運用データを、セキュアで、認証され、暗号化された方法で取得できるようになりました。
まとめ
この実験では、Linux システムで SNMPv3 を使用してセキュアなネットワーク監視を実装する方法を学びました。まず、システムのパッケージリポジトリを更新した後、SNMP エージェント (snmpd) およびクライアントツール (snmp) を含むコアコンポーネントをインストールしました。主な焦点はセキュリティであり、snmpd.conf ファイルに新しい SNMPv3 ユーザーを作成し、強力な認証およびプライバシー (暗号化) プロトコルを完備して、転送中のデータを保護するように設定しました。
セキュアなユーザーを設定した後、snmpd サービスを再起動して新しい設定を適用し、正しく実行されていることを確認しました。次に、SNMP クライアントツールを使用してエージェントに対してセキュアなクエリを実行し、作成した SNMPv3 ユーザーの認証情報で認証を行いました。snmpwalk を使用して MIB ツリーブランチ全体をトラバースする方法と、snmpget を使用して特定のオブジェクト識別子 (OID) を取得する方法を練習しました。これにより、包括的なツリーウォークと正確な個別のクエリの両方を使用して、システムの説明、アップタイム、連絡先情報などのシステム情報をセキュアに監視する方法を示しました。



