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

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


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

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

最近、朝起きて、会社に行って仕事して、帰ってきたら栗の絵を描いて、 もろもろの残作業をしたりしなかったりして寝る、という単調な生活を、 延々と繰り返していることに気づきました。

社会に対してなにか有意義なことを行うためには、その栄養の素となる、 新鮮な情報を必要とするように思います。ですが、 限られた範囲内で単調な生活を行っているだけでは、 大切な栄養が不足してしまいがちです。
いまさらですが、このままじゃまずいぞ、と焦ってきました。

というわけで、というわけでもないのですが、今週末、大阪の実家を経由して、 奈良へ遊びに行ってきました。

春休み最後のウィークエンドであることや、桜が満開に近いこと、 ドラマの影響などから、奈良公園は、たいへんな賑わいでした。
それでも、重要文化財を間近で観たり、 鹿のかわいさやあざとさを実際に目の当りにすることで、 理屈抜きに楽しむことができ、 凝り固まった頭がずいぶん軟らかくなったように思います。

ひょっとすると、新たな情報が必要なのだということを無意識に感じて、 旅などに行きたいという欲求をひねり出しているのかもしれないですね。

はい、特にオチはありませんので、今回も、はりきってまいりましょう!

今回のお題 - ログを暗号化してメールで送る

前回、ログインに失敗しました的ログを抽出し、その内容をメールで送る方法を、 ご紹介しました。

Vol.133 - 特定のログをメールで通知する
http://www.usupi.org/sysad/133.html

しかしながら、よく考えますと、ユーザアカウントなどを含むやもしれぬ情報を、 基本的に平文で扱うメールで送ってしまうということは、 場合によっては情報漏洩につながる恐れがあります。
(前言撤回! みたいで申し訳ありませんが…。)

ですがやはり、緊急度の高い情報は、いち早く手に入れたいもの。
そこで今回は、大事なログを、暗号化してやや安全にメールで送る方法について、 ご紹介したいと思います。


暗号化…と言いますと、すでに以前、GnuPG をご紹介しておりました。

Vol.087 - ファイルを暗号化する
http://www.usupi.org/sysad/087.html
Vol.088 - 暗号化したファイルをやりとりする
http://www.usupi.org/sysad/088.html

もちろん、これはこれで、安全な方法だと言えると思います。
ですが、双方で GnuPG などが使える必要がありますし、 前もって公開鍵を交換しておく必要があるなど、やや敷居が高いように思われます。

ですので今回は、もう少しお気楽に、ZIP で圧縮し、 パスワードをつけるという方法で、暗号化を行ってみたいと思います。

ただし、ZIP の場合、共通鍵暗号方式を用いますので、 送り側と受け側の双方とも同じパスワードを知っている必要があります。
また、ZIP 自体は、暗号アルゴリズムをいろいろ選べるようになっているようですが (DES, 3DES, RC4, AES など)、 主要なディストリビューションにもれなくついてくる zip コマンドは、 DES のみ対応のようで、安全性にやや疑問符がつくようにも思われます。

ですが、今回の場合、システム管理者内でパスワードを決めておけばよいですし、 万が一漏洩した場合のリスクは、それほど高くないと思いますので、 今回は ZIP ファイルを使ってやりとりしてみたいと思います。


言い訳が終わりましたので、まずは、 ZIP ファイルの作成から始めてみることにしましょう。

ZIP ファイルを作成するには、zip コマンドを用います。
-r オプションに続いて、ZIP ファイル名と、中に入れるファイルを羅列します。

  % zip -r foo.zip bar.txt baz.txt
    adding: bar.txt (deflated 62%)
    adding: baz.txt (deflated 61%)

この場合、bar.txt と baz.txt を圧縮して、 foo.zip というファイルに押し込めたことになります。

作成した ZIP ファイルの内容を確認したい場合は、unzip コマンドを、 -l オプションつきで実行します。

  % unzip -l foo.zip
  Archive:  foo.zip
    Length     Date   Time    Name
   --------    ----   ----    ----
     104357  06-13-07 11:58   bar.txt
      78368  02-20-08 16:14   baz.txt
   --------                   -------
     182725                   2 files

実際に伸長する場合は、そのまま unzip コマンドを実行します。
すると、カレントディレクトリ以下に、各ファイルが伸長されます。

  % unzip foo.zip
  Archive:  foo.zip
    inflating: bar.txt
    inflating: baz.txt

では次に、パスワードつきの ZIP ファイルを作成してみましょう。
そのためには、zip コマンドを、-e オプションつきで実行します。

  % zip -er foo.zip bar.txt baz.txt
  Enter password: (パスワードを入力します)
  Verify password: (同じパスワードを入力します)
  ...

実行しますと、上記のようにパスワードを聞かれますので、 パスワードを2回入力します。問題なければ、 パスワードで保護された ZIP ファイルが作成されます。

