Como adiciono dados de conexão de origem da rede ou do usuário às entradas do histórico?

8

Gostaria de modificar as configurações do histórico para todos os usuários nos sistemas que eu gerencio. Gostaria que ele contivesse as informações do terminal de conexão, como dewho

sysadmin:/ # who
sysadmin  pts/0        Mar 26 07:11 (sysadmin.doofus.local)

Atualmente, modifico meu histórico das seguintes maneiras. Eu sei que muitas dessas configurações foram abordadas aqui várias vezes. No entanto, eu peguei esse código de " Linux System Administration Recipes por: Juliet Kemp " há muito tempo.

shopt -s histappend
PROMPT_COMMAND='history -n;history -a'
HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT="%m/%d/%y %T  "

shopt -s histappend corrige o problema quando você tem vários terminais. As informações abertas podem ser perdidas.

PROMPT_COMMAND='history -n;history -a' se estende para fornecer anexos em tempo real ao histórico em vários terminais.

HISTSIZE=100000 HISTFILESIZE=100000 estende a quantidade de historyretenção

HISTTIMEFORMAT="%m/%d/%y %T "precede cada linha do histórico com um carimbo de hora

O que você normalmente recebe history

835  ls
836  cd ..

Meus historyresultados atuais modificados

5853  03/26/12 07:16:49  ls
5854  03/26/12 07:16:50  ll

O retorno de historyeu gostaria de ver

5853  03/26/12 07:16:49  sysadmin.doofus.local    ls
5854  03/26/12 07:16:50  sysadmin.doofus.local    ll

001  03/26/12 05:11:29  demo_user.doofus.local    cd
002  03/26/12 05:11:30  demo_user.doofus.local    ll

Eu não sou "casado" em ver o DNSnome. Eu só o desejaria lá se ele o puxar de whoou de outro local sem a necessidade de realizar uma pesquisa ou consulta de qualquer tipo. Eu ficaria feliz com o endereço IP.

002  03/26/12 05:11:30  192.168.0.2    ll

Por quê? Eu gerencio vários sistemas nos quais um usuário compartilha vários usuários do mesmo grupo para realizar suas tarefas diárias. Isso me permitiria correlacionar a localização real e o usuário real dentro da organização com o que eles fizeram na história.

Estou ciente de que isso não é o ideal e gostaria de alterá-lo, mas quando você está em um navio do tamanho de um navio de cruzeiro, não tenta fazer curvas fechadas. (Nota: quando você faz os passageiros, tenta jogá-lo ao mar)

De qualquer forma, até que eu possa migrá-los para uma solução melhor, eu gostaria de ter essa capacidade de rastreamento.

Além disso, se você tiver alguma recomendação sobre o que estou usando atualmente para minhas historymodificações, adoraria ouvi-lo.

Obrigado,

Editar: 1

Eu não quero executar outros programas ou tenho que configurar algo adicional "dentro do razoável".

Quero adicionar 0despesas gerais, se precisar adicioná-las, ela precisa ser pequena.

Confio nos meus usuários. Gostaria apenas (caso algo aconteça) de ver quais dos, digamos, 10 usuários que efetuaram login no sistema com o mesmo usuário: a senha fez isso. Ou, pode não ter sido um usuário, poderia ter sido esquecido cronem um sistema que executa uma conexão como usuário para fazer alguma coisa. Ou um aplicativo Ex: BMC Control-Mque se conecta sshe executa tarefas. Não se trata apenas de encontrar "usuários ruins", mas de encontrar com um mínimo de esforço.

Edição 2:

Os sistemas estão executando SLES e RHEL

2bc
fonte
1
Parece que a contabilidade do processo pode ser útil. O histórico do shell nunca foi projetado para registro e, se você deseja usá-lo, precisa confiar em todos os seus usuários. Consulte a pergunta relacionada sobre a atividade de monitoramento e uma resposta relacionada .
Jw013
@ jw013 Obrigado pelo comentário. No entanto, isso deve ser configurado e gerenciado, além de fornecer as informações que li, seria melhor excluir diretórios como /proc /deve de usuários /home. Isso adiciona sobrecarga. Considerando que historyjá está sendo gravado e suas informações de conexão são conhecidas pelo sistema que está conectando o IP, etc ... Essas informações, se ainda não estiverem disponíveis "estaticamente", podem ser configuradas dessa maneira ou armazenadas em uma variável ou arquivo e inseridas nos historyregistros e no desempenho atingido seria muito pequeno ou 0.
2bc 27/03/12
Se isso estiver no Linux, considere usar auditd. Não tenho certeza se os logs fornecerão informações suficientes. A dificuldade do que você quer é exatamente o motivo pelo qual as contas compartilhadas são tão reprovadas.
Gilles 'SO- stop be evil'
É no Linux, vou editar minha pergunta para deixar isso claro. auditdé muito parecido com o que inotifyvocê precisa dizer para monitorar as alterações. Arquivos individuais, diretórios, etc. Não quero ir para esse nível de configuração. De fato (sim), mas essencialmente não me importo tanto. Eu tenho puppetque lidar com isso. auditdtambém vem com carga e tempo adicionais para a instalação. Se uma conta estiver modificando algo, eu ainda gostaria de olhar para trás no histórico e ver quem ou o que está fazendo login e tentando.
2bc 27/03/2012
2
hm, como PROMPT_COMMAND=apenas executa comandos normais antes do próximo prompt, você não poderia escrever uma função chamada sed / awk que funcione na última linha do arquivo de histórico para adicionar as informações. então chame essa função PROMPT_COMMAND=para acrescentar os dados? seria hackish, mas deveria fazer o trabalho.
llua

