コマンドの実行履歴を残す
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
●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は、特権ユーザーの利用制限において便利かつ安全性の向上が行えるので、利用されることをぜひお勧めする。次回はログの運用管理について説明する。
- Tripwireのポリシーを最適化する
- Tripwireでファイルの改ざんを検出せよ〜Tripwireのインストールと初期設定 〜
- 安全性の高いログ・サーバへの乗り換えのススメ(2)〜 ログ管理のセキュリティ強化を実現する方法を知ろう 〜
- 安全性の高いログ・サーバへの乗り換えのススメ(1)〜 syslogサーバからsyslog-ngへの乗り換え 〜
- syslogによるログの一元管理
- UNIXサーバの運用管理で欠かせないログ管理
- 特権ユーザーの安全性向上を行うsudoの設定例
- サービスをセキュアにするための利用制限(3)〜管理者権限の制限のためのsuとsudoの基本〜
- サービスをセキュアにするための利用制限(2)〜管理者特権の利用制限〜
- サービスをセキュアにするための利用制限〜TCP Wrapperによるサービスのアクセス制限〜
- ソフトウェアの現状確認とアップグレード
- 不要なサービスの停止こそ管理の第一歩
Copyright © ITmedia, Inc. All Rights Reserved.