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

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


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

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

「オープンソース焼きそば」なるものが、いっとき話題になりましたが、 オープンソースと焼きそばの関連性がわからず (作り方がオープンソースなわけでもないですし…あ、ソースつながりでしょうか?)、 釈然としない思いを抱えていました。

ですが、以下の駄洒落オンパレード! な記事を読んで、そういうのも悪くないかな、 と考えをあらためました。

話題沸騰、お湯も沸騰! あの「オープンソース焼きそば」をベンチマーク
http://journal.mycom.co.jp/column/komono/052/

まあ、なんといいますか、ばかばかしいと言ってしまうと身もふたもないのですが、 ここまで徹底してノリノリな姿勢を見せられますと、爽やかさすら感じられます。 まいりましたって感じですね。

…あ、それだけです。それでは今回も、はりきってまいります。

今回のお題 - プロセスアカウンティングでコマンド履歴を残す

ユーザがコマンドを実行しますと、通常は、 シェルのヒストリ機能が履歴を記録してくれると思います。

システムをおかしくしてしまった可能性のあるときや、 だれかが侵入した可能性のあるときなどに、シェルのコマンド履歴をたどることで、 なにを実行して今の状態になったのかを、ある程度推測することができます。

しかし、ヒストリ機能を無効にしたりされたりしますと、 履歴が残らなくなってしまい、途方に暮れてしまうことになります。
また、シェルが記録してくれる履歴は、コマンドの内容だけで、 いつ実行したのかという、時間の情報までは記録してくれません。

また、シェルのヒストリ機能とは別に、ユーザが、 いつどんなコマンドを実行したのか、まるっとログに残しておくことができますと、 不安の種が尽きないシステム管理者にとっては、 非常にありがたい情報となるのではないでしょうか。

というわけで今回は、プロセスアカウンティングを使って、 コマンド履歴を記録する方法について、ご紹介したいと思います。


プロセスアカウンティングは、Linux カーネルが直接行う機能です。

ですが、プロセスアカウンティングの開始や停止を行ったり、 ログを参照するためには、accton や lastcomm などのコマンドが必要になります。

これらのコマンドは、Fedora などでは psacct パッケージに、 Debian や Ubuntu などでは pacct パッケージに含まれます。
もし accton コマンドが見当たらなければ、それぞれ、 yum や apt などを用いて入手してください。

  # which accton
  /usr/bin/which: no accton in (パス)  ←ないよと言われています
  # yum install psacct                 ←Fedora/RedHat系の場合
  # apt-get install pacct              ←Debian/Ubuntu系の場合

Vine などパッケージがない場合は、 ソースパッケージから作成するのがてっとり早いと思います。 (以下は、Vine の場合の一例です。)

  % wget ftp://rpmfind.net/linux/redhat/enterprise/4/en/os/i386/\
  SRPMS/psacct-6.3.2-31.src.rpm
  (↑rpmfind.net から某ソースパッケージを入手しています。)
  % rpmbuild --rebuild psacct-6.3.2-31.src.rpm
  % sudo rpm -i ~/rpm/RPMS/i386/psacct-6.3.2-31.i386.rpm

プロセスアカウンティングの開始には、accton コマンドを用います。
以下のように、ログファイル名を引数に指定して実行します。

  # accton ログファイル名

すると、Linux カーネルが、プロセスアカウンティング情報を、 指定したログファイルに記録するようになります。
ファイル名を指定しなければ、プロセスアカウンティングを停止します。

  # accton

 

とはいえ、パッケージには、 プロセスアカウンティングを起動するためのスクリプトが入っていますので、 accton コマンドを直接起動することはほとんどないと思います。

Fedora などの場合ですと、以下を実行することで、 起動(start)もしくは停止(stop)させることができます。
その場合、ログファイルは、/var/account/pacct になります。

  # /etc/init.d/psacct start  (もしくは stop)

