いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.232 / 読者数:2247名

こんばんは、うすだです。


…も、申し訳ございません、また1週間遅れてしまいました。
できましたら、今週発行だった、と思いこんでから、 以降をご覧いただけますと誠に幸いです。


さて、先日のことですが、とある講習会に本業で参加し、 4日間まるまる勉強するという機会をいただきました。

学生さんじゃなくなると、 机に向かって1日中勉強しまくるという機会はなかなかないのではないかと思います。

また、いまやっている仕事とはかなりかけ離れた内容でしたので、 すごく新鮮な4日間を過ごせました。

 

最 終 日 に 試 験 さ え な け れ ば 。

 

他の参加者の方々は、みな第一線で活躍されておられますので、応用的な試験問題を、 自分の経験に照らし合わせて解いておられたようでした。

しかし、そんな経験など微塵もないわたくしは、 限られた時間内で想像力を発揮しながら、最適な解を選択せねばなりませんでした。

受かった人にはおめでとうメールが送られてくるそうなのですが、いまのところ、 わたくしにはまだそのようなメールは届いておりません。

ただ、普段お話しする機会はまったくないだろうと思われる、 超一流企業所属の方々や、著名な講師陣の方々とお話しできました。かろうじて。

もし落ちていても、それだけで価値があった、と思うようにします。
会社的には非常にまずそうですが…。

ポジティブになれないまま、今回もはりきって…まいります。

今回のお題 - SNMP を動かしたり使ってみたりする

超巨大企業さまはもちろん、中小な企業さまも含めたあらゆる組織では、 サーバやデスクトップなPC、様々なネットワーク機器などが、 社内や部内のネットワークに接続され、日夜稼働しつづけています。

それらは正常に動作していることが当たり前で、 問題が発生してサービスの提供が滞ると、動かないぞー! などと文句を言われるという、 理不尽な環境下におかれています。

そのため、われわれシステム管理者は、 いち早く異常に気づいて復旧することでみなさまの不満を最小限にし、 かつネットワーク機器さまの精神的な重荷を極力軽くしてあげる、 という難しい役割を求められています。

その役割を担うには、普段から、 各種機器の構成や最新の状況を把握しておく必要があると思います。
そして、お察しの通り、そういうところはできるだけ自動化とやらをすることで、 システム管理者の激務を多少なりとも軽くすることができます。

というわけで今回は、SNMP なるものに触れてみたいと思います。

SNMP とは

SNMP (Simple Network Management Protocol) とは、 ネットワークに接続された機器の状態を確認したり制御したりするためのプロトコルです。

SNMP では、ネットワーク機器を制御する側の「マネージャ」と、 制御をされる側の「エージェント」というモノが主に活躍します。

基本的には、マネージャがエージェントに情報を要求したり、 なんらかの操作を依頼します。エージェントは、 正しい(と言える)マネージャからの要求に対して、処理した後に答えを返します。

正しいかどうかの判断は、SNMPのバージョンによって異なります。
SNMPには、大きく分けて、バージョン1、2、3という、3つのバージョンがあります。 今回は、パスワードに相当する「コミュニティ名」でその判断を行う「バージョン1」 を対象とします。

また、SNMPには、「MIB(Management Information Base)」という、 機器の様々な情報を格納する領域があります。MIBはツリー構造になっていて、 特定の情報を指定するために「OID(Object ID)」というものを用います。

…というのをまとめますと、マネージャは、エージェントのとある情報を知りたいとき、 正しいコミュニティ名と、知りたい情報のOIDを指定してエージェントに要求を投げます。 エージェントは、コミュニティ名を確認した後、 指定されたOIDに相当する情報をマネージャに返します。

SNMP を使…う前の準備

お近くにSNMP対応の機器がないこともおおいにありえますので、 ここではマネージャもエージェントも同じLinuxマシンで、各種試していきます。

ちなみに、エージェントの役目は、「snmpd」デーモンが担います。
マネージャは、ここでは確認用のコマンドで代用します。

さて、Linuxで SNMP を使うには、 まず必要なパッケージをインストールする必要があります。

たいていのディストリビューションであれば、 マネージャとエージェントに相当するパッケージがあります。以下を参考に、 インストールしてみてください。 (前者がマネージャ、後者がエージェントに相当します。)

  $ sudo apt-get install snmp snmpd       (Debian系の場合)
  # yum install net-snmp-utils net-snmp   (RedHat系の場合)

