詳細検索

Output bash history syslog, build com jenkins

Avatar
por komi
6 min de leitura

Output bash history syslog, build com jenkins
Traduzido do 日本語 • Ver original

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.

Related Articles