• bashのhistoryをsyslog出力、jenkinsでビルド

    こんにちは。小宮です。 セキュリティ関連のお仕事で「実行コマンドを記録したい」という要望が最近多くなってきました。 何種類か方法はあると思いますが、今回はbash_historyに時刻を入れて一つのログにまとめてみたいと思います。

    これやったあと便利に感じたのはメンテナンスの時作業時刻を報告する場合にログをgrepで解決可能というところです。

    jenkinsでビルドするのは、最近はやりの継続的インテグレーションということでやってみました。 最初は心理的な障壁があったんですがやってみると結構楽で手順のもれがないので良いと思いました。 脆弱性の対応で何回かビルドすることになりましたがjenkinsジョブになってるのは便利でした。

    CentOS6.5です。 jenkinsさんのジョブは以下のとおりです。 単にパラメータつきのシェルの実行です。

    #!/bin/bash
    topdir="${HOME}/rpmbuild"
    rpmdir="${topdir}/RPMS/x86_64"
    
    if [ -f ${HOME}/.rpmmacros ];then
      echo "%_topdir ${topdir}" > "${HOME}/.rpmmacros"
      echo "%_signature gpg" >> "${HOME}/.rpmmacros"
      echo "%_gpg_name D279xxxx" >> "${HOME}/.rpmmacros"
    fi
    if [ -d ${HOME}/rpmbuild ];then
      mv ${HOME}/rpmbuild{,.`date +%Y%m%d.%H%M`}
      mkdir -p ${HOME}/rpmbuild/SRPM
    fi
    
    case "${TARGET}" in
     *.src.rpm) rpm -Uvh "${TARGET}"
      cp -p ${topdir}/SPECS/bash.spec{,.org}
      sed -i 's/make "CFLAGS=$CFLAGS -fwrapv" "CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS `getconf LFS_CFLAGS`"/make "CFLAGS=$CFLAGS -fwrapv" "CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS `getconf LFS_CFLAGS` -DSYSLOG_HISTORY"/g' ${topdir}/SPECS/bash.spec
      sed -i 's/Release: 29%{?dist}/Release: 29%{?dist}_isao_5/g' ${topdir}/SPECS/bash.spec
      sed -i '108s/^$/\n/g' ${topdir}/SPECS/bash.spec
      sed -i '109s/^$/Patch145: bash-syslog_facirity.patch\n/g' ${topdir}/SPECS/bash.spec
      sed -i '181s/^$/%patch145 -p1\n/g' ${topdir}/SPECS/bash.spec
      cd ${HOME}/rpmbuild/SOURCES/
      tar xzf bash-4.1.tar.gz
      cp -rp bash-4.1{,.org}
      sed -i 's/#  define SYSLOG_FACILITY LOG_USER/#  define SYSLOG_FACILITY LOG_LOCAL6/g' ${HOME}/rpmbuild/SOURCES/bash-4.1/config-top.h
      sed -i 's!(SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d UID=%d %s", getpid(), current_user.uid, line)!(SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d PPID=%d SID=%d User=%s UID=%d CMD=%s", getpid(), getppid(), getsid(getpid()), current_user.user_name, current_user.uid, line)!g' ${HOME}/rpmbuild/SOURCES/bash-4.1/bashhist.c
      sed -i 's!(SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY (TRUNCATED): PID=%d UID=%d %s", getpid(), current_user.uid, trunc)!(SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY (TRUNCATED): PID=%d PPID=%d SID=%d User=%s UID=%d CMD=%s", getpid(), getppid(), getsid(getpid()), current_user.user_name, current_user.uid, trunc)!g' ${HOME}/rpmbuild/SOURCES/bash-4.1/bashhist.c
      diff -crN bash-4.1.org bash-4.1 > ${HOME}/rpmbuild/SOURCES/bash-syslog_facirity.patch
      rpmbuild -ba ${topdir}/SPECS/bash.spec
     ;;
     *)  echo 'environment variable TARGET must be set.'; exit 1;;
    esac
    

    TARGETにしたパラメータは以下です。 http://vault.centos.org/6.5/updates/Source/SPackages/bash-4.1.2-15.el6_5.2.src.rpm

    ...