
VPN은 사용자 기기와 인터넷 사이에 터널을 만들어주는 기술이다. VPN을 설정하면 외부에서 내부 네트워크로 전용 회선이 놓인 것 같은 효과를 얻을 수 있다.
VPN이 지원하는 주요 기능은 다음과 같다.
양단 통신이 가능하도록 정책을 허용하여 종단이 다른 네트워크로 구성되어 있지만 동일 네트워크에 있는 거처럼 동작한다. 기존에는 Port Forwarding을 통해 내부 네트워크에 접근했지만 해당 VPN을 이용함으로서 더 안전하게 통신이 가능해졌다.
하지만 계정이 탈취된다면 다른 이용자가 쉽게 내부 네트워크로 접근이 가능해진다. 그래서 기업 환경에서는 SIEM(Security Information and Event Management), EDR(Endpoint Detection and Response) 같은 솔루션을 지원한다.
SIEM, EDR
SIEM은 '보안 정보 및 이벤트 관리'를 하는 기술로 시스템에서 발생하는 로그와 이벤트 데이터를 수집하고 분석하여 보안 위협을 탐지, 대응, 관리하는 사이버 보안 솔루션이다.
EDR은 기기에서 발생하는 사이버 위협을 탐지하고 대응하는 보안 솔루션으로 악성코드를 파일이 아닌 기기의 행위를 분석하여 탐지하며, 위협의 전 과정을 추적하고 분석하는 보안 솔루션이다.
IPSec VPN은 인터넷 프로토콜(IP) 계층에서 작동하며, IPSec이라는 보안 프로토콜 그룹을 사용하여 데이터를 암호화하고 인증함으로써 VPN을 구성하는 기술이다.
먼저 HA 네트워크란 시스템의 단일 장애 지점(Single Point of Failure, SPOF) 을 제거하여 장애가 발생하더라도 서비스가 중단 없이 지속되도록 보장하는 네트워크 환경을 의미하고, 이러한 고가용성이 보장되는 네트워크 환경을 위해 네트워크 트래픽에 의한 부하를 분산하고 서버 하나에 장애가 발생해도 서비스의 지속성을 보장하는 Fail Over기능을 하는 것이 Load Balancer이다.
실습환경 세팅
- ec2 인스턴스 2개 (하나는 그냥 생성 나머지는 이미지로 만들어서 올리기)
- vpc는 default 이용
- 보안 그룹에서 http 연결 정책 추가
- 생성한 두 인스턴스를 대상 그룹(target group)으로 설정
- Load Balancer 생성시 대상 그룹 지정 및 서브넷은 인스턴스 설정시 했던 서브넷 지정
- auto scaling을 위해 시작 템플릿 생성 후 auto scaling 생성

로드 밸런서 사용 실습을 위해 Ec2 인스턴스 2개를 만들어준다.

생성한 인스턴스들을 Target Group으로 지정한다.

그리고 로드밸런서를 생성 해준다.

생성한 로드 밸런서 DNS 주소로 접속하면 Ec2 인스턴스에 올려놓은 웹서버 페이지를 볼 수 있고, 다른 설정을 하지 않으면 기본적으로 Round-Robin으로 로드 밸런서가 작동하기 때문에 페이지 새로고침만 해줘도 각각 인스턴스에 설정한 웹 페이지로 바뀌는것을 확인할 수 있다.

로드밸런서에 Auto-Scaling 기능을 추가 해보자. Auto Scaling 그룹을 원하는 사양에 맞춰 설정하여 생성 해준다. 인스턴스 관리 탭에 들어가면 할당되어 있는 인스턴스를 확인할 수 있다.

각 인스턴스에 ssh 접속을 해주고 모니터링용 터미널도 켜준 상태에서 stress 패키지를 활용하여 각 인스턴스에 부하를 줄 것이다. 컴퓨팅 리소스 사용량 모니터링은 top 명령으로 확인 가능하다.

부하를 주기 전 각 인스턴스의 cpu 사용량이다. stress --cpu 2 --timeout 600 명령으로 cpu에 부하를 줘보자.

cpu 사용량이 100% 가까이 증가됨을 확인할 수 있고, Auto Scaling이 됐는지 확인해보자.

추가적으로 인스턴스가 할당된 것으로 보아 Auto Scaling이 잘 되고 있음을 확인할 수 있다.
취약점 분석, 시스템 모니터링 등과 같은 작업을 자동화 하기 위해 스크립트를 작성하게 되는데, Shell Script 작성을 할 때 주요 유의 사항은 다음과 같다.
shell script는 동작하는 OS의 Shell에 따라 Script는 영향을 받는다.
기존 bash 환경에서 사용되던 반복문 일부와 명령어 패키지가 가진 옵션이 다른 경우 제대로 동작하지 않을 수 있다.
Bourne Shell
Shellshock 취약점은 Bash가 환경 변수를 처리하는 방식의 결함으로, 공격자가 원격에서 임의의 코드를 실행할 수 있고, Bourne Shell (sh) 문법은 유닉스 계열 운영체제의 POSIX 표준에 가장 가깝게 설계되어 여러 shell에서 범용적으로 실행이 가능하다.
점검 항목 모듈화
Script를 한 덩어리로 만들지 말고, 점검항목에 따라 함수화 해줘야 수정시 해당 영역만 변경할 수 있다.
Shell Script 작성시 유의 사항을 참고하여 간단하게 특정 사용자가 로그인, 로그아웃했을 때 감지하는 기능과 사용자가 su 명령을 통해 사용자 변경을 시도를 감지하는 모니터링 스크립트를 작성 해보고 테스트 해봤다. 스크립트 작성시 고려한 사항은 다음과 같다.
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로 변경해도 찍히는 것을 확인할 수 있다. 사용자 변경에 실패해도 역시 로그에 남는다.

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

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