Respostas:

1

Por sugestão de llua, podemos trabalhar um pouco mais com a história. Anexe uma linha ao arquivo BASH RC em todo o sistema, talvez /etc/bash.bashrc.

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Configure o log para "local6" no log do sistema. Talvez algo parecido com isto:

local6.*    /var/log/commands.log

Reinicie o log do sistema. Talvez configure a rotação do arquivo de log. Sair; Conecte-se; e agora o histórico é gravado em /var/log/commands.log em um formato como este:

data e hora nome do host logger: nome de usuário [audit_pid]: comando [return_val]

Isso pode ser alterado ainda mais a gosto.

Christopher
fonte
1

Os parágrafos a seguir descrevem a idéia em geral e estão desatualizados em alguns aspectos, mas você pode usar e usar as últimas nesta página. Vamos usar um arquivo grande ~ / .bash_history.archive (separado de HISTFILE = ~ / .bash_history). E então, ao sair de cada sessão do bash, vamos anexar novas linhas de histórico a ela.

O primeiro problema com essa abordagem foi: como fazer com que o bash chame esse script em cada saída? Claro, se você sair digitando 'exit', então você pode usar a função 'exit', mas eu uso o atalho Ctrl-D para isso e não consegui encontrar uma maneira de reatribuí-lo a algo, mas não a função de saída interna.

Portanto, a primeira tentativa foi: proibir Ctrl-D por

export IGNOREEOF=10

e defina a combinação Ctrl-X dupla para chamar a função de saída.

Mas a abordagem correta é usar o tramp de saída do bash, que é uma solução perfeita, pois é chamada independentemente da maneira como você sai do bash: Ctrl-D, sair, fechar a janela xterm.

trap 'archive_history' EXIT

O passo seguinte é definir uma linha de partida em nossa bash_history, para que possamos salvar apenas novas linhas e garantir que anexemos a um arquivo de histórico.

export CURBASHSTART=`grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'` CURBASHDATE=`date`

shopt -s cmdhist histappend

É tudo o que precisamos no início do bash - agora sabemos a partir de qual linha da história começa a história atual (nova). Para salvar o histórico, adicione a próxima peça ao seu ~ / .bashrc.

archive_history()
{
    HISTORYOLD=${HISTFILE}.archive
    CURTIME=`date`
    CURTTY=`tty`
    if  [ x$HISTDUMPPED = x ]; then
      echo "#-${HOSTNAME}-- ${CURBASHDATE} - ${CURTIME} ($CURTTY) ----" >>   $HISTORYOLD

      history $(($HISTCMD-${CURBASHSTART-0})) | sed -e 's/^[ ]*[0-9][0-9]* [ ]*//g'  >> $HISTORYOLD
      export HISTDUMPPED=1
    fi
}

exit ()
{
   archive_history
   builtin exit

}

O arquivo ~ / .inputrc deve conter as próximas linhas para redefinir o atalho de saída para Ctrl-x x. Em uma primeira tentativa, você pode achar que é um atalho terrível, mas depois se acostuma - acredite em mim.

$if Bash
# to exit through calling exit function which will archive the history
"\C-x\C-x": "exit\n"
# to dump history we have so far
"\C-x\C-w": "archive_history\n"

$endif

Além disso, se sua sessão do bash for uma sessão de login e você sair chamando ' logout', poderá adicionar a próxima linha ao seu~/.bash_logout

archive_history

Após todas as ações mencionadas, você pode encontrar seu ~/.bash_history.archivearquivo contendo seções como estas

#-belka-- Sun Oct 12 21:52:13 EDT 2003 - Sun Oct 12 21:53:25 EDT 2003 (/dev/pts/13) ----
exit
aptitude
exit
#-washoe-- Sun Oct 12 18:03:16 EDT 2003 - Sun Oct 12 23:06:48 EDT 2003 (/dev/pts/3) ----

exit
cd progr/letters/resume/
e resume.tex

que em geral pode ser lido como arquivo de histórico usual, se desejar.

Rahul Patil
fonte