사용자의 bash 명령을 어떻게 기록합니까?


답변:


11

스누피를 설치하십시오 . 한 명의 사용자 만 로그하려면 syslog 필터링 fu를 수행하십시오.


모든 사용자를 기록하고 싶습니다.
Malfist

그럼 그냥, 그것은거야 "단지 작품"(TM)를 설치
기술자에게

/var/log/auth.log 이외의 다른 곳에 기록하도록 설정할 수 있습니까?
Malfist

syslog로 이동하므로 어디에서나 iirc로 필터링 할 수 있습니다. 나는 syslog-ng로 아무것도하지 않았기 때문에 정기적 인 syslog가있는 필터에 대해서는 전혀 모른다.
Cian

4

패치 또는 특수 실행 도구를 사용하지 않고 모든 'bash'명령 / 내장을 텍스트 파일 또는 'syslog'서버에 기록하는 방법을 작성했습니다.

'bash'를 초기화 할 때 한 번 호출해야하는 간단한 셸 스크립트이므로 배포하기가 매우 쉽습니다. (예를 들어 .bashrc에서 '소스'만 사용하십시오) bash DEBUG 트랩 사용 아이디어를 기반으로합니다. 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  

자세한 내용은 여기에 설명되어 있습니다 : http://blog.pointsoftware.ch/index.php/howto-bash-audit-command-logger

Francois Scheurer를 건배


2

ttyrpld 시도 할 수 있습니다 . 전체 tty를 기록하기 때문에 원하는 것 이상입니다.
나는 그것을 직접 사용하지는 않았지만 (커널에서) 작동하는 방식으로 사용자가 로그를 변경할 수 없습니다.


멋지다, 나는 그것을 확인할 것이다. 그것이 모든 것에 잘 어울린다면 그것은 내가 필요한 것입니다. 확인하기 위해 로그 파일을 추가 전용으로 변경할 수 있습니다.
Malfist

스누피를 사용하는 Cian의 답변은 찾고있는 것과 더 비슷합니다.
반경

0

grsecurity 패치 커널을 사용하십시오 . 이 목적을위한 커널 옵션이 있습니다.


-1

시스템 감사를 활성화 할 수 있습니다.


1
그리고 어떻게합니까?
Rory

감사를위한 매뉴얼 페이지부터 시작하여 거기서부터 시작하십시오. 기본 데비안 설치의 일부는 아니지만 감사 기능은 Linux 커널 구성 요소이므로 사용자 배포 도구는 모든 배포에서 설치 및 사용할 수 있습니다.
Geoff Fritz

-3

bash는 지정된 크기의 명령 기록을 유지합니다. 관리자는 해당 크기를 설정하고 cron을 통해 사용자별로 해당 내역을 가져 오는 스크립트를 쉽게 작성할 수 있습니다.


1
.bash_history는 보안을위한 것이 아니라 편의를위한 것입니다. 이것에 대한 여러 가지 이유가 있는데, 그 이유는 최소한 사용자가 편집 할 수있는 (또는 최소한 추가 할 수있는) 것이 아닙니다.
Matt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.