서버의 모든 사용자가 Bash 명령을 모두 기록하는 방법은 무엇입니까?


21

우리의 소규모 회사는 우분투 서버 11.10을 운영하고 있으며, 여기에는 두 사람이 SSH로 액세스 할 수 있습니다. 실제 터미널도 때때로 사용됩니다. 사용자 및 타임 스탬프와 함께 모든 Bash 명령 실행을 로컬로 어떻게 기록 할 수 있습니까?

우리는 아무도 악의적이지 않고 적극적으로 로깅을 피하려고 시도하지 않는다고 가정 할 수 있지만, 여전히 사용자가 로그 파일에 대한 직접적인 쓰기 액세스 권한을 갖지 않는 것을 선호합니다. 동시 세션을 올바르게 처리해야합니다.

답변:


32

BASH 쉘의 경우 시스템 전체 BASH 런타임 구성 파일을 편집하십시오.

sudo -e /etc/bash.bashrc

해당 파일의 끝에 추가하십시오.

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

새 파일로 "local6"에 대한 로깅을 설정하십시오.

sudo -e /etc/rsyslog.d/bash.conf

그리고 내용은 ...

local6.*    /var/log/commands.log

rsyslog를 다시 시작하십시오.

sudo service rsyslog restart

로그 아웃. 로그인하십시오.

그러나 로그 회전을 잊었습니다.

sudo -e /etc/logrotate.d/rsyslog

같은 방식으로 회전 할 로그 파일 목록이 있습니다 ...

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message

따라서 새 bash-commands 로그 파일을 해당 목록에 추가하십시오.

/var/log/commands.log

구하다.


답변에 추가 한 로그 회전을 잊어 버렸습니다.

1
이 방법은 효과가 있지만 주변에 방법을 발명 할 수 있습니다 (csh, .bash_logout 사용). Sabacon의 acct 솔루션을 사용합니다. 이 훌륭한 읽기했다 : linuxjournal.com/article/6144beginlinux.com/blog/2010/01/...

2
PROMPT_COMMANDbash가 아닌 쉘로 간단히 재설정하거나 설정을 해제 하거나 실행 하여 사용자가 쉽게 비활성화 할 수 있다고 생각합니다 .
Stefan Lasiewski

1
@Benubird 사전 설정된 몇 가지 시설 수준이있는 것 같습니다 . 그 중 8 개는 local0-local7 : en.wikipedia.org/wiki/Syslog 입니다. 0은 긴급을 의미하고 7은 디버그를 의미하고 6은 "정상적인 작동 메시지"인 7보다 부끄럽습니다.
munchybunch

1
@yukashima 로그를 삭제하지 않으면 큰 파일이 될 수 있기 때문에 회전은 로그 파일을 회전하고 로그를 작게 유지하기 위해 오래된 파일을 삭제하는 것을 의미합니다.
Badr Elmers

4

이와 관련하여 프로세스 계정 시스템, 특히 lastcomm 및 ac 명령을 제공하는 acct 패키지가 도움이 될 수 있습니다 .

ac 명령은 사용자의 연결 시간에 대한 통계를 시간 단위로 인쇄합니다. 이것은 사용자가 SSH 또는 직렬 터미널을 통해 원격으로 또는 콘솔에서 시스템에 연결 한 시간입니다.

lastcomm 명령은 이전에 실행 된 명령에 대한 정보를 표시합니다. 가장 최근 항목이 목록 맨 위에 표시됩니다. 각 프로세스가 사용한 총 CPU 시간도 표시됩니다.

도움이 될 수있는 오래된 튜토리얼은 다음과 같습니다.

http://www.linuxjournal.com/article/6144?page=0,1

이 자습서에서 last 등과 같은 다른 계정 명령을 찾을 수 있습니다.

http://www.techrepublic.com/article/system-accounting-in-linux/1053377


lastcomm은 명령 로거로서 무의미합니다. 실행 된 실행 파일 만 기록합니다. 인수, 스위치 또는 경로가 기록되지 않습니다.
Phil_1984_

3

snoopy를 사용할 수 있습니다 .

스누피 로거는 당신의 목적에 잘 맞을 것입니다. 피할 수없는 로깅 솔루션이 아니라, 자신의 작업을 추적하는 것을 선호하는 부지런한 관리자에게 유용한 도구입니다.

공개 : 나는 스누피 관리자입니다.


답변에 설치 및 사용에 대한 지침을 제공하십시오.
muru

1
자세한 설치 지침은 현재 주요 스누피 리소스 인 snoopy github 페이지 인 github.com/a2o/snoopy에서 확인할 수 있습니다. 기본 위치는 설계에 따라 유지되고 다른 위치는 유지되지 않으므로 다른 위치에 설치 지침을 다시 제공하고 있습니다. BTW 추가 정보가보다 체계적으로 업데이트되었습니다.
Bostjan Skufca 1

1
아마 그렇습니다. 그러나 이것을 사용하는 데 필요한 단계를 요약하지 않아도 링크 전용 답변이며 삭제 될 수 있습니다.
muru

1
글쎄, 나는 대안적이고 실행 가능한 솔루션에 대한 포인터를 제공했다. 그것이이 사이트에 관한 것이 아니라면, 반드시 내 계정과 함께 삭제되어야합니다.
Bostjan Skufca

2
@BostjanSkufca는 불쾌 할 필요가 없습니다. 적어도 합리적으로 독립적 인 답변을 얻는 것은 스택 교환 일뿐입니다. 단계를 추가하는 것에 강력히 반대한다면, 그것은 당신의 소원입니다. 내 downvote가 남아 있습니다. 누군가는 아마 그것을 찬성 할 것입니다.
muru

3

당신은 찾을 수 있습니다 여기에 모든 로그인하는 스크립트 bash는 텍스트 파일이나에 명령 / 빌트인 시스템 로그 패치 또는 특별한 실행 도구를 사용하지 않고 서버를.

bash 초기화시 한 번만 호출해야하는 간단한 셸 스크립트이므로 배포가 매우 쉽습니다 .

무료이며 귀하의 요구에 부합하기를 바랍니다.


1
이것은 좋은 답변이지만 블로그에 연결하는 대신 답변 본문에 단계와 스크립트를 포함시키는 것이 좋습니다. 이것을 포함하도록 답을 편집 해 주시겠습니까?
Tom Brossman

2
사이트를 사용할 수 없음
Gaia

0

기록 파일을 덮어 쓰지 않는 여러 세션을 처리하려면 Bash 시작 파일에 "shopt -s histappend"를 넣어야합니다. 같은 문제에 대한 이 질문 도 참조하십시오 .


0

이것을 시도하십시오 (위의 솔루션은 bash 4.3에서 100 % 작동하지 않습니다).

export HISTTIMEFORMAT="%Y-%m-%d %T "
export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;'

이것은 로깅을 수행하며 bash 히스토리 파일에 사용되는 타임 스탬프의 로깅을 방지합니다. bash는 strg + c를 여러 번 누른 후 bash 4.3으로 테스트 한 후 "subjob"에 신호를 보내므로 트랩이 필요합니다. 이것은 현재 사용자의 로그 아웃을 강제합니다 (예 : sudo로 로그인)


0

acct 설치를 시도 할 수도 있습니다. Acct는 Linux 시스템에서 수행되는 작업에 대한 자세한 감사 내역을 유지합니다.

sudo apt-get install acct
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.