Olá. Aqui é a Komiya. Recentemente, houve muitos pedidos para "gravar comandos de execução" em trabalhos relacionados à segurança. Acho que existem várias maneiras, mas desta vez gostaria de colocar o tempo no bash_history e resumir tudo em um único log.
O que achei conveniente depois de fazer isso é que o log pode ser resolvido com grep ao reportar o tempo de trabalho durante a manutenção.
Construir com Jenkins tem sido recentemente uma integração contínua de lanças. No começo, havia uma barreira psicológica, mas quando tentei, achei bom porque era bem fácil e não havia passos a seguir. Tive que construir várias vezes para lidar com vulnerabilidades, mas era conveniente ter um trabalho de Jenkins.
CentOS 6.5. O trabalho de Jenkins é o seguinte. É simplesmente rodar um shell com parâmetros.
#!/lixo/batida
topdir="${HOME}/rpmbuild"
rpmdir="${topdir}/RPMS/x86_64"
se [ -f ${HOME}/.rpmmacros ]; então
echo "%_topdir ${topdir}" > "${HOME}/.rpmmacros"
echo "%_signature gpg" >> "${HOME}/.rpmmacros"
echo "%_gpg_name D279xxxx" >> "${HOME}/.rpmmacros"
fi
se [ -d ${HOME}/rpmbuild ]; então
mv ${HOME}/rpmbuild{,.'date +%Y%m%d.%H%M'}
mkdir -p ${HOME}/rpmbuild/SRPM
fi
caso "${TARGET}" em
*.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, "HISTÓRICO: PID=%d UID=%d %s", getpid(), current_user.uid, linha)! (SYSLOG_FACILITY| SYSLOG_LEVEL, "HISTÓRICO: PID=%d PPID=%d SID=%d Usuário=%s UID=%d CMD=%s", getpid(), getppid(), getsid(getpid()), current_user.nome_usuário, current_user.uid, linha)!g' ${HOME}/rpmbuild/FONTES/bash-4.1/bashhist.c
sed -i 's! (SYSLOG_FACILITY| SYSLOG_LEVEL, "HISTÓRIA (TRUNCADO): PID=%d UID=%d %s", getpid(), current_user.uid, trunc)! (SYSLOG_FACILITY| SYSLOG_LEVEL, "HISTÓRIA (TRUNCADO): 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
;;
*) eco 'variável ambiental TARGET deve ser definida.'; saída 1;;
ESAC
Os parâmetros que escolhi para TARGET são os seguintes: 'http://vault.centos.org/6.5/updates/Source/SPackages/bash-4.1.2-15.el6_5.2.src.rpm'
Quando fiz o upgrade, mudou para o seguinte. Os trabalhos são separados para cada versão. 'http://vault.centos.org/6.6/os/Source/SPackages/bash-4.1.2-29.el6.src.rpm'
'${HOME}' é '/var/lib/jenkins'.
O fluxo é colocar o RPM de origem caído, descompactar o arquivo de código-fonte, sed, fazer um patch, sedar o arquivo de especificação para que o patch que você fez possa ser aplicado e então construir. Descobri que a opção para corrigir todo o diretório em diff era -crN. Se eu ousar enviar o patch, é o seguinte.
# Cat Bash-syslog_facirity.patch
Diferença -crN bash-4.1.org/bashhist.c bash-4.1/bashhist.c
bash-4.1.org/bashhist.c 2009-08-15 04:33:02.000000000 +0900
--- bash-4.1/bashhist.c 2014-12-16 19:13:45.272586470 +0900
***************
*** 705.716 ****
char trunc[SYSLOG_MAXLEN];
se (strlen(linha) < SYSLOG_MAXLEN)
! syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d UID=%d %s", getpid(), current_user.uid, line);
else
{
strncpy (trunc, line, SYSLOG_MAXLEN);
trunc[SYSLOG_MAXLEN - 1] = '';
! syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY (TRUNCATED): PID=%d UID=%d %s", getpid(), current_user.uid, trunc);
}
}
#endif
--- 705,716 ----
char trunc[SYSLOG_MAXLEN];
if (strlen(line) < SYSLOG_MAXLEN)
! syslog (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);
else
{
strncpy (trunc, line, SYSLOG_MAXLEN);
trunc[SYSLOG_MAXLEN - 1] = '';
! syslog (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); }
}
#endif
diff -crN bash-4.1.org/config-top.h bash-4.1/config-top.h
*** bash-4.1.org/config-top.h 2009-12-23 05:29:39.000000000 +0900
--- bash-4.1/config-top.h 2014-12-16 19:07:53.607579557 +0900
***************
*** 103,109 ****
bash_add_history() para ser enviado para syslog(). */
/* #define SYSLOG_HISTORY */
#if definido (SYSLOG_HISTORY)
! # Defina SYSLOG_FACILITY LOG_USER
# Defina SYSLOG_LEVEL LOG_INFO
#endif
--- 103,109 ----
bash_add_history() para ser enviado para syslog(). */
/* #define SYSLOG_HISTORY */
#if definido (SYSLOG_HISTORY)
! # Defina SYSLOG_FACILITY LOG_LOCAL6
# Defina SYSLOG_LEVEL LOG_INFO
#endif
O formato do log foi alterado para incluir o ID do processo pai e o PID do SU com referência a essa URL. (Achei que seria mais fácil auditar)
A funcionalidade foi alterada para local6. Suponha que você faça o seguinte em 'rsyslog.conf':
*.info; mail.nenhum; authpriv.nenhum; cron.nenhum; local6.none /var/log/messages
# bash_history tronco
local6.* /var/log/bash_history
Acho necessário remover o bash do alvo de atualização do yum separadamente. (Se 'yum-updatesd' for válido, 'exclude=bash*' em 'yum.conf' depois, etc.) Se você não fizer isso depois, ele não será atualizado para bash personalizado quando você rodar a receita, então tenha cuidado. Ao inserir no Chef(yum), tive que colocar 'options"--disablerepo=base,updates'. Isso é uma contramedida para não ser atualizado em pacotes em outros repositórios. Além disso, se você não começar com uma receita que coloca um repositório personalizado na ordem run_list ao fluir uma receita no Chef, pode ser considerado que o repositório não está disponível e não será instalado ou atualizado.
Eu uso um plugin chamado 'RPMSign' para assinar o gpg e scp em um repositório yum personalizado. Também coloco o 'plugin SSH' no plugin.
Defina a chave gpg e a senha nas configurações do sistema, e no trabalho você escolhe a chave e escreve o caminho completo do pacote para assinar as opções da linha de comando (curingas são aceitáveis).
A forma real como as toras são produzidas é a seguinte.
21 de agosto 11:11:54 localhost -bash: HISTÓRICO: PID=18837 PPID=18836 SID=18837 Usuário=komiyay UID=501 CMD=sudo su -
21 de agosto 11:44:55 localhost bash: HISTÓRICO: PID=19298 PPID=18864 SID=18837 Usuário=raiz UID=0 CMD=knife solo data bag editar ssl nginx
Criei um trabalho separado para diferenciar os metadados do SCP e do repositório Yum, e queria evitar o trabalho de deletar se o pacote falhar ao compilar e receber um nome um pouco estranho.
Bas_history h\ corre risco de ser adulterado, então medidas como encaminhá-lo para outro servidor em tempo real ainda são necessárias, e acho que existem métodos como rsyslog, syslog-ng e td-agent, mas eles serão omitidos porque serão muito longos.
Jenkins faz muitas coisas automaticamente, e é conveniente porque não há procedimentos não falados. Aprendi muito. Fui informado sobre Jenkins pelo Sr. Hiragata, do desenvolvimento interno. Muito obrigado. Graças a você, a barreira psicológica foi reduzida.
Como curiosidade, se quiser usar algo além do bash e não puder cobrir isso com uma operação que só use bash, acho que pode adicionar 'psacct' (sistema RHEL) ou 'pacct' (sistema Debian) e adicionar uma opção como '--user' em 'lastcomm' para verificar e depois checar o histórico de cada usuário. Talvez. Pesquisei um pouco no Google e encontrei alguém que tinha o comando script aberto automaticamente em /etc/profile. Parece ser conveniente acompanhar o que aconteceu, mas pessoalmente achei que o escopo do que poderia ser feito com o pacote era agradável. Por padrão, o histórico não exibe o horário, então parece que existem diferentes formas de exibir o tempo em um shell além do bash, e quando pesquisei no Google, foi como mostrado no link abaixo. Coloque uma data no histórico do tcsh - Toolbox zsh histórico para poder ver o tempo de execução do comando - Qiita Se você estiver usando algo diferente do acima, por favor, verifique por sua conta e risco. Aliás, esse time bash é modificado e enviado para syslog, então não é necessário, mas se você quiser colocar o tempo em cada arquivo de histórico sem fazer isso, parece que pode definir a variável shell "HISTTIMEFORMAT" após a versão 3.0. Além disso, sh e csh parecem não conseguir editar o histórico, então sinto que é impossível definir o tempo. Além disso, é necessário auditar para alcançar o objetivo de detectar a adulteração no arquivo de histórico? Nunca usei o auditd corretamente porque parece levar muito tempo para decidir as regras corretamente e pensar sobre o funcionamento correto, ou porque a legibilidade do log não é boa.
Veja também: histórico registrado do syslog - C - C Program Develop [Tech Blog vol.2] Process Accounting with psacct Package | Tech Blog | Managed Hosting Deenet Como Manter um Histórico de Execução de Comandos no Linux/UNIX - histórico drk7jp Permita que a data e hora sejam exibidas nos resultados do comando - Takami_hiroki's Diary
Obrigado por ler.