MSSQL 서버를 설치를 하게 되면 로컬 보안 정책에 따라 계정에 대한 로그인 실패가 아래와 같이 응용프로그램 에 남는것을
확인 하실수 있을겁니다.
사용자 'sa'이(가) 로그인하지 못했습니다. [클라이언트: 199.19.xxx.xxx] 와 같은 이벤트 로그의 경우 대부분 Brute-Force 공격으로써
1433 포트스캔을 하여 sa 계정으로 패스워드 무차별 대입공격을 시도 하게 됩니다. 이러한 공격 대부분 중국쪽의 MSSQL 전용
공격툴 또는 SQL 콘솔명령어(osql, sqlcmd, BCP)로 로그인을 시도 하게 됩니다.
이때 서버관리자는 MSSQL 설치시 SQL 혼합 인증모드 체크후 sa계정의 비밀번호를 설정하지 않을경우 해킹을 당할 위험이 있습니다.
netstat -an 명령어를 통해서 보면 특정 랜덤한 ip에서의 SQL 서버로의 로그인을 초당 적게는 1회~70회이상 의 로그인을 시도 하는 경우가 있습니다.
이벤트 뷰어로 확인을 해보면 초당 sa 로그인을 시도한 흔적들이 하루가 지나면 80000회 이상 정도 로그인을 시도 하는것을 확인할수 있습니다.
해당 공격에 대한 해결방법은 가장 좋은 방법은 아래와 같습니다.
1. MSSQL 의 1433,1434포트의 인바운드 포트를 방화벽단에서 차단하고 로컬또는 같은 특정ip에서만 접속을 허용하는 방법이 있습니다.
(웹서비스를 시도 할경우는 포트를 임위적으로 변경하여 인바운드 포트를 열어주는것이 좋습니다.)
1434 포트의 경우 SQL2005/2008 이상부터 생겨난 관리자 전용 연결 (Dedicated Aministrator Connection) DAC 의 경우
SQL 리소스 부족하여 SQL 서버가 접속이 안될경우 응급조취시 관리자가 기본적으로 퀴리문을 사용할수 있도록 보장된 접속 이기때문에
해당 1434 포트의 경우 특정ip에서만 접속을 허용할수 있도록 방화벽단에서 구성을 해줘야 합니다.
2. sa 계정의 경우 Sql2005/2008 부터 는 sa 로그인 실패시 로그인이 잠기도록 설정할수 있게 됩니다. 그래도 sa 계정을 직접적으로 사용을
하는것보다 sysadmin (최고 관리자)계정을 별도로 생성을 하여 이용및 관리를 하시는것이 좋습니다.
위에 상황이 아닌 부득이하게 기본적으로 1433 기본포트 및 외부접속을 반드시 허용을 해야 하는 경우 아래와 같이 불법적으로 로그인을 시도 하는 sa 계정에 대해서 어떻게
서버단에서 특정 포트와 ip를 차단하는 방법에 대해서 차단할수 가 있습니다.
차단방법의 경우 여러 방법이 있겠지만 관리하기 쉬운 방법으로써 아래와 같이 조취를 취해 줄수가 있습니다.
실전 상황 :중국쪽으로의 모든 접속부분에 대해서 ipsec 에서 중국쪽 모든 1433으로 접속되는 모든 ip를 차단하였음에도 불구하고 ip를 위변조 하여 지속된
sa 로그인을 시도 합니다.
중국쪽 ip대역 부분을 모두 확인한후 ipsec 3000건 이상의 서브넷 ip대역 c.d 클래스 서브넷으로 원천차단해보았습니다.
중국쪽 ip를 차단 하자 국내 또는 다른 해외ip 로 지속적으로 로그인을 시도하는것이 보여 집니다.
위에 그림은 중국쪽 의 모든ip대역을 ipsec 에서 차단한 내역입니다.
딱히 ipsec 에서 중국 전체 ip대역을 차단하더라도 해당 공격을 막기에는 역부족입니다.
분석을 해본결과 80000회 이상 접속을 시도 하는ip를 확인해본결과 총 5개~11개 정도의 ip가 동일한 ip라는 것입니다.
방법은 이벤트 뷰어 에 기록된 응용 프로그램의 로그를 분석하여 MS리소스 킷 툴인 로그파서(logparser.exe) 를 이용하여 이벤트뷰어의 sa
로그인 되는 ip의 정보를 모아 임시적으로 .txt 파일에 ip를 기록하게 끔 하여 cmd 명령어를 통한 ipsec 명령어를 통하여 차단하는 롤을 알려드리겠습니다.
로그파서를 설치 이후에 시작->실행 cmd 창을 여신다음 아래와 같이 명령어를 입력하게 되면은 temp.txt 파일 안에 sa 접속을 시도 하는 ip의 정보만 취합을
할수가 있습니다.
"%ProgramFiles(x86)%\Log Parser 2.2\logparser.exe" "SELECT EXtrACT_TOKEN(Strings,0,']') AS 로그인시도 INTO temp.txt FROM application WHERE EventID=18456"
temp.txt
해당 텍스트 문서를 열어본 화면 입니다.
로그인시도
---------------------------
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
로그인시도
---------------------------
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
로그인시도
---------------------------
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
로그인시도
---------------------------
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
sa| [클라이언트: 116.125.124.254
로그인시도
자 위와 같이 이벤트 뷰어 에서 sa 접근하는 ip의 리스트만 뽑아 보았습니다.
이제 위에 ip를 ipsec 통해서 모두 실시간으로 차단해줘야 겠지요 ?
방법은 원도우의 꽃 cmd 명령어를 이용하면 됩니다 cmd명령어 란 windwos95 때부터 bat 배치파일 이라는 확장자로 원도우 자동화를 할수 있도록 도스 명령어와 내장및 외장 명령어를 일괄적으로
처리할수 있는 스크립트 파일입니다 windwos2000 이후부터 확장자를 bat 및 cmd 로 바꾸고 명령라인을 입력하면 해당 명령어들이 순차적으로 읽어 들여 차례대로 지정한 명령어를 실행하게 됩니다.
해당 배치파일의 경우 리눅스 서버의 쉘스크립트 처럼 막강하게 지원되는 부분은 없지만 잘만 활용하면 어떠한 도구 툴 남부럽지 않게
사용을 할수 있는 아주 무시무시한 방법이라는것을 아시게 될것입니다.
아래와 같은 배치파일 스크립트를 보여 드리겠습니다.
@echo off
setlocal
set temp_file=mssql_sa.txt
setlocal
set temp_file=mssql_sa.txt
REM 로그 파서를 이용하여 이벤트 뷰어의 응용프로그램 항목쪽에 MSSQL 실패 한 유저의 모든 정보를 mssql_sa.txt 정보를 취합한다.
"%ProgramFiles(x86)%\Log Parser 2.2\logparser.exe" "SELECT EXtrACT_TOKEN(Strings,0,']') AS 로그인시도 INTO %temp_file% FROM application WHERE EventID=18456"
"%ProgramFiles(x86)%\Log Parser 2.2\logparser.exe" "SELECT EXtrACT_TOKEN(Strings,0,']') AS 로그인시도 INTO %temp_file% FROM application WHERE EventID=18456"
REM mssql_sa.txt 저장된 정보중 SA 로 접근 하는 ip만 검색하여 temp.txt 임시 저장한다.
find %temp_file% "sa" > temp
find %temp_file% "sa" > temp
REM temp.txt 파일를 열어 첫열부터 2번째 열까지 제외및 하나 둘 셋번째 라인의 ip 만 읽어 들여서 eveent_ip_deny 디렉토리에 새로운 폴더를 만들어 중복된ip를 필터링 한다.
for /f "skip=2 tokens=3" %%i in (temp) do mkdir event_ip_deny\%%i
for /f "skip=2 tokens=3" %%i in (temp) do mkdir event_ip_deny\%%i
REM 중복된 ip를 필터링 하여 접속시도를 하는ip만 다시 취합한다.
dir /b event_ip_deny > ipsec_dany_list_temp
dir /b event_ip_deny > ipsec_dany_list_temp
REM SA로 접근 하는 ip 리스트를 IPSEC 필터 리스트에 해당 ip를 접속을 차단 시킨다.
for /f "eol=; tokens=1,2* delims==\ " %%p in (ipsec_dany_list_temp) do @echo netsh ipsec static add filter filterlist="ip_deny" srcaddr=%%p dstaddr=me description="SQL SA접속시도" protocol=tcp srcport=0 dstport=1433>>event_ipsec_deny.bat
for /f "eol=; tokens=1,2* delims==\ " %%p in (ipsec_dany_list_temp) do @echo netsh ipsec static add filter filterlist="ip_deny" srcaddr=%%p dstaddr=me description="SQL SA접속시도" protocol=tcp srcport=0 dstport=1433>>event_ipsec_deny.bat
REM 기본에 이벤트로그에 기록된 응용프로그램의 이벤트 로그 를 모두삭제 한다
CScript /nologo event_log_delete.vbs
CScript /nologo event_log_delete.vbs
del /q temp ipsec_dany_list_temp
pause
위에 배치파일의 경우 ipsec 롤에 대한 세부 설정방법에 대해서는 따로 알려드리지는 않았지만
시작 -> 실행 명령어를 통해서 ipsec 를 명령어 로만 필터 생성,구성, 삭제,추가 등을 하실수가 있습니다.
위에 배치 스크립트 그대로 사용하시면 오류가 발생이 되기 때문에
netsh ipsec static add filter filterlist="ip_deny" srcaddr=%%p dstaddr=me description="SQL SA접속시도" protocol=tcp srcport=0 해당 부분에 대해서는
설정하고 자 하는 서버의 ipsec 룰이 이미 생성이 되어져 있어야 추가가 가능합니다.
ipsec 의 대한 개념과 이해가 필요로 합니다.
또한 "%ProgramFiles(x86)% 이부분은 64비트 이기 때문에 32비트 os 를 사용하신다면은 %ProgramFiles% 바꾸어 주셔야 합니다.
시작 -> 실행 -> netsh ipsec /?
다음 명령을 사용할 수 있습니다.
이 컨텍스트에 있는 명령:
? - 명령 목록을 표시합니다.
dump - 구성 스크립트를 표시합니다.
dynamic - `netsh ipsec dynamic' 컨텍스트의 변경 내용입니다.
help - 명령 목록을 표시합니다.
static - `netsh ipsec static' 컨텍스트의 변경 내용입니다.
? - 명령 목록을 표시합니다.
dump - 구성 스크립트를 표시합니다.
dynamic - `netsh ipsec dynamic' 컨텍스트의 변경 내용입니다.
help - 명령 목록을 표시합니다.
static - `netsh ipsec static' 컨텍스트의 변경 내용입니다.
다음 하위 컨텍스트를 사용할 수 있습니다.
dynamic static
dynamic static
명령에 대한 도움말을 보려면 명령을 입력한 다음 공백을 입력한 후
?을(를) 입력하십시오.
?을(를) 입력하십시오.
event_log_delete.vbs 파일의 VBS 소스
event_log_delete.vbs 의 경우 이벤트 뷰어를 백업하고 삭제 처리 하는 vbs 소스 파일입니다.
===================================================
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate, (Backup, Security)}!\\" _
& strComputer & "\root\cimv2")
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate, (Backup, Security)}!\\" _
& strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery _
("Select * from Win32_NTEventLogFile")
("Select * from Win32_NTEventLogFile")
For Each objLogfile in colLogFiles
If objLogFile.FileSize > 100000 Then
'strBackupLog = objLogFile.BackupEventLog _
'("c:\scripts\" & objLogFile.LogFileName & ".evt")
objLogFile.ClearEventLog()
End If
Next
===================================================
If objLogFile.FileSize > 100000 Then
'strBackupLog = objLogFile.BackupEventLog _
'("c:\scripts\" & objLogFile.LogFileName & ".evt")
objLogFile.ClearEventLog()
End If
Next
===================================================
위에 배치파일 소스를 충분히 이해 하셨다면은 스케줄(작업예약) 파일로 등록하여 sa접속실패된 모든ip 대해서 자동적으로 ipsec 롤에 ip를 추가 하여
1433포트 로 접속된는 모든 ip를 차단할수 있습니다.
해당 차단은 sa 시도 되는 특정한 ip를 실시간으로 차단하여 ipsec 룰에 등록 한 기록입니다.
원문 : http://www.sqler.com/460824
원문 : http://www.sqler.com/460824
===========================================================
작성자 : (주)엔플린트 http://nflint.com 황오선
===========================================================
'setting' 카테고리의 다른 글
[Nginx Proxy Manager] Docker 설치 (0) | 2020.04.10 |
---|---|
파일 업로드 용량 제한.(machine.config) (0) | 2010.11.09 |