SNMP(Simple Network Management Protocol)はネットワーク管理用に設計されたプロトコルです。SNMPを使って定期的にネットワーク・ルータやスイッチなどネットワーク機器、サーバ等の状態を観察すれば、障害やトラブル発生を事前策を打つことができます。
SNMPには以下3つのバージョンがあります。
- SNMPバージョン1 RFC1157
- SNMPバージョン2 RFC1441
- SNMPバージョン3 RFC3411
最も普及しているのはSNMPバージョン1です。SNMPは「マネージャ」「エージェント」の2要素から構成されます。マネージャからはSNMPに対応した様々な機器の情報や設定を集中管理出来ます。当記事では主にマネージャ側について説明します。
目次
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もインストールする必要があります。
インストールコマンドは以下の通りです。
| 1 2 | # yum -y install net-snmp # yum -y install net-snmp-utils | 
初期設定
snmpの設定ファイルは以下です。今回はloacalhostからしか受け付けない設定としていますので、設定は適宜変更してください。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # 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とコミュニティ名で識別します。
| 1 | com2sec <group name> <manager ip> <community> | 
以下はdefaultというローカルのSNMPマネージャからコミュニティ名publicでアクセスしてきた場合委はセキュリティグループnotConfigUserとして扱う。という設定です。グループの設定は後述します。
| 1 | com2sec notConfigUser  default       public | 
外部からエージェントとして接続を許可する場合は、publicのような文字列をそのまま使用するのは不適切です。予測可能なコミュニティ名をそのまま使用すると、外部からシステムの重要な情報を盗み取られる原因となります。
group
セキュリティグループに対して、セキュリティモデルを設定します。
| 1 | group <group name> <model> <security> | 
- v1:SNMPバージョン1で使用する
- v2:SNMPバージョン2cで使用する
- usm:SNMPバージョン3で使用する
view
MIBツリーをどこまで参照許可させるかの設定です。
| 1 | view <view name> <view type> <subtree> <mask> | 
access
snmpへのアクセス制限を設定します。設定は、com2sec group view を組み合わせで行います。
| 1 | access <group name> <context> <model> <level> <prefix> <read> <write> <notify> | 
SNMPの起動・自動起動設定(CentOS7)
| 1 2 | # systemctl start snmpd # systemctl enable snmpd | 
動作確認
正常に動作するか確認してみます。コマンドは後述しますが、以下のコマンドでサブツリー情報が大量に表示されれば正常に起動しています。
| 1 | # snmpwalk -v1 localhost -c local_community ucdavis | 
サブツリー情報が表示されれば問題ありません。以下のメッセージが表示された場合は、コミュニティ名の間違いやバージョンの許可情報の誤りなどを疑ってみてください。
| 1 | Timeout: No Response from localhost. | 
SNMPマネージャのコマンドリスト
主なSNMPマネージャのコマンドは以下の通りです。
snmpget
| 1 | snmpget [-<snmpversion>] <AgentIP> -c <Community> <OID>... | 
| 1 | snmpgetは[AgentIP]で指定したSNMPエージェントにリクエストを送り、[OID]の値を取得します。[snmpversion]にはv1,v2c,v3のそれぞれ指定することが出来ますが、省略した場合はv3がデフォルト設定となります。 | 
snmpgetコマンド例
| 1 2 | # snmpget -v1 localhost -c local_community system.sysName.0 SNMPv2-MIB::sysName.0 = STRING: hogehoge.com | 
snmpgetnext
| 1 | snmpgetnext [-<snmpversion>] <AgentIP> -c <Community> <OID>... | 
| 1 | 基本的にはsnmpgetと同様です。OIDにインデックスまで指定した場合は、次のオブジェクトに相当するものが表示されます。インデックスの指定が無ければ、当該オブジェクトの最初のインデックスが表示されます。 | 
snmpgetnextコマンド例
| 1 2 3 4 | # 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
| 1 | snmpwalk [-<snmpversion>] <AgentIP> -c <Community> <OID> | 
| 1 | <OID>以下のSNMPサブツリーの全情報を取得します。こちらも<snmpversion>を指定できますが、省略した場合はv3がデフォルト設定となります。 | 
snmpwalkコマンド例
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | # 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
| 1 | snmpwalk [-<snmpversion>] <AgentIP> -c <Community> -Cp <Nsec> <OID> | 
| 1 2 | snmpdeltaは<OID>の情報を取得し、その差分情報を表示します。 整数値を持つSNMPオブジェクトのOIDでなければ指定できないので注意が必要です。 | 
snmpdeltaコマンド例
| 1 2 3 4 5 6 7 8 9 | # 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を指定すると以下のようにエラーとなります。
| 1 2 | # snmpdelta -v1 localhost -c local_community -Cp 3 sysORID Failed object: SNMPv2-MIB::sysORID | 
| 1 | 


