Security administrator - 실패한 로그온 이벤트를 손쉽게 찾아내기

Security administrator +

LogParser를 사용하자.

윈도우의 보안 문제를 다룰 때 가장 중요한 리소스 중의 하나는 윈도우 보안 로그이다. 시스템의 보안 로그내에 기록된 이벤트들을 분석하면 잠재적인 보안 위협이나 보안 불일치와 관련된 사항들을 찾아낼 수 있다. 이 로그에 포함되어 있는 모든 정보를 살펴보려고 시도하다가는 낭패를 겪을 수 있다. 예를 들어 윈도우 2000 이후 버전의 도메인에서, 각 도메인 컨트롤러의 보안 로그에는 도메인 로그온 실패와 관련된 모든 레코드들이 기록된다. 실패-관련 이벤트들을 찾아내기 위해 모든 도메인 컨트롤러의 보안 로그를 옮기는 작업이나 원하는 보안 위협을 찾아내기 위해 이런 이벤트들의 설명들을 필터링하는 작업은 그다지 쉬운 일이 아니다.

LogParser를 사용해보자. 이 유틸리티는 윈도우 2000 이상의 시스템에서 이벤트 로그를 읽고, 쿼리할 수 있는 아주 유용한 기능을 제공한다. LogParser는 SQL과 유사한 SELECT 구문을 제공한다. 이 명령을 사용하면 EventID, EventType, TimeGenerated와 같은 이벤트-로그 필드를 이용해 정보를 필터링할 수 있다. 이벤트의 설명 필드에서 정보를 추출하기위해 이 툴의 Strings 필드를 사용하는 방법을 살펴보도록 하자.

도메인 컨트롤러의 보안 로그를 스캔하고, 특정 이벤트의 인스턴스나 이벤트들을 추출하고, 이벤트의 설명에서 특정 정보를 꺼내기 위해 LogParser를 사용할 수 있다. 예를 들어 로그온-실패 분석을 위해 LogParser를 사용하는 방법을 살펴보도록 하자.

토큰 정보

예를 들어 보안 로그를 스캔해서 이벤트 ID 529번 이벤트(logon failure:bad username or password)를 찾아낼 필요가 있으며, 이벤트의 설명에서 Logon Type 필드를 이용해 이런 종류의 이벤트들을 필터링 할 필요가 있다고 가정하자. 이 필드는 로그온 실패 원인에 대한 보다 상세한 정보를 제공한다-예를 들어 실패한 로그온 시도가 인터랙티브 로그온 시도(Logon Type 3)인지, 서비스나 예약된 작업에 의한 시도(Logon Type 4)인지를 알수 있다. Logon Type 4의 이벤트가 운영 관점에서는 흥미로울 수 있지만, 보안 관점에서는 중요하지 않을 수도 있다. 서버가 물리적으로 안전한 상태를 유지하고 있다면, 실패한 인터랙티브 로그온을 필터링해서 제거할 수도 있으며, 시스템의 물리적 보안을 높이기위해 다른 물리적 장치가 제공하는 액세스 제어 로그 기능을 이용하는 것도 권장할 만하다.

우선, 이벤트 ID 529의 모든 인스턴스에 대한 설명을 추출하기위해 [리스트 1]의 명령을 실행시킨다. 이 명령은 이벤트 ID 529 인스턴스의 EventID와 Strings 필드를 포함한 출력물을 만들어준다. [그림 1]을 참조한다. 출력물의 각 라인은 하나의 이벤트 인스턴스를 나타낸다. 컬럼은 선택된 필드를 나타낸다. Strings 필드는 이벤트 설명내의 모든 필드를 포함하며 이런 필드의 구분자는 파이프 문자(|)이다. 출력물의 Strings 컬럼의 3번째 필드가 Logon Type을 의미한다.

