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

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

あけましておめでとうございます、うすだです。
本年も、どうかよろしくお願いいたします。

さて、今回の年末年始は、いかがでしたでしょうか。
栄養やアルコールの補給、休養などをたっぷりとされましたでしょうか。

わたくし、年末にイロイロありまして、ひさしぶりに実家で年を越すことになりました。

上海にいる姉もひとっ飛びで帰ってきて、 現地ならではの話をたっぷりと聞くことができました。

それぞれの国のマスコミは、それぞれの都合のよいように報道しますが、 庶民の受け止め方や感情などがその通りとは限らないということが、よくわかりました。

守るべきものは守るべきですし、主張すべきときには主張すべきですが、 他人の言うことを鵜呑みにせず、 自分なりに解釈して冷静に判断することが大事なんだなぁ、 ということをあらためて思いました。

政治が絡むと歯切れが超悪くなりますが、今回もはりきってまいります!

今回のお題 - SNMP のアクセス制御を設定する

昨年末の最後の2号は、ともに1週間遅れでしたが、 下記のようなSNMPネタをお送りしました。

Vol.232 - SNMP を動かしたり使ってみたりする
http://www.usupi.org/sysad/232.html
Vol.233 - MRTG でネットワークを監視する
http://www.usupi.org/sysad/233.html

もう潮時ではないかという気もいたしましたが、 肝心の(?)アクセス制御に触れないのはいかがなものか、 と思いながら年を越しておりました。
ですので、新年一発目は、アクセス制御をご紹介したいと思います。

け、決して、ネタに困って SNMP で引っ張っているのではございません。
書くほどに言い訳がましくなりますが、違うんです。違いますとも…。

SNMPv1/SNMPv2c の場合

SNMP にはいくつかのバージョンがありますが、現在主流なのが、SNMPv1, SNMPv2c および SNMPv3 です。

で、SNMPv1 と SNMPv2c でのアクセス制御は、 いままでさらっと説明してきた「コミュニティ名」によるものです。
コミュニティ名を知っていることで、参照や設定が行えます。ですので、 パスワードと同じようなものだと思っておいてください。
(以下では、単純な名前を使っていますが、 実運用時はもっと複雑な名前つけてください。(平文で流れるとしても、です。))

情報を取得するだけのコミュニティと、設定できるコミュニティの2種類あり、 それぞれ「rocommunity」「rwcommunity」ディレクティブで設定ができます。 書式は以下の通りで、どちらも同じ形式です。
(ちなみに、[] で囲った部分は省略可能です。以降も同様です。)

  rocommunity コミュニティ名 [許可するアドレス [OID | -V ビュー]]
  rwcommunity コミュニティ名 [許可するアドレス [OID | -V ビュー]]

許可するアドレスには、「localhost」などのホスト名や、 IPアドレスの範囲を「IPアドレス/ネットマスク」で表したものを指定できます。 省略した場合や「default」を指定した場合は、 「agentAddress」で待ち受けているアドレスに対するアクセスを許可します。
(つまり、来るものは拒みません。)

その後に、参照や設定を許可するOIDもしくは「ビュー」を指定します。
ビューは、いままでさりげなく書いていた 「view」ディレクティブで許可するOIDを指定するためのものです。 view の書式は以下の通りです。

  view ビュー名 included|excluded OID [マスク]

ビュー名のあとに、included と許可するOID、 もしくは excluded と許可しないOIDを指定します。

マスクを指定すると、ビットが立っている部分は指定したOIDと一致する必要があり、 立っていない部分は一致しなくてよい、というややこしい…いえ、 若干複雑な指定ができます。たとえば、

  view systemonly included .1.3.6.1.4.1.2021.13.15.1.1.1.30 0xff:0xe8

と指定すると、以下のように、 マスクのビットが立っていない部分は一致しなくてよくなります。

                                    ↓この1は1以外でもOK
  OID:  .1.3.6.1.4.1.2021.13.15.1.1.1.30
  MASK:  1 1 1 1 1 1    1  1  1 1 1 0  1 0 0 0   (2進数)
         ~~~~~~f ~~~~~~~~~~f  ~~~~~~e  ~~~~~~8  (16進数)

この場合、最後の「30」の1つ手前の「1」は、 1 と書いていますが実際はなんでもよくて、 それ以外は一致するOIDのみ許可されます。ですので、 snmpwalk でごそっと抜き出すと、30 の結果だけが得られます。

  $ snmpwalk -On -v 1 -c public localhost .1.3.6.1.4.1.2021.13.15
  .1.3.6.1.4.1.2021.13.15.1.1.1.30 = INTEGER: 30
  .1.3.6.1.4.1.2021.13.15.1.1.2.30 = STRING: sda5
  .1.3.6.1.4.1.2021.13.15.1.1.3.30 = Counter32: 956112384
  .1.3.6.1.4.1.2021.13.15.1.1.4.30 = Counter32: 1905282560
  .1.3.6.1.4.1.2021.13.15.1.1.5.30 = Counter32: 416254
  .1.3.6.1.4.1.2021.13.15.1.1.6.30 = Counter32: 1673948
  End of MIB

