連載
» 2003年12月20日 00時00分 公開

止められないUNIXサーバのセキュリティ対策(6):特権ユーザーの安全性向上を行うsudoの設定例 (2/2)

[木村靖,三井物産GTI]
前のページへ 1|2       

コマンドの実行履歴を残す

  sudoでは、コマンド実行ごとに実行結果がログに保存される。そのため、sudoで「いつ、だれが、どこから、どのコマンドを実行した」を知るためには、保存されたログを参照すればよい。

 例えば、「sudoless /var/log/secure」を実行した場合、syslogを介して以下の内容がログファイル/var/log/messagesに保存される。

Oct 8 03:35:19: atmarkit sudo: kimu : TTY=ttyp7 ; PWD=/home/kimu ; USER=root ; COMMAND=/usr/bin/less /var/log/secure

 通常であれば、これで問題ない。しかし、前回説明したとおり、「sudo -s」などで新たにシェルを実行した場合、それ以降にそのシェル上で実行したコマンドは、ログには残らない。この問題は、suコマンドでも同じことがいえる。

kimu@atmarkit{505}% sudo-s
root@atmarkit{505}% (これ以降に実行するコマンドはシェルを終了するまでログに残らない)

 この問題の解決策として、以下の方法が挙げられる。

  • (a)毎回scriptコマンドを実行して、内容をファイルに保存する
  • (b)システムアカウンティング機能を有効にする
  • (c)実行シェルを改造し、ログを保存するようにする。

 これらには、それぞれ長所と短所があるが、本稿では、既存環境で比較的容易に実現可能であることから、(a)と(b)について説明する。

scriptコマンドで実行内容を保存する

 実行したコマンドの内容を記録しておく方法として、一番手軽に行えるのがこのscriptコマンドを使う方法だ。使い方は非常に簡単で、以下の形式で実行するだけだ。

script 保存先ファイル

 例えば、/tmp/sagyo-2003-12-17.logというファイルに記録する場合は、以下のとおり実行する。

% script /tmp/sagyo-2003-12-17.log

 scriptコマンド実行後のシェル上で実行したコマンドおよび実行結果が/tmp/sagyo-2003-12-17.logファイルに保存される。保存先のファイルはテキスト形式であるため、cat、more、lessコマンドで参照することができる。

% cat /tmp/sagyo-2003-12-17.log
Script started on Fri Dec 19 01:38:55 2003
kimu@atmarkit{501}% cd /etc
kimu@atmarkit{502}% sudo -s
root@atmarkit{501}% cp inetd.conf inetd.conf.old
root@atmakrit{502}% vi inetd.conf
root@atmarkit{503}% ps -ax | grep inetd
217 ?? Ss 0:00.02 /usr/sbin/inetd -l
root@atmarkit{504}% kill -HUP 217
root@atmarkit{505}%
root@atmakrit{505}% exit
exit
kimu@atmarkit{503}% exitScript done on Fri Dec 19 01:39:56 2003

上記の内容から、sudo -sの後に、inetd.confファイルを編集し、内容を反映させていることがうかがえる。

 このように、scriptコマンドは手軽に利用できるのでとても便利なコマンドの1つだ。ただ、デメリットとしては、実行記録ファイルの管理が面倒であることが挙げられる。

システムアカウンティング機能を有効にする

 多くのUNIXでは、古くからアカウント情報を記録する機能が存在する(詳細はman acctで確認してほしい)。この機能は、実行中のすべてのプロセスの実行結果がログファイルに記録される。これにより、前述の「sudo -s」以降に実行したコマンドのみならず、すべてのコマンドの実行記録をログファイルに残すことができる。*1

*1

ただし、システム異常終了時は、アカウント情報データが正確に処理されていない場合がある。そういったケースが発生した場合に、より正確な情報を残したいのであれば、障害復旧後の最初のOS起動はシングルユーザモードで起動し、アカウント情報データを手動でサマリーファイルに加える処理が必要となる。

●NetBSDの場合

# mv /var/account/acct /var/account/acct.bak
# touch /var/account/acct
# chmod 600 /var/account/acct
# sa -s /var/account/acct.bak > /dev/null
# rm -f /var/account/acct.bak

sa -s により、アカウント情報ファイル(/var/account/acct)のデータがサマリーファイル(/var/account/savacctおよび/var/account/usracct)に記録される。sa -s実行後、/var/account/acct.bakは空になるので削除しても構わない。


 既存の環境で手っ取り早くシステムアカウント情報の記録を有効にする場合は、acctonコマンドを実行するとよい。*2