Debian系の方は、以下も必要かもしれません。

  $ sudo apt-get install snmp-mibs-downloader

それから、SNMPでは、UDPの161番ポートを使用します。
…あ、厳密には、下記のように、162番ポートも使用します。
162番ポートは、「SNMPトラップ」という、 エージェントからマネージャに何か通知するための機構で使われます。

  $ grep snmp /etc/services | grep udp
  snmp          161/udp
  snmp-trap     162/udp         snmptrap

いずれにしましても、ファイヤウォールを有効にしている場合は、 しかるべき箇所からのアクセスを許可するよう設定してください。
(今回は、単一のマシンでやるため、特に許可の必要はないと思います。)

さらに、snmpdをシステム起動時に自動起動させるには、以下のコマンドを実行します。

  $ sudo /usr/sbin/update-rc.d snmpd defaults  (Debian系の場合)
  # chkconfig snmpd on                         (RedHat系の場合)
  # systemctl enable snmpd.service             (Fedoraの場合)

とりあえず SNMP を体験してみる

それでは、まず最初に、エージェントであるsnmpdを動かし、 マネージャであるコマンドを実行して、SNMPの動作を確認してみましょう。

snmpdの設定ファイルは「/etc/snmp/snmpd.conf」です。
「public」というコミュニティ名で各種参照ができるようになっていますが、 そのままだと不安だという貴兄は、下記を実行して、 コミュニティ名を別の名前に変更してください。

  # sed -i 's/\(^[^#].*\)public\(.*\)$/\1新しい名前\2/' /etc/snmp/snmpd.conf

上記の「新しい名前」に、つけたいコミュニティ名を指定してください。
また、上記を実行すると、snmpd.conf を直接書き換えますので、 バックアップを事前にとっておきましょう。(たとえば下記のように。)

  # cp -pi /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.年月日など

では、以下の手順で、snmpd を起動してみてください。

  $ sudo /usr/sbin/service snmpd start   (Debian系の場合)
  # service snmpd start                  (RedHat系の場合)
  # systemctl start snmpd.service        (Fedoraの場合)

起動したら、service コマンドや ps コマンドなどで、 snmpd が動作していることを確認しましょう。

  $ /usr/sbin/service snmpd status   (あるいは /sbin/service)
  $ ps -ef | grep snmpd

それでは次に、SNMPで情報を得てみましょう。

情報を得るには、「snmpget」というコマンドを使います。
今回試すSNMPバージョン1 では、概ね以下のように実行します。

  $ snmpget -v 1 -c コミュニティ名 ホスト OID...

コミュニティ名は、前述で変更していなければ public です。
ホストは、今回は自分自身ですので localhost を指定します。
OID は、詳しくは後述しますが、 まずは system.sysDescr.0 を指定して実行してみてください。 (エージェントの概要みたいなモノを得ます。)

  $ snmpget -v 1 -c public localhost system.sysDescr.0
  SNMPv2-MIB::sysDescr.0 = STRING: Linux foo 3.2.0-32-generic-pae \
  #51-Ubuntu SMP Wed Sep 26 21:54:23 UTC 2012 i686

こんな感じで、エージェント(自分自身ですけど…) のホスト名やOSなどの情報を得ることができます。
下記のように、OID を複数指定することもできます。

  $ snmpget -v 1 -c public localhost system.sysUptime.0 system.sysName.0
  SNMPv2-MIB::sysUpTime.0 = Timeticks: (21892347) 2 days, 12:48:43.47
  SNMPv2-MIB::sysName.0 = STRING: foo

MIB とか OID とかについてさらっと理解する

さて、snmpgetで情報を引っ張ってくることはできましたが、 指定するOIDをどうするかというのがよくわからないですよね。

というわけで、MIB と OID について、もう少し詳しく説明します。

まず、MIBですが、構成や値の形式などは SMI(Structure of Management Information)」で定義されています。

RFC1155 - Structure and Identification of Management Information for TCP/IP-based Internets
http://tools.ietf.org/rfc/rfc1155.txt

これによると、SMIはツリー構造になっていて、 各ノードには名前と数値をラベルとして持ちます。ただし、 ルートノードにラベルはありません。そして、ルートノードの直下には、 以下の3つのノードがあります。

  ccitt(0)           ... ITU-T(旧CCITT)が管理
  iso(1)             ... ISOが管理
  joint-iso-ccitt(2) ... ISOとITU-Tが共同で管理