マスクを指定しない場合、 .1.3.6.1.4.1.2021.13.15.1.1.1.30 だけしか得ることができません。 というわけで、テーブルの特定のインデックスの情報をごっそり許可したい、 という場合などに便利です。(たぶん)


そして、説明がやや前後してしまいましたが、 /etc/snmp/snmpd.conf に各種ディレクティブを追加したら、 snmpd を再起動してください。
(root の権限をお持ちでしたら、sudo は省略可能です。)

  $ sudo service snmpd restart

snmpget や snmpset で実際にアクセスする場合は、 「-v」オプションでSNMPのバージョンを、 「-c」オプションでコミュニティ名を指定します。
以下は、 snmpset で system.sysContact.0 に hoge という文字(s)を設定する場合の例です。
(実際はエラーになるため設定できませんが…。)

  $ snmpset -v 1 -c private localhost system.sysContact.0 s hoge

ちなみに、IPv6 用の「rocommunity6」「rwcommunity6」もあります。
書式は同じです。許可しておくと、こんな感じでアクセスできます。

  $ snmpwalk -On -v 2c -c public6 'UDP6:[fe80::212:34ff:fe56:789a]' \
  system.sysDescr.0

SNMPv3 の場合

SNMPv3 では、コミュニティ名の代わりに、ユーザ名とパスワードを使用します。 また、平文のまま送らず暗号化して送ることもできます。

コミュニティと同様、参照するだけのユーザと設定できるユーザがあり、 それぞれ「rouser」「rwuser」ディレクティブで設定します。
書式は以下の通りです。こちらも同じ形式です。

  rouser ユーザ名 [noauth|auth|priv [OID | -V ビュー]]
  rwuser ユーザ名 [noauth|auth|priv [OID | -V ビュー]]

ユーザ名の後に、パスワードによる認証も暗号化もしない「noauth」か、 認証を行う「auth」、暗号化も行う「priv」のいずれかを指定します。

OID とビューに関しては、r[ow]community と同様です。

パスワードは、 別のファイルである /var/lib/snmp/snmpd.conf かまたは /var/lib/net-snmp/snmpd.conf に設定します。
(Debian系は前者、RedHat系は後者のようです。ま、存在する方ですね。)

このファイルは snmpd が実行時に使用するため、 基本的にはニンゲン様が記述しては行けないことになっています。ですが、 パスワードの設定だけは特別です。

さて、パスワードを設定するには、「createUser」ディレクティブを使います。 書式は以下の通りです。

  createUser ユーザ名 MD5|SHA パスワード [DES|AES] [暗号化パスワード]

認証に使うハッシュ関数を、「MD5」か「SHA」から選びます。SHA の方が安心です。 暗号化を行う場合は、 暗号化に使う方式(「DES」か「AES」)と暗号化のパスワードを指定します。 後者を省略すると、認証のパスワードを使います。

これを /var/lib/(snmp|net-snmp)/snmpd.conf に追加する前に、 snmpdを止める必要があります。

  $ sudo service snmpd stop

snmpd を止めたら、createuser を追加し、snmpd を動かします。
動かす前に、指定したパスワードを脳裏に焼き付けてください。

  $ sudo service snmpd start

すると、createUser の行が消えて、「usmUser」に変わります。

  usmUser 1 3 0x80001f888024b41517d83ecc5000000000 ...後略...

ニンゲン様には理解不能な文字列にごっそり変換されてしまいますので、 パスワードは脳裏に焼き付けておく必要がある、というわけでした。


snmpget などでアクセスするには、以下のオプションの指定が必要です。

オプション概要
-l 「noAuthNoPriv」「authNoPriv」「authPriv」のどれかを指定します。
それぞれ、認証なし、暗号化なしで認証あり、暗号化も認証もあり、となります。
-uユーザ名を指定します。
-a 認証で使うハッシュ関数「MD5」か「SHA」を指定します。
-A認証のパスワードを指定します。
-x暗号化方式「DES」か「AES」を指定します。
-X暗号化のパスワードを指定します。

たとえば、認証だけを行うには、以下のように実行します。

  $ snmpget -v 3 -l authNoPriv -u ユーザ名 -a MD5 -A パスワード \
  localhost system.sysDescr.0