これを unzip コマンドで伸長するには、パスワードが必要になります。

  % unzip foo.zip
  Archive:  foo.zip
  [foo.zip] bar.txt password: (パスワードを入力します)
    inflating: bar.txt
    inflating: baz.txt

もちろん、パスワードを間違えると、伸長に失敗します。

  % unzip foo.zip
  Archive:  foo.zip
  [foo.zip] bar.txt password: (間違ったパスワードを入力します)
  password incorrect-reenter: (同上)
  password incorrect-reenter: (同上)
     skipping: bar.txt                 incorrect password
  ...後略...

これで、大事なログを、ZIP ファイルに託すことができますね。


…と言いたいところですが、 ログの内容から ZIP ファイルを作成する度にパスワードの入力が必要ですと、 自動化することができません。

そこで、パスワードを入力しなくて済むようにしたいと思います。
-P オプションを使用すると、 パスワードとなる文字列を指定することができます。
たとえば、「TeSt01」というパスワードをつけるには、 以下のように zip コマンドを実行します。

  % zip -P TeSt01 -r foo.zip bar.txt baz.txt
    adding: bar.txt (deflated 62%)
    adding: baz.txt (deflated 61%)

この方法を用いますと、スクリプト内などに生のパスワードを記述する、 というリスクを伴いますが、たとえば root しか読めないようにすることで、 リスクを緩和することができるように思います。


さて、それでは、前回の続きで、抽出したログを、 パスワードつきの ZIP ファイルにして、メールで送信してみたいと思います。
そのため、以下のようなシェルスクリプトを作ってみました。

  #!/bin/bash
  # ↓ 作業場
  WORKPATH=/tmp/sysad_134
  # ↓ ZIPファイルのパスワード
  PASSWORD="sYs134Ad"
  # ↓ 作業場に移動して、無限にいろいろ行う
  cd $WORKPATH
  while [ 1 ]; do
      allmessages=""
      # ↓ 吐かれたログをパイプから収集
      while read -t 60 message; do
          allmessages="${allmessages}${message}@RET@"
      done < /var/log/authpriv
      # ↓ ログの内容を通知すべきなら、以下を実行
      if [ "z`echo $allmessages | grep -i fail`" != z ]; then
          # ↓ この時点で $TXTFILE は作成される
          TXTFILE=`mktemp syslog_auth_messages-XXXXX`
          ZIPFILE=${TXTFILE}.zip
          # ↓ 抽出したログを $TXTFILE に書き出す
          echo $allmessages | sed 's/@RET@/\n/g' >> $TXTFILE
          # ↓ ZIPファイルを作成
          zip -q -P "$PASSWORD" -r $ZIPFILE $TXTFILE
          # ↓ uuencode を介して Mail で送信
          uuencode $ZIPFILE < $ZIPFILE | \
              /usr/bin/Mail -s 'syslog authpriv' root
          # ↓ $TXTFILE と $ZIPFILE は消しておく
          rm -f $TXTFILE $ZIPFILE
      fi
  done

一時的にファイルをいくつか作成しますので、上記では、 /tmp/sysad_134 というディレクトリの下で作業するようにしています。

while 文の中は、前回のスクリプトとほぼ同様です。
ただ、そのまま Mail コマンドで送信するのではなく、 mktemp コマンドで作成したファイルに一旦書き出し、 それを zip コマンドでパスワードつきの ZIP ファイルに格納します。 そして、uuencode コマンドでメールに貼りつけられる形式にして、 Mail コマンドで root 宛に送信します。

このファイルを auth2mail.sh というファイル名で保存したら、 root なひとだけ参照できる状態にしておきます。

  # chmod 700 auth2mail.sh

そして、前回と同様に、 /etc/syslog.conf の設定や /var/log/authpriv の作成を行いましたら、 ディレクトリを作成し、上記を実行します。

  # mkdir -m 700 /tmp/sysad_134
  # ./auth2mail.sh

