scriptとpsacctでオペレーションログを記録する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。

Linuxの基本機能であればいいんじゃないかなぁとは思いますが、基本機能だけでは中々難しいのがオペレーションログ(操作ログ)です。一般的には、scriptコマンド、またはpsacctコマンド(サービス)を利用することが定番となっていますが、それぞれ一長一短かと思います。

今回は、AWS環境(Amazon Linux)で「オペレーションログを保存すること」という運用要件に対し、手間をかけずに対応する方法を紹介します。

scriptコマンドとpsacctコマンドの比較

はじめにscriptコマンドとpsacctサービスの比較をしてします。

script psacct
コマンドのオプション ×
実行結果の確認 ×
実行ユーザの確認
ログの改竄防止 ×
設定(有効化)

scriptは、実行コマンドとその結果をそのままテキストファイルに保存するコマンドです。 一方、psacctはバイナリファイルにコマンドの実行ログのみを保存するサービスです。

scriptによるログの保存

scriptコマンドで作業ログを記録でも紹介されていますが、scriptコマンドを利用するとコマンドの操作ログをファイルに記録することができます。このコマンドを利用し、SSHでログインした後のコマンド操作を記録できます。

SSHログイン後に、この設定を有効にするために /etc/profile (または ~/.bash_prrofile)の末尾に以下のコマンドを追加します。

# output operation log 
P_PROC=`ps aux | grep $PPID | grep sshd | awk '{ print $11 }'`
if [ "$P_PROC" = sshd: ]; then
  script -q /var/log/script/`whoami`_`date '+%Y%m%d%H%M%S'`.log
  exit
fi

参考: ssh上で行った作業のログをとる ー もぎゃろぐ

ポイントは、親プロセスがsshdである場合のみscriptコマンドを実行する点です。これを仕込んでおかないと、scriptコマンドが無限ループしますので注意してください。

ログファイルは、ログインユーザ名と時刻を元に作成し、 /var/log/script/ ディレクトリに保存する形としました。同ディレクトリは予め作成しておきます。

SSHログインを行い、コマンドを実行していくと次のようなログファイルが作成されていきます。

$ cat /var/log/script/ec2-user_20150918055217.log 
スクリプトは 2015年09月18日 05時52分17秒
 に開始しました[ec2-user@ip-172ls /var/log/script/50918045340.log
ec2-user_20150918045340.log  ec2-user_20150918055217.log
[ec2-user@ip-172-31-15-191 ~]$ cd ~
[ec2-user@ip-172-31-15-191 ~]$ sudo yum -y update
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main/latest                                                             | 2.1 kB     00:00     
amzn-updates/latest                                                          | 2.3 kB     00:00     
No packages marked for update
[ec2-user@ip-172-31-15-191 ~]$ exit

scriptコマンドは入力したコマンドや実行結果をすべて保存します。しかし、保存したファイルが保護されているわけではありません。悪意のある操作でファイルを削除することも改竄することも容易です。

psacctによるコマンド履歴

psacct(プロセスアカウンティング)は、全アカウントのコマンド実行履歴を残すためのサービスです。Amazon Linuxではデフォルトでインストールされているため、有効にするにはサービスを起動してください。

$ sudo service psacct start
$ sudo chkconfig psacct on

ログは、/var/account/pacct に保存されます。このファイルの所有者はrootであり、バイナリ形式で保存されるため、簡単に改竄することはできないようになっています。

実行されたコマンドを確認するには、次のようにlastcommコマンドを利用します(コマンドやユーザで絞り込むことも可能)。

$ lastcomm --user ec2-user
bash               F    ec2-user pts/1      0.00 secs Fri Sep 18 05:55
id                      ec2-user pts/1      0.00 secs Fri Sep 18 05:55
grep                    ec2-user pts/1      0.00 secs Fri Sep 18 05:55
rm                      ec2-user pts/1      0.00 secs Fri Sep 18 05:55
bash               F    ec2-user pts/1      0.00 secs Fri Sep 18 05:55
dircolors               ec2-user pts/1      0.00 secs Fri Sep 18 05:55
grep                    ec2-user pts/1      0.00 secs Fri Sep 18 05:55
bash               F    ec2-user pts/1      0.00 secs Fri Sep 18 05:55
mktemp                  ec2-user pts/1      0.00 secs Fri Sep 18 05:55
bash               F    ec2-user pts/1      0.00 secs Fri Sep 18 05:55

このように、記録されるのは何時・誰が・どのコマンドを実行したかという情報に限られます。コマンドのオプションや実行結果は確認することができません

オペレーションログを記録し、運用する

オペレーションログに関する運用要件がある場合、scriptコマンドとpsacctサービスを併用して設定しましょう。

scriptコマンドだけでは、改竄に対する部分で弱すぎるため、運用要件を満たすか怪しい可能性があります。また、全操作と結果が保存されるため、ログの量が多すぎて追うことが難しくなるのも問題です。

一方、psacctサービスでは、検索性や改竄に対する対策はある程度可能である一方、コマンドのオプションや実行結果がわかりません(細かいことはいいので、記録してあれば安心というのであればpsacctのみでもいいでしょう)。

このため、scriptコマンドとpsacctサービスを併用し、障害が起きた場合の一次調査をlastcommなどで行い、詳細な調査が必要な場合はscriptのログを確認する体制とすれば、デメリットを補える運用となるでしょう。 もちろん、EBSボリュームは日次などでスナップショットを作成しておきましょう。

ただし、scriptコマンドとpsacctサービスによるオペレーションログの運用は、オペレーションを監視・記録するような専用のミドルウェアではありません。悪意を持って抜け道を通るような操作は幾らでもあることは念頭においてください。しかしながら、人為的事故発生時の原因調査などには十分な情報になるかと思います。

まとめ

SSHログインでのオペレーションログを記録し、運用するには次のような運用がおすすめです。

  • scriptコマンドをSSHログイン時に実行し、コマンドの履歴を記録する
  • psacctサービスを有効にし、全アカウントのコマンド実行履歴を残す
  • 定期的にEBSのスナップショットを取得する