Simple Network Management Protocol(SNMP)は、UDPポート161および162上で動作するマネージャー・エージェントモデルを通じて、ルーター、スイッチ、サーバー、ファイアウォールなどのエンタープライズデバイスの監視および設定を可能にする標準的なネットワーク管理プロトコルです。 SNMPは、オブジェクト識別子(OID)によって整理された管理情報ベース(MIB)内のオブジェクトとしてデバイスデータを公開し、マネージャーはポーリング要求を通じてこれにアクセスするか、イベント発生時に非要求のトラップ通知を介して受信します。 組織は、セキュリティ上の脆弱性、設定ミスによる死角、およびデバイスのCPU負荷過多によるパフォーマンス低下を回避するために、認証と暗号化を備えたSNMPv3を導入し、正確なMIBファイルを維持し、ポーリング間隔を慎重に管理し、送信元アドレスによるアクセスを制限する必要があります。
SNMPの仕組み
SNMPは、マネージャーとエージェントのモデルを採用しています。エージェントは管理対象デバイス上で動作し、そのデータをオブジェクト識別子(OID)によって識別され、管理情報ベース(MIB)に整理されたオブジェクトとして公開します。
- データの定義:各MIBは、インターフェースカウンターやCPU負荷など、デバイスが報告可能なオブジェクトを記述し、ツリー構造の中で各オブジェクトに一意のOIDを割り当てます。
- リクエストの送信:マネージャーは、UDPポート161を介してエージェントにメッセージを送信します。Getリクエストは特定のオブジェクトを読み取り、GetNextおよびGetBulkはツリーを順次探索し、Setは書き込み可能な値を変更します。
- リクエストの認証:SNMPv1およびSNMPv2cでは、コミュニティ文字列を使用して送信者を識別します。SNMPv3では、ユーザーベースの認証とオプションの暗号化が追加されています。
- 応答の返送:エージェントは要求されたオブジェクトを検索し、その値またはエラーをマネージャーに返します。
- 通知の送信:リンクのダウンなど、定義されたイベントが発生すると、エージェントはポーリングされることなく、UDPポート162を介してマネージャーにトラップを送信します。インフォームはトラップと同様に機能しますが、確認応答を必要とします。
SNMPウォークとは、OIDツリー内の指定されたポイントの下にあるすべてのオブジェクトを取得するための、GetNextまたはGetBulkリクエストの繰り返し一連の処理です。これは通常、デバイスが公開している情報を特定するために使用されます。トラップはポーリングサイクル間のイベントをカバーしますが、プレーンなトラップのUDPによる配信は保証されません。
SNMPのよくある問題
public や private といったコミュニティ文字列が設定されたままのデバイスでは、UDP ポート 161 にアクセスできる者なら誰でもデータを読み取ることができ、場合によっては書き込みも可能になります。セキュリティスキャンでは、インストール後にセキュリティ強化が行われていないプリンターやスイッチにおいて、この問題が頻繁に指摘されます。
トラップ受信側に何も届かないのは、デバイスにトラップの送信先が設定されていない、ファイアウォールがUDPポート162をブロックしている、あるいはコミュニティ名やSNMPv3ユーザーが一致しないためです。トラップは要求なしに送信されるものであり、SNMPv1およびSNMPv2cのトラップには確認応答がないため、送信側からは失敗の兆候が一切示されません。
マネージャーとエージェントの間で、セキュリティレベル、認証プロトコル、またはプライバシープロトコルに不一致がある場合、ポーリングはタイムアウトするか、認証エラーを返します。トラップやインフォームに使用されるエンジンIDの不一致も、よくある原因の一つです。
ルーティングテーブルやARPテーブルなどの大規模なテーブルに対して、過度に短いポーリング間隔を設定したり、大規模なGetBulkウォークを実行したりすると、旧式のデバイスではCPU使用率が上昇し、グラフにデータ欠落が生じる可能性があります。通常、ポーリングを時間差で実行したり、要求するOIDを制限したりすることで、この問題は解決されます。
正しいベンダーMIBが読み込まれていない場合、ツールは生の数値OIDを表示したり、値を誤って読み取ったりすることがあります。また、32ビットのインターフェースカウンタではカウンタのラップオーバーが発生し、高速リンク上で誤ったスパイクが生じる可能性があるため、64ビットのカウンタを使用することをお勧めします。