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

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


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

こんばんは,うすだです.

先日,マイクロソフトの無料セミナーに行ってきました.

SECURE SYSTEM Training Tour 2005 (5月でおわってしまいますが…)
http://www.event-registration.jp/events/sstt05/

未だに,Windows のことはよくわからないのですが,それではいかんよなと思い, 受けてきました.無料にしては気合いの入ったセミナーでした.

印象的だったのは,「多層防御」という言葉が頻繁に出てきたことです.
ウィルスやワームが蔓延している今となっては当たり前なんですが, こうやってセミナーで直接教わると,やべぇやらなきゃ,と思わせられます.
これからは,アプリケーションレベルでの防御とか,考えてみようかなと思いました.

しかし,Windows + ISA Server でファイアウォール, はちょっと勇気がいるかもしれませんね.偏見かもしれませんが.

それでは,今日も,はりきってまいりましょう!

今週のお題 - WWW を使ってログをとる デラックス

がくんと読者数が減るわけでもなく,抗議のメールが殺到したわけでもありませんでしたので,宣言通り,続きをやらせていただきます.

ちなみに,今回は,先週ご紹介した内容に関して,特になにも説明をしていません. これなんだったっけ? というものがありましたら,お手数ですが, バックナンバーをご覧ください.
http://www.usupi.org/sysad/011.html

前回は,ssh で遠隔ログインした時,WWW サーバにアクセスして, WWW のログに記録するところまでを行いました.
今回は,WWW のログに記録するのではなく,何かアクションを起こしてみようと思います.

Apache は,以下のようにログのパスを指定すると,そのファイルにログを記録してくれます.

  CustomLog /var/log/httpd/access_log combined

しかし,Apache はそれだけにとどまりません.rotatelogs などお使いの方はご存知だと思いますが, ファイルではなく,プログラムに渡すこともできてしまうのです.すごいぞ Apache!
# 行末を \ で折り返していますが,実際は1行です.

  CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log 86400" \
  combined

上記のように設定すると,rotatelogs の標準入力に,ログを渡します.
rotatelogs は,標準入力からそのログを読み込み,決められたファイルに記録します. その結果,うまいことログのローテーションがなされます.

それでは,この機能を利用して,またまたメールを飛ばすものを作ってみようと思います.

ここで,鋭い方は,メールの通知を Apache 側でやらせる必要があるのか, という疑問を持たれたのではないでしょうか.
はい,確かにそうなんですが,例えば,遠隔ログイン先のマシンは, メールを送信できるように設定していないとか, メールを送信できないポリシーやフィルタの設定がある,といった場合に, 使えるのではないかと思っております.はい.

そこで,まず,CustomLog に指定するプログラムを,以下のようにします.
# これも,行末を \ で折り返している箇所は,実際は1行です.

  #!/usr/bin/perl
  my $MAIL_FROM = "kuri\@usupi.org"; # メールの送信元アドレス
  my $MAIL_TO = "usu\@usupi.org";    # メールの宛先
  my $SENDMAIL_CMD = "/usr/sbin/sendmail -oi $MAIL_TO";

  # 本文が $message のメールを送信するサブルーチン
  sub send_mail {
      my ($message) = @_;
      if(open(MAIL, "|$SENDMAIL_CMD")) {
          print MAIL "From: $MAIL_FROM\nTo: $MAIL_TO\n";
          print MAIL "Subject: [ssh] notice\n\n";
          print MAIL $message;
          close MAIL;
          1;
      } else {
          0;
      }
  }

  # メインはこちら
  while(<>) {
      chop;
      if(/^(\S+).+\[([^\]]+)\].*\/ssh_access_((\d+\.){3}\d+)_(\d+)_\
((\d+\.){3}\d+)_(\d+)/) {
          $message  = "Source : $3 port $5\n";
          $message .= "Destination : $6 port $8\n";
          $message .= "Date : $2\n";
          $message .= "WWW-Client : $1\n";
          if(!&send_mail($message)) {
              print STDERR "$2 : $3:$5 to $6:$8 : Failed.\n";
          }
      }
  }

同じものが、こちらにあります。
http://www.usupi.org/sysad/012-1_pl.txt

while 文で,標準入力からログを読み込み,パターンにマッチする場合に send_mail サブルーチンでメールの送信を行っています.

