Deep dive into MS-SQL IR Case : Stored procedure analysis - Response
이 글에서는 MS-SQL 로그 및 시스템 로그의 한계에 대응하기 위한 추가적인 로깅을 통한 추적과 침해사고 예방을 위한 몇 가지 보안 설정에 관해 설명한다. 침해사고 대응 및 예방을 위해 각 방안을 비교하여 시스템에 적절한 설정을 적용하는 것을 권고한다.
이 글을 읽기 전 아랫글을 먼저 읽는 것을 추천한다.
1. 로깅 강화
1. Sysmon을 통한 추적
이번에는 Sysmon을 설치해 MSSQL 서버에 대한 침해사고가 발생했을 때, 기본 상태와 비교해 보안 향상이 되는지 확인해 본다. 혹여 Sysmon을 처음 접하는 사람의 경우 아래 링크를 참고해 Sysmon의 개념에 대해 먼저 이해하길 바란다.
두 저장 프로시저를 통한 공격을 Sysmon을 이용해 확인한 결과는 다음과 같다. 운영체제에 따라 Sysmon의 로그가 달라지지 않기 때문에, 이번에는 Windows Server 2016만을 대상으로 분석을 진행했다.
확인 결과, 로그인 이력과 같은 특정 애플리케이션에 대한 이력은 확인할 수 없었지만, Sysmon은 기본적으로 프로세스 생성 이벤트를 추적하기 때문에, 부모 프로세스가 MSSQL이거나 비정상적인 CommandLine을 추적하면 공격자의 행동을 추적할 수 있을 것으로 판단된다.
2. SQL Server Profiler를 통한 추적
SQL Server Profiler는 SQL Server Management Studio의 일부로 제공되는 추적 도구다. 이 도구는 데이터베이스에서 실행되는 쿼리, 저장 프로시저, 트리거 등의 SQL 구문을 추적하고 기록해 분석하는 데 도움을 준다. 그러나, SQL Server Profiler는 기본적으로 모든 로그를 추적해 저장하므로, 서버의 성능 및 용량에 대한 보장이 없는 경우 서버 운영에 문제를 일으킬 수 있다. 따라서, 필요한 이벤트만 추적하도록 설정하기 위해 적절한 감사 설정을 사용해야 한다. 아래에는 로그인 및 저장 프로시저 사용을 추적할 수 있는 SQL Server Profiler 설정 방법을 제시한다.
1. SQL Server Profiler를 실행한다.
2. File - New Trace로 서버에 접속해 새로운 추적을 생성한다.
3. "이벤트 선택" 탭으로 이동해 "Security Audit > Audit Login/Logout" 및 "TSQL > SQL:BatchCompleted"를 선택하고 Column을 적절히 설정한다.
4. "Run"을 눌러 추적을 시작한다.
다만, 위 방법은 모든 SQL 쿼리를 추적하게 되므로 서버의 성능에 따라 관리되어야 한다. 따라서, Filters로 특정 SQL 쿼리만 추적하도록 설정할 수 있다.
그러나, xp_cmdshell처럼 프로시저 명이 고정되어 있지 않고 공격자가 임의의 저장 프로시저를 생성하는 CLR Shell은 필터 추적에 어려움이 있을 수 있다.
3. Extended Events를 통한 추적
Extended Events는 SQL Server 2008부터 도입된 성능 모니터링 시스템으로, 동작에 대한 상세한 정보를 제공한다. 다양한 이벤트를 지원하며, 원하는 이벤트만으로 세션을 구성해 추적할 수 있다. 따라서, 로그인 및 저장 프로시저만을 추적하도록 세션을 생성해 위협 모니터링을 수시로 수행하는 것을 권장한다. 다음은 Extended Events로 로그인 및 저장 프로시저를 추적할 수 있는 설정 방안이다.
- SQL Server Management Studio(SSMS)로 SQL Server에 연결한다.
2. "관리" 메뉴를 확장하고 "확장 이벤트"를 클릭한다.
3. "새 세션 마법사"를 클릭해 새 세션을 생성한다.
4. 세션 이름을 입력하고, 필요한 경우 세션 옵션을 구성한다.
5. 이벤트 라이브러리
에서 이벤트를 추가한다. 로그인 및 저장 프로시저 명령 추적에 관한 이벤트는 다음과 같다.
이벤트 | 설명 |
---|---|
sqlserver.login | 로그인 성공 및 실패하였을 때 발생 |
sqlserver.sql_statement_completed | SQL문이 완료될 때마다 발생 |
sqlserver.sp_statement_completed | 저장 프로시저 내의 개별 SQL 문이 완료되었을 때 발생 |
sqlserver.module_start | CLR 모듈(즉, CLR 저장 프로시저, 함수 또는 트리거)이 시작될 때 발생 |
sqlserver.module_end | CLR 모듈(즉, CLR 저장 프로시저, 함수 또는 트리거)이 완료될 때 발생 |
sqlserver.assembly_load | CLR Assembly가 로드될때 발생 |
6. 전역 필드 캡처
에서 주요 정보만 선택한다. 아래는 추적에 필요한 일부 필드들에 대한 정보이다. 이외 필요한 필드를 추가해 설정을 완료한다.
필드 명 | 설명 |
---|---|
session_id | 이벤트가 발생한 세션의 ID를 표시 |
sql_text | 이벤트와 관련된 SQL 명령 텍스트를 표시 |
username | 이벤트를 발생시킨 사용자의 이름을 표시 |
client_app_name | 이벤트를 발생시킨 클라이언트 응용 프로그램의 이름을 표시 |
client_hostname | 이벤트를 발생시킨 클라이언트 호스트의 이름을 표시 |
database_name | 이벤트가 발생한 데이터베이스의 이름을 표시 |
start_time | 이벤트가 시작된 시간을 표시 |
7. 세션 데이터 스토리지
를 지정해 로그 파일을 저장하도록 설정한다. 이때, 롤 오버 기능을 사용해 로그가 순환될 수 있도록 설정하며 저장소의 성능에 따라 적절히 관리해야 한다.
8. 이벤트 세션
을 생성한다.
이렇게 최종적으로 이벤트 세션을 생성해 추적하는 경우, 아래 그림처럼 실행된 SQL 구문을 확인할 수 있다.
2. 서버 보안 강화
2.1. 외부접속 보안 강화
MS-SQL 서버는 ERP 및 다양한 업무용 솔루션 설치 과정에서 함께 설치되는 경우도 많다. 이렇게 설치되는 경우, 기본 포트로 설정되어 외부에 서비스가 노출될 수 있다. 서비스가 인터넷에 노출될 경우, 공격자의 무차별 대입 공격(Brute-Force Attack), 사전 공격(Dictionary Attack)을 통해 비밀번호가 탈취될 가능성이 높다.
따라서, 아래와 같은 보안 조치를 통해 MS-SQL 및 서버 자체에 대한 보안을 강화해 위협을 방지해야한다.
2.1.1. 접근 제어 정책 적용
부득이 하게 서비스를 외부에 오픈해야할 경우, 인가된 IP만 접근할 수 있도록 접근제어 정책을 설정하여 불필요한 외부 접근을 차단해야한다.
2.1.2. 기본 포트 변경
기본 포트는 스캐닝등에 의해 쉽게 공격 대상이 될 가능성이 높으므로 포트 번호를 변경하여 사용해야한다.
* 기본 포트
MS-SQL: 1433 / RDP: 3389
2.1.3. VPN 사용
외부에서의 접근이 필요한 경우, VPN을 통해 접근해야한다.
2.1.4. 이중 인증 적용
VPN 및 RDP의 경우, OTP와 같은 이중 인증 방식을 적용하여 계정이 탈취되더라도 비인가자의 접근을 차단할 수 있도록 설정해야한다.
2.2. 계정 보안 강화
2.2.1. 기본 관리자 비밀번호 변경
ERP와 같이 업무용 솔루션과 함께 MS-SQL이 설치되는 경우, 솔루션이 사용하는 데이터베이스 관리자 계정의 초기 비밀번호를 공격자가 유추하기 어렵게 변경해야하며, 일정 주기에 따라 변경하여 사용해야한다.
2.2.2. sa 계정 비활성화
sa(System Administrator)계정은 MS-SQL에서 최상위 관리자 계정으로, 모든 데이터베이스 및 서버 수준의 작업을 수행할 수 있다. 따라서, 부득이하게 해당 계정을 사용해야하는 경우에는 비밀번호를 복잡하게 변경하고 사용해야하며, 이외에는 해당 계정을 비활성화해야한다.
2.2.3. 주기적인 계정 권한 점검
서버 관리를 위해 다수의 계정을 운영해야한다면, 계정마다 필요한 권한을 정확히 파악하여 부여할 필요가 있다. 다수의 계정이 관리자 권한을 가지고 있다면 하나의 계정이 탈취될 경우, 서버 전체의 보안이 위협받을 수 있다. 따라서, 각 계정에 부여된 권한을 주기적으로 점검하고, 불필요한 권한은 즉시 제거해야 한다.
또한, 사용하지 않는 계정은 비활성화하거나 삭제하는 것이 좋다. 이를 통해 불필요한 접근 포인트를 최소화하고, 서버의 보안을 강화할 수 있다. 주기적인 권한 점검은 서버의 안정성을 유지하고, 잠재적인 위협으로부터 보호하는 데 중요한 역할을 한다.
2.3. 데이터베이스 운영 서버 보안 강화
2.3.1. 운영체제 업데이트 및 업그레이드
지원이 종료된 운영체제의 경우, 보안 업데이트가 지속적으로 수행되지 않는다. 취약점이 발견될 경우, 공격자는 이를 악용해 공격을 수행할 수 있다. 따라서, 지원이 종료된 운영체제를 사용하는 경우에는 충분한 검토를 거쳐 보안 업데이트가 지원되는 운영체제를 사용하는 것을 권고한다.
2.3.2. 안티-바이러스 솔루션 설치 및 랜섬웨어 보호 기능 활성화
안티-바이러스 솔루션을 설치하여 서버로 유입되는 악성 파일들을 사전에 차단하고, 랜섬웨어 차단 폴더 등의 랜섬웨어 보호 기능을 활용하여 랜섬웨어를 방지할 수 있다.
3. 결론
MS-SQL 데이터베이스에서 시스템 저장 프로시저를 활용한 공격 분석을 진행하였다. 이 분석에서는 xp_cmdshell과 CLR Shell을 사용한 공격을 중점적으로 살펴보았으며, 로그인 이력, 저장 프로시저 활성화 이력, 명령 실행 이력 등을 추적할 수 있음을 확인하였다.
그러나, 이러한 추적이 완벽하지 않은 경우도 있었다. 모든 이력이 로그에 기록되지 않는 경우, 또는 기록된다 해도 세부적인 정보를 제공하지 않는 경우가 상당히 많았다. 이에 따라, 공격자의 행동을 완전히 추적하는 것이 어려웠다.
이러한 문제에 대응하기 위해, 여러 Windows 아티팩트와의 연관 분석이 필요함을 확인할 수 있었다. 또한, Sysmon이나 SQL Server Profiler와 같은 도구를 활용하여 SQL Server나 Windows 시스템에서 발생하는 이벤트를 주기적으로 모니터링하여 애플리케이션 및 시스템 로깅의 한계를 극복할 수 있다.
이러한 과정을 통해, 기존의 로깅 방법만으로는 충분하지 않을 수 있음을 인지하였고, 침해사고 대응 및 예방을 위해 시스템에 적절한 추가 설정을 적용하길 바란다.