暗号化も行う場合は、以下のように実行します。

  $ snmpget -v 3 -l authPriv -u ユーザ名 -a SHA -A パスワード \
  -x AES -X 暗号化パスワード localhost system.sysDescr.0

ただ、ユーザを追加する際、 一時的とはいえ snmpd を止める必要があるというのは非常に面倒ですよね。
そんな貴兄のために、「snmpusm」コマンドというものをご紹介します。

snmpusm コマンドは、 ユーザの作成・削除やパスワードの変更をその場で行うためのものです。
たとえば、ユーザを作成するには、以下のように実行します。

  snmpusm [SNMPのオプション] create 作成するユーザ名 既存ユーザ名

既存のユーザの設定をもとに、ユーザを作成します。
もう少し具体的な例を示すと、こういう感じです。

  $ snmpusm -v 3 -l authPriv -u 既存ユーザ -a MD5 -A パスワード \
  -x DES -X 暗号化パスワード localhost create 作成するユーザ 既存ユーザ

ただ、/etc/snmp/snmpd.conf に rouser か rwuser を追加して snmpd を再起動する手間は、残念ながら省くことはできません。 つまり、

  rwuser 作成するユーザ

などを snmpd.conf に追加して、

  $ sudo service snmpd restart

とすると、使えるようになります。

  $ snmpget -v 3 -l authPriv -u 作成したユーザ -a MD5 -A パスワード \
  -x DES -X 暗号化パスワード localhost system.sysDescr.0

ただ、パスワードが既存のユーザと一緒、というのは嫌ですよね。
パスワードを変えるには、snmpusm を以下のように実行します。

  snmpusm [SNMPのオプション] passwd [-Ca][-Cx] 古いパスワード \
  新しいパスワード [ユーザ名]

-Ca オプションで認証用の、-Cx オプションで暗号化のパスワードを変更します。 ユーザ名を省略すると、自分自身のパスワードを変更します。
もう少し具体的な例を示すと、こういう感じです。

  $ snmpusm -v 3 -l authPriv -u 既存ユーザ -a MD5 -A パスワード \
  -x DES -X パスワード localhost passwd -Ca -Cx パスワード \
  新しいパスワード 作成したユーザ

ちなみに、SNMPv3 のユーザは、以下のOIDあたりに登録されています。
snmpwalk で吸い出すと、それっぽい情報を見ることができます。

  $ snmptranslate -Tl
  ...中略...
  .iso(1).org(3).dod(6).internet(1).snmpV2(6).snmpModules(3).\
  snmpUsmMIB(15).usmMIBObjects(1).usmUser(2)
  ...後略...
  $ snmpwalk -v 3 -l ...中略... localhost .1.3.6.1.6.3.15.1.2
  ...後略...

パスワードはさすがに出てこないですが、ユーザ名やハッシュ関数などは確認できます。

おわりに

以上、SNMPのアクセス制御について、簡単にご紹介しました。

他にも、トラップとか様々な監視とか、機能がてんこ盛りですので、 SNMPを取り上げている限りネタには困らないのですが、 あまり引っ張りすぎるのもなんですので、このくらいで終わりにします。

ですが、もし、もっと続けて欲しいと切に願う貴兄がいらっしゃいましたら、 お便りください。万が一たくさん来た場合は、喜んで引っ張ります。

宿題の答え

前回の宿題は、

  ディスクの使用量を MRTG でグラフにしてみましょう。

でした。

というわけで、前回ご紹介しました、 メモリとスワップの空きを知るための外部コマンドを参考に、 ディスクの使用量と空き容量を知るための外部コマンドを作ってみました。

#!/bin/sh
df -B 1024 / | awk '/^\/$/ { printf("%d\n%d\n", $3, $4) }'
snmpget -v 1 -c public localhost host.hrSystem.hrSystemUptime.0 | sed 's/^.*) //'
echo "Filesystem / Used and Available"

基本的には同じ構成です。
2行目では、df コマンドで / の状況を出力させ、 awk コマンドで使用量と空き容量を抜き出しています。 df コマンドでわざわざ -B オプションを使っているのは、 数字の末尾に単位がつかないようにするためです。
(ですので、-k などでも構いません。)

これをたとえば「fsinfo.sh」というファイル名にして保存した場合は、 mrtg.cfg に以下のような設定を追加します。

  Target[fs]: `/some/where/fsinfo.sh`
  MaxBytes[fs]: 840692152
  Title[fs]: Filesystem / Used and Available

MaxBytes に指定した値は、わたしの環境での、 / パーティションの容量(上限)です。
あとは、いままで通り mrtg コマンドを何度か実行すると、 その都度収集した値をグラフにしてくれます…くれるはずです。
(cron に登録しておけば、定期的に収集してグラフ化されますね。)

  $ LANG=C mrtg /foo/bar/mrtg.cfg