Debian 系の場合は、以下の通りです。
その場合、ログファイルは、/var/log/account/pacct になります。

  # /etc/init.d/acct start  (もしくは stop)

これらをサービスとして、自動的に起動するようにするには、 chkconfig コマンドや update-rc.d コマンドを用いる必要があります。
具体的な方法は、過去に取り上げていますので、そちらを参照ください。

Vol.031 - サービスを登録する
http://www.usupi.org/sysad/031.html


さて、これで、プロセスアカウンティング情報を記録できましたが、 中身を参照できないと、意味がありませんよね。

履歴の中を見るためのコマンドが、lastcomm コマンドです。
そのまま実行しますと、ログファイルの内容をすべて出力します。

  # lastcomm
  awk              root     __     0.00 secs Sun Jun 15 19:31
  0anacron         root     __     0.00 secs Sun Jun 15 19:31
  ...どばばば...

起動されたコマンドの履歴がすべて記録されていますので、 大量の出力が得られます。
特定のユーザが実行したコマンドに絞りたい場合は、--user オプションを使用します。

  # lastcomm --user ユーザ名

また、特定のコマンドの記録だけ参照するには、--command オプションを使用します。

  # lastcomm --command コマンド名

説明だけで終わらせてしまいますと、「実践」ではなくなってしまいますので、 lastcomm コマンドの実行例を、いくつかご紹介します。

まず、ls コマンドの記録だけを参照してみましょう。

  # lastcomm --command ls
  ls               usu     pts/0   0.00 secs Tue Jun 10 23:47
  ls               usu     pts/0   0.00 secs Tue Jun 10 23:36
  ls               root    pts/3   0.00 secs Mon Jun 10 22:50
  ...後略...

次に、以下のように、 usu ユーザが ls コマンドを実行した記録だけ出力させてみたいと思います。

  # lastcomm --command ls --user usu
  bash       F     usu     pts/0   0.00 secs Tue Jun 10 23:48
  bash       F     usu     pts/0   0.00 secs Tue Jun 10 23:48
  wc               usu     pts/0   0.00 secs Tue Jun 10 23:48
  ...後略...

予想に反して、ls コマンド以外の結果も得られてしまいました。
これは、どちらかの条件を満たす記録が出力されてしまうためです。
(つまり、ls コマンドか usu ユーザの実行した結果が出力されます。)

どちらかではなく、すべての条件を満たす記録だけに限定したい場合は、 --strict-match オプションを指定します。

  # lastcomm --strict-match --command ls --user usu
  ls               usu     pts/0   0.00 secs Tue Jun 10 23:47
  ls               usu     pts/0   0.00 secs Tue Jun 10 23:36
  ls               usu     pts/0   0.00 secs Mon Jun 10 22:58
  ...後略...

ちなみに、Linux カーネルが、プロセスアカウンティング情報を記録するタイミングは、 コマンドが終了するときです。

ですので、たとえば、sleep コマンドを実行しますと、sleep が終了するまで、 lastcomm コマンドの結果に出てきません。
以下のように、sleep コマンドを実行後、lastcomm コマンドで確認すると、 ちゃんと記録されています。

  # sleep 1
  # lastcomm --command sleep
  sleep            root    pts/3   0.00 secs Tue Jun 10 23:45

ですが、バックグラウンドで sleep を実行中に、lastcomm で確認しますと、 以下のように、記録には現れません。

  # sleep 100 &
  # lastcomm --command sleep
  sleep            root    pts/3   0.00 secs Tue Jun 10 23:45

もちろん、100秒後に sleep が終了した後であれば、現れます。

  # lastcomm --command sleep
  sleep            root    pts/3   0.00 secs Tue Jun 10 23:45
  sleep            root    pts/3   0.00 secs Tue Jun 10 23:45

 

さらにちなみに、みなさまの予想通りだとは思いますが、 ログファイルの参照には root の権限が必要です。
試しに、一般ユーザが実行しますと、以下のように叱られます。

  % lastcomm
  couldn't open file '/var/account/pacct': Permission denied