これらの下には、広大な(?)ツリーがあらゆる方向に(?)伸びています。
たとえば、すべてのエージェントが対応しているMIBに「MIB-II」というモノがあります。 ちなみに RFC1213 で定義されています。

RFC1213 - Management Information Base for Network Management of TCP/IP-based internets: MIB-II
http://tools.ietf.org/rfc/rfc1213.txt

これの具体的な位置は、 iso(1)の下のorg(3)の下のdod(6)の下のinternet(1)の下のmgmt(2)の下のmib-2(1)です。 …と書くと大変ですので、名前を「.」で連結した OID で表します。

  .iso.org.dod.internet.mgmt.mib-2

あるいは、数値でも構いません。

  .1.3.6.1.2.1

snmpget などのコマンドは、このMIB-IIを起点としてOIDを指定できますので、 最初の .iso.org.dod.internet.mgmt.mib-2(または .1.3.6.1.2.1) を省略できます。


そして、葉ノードには、様々な情報が格納されています。
格納されている情報には、文字列やIPアドレス、数値や時間(100分の1秒)など、 いろいろな型があります。

また、OID で指定した葉ノードには、単一の値を持つモノと、 テーブルのように複数の値を持つモノがあります。
たとえば、前述の system.sysDescr は単一の値を持ちますので、 OID の最後に「.0」をつけることで、その値を参照できます。

後者の場合は、0 の代わりに、テーブルの行を示す番号を指定します。
たとえば、system.sysORTable(9).sysOREntry(1) 以下の情報は、 後者に該当しますので、sysORDescr(3) の2番目(テーブルの2行目)の情報を得るには、 以下のように OID を指定して実行します。

  $ snmpget -v 1 -c public localhost 1.9.1.3.2
  SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.

さて、MIB のツリーについて具体的に知りたいという貴兄は、 以下のように snmptranslate コマンドを実行してみてください。

  $ snmptranslate -Tp
  +--iso(1)
     |
     +--org(3)
        |
  ...中略...
              |  +--mib-2(1)
              |     |
              |     +--system(1)
              |     |  |
              |     |  +-- -R-- String    sysDescr(1)
              |     |  |        Textual Convention: DisplayString
              |     |  |        Size: 0..255
              |     |  +-- -R-- ObjID     sysObjectID(2)
  ...後略...

こんな感じで、MIBの概要をツリー形式で出力してくれます。
個々の OID の詳しい説明を知りたい場合は、以下のようにOIDを指定して実行します。

  $ snmptranslate -Td .1.3.6.1.2.1.1.1
  SNMPv2-MIB::sysDescr
  sysDescr OBJECT-TYPE
    -- FROM      SNMPv2-MIB
    -- TEXTUAL   CONVENTION DisplayString
    SYNTAX       OCTET STRING (0..255) 
    DISPLAY-HINT "255a"
    MAX-ACCESS   read-only
    STATUS       current
    DESCRIPTION  "A textual description of the entity.  This value
              should include the full name and version identification
              of the system's hardware type, software operating-system,
              and networking software."
  ::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) system(1) 1 }

他にも、以下のようなサイトで確認できます。

SNMP オブジェクトナビゲータ
http://tools.cisco.com/Support/SNMP/do/BrowseOID.do?local=ja
OID description for 1.3.6.1.2.1 - SNMP MIB-2
http://www.alvestrand.no/objectid/1.3.6.1.2.1.html

おわりに

以上、SNMP の超概要と、超簡単な使い方をご紹介しました。

前の職場では、複数のネットワーク機器を集中管理するために、 よくSNMPを使っていました。
エージェント側がすでにSNMPに対応していることが多かったため、 あとはマネージャをどうするか、というころがミソだったように思います。

とりあえず超入口のところで終わってしまいましたので、 次回はもう少し踏み込んだ内容にしたいと思っております。

宿題の答え

前回の宿題は、

  ディスクの状況を確認してメールするようにしてみましょう。

でした。

どのような出力結果をメールするかというのは、 個人のセンスによるように思いますが、そのあたりは気にしないで、例を示します。

#!/bin/sh
MAILTO="root@example.com"   # ←宛先メールアドレス
(echo "[df]" ; \
 df -Th -t ext2 -t ext3 -t ext4 ; \
 echo "" ; \
 echo "[free]" ; \
 free) | mail -s "diskinfo : `date +%Y/%m/%d`" $MAILTO

ただ単に、dfコマンドとfreeコマンドを実行して、 それをmailコマンドに渡してメールしているだけです。