特にエラーなど発生していないようでしたら、 実際にログインに失敗してみてください。 数分後に以下のようなメールが届けば、成功です。

  From: root@hoge.usupi.org
  To: root@hoge.usupi.org
  Subject: syslog authpriv

  begin 644 syslog_auth_messages-18663.zip
  M4$L#!!0`"0`(`(JUACA.$$Z@'`$``'<$```:`!4`<WES;&]G7V%U=&A?;65S
  M<V%G97,M,3@V-C-55`D``[33^$>TT_A'57@$```````<[FWQG(\8;*.W(=&2
  ...中略...
  M&@`-```````!````@($`````

このメールをファイルに出力し、uudecode コマンドで処理することで、 ZIP ファイルを抽出することができます。

  % uudecode mail.txt
  % unzip syslog_auth_messages-18663.zip
  ...後略...

あ、もし、uuencode コマンドや uudecode コマンドが見当たらない場合は、 sharutils パッケージをインストールしてくださいませ。


uuencode/uudecode もいいけど、 MIME のほうがいいなあ…という貴兄もいらっしゃるのではないかと思います。

もし、ご使用のマシンに metamail パッケージがありましたら、 metasend コマンドを利用して、MIME なメールにすることが可能です。
その場合、上記スクリプトの以下の部分を、

          # ↓ uuencode を介して Mail で送信
          uuencode $ZIPFILE < $ZIPFILE | \
              /usr/bin/Mail -s 'syslog authpriv' root

以下に差し替えてください。

          # ↓ metasend でメールを送信
          metasend -b -s 'syslog authpriv' -t root -e base64 \
              -m application/octet-stream -f $ZIPFILE

マルチパートじゃないのがアレですが、そのあたりは、 大目に見てやっていただけますと幸いです。


以上、パスワードで保護された ZIP ファイルを使って、 抽出したログをメールで通知する方法を、ご紹介しました。

もう少しちゃんとした MIME にたどり着きたかったのですが、 試しに作成してみたところ、 Perl スクリプトがとてもシンプルとは言えないモノになってしまいましたので、 そっと心の内にしまっておきました。

ですが、上記でも、本質的には十分機能を満たしていると思いますので、 まずは、百聞は一見にしかずということで、実際に動かして体験してみてくださいまし。

宿題の答え

前回の宿題は、

  プロミスキャス・モードになったときに、メールで通知しましょう。

でした。

これは、カーネルメッセージですので、facility は kern になります。
前回と同様の手順で、ずらっとご紹介していきましょう。

まずは、/etc/syslog.conf に以下を追加してください。

  kern.*      /var/log/kern

そして、パイプを作成します。

  # mkfifo -m 600 /var/log/kern

設定変更を syslogd に知らせます。

  # /etc/init.d/syslog reload
  もしくは
  # /etc/init.d/sysklogd reload

肝心のスクリプトは、以下のようなものをご用意しました。

  #!/bin/sh
  while read message; do
      if [ "z`echo $message | grep promiscuous`" != z ]; then
          if [ "z`echo $message | grep entered`" != z ]; then
              act="ENTER"
          elif [ "z`echo $message | grep left`" != z ]; then
              act="LEFT"
          else
              act="MISC"
          fi
          echo $message | /usr/bin/Mail -s "[promisc] $act" root
      fi
  done < /var/log/kern

1回につき2行しか出力されませんし、 すぐにキャプチャを止めるかどうか推測できませんので、 2通届いてもいいや的に考え、1行ずつ読み込む版をベースに作成しました。

やっていること自体は単純で、/var/log/kern から読み込んだ1行のログに、 promiscuous という文字列を含んでいれば、 Mail コマンドを用いて root にご連絡します。

ただ、それだけではつまらないので、 プロミスキャス・モードに入ったのか出たのかがわかるよう、 題名に記すようにしました。

宿題の答えとしては以上ですが、ログイン中のユーザの一覧など、 付加的な情報も合わせてメールすると、よいかもしれませんですね。
余力のある貴兄は、なにかひと工夫加えてみてください。

今回の宿題

今回の宿題は、

  GnuPG を使って、ログを暗号化し、メールで送信してみましょう。

です。

過去に GnuPG をご紹介した手前、ないがしろにはできませんので、 同等のモノを作ってみたいと思います。
ただし、自動化のため、パスフレーズはなしで行おうと思います。

あとがき

冒頭であれこれ言いましたように、生活が単調ですので、 なるべく幅広く情報が得られるようにと思い、 本業とは異なるジャンルの本を読むように心がけています。

とはいえ、本屋さんや図書館に行って、手当たり次第に選ぶというわけにいきません。 自分で開拓するには、お金も時間もかかりますので、庶民なわたくしとしましては、 偉いひと賢いひとの書評を参考にして、 なるべくお金も時間も節約したいところであります。

というわけで、かつてはいろんな書評のメルマガを購読していましたが、 過度期の淘汰を経て、最近は以下の2つに絞られました。

1分間書評!『一日一冊:人生の智恵』
http://www.mag2.com/m/0000094236.html
毎日3分読書革命!土井英司のビジネスブックマラソン
http://www.mag2.com/m/0000135008.html

もちろん、ひとによって好みは違いますから、 上記で紹介されている本が必ずツボにはまるとは限りません。
ですが、上記メルマガを経由して出会った本によって、 自分の考え方などが大きく変わったということも、いくつかありました。

また、上記のメルマガに共通しているのは、 人生や本に対する熱い気持ちが文章に表れているところではないか、と思います。

やはり、ひとの心を動かすのは、情熱だと思います。人生を変えるようないい本を、 情熱を持って紹介し、読者の成功を願うという行為は、 とてもすばらしいと思います。
わたしも、理屈抜きに熱中できて、かつその行為が社会に貢献するようになるべく、 模索しながらいろいろがんばりたいと思いました。

 

今回も、ここまで読んでいただき、ありがとうございました。
それでは、次回は 4月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/ (栗日記ブログ)


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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本