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

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


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

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

8月末に、Apache のRangeヘッダの処理の脆弱性が話題になりました。

CVE-2011-3192
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3192

この脆弱性をつっつくと、いとも簡単にメモリを食いつぶして、 OSごと制御不能(かそれに近い状態)になります。ですので、 早急にパッチが公開され、アップデートパッケージもあちこちで公開されています。

本業の会社では、Linuxなサーバの保守もやっていますので、 あちこちでapacheパッケージのアップデートの話が舞い込んできています。

仕事があることはありがたいことなのですが、 WWWのサービスは基本的に長時間止められないことが多いため、 作業は常に緊張を伴います。

というわけで、ドキドキしながら、アップデートを行っています。
この作業に慣れた頃には、依頼もなくなっているんだろうなと思いつつ。

仕事には適度な緊張感が必要ですよね、と自分に言い聞かせつつ、 今回もはりきってまいりたいと思います。

今回のお題 - rsyslog ならではの機能を使用する

前回は、rsyslog のさわりだけで終わってしまいました。

Vol.207 - rsyslog の設定をしてみる
http://www.usupi.org/sysad/207.html

syslog の基本的なところをご紹介しました。ですので、今回は、 rsyslogならではの機能について触れたいと思います。
具体的には、以下の3本立てでお送りする予定です。

  • メッセージのフォーマットを変える
  • 出力先を年月日などで変える
  • フィルタで必要なメッセージだけを記録する

まずはテンプレートから

rsyslog では、出力するログのフォーマットなどを変更できます。
その際に、「テンプレート」というものを使用します。
書式は以下の通りです。

  $template テンプレート名,"中身"

テンプレート名には、テンプレートの名前を指定します。 …超当たり前のことを書いていますね。すみません。
中身には、ログなどの出力内容を、「プロパティ」を使って指定します。
プロパティには、メッセージそのもの(msg)やホスト名(hostname)、 日時(timestamp や timegenerated)、ファシリティ(syslogfacility-text)、 プライオリティ(syslogpriority-text) などなど、いろいろあります。
詳しくは、以下か、パッケージ内の同名のファイルを参照してください。

The Rsyslogd Property Replacer
http://www.rsyslog.com/doc/property_replacer.html

たとえば、out1 という名前のテンプレートで、ログが生成された日時とプライオリティ、 そしてメッセージの内容を指定するには、以下のように記述します。

  $template out1,"%timegenerated% %syslogpriority-text% %msg%\n"

メッセージを変更する

それでは実際に、ログの出力を変更してみましょう。
先ほどの out1 を使って、 local5 の info 以上のプライオリティのログを /var/log/local5-out1.log へ出力するには、以下を追加します。

  $template out1,"%timegenerated% %syslogpriority-text% %msg%\n"
  local5.info    /var/log/local5-out1.log;out1

ログファイル名の後に、「;」とテンプレート名を指定します。

追加する設定ファイルは、/etc/rsyslog.conf でも /etc/rsyslog.d/以下のファイルでも、 どちらでも構いません。
追加しましたら、rsyslogd にその旨をお伝えします。
(Ubuntu な方は、前回同様、事前にファイルを作ってください。)

  # service rsyslog reload

そして、local5.info (かそれ以上)に何か出力してみましょう。

  $ logger -p local5.info "This is a template test."

すると、/var/log/local5-out1.log に出力されます。

  # cat /var/log/local5-out1.log
  Aug 18 09:03:45 info  This is a template test.

ログファイルを年月日で分ける

通常は、logrotate を使って、日や週などの単位でログを分けられていると思います。 ですが、rsyslog 単体でも、日や週などの単位で分けることが可能です。

その場合も、テンプレートを使用します。
たとえば、/var/log/local5-YYYY-MM-DD.log というファイル名に出力をするには、 以下のように指定します。
(念のため書くと、YYYY が西暦年、MM が月、DD が日を示しています。)

  $template file1,"/var/log/local5-%$year%-%$month%-%$day%.log"
  local5.info    ?file1

テンプレート名を、安直に file1 としています。
そして、ログファイル名のところに「?」とテンプレート名を続けて書くと、 テンプレートに従ったファイル名に出力してくれます。

実際に rsylog サービスを reload して logger コマンドなどでログへの出力を行うと、 ファイルが作成されています。

  $ date
  2011年  8月 18日 日曜日 22:48:54 JST
  $ logger -p local5.notice "This is a test for log file name."
  $ ls /var/log/local5-2011*
  /var/log/local5-2011-08-18.log

ちなみに、年月日に限らず、いろんな分け方ができます。たとえば、 以下のように指定すると、ファシリティとプライオリティで分けられます。
(行末の「/」は、実際には改行せず次の行へ続くという意味です。)

  $template file2,"/var/log/syslog-%syslogfacility-text%-\
  %syslogpriority-text%.log
  *.*            ?file2

ただし、これを実際に設定しますと、 /var/log/syslog-kern-info.log などのログファイルがたくさんできますので、 ご注意ください。

さらにちなみに、出力フォーマットののテンプレートも指定できます。

  local5.info    ?file1;out1

フィルタで制限する

