강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
bash history를 syslog로 남기기
조회 : 7,666  


bash history를 syslog로 남기기

0. 개요
서버관리를 하다보면
누군가 파일을 지웠는데 아니라고 하며
관리자를 타박하거나 opensource라 그렇다고
책임을 전가하려는 것을 한두번은 격었을 것이다

만약 ftp라면 xferlog로 분석이 가능하겠지만
ssh나 sftp로 접속을 한경우 특히 ssh 로 접속 하여
root로 사용한 경우는 더욱이 밝히기 힘들다

bash_history에 커맨드는 남지만 언제 접속하여 한
작업인지는 확인이 불가능하다

즉 심증은 있지만 물증이 없다는 이야기이다

이러한 경우 정확히 증거를 수줍할 수있는 방법이 있다
바로 syslog에 남겨 그기록을 보졶는 것이다


1. 설정 방법
설정하기 위해서 사전에 생각해야 하는 것은
어떠한 채널을 사용할 것이며 어떠한 포맷으로 남길것인가이다

본문에서는 날짜 : 시간 : 사용자 : 접속 아이피 : 명령어의 포맷으로
local1의 채널을 사용할 것이다

그리고 history를 syslog로 넘기기 위해 리눅스 배포본에 기본적으로
설치되어있는 logger를 이용 할 것이다

먼저 history를 핸들링 하기 위해  /etc/profile에서 history에 대한
스크립트를 만들어 준다


/etc/profile 에 아래의 스크립트를 추가 한다
-------------------------------------------------------------------------
  ####### sulinux 2014  command history
  function history_to_syslog {
 declare command
 remoteaddr="`who am i`"        
 command=$(fc -ln -0)        
 if [ "$command" != "$old_command" ]; then                
  logger -p local1.notice -t bash -i ? "$USER : $remoteaddr"  : "$command"        
 fi        
 old_command=$command
 }
 trap history_to_syslog DEBUG
 ------------------------------------------------------------------------


 위와 같이 설정하면 터미널에 타이필후 엔터를 입력하면
 무조건 syslog로 local1.notice 채널로 넘겨준다


 위의 설정이후 syslog에서 해당 채널에 대해 로그를 남길수 있도록 설정한다

 /etc/syslog.conf 의 하단에 아래 내용을 추가한다
 -----------------------------------------------------------------------
 local1.notice      /var/log/.cmd.log
------------------------------------------------------------------------

이후 servie syslogd restart 하면 해당 로그를 남길 준비가된것이다

작업한 터미널에서 바로 또는 접속한 터미널에서 바로 남기기를 원하면

source /etc/profile을 해주면 바로 적용이 되며
위의 명령어를 실행 하지 않더라도 새로 접속한 터미널에서는 로그가 남게 된다

 

2. 로그 형대 및 추가 설정사항

접속후 명령어를 실행 할때마다 아래와 같은 형태로 로그가 남게 된다

--------------------------------------------------------------------------------------------------------------------------------
Nov  6 15:06:19 localhost bash[7397]: 1 root : root     pts/0        2012-11-06 15:06 (xxx.xxx.xxx.xxx) : #011 exit
Nov  6 15:06:39 localhost bash[7417]: 1 root : root     pts/0        2012-11-06 15:06 (xxx.xxx.xxx.xxx) : #011 netstat -nlp
Nov  6 15:06:45 localhost bash[7437]: 1 root : root     pts/0        2012-11-06 15:06 (xxx.xxx.xxx.xxx) : #011 mkdir /web_logs
Nov  6 15:06:45 localhost bash[7444]: ? root : root     pts/0        2012-11-06 15:06 (xxx.xxx.xxx.xxx) : #011 cd /web_logs/
Nov  6 15:06:46 localhost bash[7452]: ? root : root     pts/0        2012-11-06 15:06 (xxx.xxx.xxx.xxx) : #011 ll
--------------------------------------------------------------------------------------------------------------------------------

그리고 실행 디렉토를 알고 싶다면 위의 스크립트에서  $PWD  라는 변수를 이용하면 위치까지 확인이 가능하다

만약 log가 감당이 안될 정도로 쌓인다면
logrotate를 이용하여  messages 처럼 분할및 삭제가 가능하다

 

3. 마무리

어느 아이피에서 접속하여 어떤 명령어를 사용하였는지 확인이 가능하다
그리고 syslog를 이용하기에 원격으로 해당로그를 보내 원격지에서 저장 및 보관이 가능하다

이는  rm -f / 등의 명령은 막지 못하지만
어디서 접속하여 작업하였는지 확인이 가능하며
이로인해 문제의 원인을 찾기가 한결 수원해진다

그리고 서문에 언급한 일로 불필요한 시간낭비를 줄일수 있다


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1805


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
이재석
본명 : 이재석
e-mail : locli앳superuser.co.kr
소속 : (주)수퍼유저코리아