ちなみに、SNMP 経由でも、同等の情報を取得できます。
以下の OID あたりに、それらしき情報があります。

  $ snmptranslate -Tl  (-Tos の方がわかりやすいかも…)
  ...中略...
  .iso(1).org(3).dod(6).internet(1).private(4).enterprises(1).\
  ucdavis(2021).dskTable(9)
  .iso(1).org(3).dod(6).internet(1).private(4).enterprises(1).\
  ucdavis(2021).dskTable(9).dskEntry(1)
  .iso(1).org(3).dod(6).internet(1).private(4).enterprises(1).\
  ucdavis(2021).dskTable(9).dskEntry(1).dskIndex(1)
  .iso(1).org(3).dod(6).internet(1).private(4).enterprises(1).\
  ucdavis(2021).dskTable(9).dskEntry(1).dskPath(2)
  ...後略...

ただ、snmpd のデフォルトの設定では、 これらの情報を教えてもらうことができませんので、 以下のエントリを /etc/snmp/snmpd.conf に追加する必要があります。 (あるいは、ビューなしに設定するなどしてください。)

  view   systemonly  included   .1.3.6.1.4.1.2021.9

追加したら、snmpd を再起動します。

  $ sudo service snmpd restart

そして、snmpwalk コマンドで吸い出します。

  $ snmpwalk -Ou -v 1 -c public localhost .1.3.6.1.4.1.2021.9
  ...中略...
  enterprises.ucdavis.dskTable.dskEntry.dskPath.1 = STRING: /
  ...中略...
  enterprises.ucdavis.dskTable.dskEntry.dskDevice.1 = STRING: /dev/sda5
  ...中略...
  enterprises.ucdavis.dskTable.dskEntry.dskTotal.1 = INTEGER: 840692160
  ...中略...
  enterprises.ucdavis.dskTable.dskEntry.dskAvail.1 = INTEGER: 516229888
  ...中略...
  enterprises.ucdavis.dskTable.dskEntry.dskUsed.1 = INTEGER: 281757536
  ...後略...

上記は、私の環境の場合ですが、1番に / の情報が入っています。
わかりにくいので、-On オプションで OID を数字で表します。

  $ snmpwalk -On -v 1 -c public localhost .1.3.6.1.4.1.2021.9
  ...中略...
  .1.3.6.1.4.1.2021.9.1.7.1 = INTEGER: 516229824
  ...中略...
  .1.3.6.1.4.1.2021.9.1.8.1 = INTEGER: 281757600
  ...後略...

前者が空き容量、後者が使用量です。
そして、mrtg.cfg の Target を以下のように指定します。

  Target[名前]: OID(&OID...):コミュニティ名@ホスト

上記の場合の例を以下に示します。

  Target[fs_snmp]: .1.3.6.1.4.1.2021.9.1.7.1&.1.3.6.1.4.1.2021.9.1.8.1:\
  public@localhost
  MaxBytes[fs_snmp]: 840692152
  Title[fs_snmp]: Filesystem / Used and Available

今回の宿題

今回の宿題は、

  SNMPv3でアクセスすると、パスワードがどう見えるか確認しましょう。

です。

コミュニティ名はバレバレでしたが、 SNMPv3 でユーザ名とパスワードを指定しながらアクセスするとどう見えるのか、 確認してみてください。
(具体的には、-d オプションをつけて snmpget を実行するだけです。)

あとがき

スマホから足を洗い、ガラケーに戻ったわたくしですが、新年早々、 気になる発表がありました。

Ubuntu for phones
http://www.ubuntu.com/devices/phone

Androidな端末で動作するケータイ版のUbuntu、のようです。

iPhone や Android とはまた別の操作性で、ディスプレイやキーボード、 マウスをつないで PC にもなる、というところが売りのようです。

PVっぽい動画を見る限りでは、指でなぞってアプリなどを切り替えたり、 Unityのランチャーから起動したり、 ケータイっぽい操作とUbuntuっぽい顔の両方を併せ持っているような印象を受けました。

それが革新かどうかはよくわかりませんが、 ケータイでも Ubuntu というのもいいんじゃないかな、という気がしています。

正式版は、2013年の10〜12月とか、2014年とか書いてありますので、 まだ先になりそうですが、動向はチェックしつづけたいと思います。

 

ホントのところは、日本発のモノ、日本ならではの発想のモノが出てきてほしいな、 と思うのですが…。
(自分のことを棚にあげて書いてみました。すぐ棚から降ろします…。)

 

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

 

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

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

「栗日記」- 年賀状、がんばった…と思うんだけどなぁ…。
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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本