해당 필드를 필터하려면 LogParser의 EXtrACT_TOKEN 함수를 사용한다. 이 함수는 3개의 인수를 필요로 한다. 이 인수들은 추출하고자 하는 토큰의 소스 스트링(즉, field) 토큰의 인덱스, 구분자 스트링(이 경우, 파이프 문자)이 된다. 예를 들어 [리스트 2]의 명령은 Strings 컬럼의 3번째 필드에서 필요한 정보를 추출하기위해 EXtrACT_TOKEN 함수를 사용하는 예이다. 출력 컬럼의 레이블은 AS 키워드를 사용하여 "LogonType"이라고 설정한다. [그림 2]는 이 명령의 결과물이다. 참고하기 바란다. Strings 컬럼의 필터링을 좀더 고급화시키고 Logon Type 3의 이벤트만을 검색하려면 [리스트 3]과 같은 명령을 실행시킨다. 이 명령은 Logon Type 3의 이벤트 ID 529번 모든 인스턴스에 대해 이벤트가 발생한 시간(TimeGenerated)과 로그온 시도 사용자 계정(token 0), 로그온 타입(token 2), 로그온을 시도한 컴퓨터(token 5), 시스템의 IP 주소(token 11) 정보를 제공한다. [그림 3]은 이 명령의 결과물이다. 참고하기 바란다.

좀 더 재미있는 작업을 해보자

이제 실행시킬 필요가 있는 쿼리 종류에 대해서 살펴보자. 여러 개의 입력 로그에서 정보를 추출하도록 쿼리를 변경시켜보자. 이 작업을 수행하려면, FROM 절에 쿼리 대상이 되는 모든 로그를 지정한다. 다른 컴퓨터의 로그를 지정하려면, UNC 경로명을 이용한 로그 이름을 사용한다. 예를 들어, 해당 시스템에서 모든 이벤트 ID 529 리스트를 추출할 때는 [리스트 4]와 같은 명령을 사용한다.

