Como posso registrar os comandos bash dos usuários?
10
Estou executando um servidor debian etch no qual os usuários farão login (espero) em uma prisão chroot através do ssh. Como posso ter os comandos que eles executam registrados de uma maneira que não podem excluir ou impedir?
Em seguida, basta instalá-lo, ele vai "apenas trabalho" (TM)
Cian
posso configurá-lo para registrar em algum lugar além de /var/log/auth.log?
11789 Malfist
Ele vai para o syslog, para que você possa filtrá-lo para qualquer lugar a partir daí, iirc. Eu só fiz alguma coisa com o syslog-ng, por isso não tenho idéia sobre filtros com o syslog regular.
Cian
4
Eu escrevi um método para registrar todos os comandos / bash 'bash' em um servidor de arquivo de texto ou 'syslog' sem usar um patch ou uma ferramenta executável especial.
É muito fácil de implantar, pois é um shellscript simples que precisa ser chamado uma vez na inicialização do 'bash'. (apenas a 'fonte' do .bashrc, por exemplo) É baseada na idéia de usar armadilhas bash DEBUG. Veja também este post em superuser.com
declare -rx HISTCONTROL="" #does not ignore spaces or duplicates
declare -rx HISTIGNORE="" #does not ignore patterns
declare -rx AUDIT_LOGINUSER="$(who -mu | awk '{print $1}')"
declare -rx AUDIT_LOGINPID="$(who -mu | awk '{print $6}')"
declare -rx AUDIT_USER="$USER" #defined by pam during su/sudo
declare -rx AUDIT_PID="$$"
declare -rx AUDIT_TTY="$(who -mu | awk '{print $2}')"
declare -rx AUDIT_SSH="$([ -n "$SSH_CONNECTION" ] && echo "$SSH_CONNECTION" | awk '{print $1":"$2"->"$3":"$4}')"
declare -rx AUDIT_STR="[audit $AUDIT_LOGINUSER/$AUDIT_LOGINPID as $AUDIT_USER/$AUDIT_PID on $AUDIT_TTY/$AUDIT_SSH]"
set +o functrace #disable trap DEBUG inherited in functions, command substitutions or subshells, normally the default setting already
shopt -s extglob #enable extended pattern matching operators
function audit_DEBUG() {
if [ "$BASH_COMMAND" != "$PROMPT_COMMAND" ] #avoid logging unexecuted commands after 'ctrl-c or 'empty+enter'
then
local AUDIT_CMD="$(history 1)" #current history command
if ! logger -p user.info -t "$AUDIT_STR $PWD" "${AUDIT_CMD##*( )?(+([0-9])[^0-9])*( )}"
then
echo error "$AUDIT_STR $PWD" "${AUDIT_CMD##*( )?(+([0-9])[^0-9])*( )}"
fi
fi
}
function audit_EXIT() {
local AUDIT_STATUS="$?"
logger -p user.info -t "$AUDIT_STR" "#=== bash session ended. ==="
exit "$AUDIT_STATUS"
}
declare -fr +t audit_DEBUG
declare -fr +t audit_EXIT
logger -p user.info -t "$AUDIT_STR" "#=== New bash session started. ===" #audit the session openning
#when a bash command is executed it launches first the audit_DEBUG(),
#then the trap DEBUG is disabled to avoid a useless rerun of audit_DEBUG() during the execution of pipes-commands;
#at the end, when the prompt is displayed, re-enable the trap DEBUG
declare -rx PROMPT_COMMAND="trap 'audit_DEBUG; trap DEBUG' DEBUG"
declare -rx BASH_COMMAND #current command executed by user or a trap
declare -rx SHELLOPT #shell options, like functrace
trap audit_EXIT EXIT
Você pode tentar ttyrpld . É mais do que você deseja, porque registrará todo o tty.
Eu não o usei, mas a maneira como está funcionando (no kernel) faz com que o usuário não possa alterar os logs.
legal, eu vou dar uma olhada. Se funcionar bem com tudo, será o que eu preciso. Eu posso mudá-lo de arquivos de log para acrescentar-only só para ter certeza
Malfist
A resposta Cian usando snoopy parece mais com o que você está procurando.
raio
0
Use um kernel corrigido grsecurity . Existe uma opção de kernel exatamente para esse fim.
Comece com as páginas de manual do auditd e vá a partir daí. Pode não fazer parte da instalação básica do Debian, mas o recurso de auditoria é um componente do kernel Linux, portanto, as ferramentas da terra do usuário podem ser instaladas e usadas em qualquer distribuição.
Geoff Fritz
-3
O bash mantém um histórico de comandos de um tamanho especificado. Você, o administrador, pode definir esse tamanho e escrever facilmente um script que vá buscar esse histórico por usuário via cron.
Respostas:
instale o snoopy . Se você deseja apenas registrar o usuário, faça algum filtro syslog fu.
fonte
Eu escrevi um método para registrar todos os comandos / bash 'bash' em um servidor de arquivo de texto ou 'syslog' sem usar um patch ou uma ferramenta executável especial.
É muito fácil de implantar, pois é um shellscript simples que precisa ser chamado uma vez na inicialização do 'bash'. (apenas a 'fonte' do .bashrc, por exemplo) É baseada na idéia de usar armadilhas bash DEBUG. Veja também este post em superuser.com
veja o método explicado em detalhes aqui: http://blog.pointsoftware.ch/index.php/howto-bash-audit-command-logger
aplausos Francois Scheurer
fonte
Você pode tentar ttyrpld . É mais do que você deseja, porque registrará todo o tty.
Eu não o usei, mas a maneira como está funcionando (no kernel) faz com que o usuário não possa alterar os logs.
fonte
Use um kernel corrigido grsecurity . Existe uma opção de kernel exatamente para esse fim.
fonte
Você pode ativar a auditoria do sistema.
fonte
O bash mantém um histórico de comandos de um tamanho especificado. Você, o administrador, pode definir esse tamanho e escrever facilmente um script que vá buscar esse histórico por usuário via cron.
fonte