メールの設定がされていないよという貴兄は、 とりあえずzenityコマンドで代用してくださいませ。

#!/bin/sh
(echo "[df]" ; \
 df -Th -t ext2 -t ext3 -t ext4 ; \
 echo "" ; \
 echo "[free]" ; \
 free) | zenity --text-info --title="diskinfo : `date +%Y/%m/%d`"

いつものように実行の権限をつけて実行すると、メールが飛んできたり、 ダイアログが表示されたりします。

  $ chmod +x 上記スクリプトファイル名
  $ ./上記スクリプトファイル名

ほんとに監視したりするなら、logwatch や sysstat、munin などの使用をおすすめします。
過去に取り上げていますので、よろしければご覧くださいませ。

Vol.074 - Logwatch をカスタマイズする
http://www.usupi.org/sysad/074.html
Vol.075 - Logwatch にサービス・フィルタを追加する
h http://www.usupi.org/sysad/075.html
Vol.177 - sysstat でシステムの状態を監視する
http://www.usupi.org/sysad/177.html
Vol.178 - sysstat でシステムの状態を定期的に監視する
http://www.usupi.org/sysad/178.html
Vol.191 - Munin でグラフィカルに状態を監視する
http://www.usupi.org/sysad/191.html
Vol.192 - Munin をカスタマイズする
http://www.usupi.org/sysad/192.html

今回の宿題

今回の宿題は、

  SNMPのパケットをダンプし、コミュニティ名が丸見えであることを確認
  してみましょう。

です。

ほぼパスワードとして使われるコミュニティ名ですが、 バージョン1 では暗号化などされず生でやりとりされるため、 セキュリティ的にはよろしくありません。

…というのを、tcpdump コマンドなどでパケットをダンプし、 肌で感じていただこうというのが、宿題の趣旨です。

とにかく、snmpget の実行時にキャプチャして、確認してみましょう。

あとがき

前回(231回)の冒頭で、まずゴールを決めることが重要なんだ、 という話をさらりと書きました。

今回受けた講習でも、まず顧客の関心事をもとに要件を定義して、 それらを実現するためにどうすればいいか順にたどって考えていく、 的な方法をとっていました。

こう書くと、当たり前じゃーんと思ってしまいますが、 実際にはそうしていないことがあります。新しい技術を使いたくて、 その技術を前提とした仕様書を書いたり、 実装しながら機能をどうするか並行して考えたり…。
(す、すみません、現在進行形のお仕事がまさにそうだったりします。)

で、唐突ですが、日本の政治に関して、今日ふと思ったことがあります。

それは、日本の政治がずっとうまくいっていない原因は、 こうありたいというゴールのイメージがないまま、 いまかかえている問題に対処している(しようとしている)だけだからではないか、 ということです。

…いえ、政党によっては、目指す将来像を掲げているところもあります。ただ、 一般庶民から見ると、その将来像は抽象化されすぎていて、 具体的にイメージできなかったりするのです。

ゴールがてっぺんにあり、 そのためにやるべきことをツリー構造でわかりやすく表現できれば、 政治に対する関心も多少は高まるんじゃないかなあ…なんて、 勝手ながら思いました。
(もちろん、賛同できるゴールでないと、ピンとは来ないと思いますが。)

 

それと、コンテキストが違うと議論にならない、ということを、 講師の方がとても熱心に力説されていました。

対象のシステムがそもそも違っていたり、おかれている状況を勘違いしていたら、 議論がかみ合うわけないですよね。

しかし、コンテキストが違っていることを確認しないまま、 かみ合わない議論を延々としてしまうことが、現実ではときどきあるように思います。

少しでも疑問に思ったら、まず最初に、現状の認識あわせを行った上で、 議論や検討を行わねば…と思いました。
(特に気をつけねばと思っているのが、そこで使われる用語です。)

 

以上、とりとめなく書きましたが、いろいろ考えることの多い週末だったと、 強引にまとめさせていただきます。

 

さて、次回は、予定ですと12月2日になりますが、 いろいろ切羽詰まっていることがおおいに予想されるため、 お休みをいただきたいと思います。

ですので、次回は12月16日にお送りする予定です。
そして、次回が、今年最後の発行となります。

…ああ、1年なんてあっという間ですね…。

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、12月16日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 来年の予定が1つできそうで、ワクワクしています。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ) http://usupi.org/k/ (モバイル栗日記)
http://twitter.com/kuriking/ (栗つぶやき)
http://facebook.com/kuriking3 (栗顔本)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本