ちなみに,send_mail サブルーチンが失敗したとき,標準エラー出力にメッセージを出力していますが,これは, 実は Apache のエラーログに出力されます.便利ですね. いいですね.Apache 最高ですね.

さて,この Perl スクリプトを,仮に /usr/local/sbin/sshnotice.pl としましょう. その場合,Apache の設定を,以下のようにします.

  CustomLog "|/usr/local/sbin/sshnotice.pl" combined env=ssh_log

ssh_log は,先週ご紹介した,SetEnvIf で設定したものです.
一応,env=ssh_log がなくても問題はありません.パターンマッチングを行って, 関係のないログは処理しないからです.

あとは,$HOME/.ssh/rc で,WWW にアクセスするようにしておけば, 少々まわりくどいですが,遠隔ログインしたことが, Apache 経由でメールで通知されるようになります.めでたしめでたし,です.

以上,いつものごとく,メールを飛ばすものにしてしまいました.
別にメールじゃなくても,SNMP のトラップをマネージャに送信したり, HTML を生成して WWW でログを参照できるようにしたりなど, いろいろと応用できそうですね.
というわけで,必然性はともかく,なにか作ってみてはいかがでしょうか.

宿題の答え

先週の問題は,

  ssh で遠隔ログインした時に,WWW サーバにアクセスし,そのアクセス
  が成功したかどうかわかるようにしてください.

でした.
成功したかどうか,というのは,wget コマンドが 0 を返すかどうかで判断します. ですので,$HOME/.ssh/rc を以下のようにすればよいです.

  #!/bin/sh
  wget -O /dev/null \
  http://wwwserver/ssh_access_`echo $SSH_CONNECTION | tr '\040' _` \
  > /dev/null 2>&1 && echo "OK" || echo "NG"

前回ご紹介したスクリプトに,ちょっと継ぎ足すだけ,ですね.
wget が成功すれば OK と出力され,失敗すれば NG と出力されます.
# wwwserver には,本物の WWW サーバを指定してください.

今週の宿題

今週の宿題は,こちらです.

  メールで通知しつつ,ログも残してくれる,CustomLog 用のプログラム
  を作ってください

今週のお題で紹介した Perl スクリプトをもとに,ちょこっと作り直してみてください.

あとがき

ふぅ,今週は本文が長かったですね.すみません.
来週は,もうちょっと簡潔にまとめます.ネタはまだ決めていませんが….

さてさて,突然ですが,ようやく,読者数が300名に達しました.
いや,ほんと,ありがとうございます.> 読者のみなさま

特に,宣伝も相互紹介も行っていないので,なんで増加しているのか, わかりません.不思議です.不可思議です.
こんなところで紹介されてて登録したよ,という方がいらっしゃいましたら, 是非ご連絡ください.

…あーいえ,宣伝されていないというのはウソです.
Teddy さんところのメルマガで,何度も紹介していただいておりました.

艶々Osakan講座
http://www.mag2.com/m/0000146691.html

艶たん「Teddy&Mikeの単語帳」
http://www.mag2.com/m/0000151531.html

メルマガのタイトルだけだと,内容を推測するのが難しいかもしれませんが, どちらも英語のメルマガです.
前者は,大阪弁も同時に学べます.トライリンガルになれますね.:-)
後者は,平日の毎日,英単語を3つ教えてくれます.例文つきです.

しかし,無料でいろいろ教えてくれるメルマガって,ほんといいですよね.
私は,ぱかぱかいっぱい登録して,長続きするメルマガだけに絞るようにしています. 読まなくなったら解除,です.

ちなみに,今数えてみたら,登録しているまぐまぐのメルマガは,24誌ありました. 意外と少ないなと感じましたが,みんなこゆいメルマガなので, そんなものかもしれません.
購読誌がおおすぎると,時間が足りなくなって,読まなくなるものが出てきて解除するので,うまくバランスがとれているのでしょうね.

今週も,ここまで読んでいただき,たいへんありがとうございました.
それでは,また来週に,お会いしましょう!

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

バックナンバーは,こちらにどっさりと.
http://www.usupi.org/sysad/backno.html

あ,「栗日記」も,懲りず飽きずにやってます!
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)


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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本