セキュリティ要件でサーバ内で実行した全ユーザのコマンド履歴を保存することが求められることがあります。いくつかの方法がありますが、Bash ではコマンド履歴を syslog に出力する機能が提供されており、今回はその方法を採用することにしました。
syslog に保存するには Bash をビルドし直す必要があります。Amazon Linux 1、CentOS、Ubuntu でその方法が見つかったのですが、Amazon Linux 2ではそれらしい情報がなかったので備忘として本記事に残します。
サーバ情報はこんな感じです。
$ uname -r 4.14.173-137.229.amzn2.x86_64 $ rpm -qa | grep bash bash-4.2.46-33.amzn2.x86_64 bash-completion-2.1-6.amzn2.noarch
ビルドするために必要なパッケージをインストールします。
$ sudo su - % yum install rpm-build texinfo bison ncurses-devel autoconf gettext gcc make
パッケージソース(SRPM)をとってきます。Amazon Linux 2では yumdownloader
コマンドが使えます。
% yumdownloader --source bash Loaded plugins: extras_suggestions, langpacks, priorities, update-motd Enabling amzn2extra-docker-source repository Enabling amzn2-core-source repository amzn2-core-source amzn2extra-docker-source (1/2): amzn2extra-docker-source/2/primary_db (2/2): amzn2-core-source/2/primary_db bash-4.2.46-33.amzn2.src.rpm
SRPM をインストールすると rpmbuild
というディレクトリができます。
% rpm -ivh bash-4.2.46-33.amzn2.src.rpm
Bash ソースの修正
syslog に履歴を出力する設定を行います。
% cd ~/rpmbuild/SOURCES % tar zxf bash-4.2.tar.gz % cp -rpf bash-4.2{,.orig} % cd bash-4.2
config-top.h
で次のように修正します。ファシリティとログレベルも変えています。
/* Define if you want each line saved to the history list in bashhist.c: bash_add_history() to be sent to syslog(). */ -/* #define SYSLOG_HISTORY */ +#define SYSLOG_HISTORY #if defined (SYSLOG_HISTORY) -# define SYSLOG_FACILITY LOG_USER +# define SYSLOG_FACILITY LOG_LOCAL6 -# define SYSLOG_LEVEL LOG_INFO +# define SYSLOG_LEVEL LOG_DEBUG #endif
変更した箇所のパッチファイルを作成します。
% cd ~/rpmbuild/SOURCES % diff -Npru bash-4.2.orig bash-4.2 > bash_history_rsyslog.patch # パッチファイルの中身 % cat bash_history_rsyslog.patch diff -Npru bash-4.2.orig/config-top.h bash-4.2/config-top.h --- bash-4.2.orig/config-top.h 2009-12-22 20:29:39.000000000 +0000 +++ bash-4.2/config-top.h 2020-05-01 06:23:19.711013827 +0000 @@ -101,10 +101,10 @@ /* Define if you want each line saved to the history list in bashhist.c: bash_add_history() to be sent to syslog(). */ -/* #define SYSLOG_HISTORY */ +#define SYSLOG_HISTORY #if defined (SYSLOG_HISTORY) -# define SYSLOG_FACILITY LOG_USER -# define SYSLOG_LEVEL LOG_INFO +# define SYSLOG_FACILITY LOG_LOCAL6 +# define SYSLOG_LEVEL LOG_DEBUG #endif /* Define if you want to include code in shell.c to support wordexp(3) */
SPEC ファイルの修正
SPEC ファイル bash.spec
を修正します。Release
で適当なプレフィックスをつけます。後でインストールするときに既存の Bash パッケージと重複しないためです。
今回作成したパッチファイルを適用するための設定を追記します。Patch番号が重複しないように適宜変更してください。今回は Patch156 が最新だったので Patch157 で追記しました。
Patch155 で syslog の修正が入っていましたが、今回のパッチと競合してビルドできなかったので外しました。bash 5.0 だしいいよね。
% cd ~/rpmbuild/SPECS/
--- bash.spec.orig 2020-05-01 06:29:54.128019450 +0000 +++ bash.spec 2020-05-01 06:54:39.473960968 +0000 @@ -6,7 +6,7 @@ Version: %{baseversion}%{patchleveltag} Name: bash Summary: The GNU Bourne Again shell -Release: 33%{?dist} +Release: 33%{?dist}_syslog Group: System Environment/Shells License: GPLv3+ Url: http://www.gnu.org/software/bash @@ -199,11 +199,15 @@ Patch154: bash-4.3-dircomp-append-slash.patch #1160482 - Add a runtime option to enable history logging to syslog -Patch155: bash-5.0-syslog-history.patch +#Patch155: bash-5.0-syslog-history.patch #1573901 - RFE: (security) support bracketed paste mode Patch156: bash-4.4-bracketed-paste.patch +#Enable detailed syslog info +Patch157: bash_history_rsyslog.patch + BuildRequires: texinfo bison BuildRequires: ncurses-devel BuildRequires: autoconf, gettext @@ -336,8 +340,9 @@ %patch152 -p1 -b .pipefd-leak %patch153 -p1 -b .wshouldquote %patch154 -p1 -b .append-slash -%patch155 -p1 -b .syslog-history +#%patch155 -p1 -b .syslog-history %patch156 -p1 -b .bracketed-paste +%patch157 -p1 -b .history_rsyslog echo %{version} > _distribution echo %{release} > _patchlevel
ビルド
ビルドしている EC2 インスタンスタイプによりますが、私の環境(t3.small)では数分程度で完了しました。
% rpmbuild -ba bash.spec # ビルドされたRPMファイルの確認 % ls ~/rpmbuild/RPMS/x86_64/ bash-4.2.46-33.amzn2_syslog.x86_64.rpm bash-debuginfo-4.2.46-33.amzn2_syslog.x86_64.rpm bash-doc-4.2.46-33.amzn2_syslog.x86_64.rpm
rsyslog の設定変更
このままだと syslog に出力されないため rsyslog の設定を変更します。
/etc/rsyslog.conf
を次のように編集します。ファシリティとログレベルは先ほど設定した値(local6.debug
)にします。
--- /etc/rsyslog.conf.orig 2019-11-14 22:39:45.000000000 +0000 +++ /etc/rsyslog.conf 2020-05-01 07:01:43.539621402 +0000 @@ -51,7 +51,7 @@ # Log anything (except mail) of level info or higher. # Don't log private authentication messages! -*.info;mail.none;authpriv.none;cron.none /var/log/messages +*.info;mail.none;authpriv.none;cron.none;local6.debug /var/log/messages
rsyslog を再起動します。
% systemctl restart rsyslog
確認
ビルドした Bash パッケージをインストールして syslog に履歴が残るか確認します。
% rpm -Uvh ~/rpmbuild/RPMS/x86_64/bash-4.2.46-33.amzn2_syslog.x86_64.rpm % rpm -qa | grep bash bash-completion-2.1-6.amzn2.noarch bash-4.2.46-33.amzn2_syslog.x86_64 # ログアウトして再度ログインする % exit $ ssh # 適当なコマンドを打つと syslog に履歴が残っているはず $ ls $ sudo tail /var/log/messages ... May 1 07:04:00 ip-172-31-1-225 -bash: HISTORY: PID=15156 UID=1000 ls May 1 07:04:04 ip-172-31-1-225 -bash: HISTORY: PID=15156 UID=1000 sudo tail /var/log/messages
ビルドした後は rpmbuild
ディレクトリを削除すれば完了です。作成した RPM ファイルは S3 などに保存しておいてください。
% rm -rf ~/rpmbuild