1. Shell Script

취약점 분석, 시스템 모니터링 등과 같은 작업을 자동화 하기 위해 스크립트를 작성하게 되는데, Shell Script 작성을 할 때 주요 유의 사항은 다음과 같다.

  • shell script는 동작하는 OS의 Shell에 따라 Script는 영향을 받는다.
    기존 bash 환경에서 사용되던 반복문 일부와 명령어 패키지가 가진 옵션이 다른 경우 제대로 동작하지 않을 수 있다.

  • Bourne Shell
    Shellshock 취약점은 Bash가 환경 변수를 처리하는 방식의 결함으로, 공격자가 원격에서 임의의 코드를 실행할 수 있고, Bourne Shell (sh) 문법은 유닉스 계열 운영체제의 POSIX 표준에 가장 가깝게 설계되어 여러 shell에서 범용적으로 실행이 가능하다.

  • 점검 항목 모듈화
    Script를 한 덩어리로 만들지 말고, 점검항목에 따라 함수화 해줘야 수정시 해당 영역만 변경할 수 있다.

2. Log-in & Out, su Monitoring

Shell Script 작성시 유의 사항을 참고하여 간단하게 특정 사용자가 로그인, 로그아웃했을 때 감지하는 기능과 사용자가 su 명령을 통해 사용자 변경을 시도를 감지하는 모니터링 스크립트를 작성 해보고 테스트 해봤다. 스크립트 작성시 고려한 사항은 다음과 같다.

  • bourne shell script로 작성
  • 사용자의 접속 상태를 현재 상태와 최근 상태 두 가지로 나눠 로그인, 로그아웃 상태를 별도 로그 파일에 기록
  • su 명령 사용 여부를 RedHat/CentOS 계열은 /var/log/secure 또는 /var/log/messages에 기록하기 때문에 이를 활용하여 su명령 사용 로그 부분을 파싱하여 감지. 나는 /var/log/messages 로그 파일에서 파싱하는게 더 편할거 같아서 해당 파일에서 파싱을 진행했음.
#!/bin/sh
USER_TO_WATCH="testuser"
LOG_FILE="userLoginLog"

echo "### 사용자 '${USER_TO_WATCH}' 로그인/로그아웃 감시 시작 ###"

SU_LOG_FILE="/var/log/messages"
LAST_STATE=0
LAST_SU_ENTRY=""

while true; do
    if who | grep -w "$USER_TO_WATCH" > /dev/null; then
        CURRENT_STATE=1
    else
        CURRENT_STATE=0
    fi

    if [ $LAST_STATE -eq 0 ] && [ $CURRENT_STATE -eq 1 ]; then
        LOGIN_TIME=$(date "+%Y-%m-%d %H:%M:%S")
        echo "사용자 '$USER_TO_WATCH': 로그인 감지"
        echo "${LOGIN_TIME}_${USER_TO_WATCH} 로그인 시작 감지" | tee -a "$LOG_FILE"
    elif [ $LAST_STATE -eq 1 ] && [ $CURRENT_STATE -eq 0 ]; then
        LOGOUT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
        echo "사용자 '$USER_TO_WATCH': 로그아웃 감지"
        echo "${LOGOUT_TIME}_${USER_TO_WATCH} 로그아웃 감지 및 기록" | tee -a "$LOG_FILE"
    elif [ $CURRENT_STATE -eq 0 ]; then
        echo "감지중..."
    fi

    if [ -n "$SU_LOG_FILE" ]; then
        LATEST_SU_ENTRY=$(sudo tail -n 50 "$SU_LOG_FILE" 2>/dev/null | grep -E 'su(\[[0-9]+\])?:|pam_unix\(su' | tail -n 1 || true)
        if [ -n "$LATEST_SU_ENTRY" ] && [ "$LATEST_SU_ENTRY" != "$LAST_SU_ENTRY" ]; then
            SU_TIME=$(date "+%Y-%m-%d %H:%M:%S")
            echo "su 명령 사용 감지"
            echo "${SU_TIME}_su 사용 감지: ${LATEST_SU_ENTRY}" | tee -a "$LOG_FILE"
            LAST_SU_ENTRY="$LATEST_SU_ENTRY"
        fi
    fi

    LAST_STATE=$CURRENT_STATE
    sleep 5
done

터미널 두 개를 띄우고 한 쪽에 shell script를 실행시키고 접속 준비를 한다.

로그인을 했더니 로그가 찍힌 것을 확인할 수 있었다.

testuser에서 user로 사용자 변경을 하니 이 역시 로그가 찍혔고, root로 변경해도 찍히는 것을 확인할 수 있다. 사용자 변경에 실패해도 역시 로그에 남는다.

마지막으로 로그아웃을 해도 로그가 잘 남는 것을 확인할 수 있었다.

별도로 로그를 저장하기 위해 설정한 파일에도 로그가 잘 남아 있다.

0개의 댓글