모든 도메인 컨트롤러에서 실패한 네트워크 로그온을 쿼리하려면, FROM 절에서 시스템 이름을 하드-코딩할 수도 있다. 이런 방법을 사용하면, 도메인 컨트롤러가 제거되거나 프로비전닝되었을 경우 문제를 일으킬 수 있다. 이런 상황을 피하려면, 좀더 인텔리한 쿼리를 만들어 적당히 DC들을 포함시키거나 제외시킨다. [웹 리스트 1](http://www.winnetmag.co.kr 의 자료실에서 다운로드 가능)도메인의 Domain Controllers 조직 단위를 반복적으로 찾아 LogParser가 요구하는 폼으로 모든 DC의 Security 로그 리스트를 만들어 준다. VBScript 스크립트를 변형시켜 사용하는 것이 도움이 된다. 간단히 callout A의 sto.local이라는 도메인 이름을 실제 사용하는 도메인 이름으로 교체한다. 예를 들어 DNS 도메인이 europe.acme.com 이라면 callout의 코드를

Set domain = GetObject("LDAP://dc=europe;dc=acme;dc=com")

으로 변경한다.

DClist.vbs를 실행시키려면 명령 라인에서 다음과 같이 명령을 실행시킨다.

cscript DClist.vbs

이 스크립트는 현재 작업중인 디렉터리에 SetdClist.cmd라는 하나의 배치 파일을 만든다. 명령 라인에서 다음 명령을 실행시킨다.

SetdClist.cmd

이 명령을 실행시키면 DClist라는 환경 변수가 만들어진다. Dclist.vbs가 검색한 도메인 컨트롤러 리스트가 환경 변수 값으로 설정된다. 배치 파일을 실행시킨 후 다음과 같은 명령을 이용해 확인 작업을 수행한다.

set DClist

LogParser 명령에 %DClist% 변수를 포함시킬 수 있다. 예를 들어 [웹 리스트 2](http://www.winnetmag.co.kr 의 자료실에서 다운로드 가능)의 명령들은 VBScript 파일을 실행시키고, 배치 파일을 실행시킨 후, 도메인내의 모든 도메인 컨트롤러에서 Security 로그에서 이벤트 ID 529의 모든 인스턴스를 대상으로 TimeGenerated, EventID, ComputerName 정보를 보여주기 위해 LogParser 명령에 Dclist 변수를 사용하는 예를 보여주고 있다.

Master Your Domain

Dclist.vbs와 SetdClist.com를 실행시킨 후, 중요한 활동을 추적하기위해 쿼리를 만든다. 도메인 계정에 대한 모든 로그온 활동을 추적하려면 Security 로그의 Account Logon 카테고리에서 만들어내는 이벤트를 사용할 수 있다. 윈도우 2000 이후 버전의 운영체제는 Kerberos와 윈도우 NT LAN Manager(NTLM) 인증을 사용한다. 침입자는 NTLM의 취약점을 이용하는 공격을 시도할 가능성이 있다. 따라서, 네트워크 컴퓨터가 윈도우 2000 이후 버전의 운영체제를 사용하고 NTLM을 사용하지 않는다하더라도 Kerberos와 NTLM 모두 모니터링할 필요가 있다. 따라서 Kerberos, 윈도우 서버 2003의 NTLM, 윈도우 2000의 NTLM과 같은 이벤트 ID를 분석할 필요가 있다.

유효한 사용자 이름을 사용했지만 잘못된 패스워드를 사용한 실패한 로그온 시도를 알아내보도록 하자. 시스템은 Kerberos 로그에 이벤트 ID 675를 기록하게 된다. 실패 코드는 0x18이다. [리스트 5]는 이런 이벤트들이 발생한 날짜와 시간, 로그온 시도한 사용자 계정의 이름, 로그온 시도한 시스템의 IP 주소를 검색할 때 사용하는 LogParser 명령의 예이다. [그림 4]를 참조한다.

다음, NTLM을 사용하는 실패한 로그온 이벤트를 알아내보자. 윈도우 2003 로그 이벤트 ID 680은 NTLM 인증 이벤트로 성공, 실패 모두를 보여준다. 따라서, 이벤트 ID 680 만으로는 원하는 결과를 찾아낼 수 없다. EventType 16(Failure Aduid Event)와 이벤트 ID 680의 설명에서 오류 코드 C000006A(이 이벤트는 잘못된 패스워드로 인한 로그온 실패와 관련있다)를 찾아내야 한다. [리스트 6]의 쿼리는 이런 이벤트들을 찾아 그림 5와 같은 리포트를 제공한다. 윈도우 2000 시스템은 약간 다른 쿼리를 이용해야 한다. 이 시스템은 실패한 NTLM 인증 이벤트를 나타내기위해 이벤트 ID 681을 사용한다. 오류 코드의 10진수 버전이 기록된다. 또한, 윈도우 2003과 윈도우 2000의 사용자 이름 토큰의 위치가 좀 다르다. 윈도우 2003의 사용자 이름 토큰은 Token 1이며, 윈도우 2000의 사용자 이름 토큰은 Token 0이다. 윈도우 2000 시스템에서 NTLM 인증 실패에 대한 정보를 검색하려면 [리스트 7]과 같은 쿼리를 사용한다.

More to Come

필자가 보여준 샘플 쿼리들은 잘못된 패스워드로 인해 발생하는 실패한 로그온을 추적할 때 요긴하게 사용할 수 있다. 다음 기사에서는, 좀더 다양한 보안 정보를 얻기위해 사용할 수 있도록 LogParser 쿼리를 변경시키는 방법을 다루도록 하겠다. 기대해주기 바란다.

리스트 1: 이벤트 설명을 추출하는 명령

logparser "SELECT EventID, Strings FROM security WHERE EventID=529"

리스트 2: 이벤트 설명에서 특정 필드를 추출하는 명령

logparser "SELECT EventID, EXtrACT_TOKEN(Strings,2,'|') AS LogonType FROM 
security WHERE EventID=529"

리스트 3: 이벤트 설명에서 몇몇 지정된 필드에 필터를 적용시키는 명령

logparser "SELECT TimeGenerated, EXtrACT_TOKEN(Strings,0,'|') AS UserName, 
EXtrACT_TOKEN(Strings,2,'|') AS LogonType, EXtrACT_TOKEN(Strings,5,'|') AS 
Computer, EXtrACT_TOKEN(Strings,11,'|') AS IPAddress FROM security WHERE 
EventID=529 AND LogonType = '3'"

리스트 4: 복수개의 시스템에서 정보를 추출하는 명령

logparser "SELECT TimeGenerated, EventID, ComputerName FROM \\w3ms\security, 
\\ias1\security WHERE EventID=529 ORDER BY TimeGenerated"

리스트 5: 실패한 Kerberos 로그온 시도를 알아내는 명령

logparser "SELECT TimeGenerated, EXtrACT_TOKEN(Strings,0,'|') AS UserName, 
EXtrACT_TOKEN(Strings,5,'|') AS IPAddress FROM Security WHERE 
(EventID=675) AND EXtrACT_TOKEN(Strings,4,'|')='0x18'"

리스트 6: 윈도우 2003에서 실패한 NTLM 로그온 시도를 알아내는 명령

logparser "SELECT TimeGenerated, EXtrACT_TOKEN(Strings,1,'|') AS UserName, 
EXtrACT_TOKEN(Strings,2,'|') AS Workstation FROM Security WHERE 
(EventID=680) AND EXtrACT_TOKEN(Strings,3,'|')='0xC000006A' AND 
EventType=16"

리스트 7: 윈도우 2000에서 실패한 NTLM 로그온 시도를 알아내는 명령

logparser "SELECT TimeGenerated, EXtrACT_TOKEN(Strings,0,'|') AS UserName, 
EXtrACT_TOKEN(Strings,2,'|') AS Workstation FROM Security WHERE 
(EventID=681) AND EXtrACT_TOKEN(Strings,3,'|')='3221225578'"

그림1 문자열 결과 예제

EventID       Strings
------       ---------------------------------------------------
529           administrator |MTG|3|NtLmSsp   |NTLM|CPQ|-|-|-|-|-
              |10.42.42.12|0
529           administrator |MTG|3|NtLmSsp   |NTLM|CPQ|-|-|-|-|-
              |10.42.42.12|0
529          nitework|W3MS|4|Advapi    |Negotiate|W3MS|W3MS$|STO|(0x0,0x3E7)
             |844|-|-|-
529          administrator|W3MS|2|User32   |Negotiate|W3MS|W3MS$|STO
             |(0x0,0x3E7)|204|-|127.0.0.1|0

그림 2 특정 토컨 추출

EventID      LogonType
------      ---------
529          3
529          3
529          3
529          3
529          4
529          2

그림 3 특정 토컨을 위해 필터링된 결과

TimeGenerated      UserName    LogonType    Computer    IPAddress
-----------       --------    ---------    -------    ----------
4/17/2004 12:02:44  administrator   3            CPQ          10.42.42.12
4/17/2004 12:02:51  administrator   3            CPQ          10.42.42.12
4/17/2004 12:04:21  Administrator  3            W3MS         10.42.42.37
4/17/2004 12:07:40  jsmith         3             XP3           10.42.42.74

그림 4 이벤트 ID 675 에서 추출한 정보

TimeGenerated                  UserName          IPAddress
-----------------------    -----------       ----------------
4/17/2004  15:46:05             alice               10.42.42.109
4/17/2004  16:50:37          john                  10.42.42.13

그림 5 이벤트 ID 680에서 추출한 정보

TimeGenerated                         UserName           Workstation
-------------------------        --------------    --------------
4/17/2004  12:02:44                   administrator         CPQ
4/17/2004  12:02:51                   administrator         CPQ
4/17/2004  12:04:21                   Administrator         W3MS
4/17/2004  12:07:40                   nitework              W3MS
4/17/2004  12:08:23                   nitework              W3MS
4/17/2004  12:09:29                   administrator          W3MS

   최종 수정일 : 2005년 3월 16일