現在のLinuxでSNMPを導入する場合
CentOS Linux 7は2024年6月30日にEOLとなりました。この後のCentOS 7手順は既存環境の参照用として残し、新規構築ではRocky Linux、AlmaLinux、RHELなどサポート中のOSを使用してください。
Rocky Linux 9/AlmaLinux 9系の基本コマンド
sudo dnf install -y net-snmp net-snmp-utils
sudo systemctl enable --now snmpd
sudo systemctl status snmpd
sudo ss -lunp | grep ':161'
設定ファイルは通常/etc/snmp/snmpd.confです。変更後はsudo systemctl restart snmpdで反映し、まずlocalhostから疎通を確認します。
新規構築ではSNMPv3を優先する
SNMPv1/v2cのコミュニティ名は暗号化されません。インターネットへUDP 161番を公開せず、監視ネットワークを制限したうえで、認証と暗号化を使えるSNMPv3を優先してください。
snmpwalk -v3 -l authPriv \
-u monitor \
-a SHA -A 'AUTH_PASSWORD' \
-x AES -X 'PRIV_PASSWORD' \
localhost 1.3.6.1.2.1.1
ユーザー作成方法はOSパッケージによって異なるため、Net-SNMP公式のSNMPv3説明と利用OSのマニュアルを確認してください。
アプリケーション監視も必要な場合は、MackerelでApacheを監視する手順も参考になります。
SNMP(Simple Network Management Protocol)はネットワーク管理用に設計されたプロトコルです。SNMPを使って定期的にネットワーク・ルータやスイッチなどネットワーク機器、サーバ等の状態を観察すれば、障害やトラブル発生を事前策を打つことができます。 SNMPには以下3つのバージョンがあります。- SNMPバージョン1 RFC1157
- SNMPバージョン2 RFC1441
- SNMPバージョン3 RFC3411
MIB・OID
エージェント側の情報はMIB(Management Information Base)という既定の分類がなされています。MIBにはデータ項目(MIB変数)と、それらに対して出来る処理が決められています。 MIB分類には、system(ホストやルータの名称などシステムの情報), interface(個々のネットワークインタフェース情報), at, ip icmp, tcp, udp, egp, snmp, privateなどがあります。 MIBは沢山のオブジェクトから構成されます。それぞれのオブジェクトにはOIDというピリオドと数字を連続させた番号が設定されています。 個々のMIBには更に、サブツリーがさらに紐づきますが、詳細はここでは割愛します。SNMPのコミュニティ名
SNMPでは、コミュニティというパスワードを使用します。コミュニティごとに役割や権限を設定できます。CentOSでSNMPインストール
CentOSでのSNMP機能は、オープンソースのnet-snmpをインストールする事で使用出来るようになります。SNMPには先述の通り「マネージャ」「エージェント」の2要素がありますが、当記事では主にマネージャ側について説明します。マネージャの機能を使用するためには、net-snmp-utilsもインストールする必要があります。 インストールコマンドは以下の通りです。# yum -y install net-snmp
# yum -y install net-snmp-utils
初期設定
snmpの設定ファイルは以下です。今回はloacalhostからしか受け付けない設定としていますので、設定は適宜変更してください。# vi /etc/snmp/snmpd.conf
# sec.name source community
#com2sec notConfigUser default public # 削除(コメントアウト)
com2sec localgroup localhost local_community # ここを追加
# localhost以外からも受け付ける場合はここに追加する(localhostを指定のネットワークに)
# groupName securityModel securityName
#group notConfigGroup v1 notConfigUser # 削除(コメントアウト)
#group notConfigGroup v2c notConfigUser # 削除(コメントアウト)
group local_group v1 localgroup # ここを追加
group local_group v2c localgroup # ここを追加
group local_group usm localgroup # ここを追加
# Make at least snmpwalk -v 1 localhost -c public system fast again.
# name incl/excl subtree mask(optional)
#view systemview included .1.3.6.1.2.1.1 # 削除(コメントアウト)
#view systemview included .1.3.6.1.2.1.25.1.1 # 削除(コメントアウト)
view all included .1 80 # ここを追加(全てのMIBツリーへのアクセスを許可)
# group context sec.model sec.level prefix read write notif
#access notConfigGroup "" any noauth exact systemview none none # 削除(コメントアウト)
access local_group "" any noauth exact all none none # ここを追加
com2sec
com2sec は、SNMPマネージャに対して、セキュリティグループを決める設定です。エージェントはマネージャをIPとコミュニティ名で識別します。com2sec <group name> <manager ip> <community>
以下はdefaultというローカルのSNMPマネージャからコミュニティ名publicでアクセスしてきた場合委はセキュリティグループnotConfigUserとして扱う。という設定です。グループの設定は後述します。
com2sec notConfigUser default public
外部からエージェントとして接続を許可する場合は、publicのような文字列をそのまま使用するのは不適切です。予測可能なコミュニティ名をそのまま使用すると、外部からシステムの重要な情報を盗み取られる原因となります。
group
セキュリティグループに対して、セキュリティモデルを設定します。group <group name> <model> <security>
- v1:SNMPバージョン1で使用する
- v2:SNMPバージョン2cで使用する
- usm:SNMPバージョン3で使用する
view
MIBツリーをどこまで参照許可させるかの設定です。view <view name> <view type> <subtree> <mask>
access
snmpへのアクセス制限を設定します。設定は、com2sec group view を組み合わせで行います。access <group name> <context> <model> <level> <prefix> <read> <write> <notify>
SNMPの起動・自動起動設定(CentOS7)
# systemctl start snmpd
# systemctl enable snmpd
動作確認
正常に動作するか確認してみます。コマンドは後述しますが、以下のコマンドでサブツリー情報が大量に表示されれば正常に起動しています。# snmpwalk -v1 localhost -c local_community ucdavis
サブツリー情報が表示されれば問題ありません。以下のメッセージが表示された場合は、コミュニティ名の間違いやバージョンの許可情報の誤りなどを疑ってみてください。
Timeout: No Response from localhost.
SNMPマネージャのコマンドリスト
主なSNMPマネージャのコマンドは以下の通りです。snmpget
snmpget [-<snmpversion>] <AgentIP> -c <Community> <OID>...
snmpgetは[AgentIP]で指定したSNMPエージェントにリクエストを送り、[OID]の値を取得します。[snmpversion]にはv1,v2c,v3のそれぞれ指定することが出来ますが、省略した場合はv3がデフォルト設定となります。
snmpgetコマンド例
# snmpget -v1 localhost -c local_community system.sysName.0
SNMPv2-MIB::sysName.0 = STRING: hogehoge.com
snmpgetnext
snmpgetnext [-<snmpversion>] <AgentIP> -c <Community> <OID>...
基本的にはsnmpgetと同様です。OIDにインデックスまで指定した場合は、次のオブジェクトに相当するものが表示されます。インデックスの指定が無ければ、当該オブジェクトの最初のインデックスが表示されます。
snmpgetnextコマンド例
# snmpgetnext -v1 localhost -c local_community system.sysDescr
SNMPv2-MIB::sysDescr.0 = STRING: Linux hogehoge.com 3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015 x86_64
# snmpgetnext -v1 localhost -c local_community system.sysDescr.0
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
snmpwalk
snmpwalk [-<snmpversion>] <AgentIP> -c <Community> <OID>
<OID>以下のSNMPサブツリーの全情報を取得します。こちらも<snmpversion>を指定できますが、省略した場合はv3がデフォルト設定となります。
snmpwalkコマンド例
# snmpwalk -v1 localhost -c local_community system
SNMPv2-MIB::sysDescr.0 = STRING: Linux hogehoge.com 3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (80725) 0:13:27.25
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: hogehoge.com
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.2 = STRING: The management information definitions for the SNMP User-based Security Model.
SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORDescr.9 = STRING: The MIB modules for managing SNMP Notification, plus filtering.
SNMPv2-MIB::sysORDescr.10 = STRING: The MIB module for logging SNMP Notifications.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (3) 0:00:00.03
snmpdelta
snmpwalk [-<snmpversion>] <AgentIP> -c <Community> -Cp <Nsec> <OID>
snmpdeltaは<OID>の情報を取得し、その差分情報を表示します。
整数値を持つSNMPオブジェクトのOIDでなければ指定できないので注意が必要です。
snmpdeltaコマンド例
# snmpdelta -v1 localhost -c local_community -Cp 3 sysORDescr.1
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
整数値以外のOIDを指定すると以下のようにエラーとなります。
# snmpdelta -v1 localhost -c local_community -Cp 3 sysORID
Failed object: SNMPv2-MIB::sysORID