accton ログファイル名

*2

SolarisやRed Hat Linuxなどでは、インストール時のタイプによってacctonがインストールされていない場合があるので注意すること。Solaris 8では、SUNWaccuが、Red Hat Linuxでは、psacctというRPMパッケージがそれぞれ提供されている。また、Solarisの場合は、/usr/lib/acct/acctonとして格納されているので注意が必要だ。

これらのパッケージでは、ログファイルのローテーションも行うように設定してくれるので、標準のものやパッケージの利用をお勧めする。


 このコマンドを実行すると、それ以降に実行するすべてのコマンドが「ログファイル名」に記録されるようになる。BSD系のUNIXの場合は/var/account/acct、Solarisの場合は/var/adm/pacct、Red Hat Linuxの場合は/var/account/pacctが一般的な格納先として知られている。

 /var/account/acctファイルが存在しない場合は、touchコマンドであらかじめ空ファイルを作成しておく必要がある。

% sudo touch /var/account/acct

 acctonが標準もしくはパッケージとしてインストールされている場合は、起動スクリプトから実行することができる。次回から常時有効にしたい場合は、起動時に実行されるようにしておくとよいだろう。

●FreeBSD 4.xの場合

/etc/rc.conf に以下の一行を追加しておく。

accounting_enable="YES"

●NetBSD 1.6の場合

/etc/rc.conf に以下の一行を追加しておく。

accounting=YES

 また、起動スクリプトとして/etc/rc.d/accountingも用意されている。

●Solarisの場合

起動スクリプトをランレベル2で実行、ランレベル0でOSの停止時に無効にする。

# ln /etc/init.d/acct /etc/rc2.d/S22acct
# ln /etc/init.d/acct /etc/rc0.d/K22acct

  参考:Solaris のシステム管理(第2巻)

●Red Hat Linuxの場合(psacct)

起動スクリプト/etc/rc.d/init.d/psacctを有効にしておく。

% sudo chkconfig --add psacct
% sudo chkconfig psacct on
% sudo chkconfig --level 2 psacct on

●システムアカウンティング機能を無効にする

システムアカウント情報の記録を無効にする(元の状態に戻す)場合は、acctonの引数に何も与えずに実行(Null指定)するだけでよい。

    % sudo accton

 これ以降、再度「accton ログファイル名」を実行するまでシステムアカウンティング機能は無効となる。

 システムアカウンティング機能を有効にすると、サーバのパフォーマンスにわずかながらでも影響が生じる。そのため、パフォーマンスを最優先させるサーバの場合は、必要に応じてこの機能をOn/Offするとよいだろう。

●実行したコマンドのログを参照する

 ログファイルに記録された内容を見る場合は、lastcommやsaなどのコマンドを使用すればよい。以下はlastcommによる表示結果の例だ。

% lastcomm
lastcomm -    kimu  ttyp3   0.00 secs Fri Dec 19 01:28(0:00:00.00)
tcsh     -S   root  ttyp3   0.03 secs Fri Dec 19 01:27(0:01:46.42)
grep     -    root  ttyp3   0.00 secs Fri Dec 19 01:28(0:00:00.03)
ps       -    root  ttyp3   0.00 secs Fri Dec 19 01:28(0:00:00.48)
vi       -    root  ttyp3   0.00 secs Fri Dec 19 01:27(0:00:01.94)
whoami   -    root  ttyp3   0.00 secs Fri Dec 19 01:27(0:00:00.00)
sed      -    root  ttyp3   0.00 secs Fri Dec 19 01:27(0:00:00.00)
hostname -    root  ttyp3   0.00 secs Fri Dec 19 01:27(0:00:00.00)
…… 省略 ……

 scriptコマンドほどの詳細さは記録できないが、だれが、いつ、どのコマンドを実行したかを把握することができる。例えば2行目は、rootユーザーとしてtcshを01:27から1分46秒間実行していたことが分かる。


 2回にわたり、sudoによる管理者特権におけるコマンドの利用制限について説明した。sudoは、特権ユーザーの利用制限において便利かつ安全性の向上が行えるので、利用されることをぜひお勧めする。次回はログの運用管理について説明する。

筆者紹介

三井物産GTI (現:三井物産セキュアディレクション株式会社

木村靖



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。