bashからsyslog経由でhistoryをファイルに出力する

■BashからSYSLOGに対して実行したコマンドを記録させる。

Bashにはhistoryコマンドが存在するが、history -cのコマンドを使えば
historyを抹消することが出来る。
また、historyの初期設定では1000行以上過去の履歴は消えてしまうため
オペレーションミスがあっても内容が把握出来ない場合がある。
そのためSYSLOGに出力しておくことで過去の操作ログを見れるようにする
作業である。

■準備するもの
Linux OS(ここではCentOS 6.5を使います)

■作業内容

現時点ではBashからSYSLOGに出力させるにはソースからビルドして
ハードコードする必要があるのでgcc(GNUのコンパイラ)とmake(コンパイラ等
の処理を自動的に行うコマンド)をインストールします。
# yum -y install gcc make

続いて作業するフォルダへ移動します。
# cd /usr/local/src/

2014/05/18現在最新版のbash4.3をダウンロードします。

# curl -OL http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 7769k  100 7769k    0     0   347k      0  0:00:22  0:00:22 --:--:--  316k

圧縮されているファイルを解凍します。
# tar zxf bash-4.3.tar.gz

展開されたフォルダへ移動します。
# cd bash-4.3/

今回編集するファイルのバックアップを取ります。
# cp -p config-top.h config-top.h_20140518

正常にバックアップが取れていて内容に差異がないか確認します。
# diff config-top.h_20140518 config-top.h

config-top.hを修正します。
修正箇所は「define SYSLOG_HISTORY」を110行目辺りに追記することと
112行目のSYSLOGファシリティを任意の物に変更する(ファシリティには指定出来るキーワードに決まりがあるので要確認)
113行目のSYSLOGプライオリティを任意の物に変更する(プライオリティにも指定出来るキーワードに決まりがあるので要確認)

# vi config-top.h
    107 /* Define if you want each line saved to the history list in bashhist.c:
    108    bash_add_history() to be sent to syslog(). */
    109 /* #define SYSLOG_HISTORY */
    110 #define SYSLOG_HISTORY ← 追記する
    111 #if defined (SYSLOG_HISTORY)
    112 #  define SYSLOG_FACILITY LOG_LOCAL6 ← 任意のSYSLOGファシリティに変更する
    113 #  define SYSLOG_LEVEL LOG_DEBUG ← 任意のSYSLOGプライオリティに変更する
    114 #endif

今回変更した箇所に間違いはないかバックアップの内容と比較する。

# diff config-top.h_20140518 config-top.h
109a110
> #define SYSLOG_HISTORY
111,112c112,113
< #  define SYSLOG_FACILITY LOG_USER
< #  define SYSLOG_LEVEL LOG_INFO
---
> #  define SYSLOG_FACILITY LOG_LOCAL6
> #  define SYSLOG_LEVEL LOG_DEBUG

差異に間違いがなければconfigureでコンピュータに応じてコンパイル出来るようにした
Makefileを作成してもらう。
# ./configure

必要なパッケージ等が不足しておらずコンパイル出来る状況になれば
ソースファイルからコンパイルを行う。
# make

コンパイルが問題なく完了すればコンパイルしたものをインストール(特定のディレクトリにコピー)する。
# make install

コンパイルしたインストールされたものは以下のディレクトリにある。
# cd /usr/local/bin/

# ls -lh
合計 3.0M
-rwxr-xr-x. 1 root root 3.0M  5月 19 01:40 2014 bash
-r-xr-xr-x. 1 root root 6.7K  5月 19 01:40 2014 bashbug

Bashのバージョンが4.3であるか確認する。