みんなのプロセスアカウンティングの情報を、だれでも参照できるのは、 さすがにまずいですもんね。

  % ls -l /var/account/pacct
  -rw------- 1 root root 28224  6月15日 19:31 /var/account/pacct

以上、プロセスアカウンティングの使用方法を、簡単にご紹介しました。

コマンドは、それこそ毎時毎分毎秒、大量に実行されますので、 情報量も半端ではありません。
プロセスアカウンティング機能を有効にされる際には、 ファイルシステムの空き容量にご注意ください。(…そして、宿題へと続きます。)

次回も、プロセスアカウンティングの続きを取り上げる予定です。
(今回の評判がものすごく悪くなければ…ですが…。)

宿題の答え

前回の宿題は、

  fakeroot で、setuid/setgid のコマンドを実行できない理由を考えて
  みましょう。

でした。

はい、まず、通常は、コマンドを実行すると、 コマンドを実行したユーザの権限で処理が行われます。これはご存じですよね。
ですが、setuid/setgid の設定されたコマンドを実行すると、ユーザではなく、 コマンドの所有者/所有グループの権限で動作します。

さて、LD_PRELOAD を設定しますと、 本来呼ばれるべきシステムコールや関数とは別の関数などが、 代わりに呼ばれる可能性があります。

もし、知らないうちに LD_PRELOAD が設定され、 いけないことをする関数が代わりに呼び出されるようになっていますと、 コマンドを実行した時点で、いけない処理が行われてしまう可能性があります。

もし、その実行したコマンドに setuid/setgid が設定されていますと、 ユーザの権限ではなく、コマンドの所有者/所有グループの権限で、 悪い処理が行われてしまいます。
(もし所有者が root だったりしますと、とっても危ないですよね。)

ですので、setuid/setgid のコマンドを実行する際には、 LD_PRELOAD の設定は無視されます。よって、fakeroot は動作しません。
(同様の理由で、LD_LIBRARY_PATH も無視されます。)

もちろん、setuid/setgid でない、普通のコマンドなどを実行する際も、 LD_PRELOAD や LD_LIBRARY_PATH の設定がおかしくないか、 たまには気をつけたほうがよいように思います。

今回の宿題

今回の宿題は、

  ファイルシステムの空き容量が少ないと、プロセスアカウンティングの
  記録はどうなるでしょうか。

です。

お試し環境であれば、比較的簡単に試せると思いますので、 試せる貴兄はやってみてください。試せない貴兄は、どうなるか想像しながら、 次回の宿題の答えをお待ちください。

あとがき

栗日記ぎゃらりーを常設していただいている、長野県は小布施にあります 栗庵風味堂さんにて、6月21日に、 初栗受賞記念感謝祭という催しが開催されます。

風味堂さんの「初栗」というお菓子が、 全国菓子大博覧会で農林水産大臣賞など受賞されたのを記念して、 初栗が安く買えたり、栗日記ぬりえ大会が行われたり、 いろいろお祭り的行事が行われます。

わたしも、現地で栗バッジを売ったり、 栗日記ぬりえ大会でなにかしたりする予定です。興味のあるかたや、 近くにお住いのかたは、ぜひ参加してみてくださいませ。 (メルマガ見てますとか声をかけていただけますと、 うれしくて号泣するかもしれません。)

本来なら、プログラマー的な催しで、なにかやるべきなのかもしれませんが、 そうでなくても、いろいろ学ぶべきことはあると思います。
行動しないで後悔するよりも、行動して失敗することのほうが、 後々の糧になると思って、積極的に失敗してこようと思います。

…あ、あとがきもそれだけです。
次回は、上記イベントでずたぼろになった心や体にむちを打って、 お届けする予定です。あまり期待せずに、お待ちいただけますと幸いです。

 

今回も、ここまで読んでいただき、ありがとうございました。
それでは、次回は 7月6日(日) 頃に、お会いしましょう!

 

「いますぐ実践! 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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本