特定のメッセージだけを記録したい場合は、「フィルタ」を使います。
プロパティが、指定した値と一致するなどの条件を満たしたときにだけ、 ログファイルに出力などを行います。
以下のように、「:」とプロパティ名、オペレータ、そして比較する値を指定します。 その後は、いつものようにログファイル名のパスなどを指定します。

  :プロパティ名,オペレータ,"値"  ログファイルなど

オペレータには、含まれる(contains)、同じ(isequal)、 正規表現(regex)などを指定します。また、オペレータの先頭に「!」をつけると、 否定になります。
たとえば、メッセージに test という文字を含まないログだけを記録するには、 以下のように指定します。

  :msg,!contains,"test"    /var/log/syslog-nottest.log

条件が一つでない場合は、「if〜then」を使って指定します。

  if 条件 then   ログファイルなど

条件には、「$プロパティ名 オペレータ '値'」や、 これら条件を「and」や「or」でつなげたもの、 もしくは「not」をつけて否定にしたものなどを指定できます。(ややこしいですね…。)

オペレータには、先ほどの他に、「==」「!=」「>」「<」なども使用することができます。

たとえば、さっきのフィルタを if〜then に書き換えると、以下のようになります。

  if not ( $msg contains 'test' ) then /var/log/syslog-nottest.log

また、ファシリティが local5 で、 メッセージに test を含まないログを記録したい場合は、以下のように指定します。

  if ( $syslogfacility-text == 'local5' ) and \
      not ( $msg contains 'test' ) then \
          /var/log/local5-nottest.log

プロパティ名に「$」がついたり、値を「"」じゃなく「'」で囲むなどの違いがあります。 ややこしいのでご注意ください。

フィルタの詳細につきましては、以下か、 パッケージ内の同名のファイルを参照してください。

Filter Conditions
http://www.rsyslog.com/doc/rsyslog_conf_filter.html

おわりに

以上、rsyslog ならではの機能をご紹介しました。

といっても、まだまだご紹介しきれていません。とはいえ、 こんな調子で延々と続けたら、まだあと5〜6回くらい続いてしまいそうです。
ですので、次回くらいで終わりにさせていただこうかなと思います。

あと、例では、テンプレート名がかなり大雑把でした。実際に設定される際には、 他とかち合わないよう、ひねって命名してくださいませ。

宿題の答え

前回の宿題は、

  設定ファイルに誤った記述があるとどうなるか、試してみましょう。

でした。

まずは、前回お試しで作った /etc/rsyslog.d/sysad-test.conf に、 以下の間違った記述を混入させてみましょう。

  local5.info    /var/log/local5.info.log
  This is a bad line.                      <=  この行を挿入
  local5.=info   /var/log/local5.=info.log

特に説明は不要だと思いますが、間に変なのを入れました。
そして、rsyslog を再起動(設定の再読み込み)してみましょう。

  # service rsyslog reload

そして、logger コマンドで何か出力させてみます。

  # logger -p local5.info "This is a bad line test."

すると… /var/log/local5.info.log と local5.=info.log の双方に出力されています。
どうやら、間違った記述は、さらりとスルーしてくれるようです。

念のため、/etc/rsyslog.conf にも間違った設定を混入しましたが、 特に問題なく動作しています。

今回の宿題

今回の宿題は、

  ファシリティが mail で、22時〜5時(直前)までのログを記録する設定
  をしてみましょう。

です。

条件が複数ありますので、if〜then でフィルタすればよさそうです。

ただ、関連するドキュメントが少ないですので、 正しい動作をするまでは試行錯誤するしかない、というのが現状のようです。

というわけで、いろいろ試行錯誤してみてください。

あとがき

昔は、cat コマンドで以下のようにリダイレクトすると、 大事なファイルがきれいさっぱり消えてしまいました。

  $ cat important.txt > important.txt

ですが、今どきは、実行すると上書きされず、ちゃんと教えてくれます。
(日本語がおかしいですが。ちなみに以下は Ubuntu の場合です。)

  $ cat important.txt > important.txt
  cat: important.txt: 入力ファイルが出力ファイルが同じファイルです

最初は、リダイレクトがシェルの機能ですので、 シェルがチェックをしているのかと思いました。ですが、 他のコマンドでは普通に実行されます。
それに、上記のエラーメッセージは、最初が「cat:」となっています。

ということは、cat コマンドがリダイレクトを検知しているということになります。 そんなことができるのでしょうか。

 

…と思いましたが、いとも簡単にできることがわかりました。
標準出力に対してfstatシステムコールを発行すると、 stat構造体に情報が格納されて返ってきます。

  struct stat st;
  fstat(STDOUT_FILENO, &st);  // エラー処理は省略
  printf("dev=%d ino=%d\n", (int)st.st_dev, (int)st.st_ino);

リダイレクトしたときは、リダイレクト先のファイルの情報が、 stat構造体に格納されて返ってきました。
cat コマンドでは、デバイスを示す st_dev と、 ファイルシステムで一意の値となる st_ino で、 ファイルが一致するかどうか判別していました。

ただし、入力のリダイレクトは、ノーチェックでした。

  $ cat important.txt
  大事なファイルの中身...
  $ cat < important.txt > important.txt
  $ cat important.txt
  $ 

大事な中身のファイルが、きれいさっぱりなくなります。
ご注意くださいませ。

 

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

 

「いますぐ実践! 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/ (モバイル栗日記)


[バックナンバーのトップへ] [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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本