# ./bash --version
GNU bash, バージョン 4.3.0(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.

SYSLOGの設定ファイルがあるディレクトリへ移動します。
# cd /etc/

SYSLOGの設定ファイルをバックアップします。
# cp -p rsyslog.conf rsyslog.conf_20140518

正常にバックアップが取れていて内容に差異がないか確認します
# diff rsyslog.conf_20140518 rsyslog.conf

SYSLOGの設定ファイルであるrsyslog.confを編集します。
63行目辺りに設定内容のコメントを記載します。
64行目辺りに先ほどコンパイル前にハードコードした
local6のファシリティとdebugのプライオリティの出力先は/var/log/history.logへ
出力して下さいと設定ファイルに記載する。

# vi rsyslog.conf
     63 # It is a rule to save the HISTORY of BASH.
     64 local6.debug                                            /var/log/history.log

今回変更した箇所に間違いはないかバックアップの内容と比較する。

# diff rsyslog.conf_20140518 rsyslog.conf
62a63,65
> # It is a rule to save the HISTORY of BASH.
> local6.debug                                          /var/log/history.log
>

比較した内容に間違いがなければ/var/log/history.logのファイルを作成する。

# touch /var/log/history.log

今回は/var/log/history.logをrootのみ閲覧書き込みすることが出来るように
ファイルのパーミッションを600にする。
# chmod 600 /var/log/history.log

SYSLOGの設定内容を反映させるためにrsyslogのデーモンを再起動します。

# /etc/init.d/rsyslog restart
システムロガーを停止中:                                    [  OK  ]
システムロガーを起動中:                                    [  OK  ]

正しくSYSLOGに出力されるかテストするためにコンパイルしたBashを起動する
# /usr/local/bin/bash

echoコマンドでtestという文字列を表示させる。
# echo "test"

コンパイルしたBashを終了させるためにexitする。
# exit

先ほど設定した/var/log/history.logにhistoryの内容が出力されているか確認

# cat /var/log/history.log
May 19 02:04:01 localhost bash: HISTORY: PID=22301 UID=0 echo "test"
May 19 02:04:03 localhost bash: HISTORY: PID=22301 UID=0 exit

rootユーザーのシェルを確認する。

# cat /etc/passwd | grep "root"
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

現在実行中(SSHにてログインしたタイミングから)のBashのバージョンを確認する。

# bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Bashがあるディレクトリへ移動する。
# cd /bin/

既存のBashは念のためバックアップしておく。
# cp -p bash bash_20140518

バックアップしたBashは実行出来ないようにパーミッションを000にしておく。
# chmod 000 bash_20140518

/bin/bashを置き換えるためにrootのシェルをコンパイルしたものに変更する。
# usermod -s /usr/local/bin/bash root

rootユーザーのシェルが変わったことを確認する。

# cat /etc/passwd | grep "root"
root:x:0:0:root:/root:/usr/local/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

※作業は再度ログインを行うか別のターミナルで新たに接続する。(rootユーザーで)

別のユーザーがログインしているか確認する。
※別のユーザーがログインしていた場合/bin/bashを使用中の可能性が非常に高いため。

# w
13:51:32 up 6 days, 12:42,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    2wakayama134.loc 02:18    0.00s  0.09s  0.03s w

/bin/bashをSYSLOG出力付きのBashに変更するためにコピーを使って置き換える。
※置き換え時に別のユーザーがログイン中で/bin/bashが使用中の場合は以下のようなエラーが出ます。
「cp: cannot create regular file /bin/bash': テキストファイルがビジー状態です」

# cp -p /usr/local/bin/bash /bin/bash

置き換えた/bin/bashのタイムスタンプ等が変わっていることを確認する。

# ls -l /bin/bash
-rwxr-xr-x. 1 root root 3136776  5月 19 01:40 2014 /bin/bash

# stat /bin/bash
  File:
/bin/bash'
  Size: 3136776         Blocks: 6128       IO Block: 4096   通常ファイル
Device: fd00h/64768d    Inode: 393246      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2014-05-19 02:18:24.163993988 +0900
Modify: 2014-05-19 01:40:39.358000010 +0900
Change: 2014-05-19 02:17:03.383998498 +0900

※作業は再度ログインを行うか別のターミナルで新たに接続する。(rootユーザーで)
Bashのバージョンが4.3になっていることを確認する。

# bash --version
GNU bash, バージョン 4.3.0(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

これで終わりではありません。
最後の仕上げとしてyum updateによって今回設定したbashがバージョンアップされないように
更新対象から除外します。
なぜかというと今回は/bin/bashを置き換えているためyum updateの際に/bin/bashを更新
されてしまう可能性があるからです。

YUMの設定ファイルがあるディレクトリへ移動します。
# cd /etc/

YUMの設定ファイルをバックアップします。
# cp -p yum.conf yum.conf_20140518

バックアップした設定ファイルが存在することと差異がないか確認します。
# diff yum.conf_20140518 yum.conf

YUMの設定ファイルに更新対象から除外する設定を追記します。
13行目辺りに「exclude=bash*」と記載します。

# vi yum.conf
     13 exclude=bash*

今回変更した箇所に間違いはないかバックアップの内容と比較する。

# diff yum.conf_20140518 yum.conf
12a13
> exclude=bash*

以上でBashからSYSLOG経由にてhistoryを出力させる方法でした。

Avatar photo

SNOWSKI

大阪にあるどこかのIT会社で働いております / もしかするとあなたのそばにいるかもね...