■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を出力させる方法でした。