레이블이 firewall인 게시물을 표시합니다. 모든 게시물 표시
레이블이 firewall인 게시물을 표시합니다. 모든 게시물 표시

2016년 10월 12일 수요일

vpopmail(pop3) brute force 공격 차단

qmail vpopmail 을 쓰고 있다.

서버 점검 중 pop3로 접속시도를 하는 로그를 발견했다.

없는 아이디로 계속 시도하는 것과 계정은 있지만 패스워드를 계속 틀리게 입력하는 유형 2가지.
Oct 11 11:27:54 mail vpopmail[27836]: vchkpw-pop3: vpopmail user not found admin12@domain.com:109.104.203.62

Oct 11 15:02:11 mail vpopmail[15277]: vchkpw-pop3: password fail (pass: 'e603f6c507b3993651f0439553584c50') acount@domain.com:110.70.15.59

한두개가 아니라 같은 아이피가 계정만 바꿔서 계속 시도하고 있다.
fail2ban으로 vpopmail 차단을설정하면 좋은데, 실 운영서버라 fail2ban 설치하기가 쉽지 않다.

그래서 스크립트 작성.
#/bin/bash


help()
{
echo ""
echo "/var/log/maillog is default"
echo "iptable apply is not default"
echo "banCount 100 is default"
echo "-a : iptable applied"
echo "-f : maillog FILE PATH"
echo "-c : ban count"
echo ""
echo "Usae : $0 -a -c 100 -f /var/log/maillog "
exit 0
}


ignoreIPs=("222.222.222.222" "111.111.111.111")
maillog="/var/log/maillog"
banCount=100
fw=false


while getopts ac:f: opt
do
case $opt in
a)
fw=true
;;
c)
banCount=$OPTARG
;;
f)
maillog=$OPTARG
;;
*)
help
exit 0
;;
esac
done


banIPs=`grep -E 'user not found|password fail' ${maillog} | awk -F: '{print $NF}' | sort | uniq -dc | awk '{if ($1 > '"${banCount}"') print $NF}'`

for banIP in $banIPs
do
for ignoreIP in ${ignoreIPs[@]}
do
if [ $ignoreIP == $banIP ]
then
# echo "ignore IP: ${ignoreIP}"
# echo "ban IP : $banIP"
break
fi
done

echo "ban IP : $banIP ,whois : $(geoiplookup $banIP)"
if [ $fw = true ] ; then
iptables -A INPUT -s ${banIP}/24 -j DROP
fi

done


if [ $fw = true ] ; then
#remove duplicate iptables rules
#http://www.krazyworks.com/remove-duplicate-iptables-rules/
/sbin/service iptables save
/sbin/iptables-save | awk '!x[$0]++' > /tmp/iptables.conf
/sbin/iptables -F
/sbin/iptables-restore < /tmp/iptables.conf
/sbin/service iptables save
/sbin/service iptables restart
if [ -f /tmp/iptables.conf ] ; then /bin/rm -f /tmp/iptables.conf ; fi
fi


 

1. banCount 는 같은 IP가 해당 값이상일 경우만 가져온다.
실제사용자가 실패할 경우도 있기 때문에 100정도면 적당한 것 같다.

2. ignoreIPs는 차단하지 않을 IP를 적어준다.

3. iptable에 적용하는 데, 중복으로 계속 적용된다.
마지막 부분이 중복을 없애고 다시 설정하는 부분이다.

maillog 파일의 생성을 살펴보면 매일 오전 4시 마다 rotate 되고 있다
cron으로 4시 30분 부터 실행되게끔 걸어주면 되겠다.

2016년 5월 26일 목요일

GeoIPCountryWhois.csv을 이용한 나라별 윈도우 방화벽 차단 등록.

나라별방화벽차단등록

www.2cpu.co.kr 에서 제작된 중국쪽 ip대역 차단 스크립트를 보게되었다.

실제로 GeoIPCountryWhois.csv 파일에 있는 걸 스크립트로 만든 거라서

GeoIPCountryWhois 파일이 업데이트 되면 다시 수정 해야 하는 번거로움이 있어서

파워쉘 스크립트로 만들었다.

처음에는 vb 로 만들려고 했으나, vb 자체의 자료도 별로 없고, 기존 프로그래밍 언어와 다른 점이 너무 많아서 powershell 로 바꿨다.

요즈음의 왠만한 윈도우 서버는 powershell 을 지원하니 왠만해서는 될 듯하다. 테스트는 안 해봤다.

최신의 GeoIPCountryWhois.csv 파일은 여기서 다운 받을 수 있다.

근데 파일 자체가 최신이 아니다. 2년전 자료이다.

진짜 최신자료는 www.maxmind.com 에서 유료로 받을 수 있다.



소스
#문의는 http://blog.netchk.net/
#############Config#################
$countryCode="CN" #차단할 나라의 CountryCode
#$geoIPcvsPath="c:\GeoIPCountryWhois.csv"
$geoIPcvsPath="\GeoIPCountryWhois.csv"
$ruleName="blockCountry"
#############Config#################


$geoData=Import-Csv $geoIPcvsPath -header sIP, eIP, start, end, cc, cn |  where-object {$_.cc –eq $countryCode} 
$geoDataTotal=$geoData.Count
$remoteIP=""


######  룰이 있는 지 체크 ########
function ruleExistsChk ($ruleName)
{
    $fw=New-object -comObject HNetCfg.FwPolicy2; # http://blogs.technet.com/b/jamesone/archive/2009/02/18/how-to-manage-the-windows-firewall-settings-with-powershell.aspx 
    $RuleCHK=$fw.rules | where-object {$_.name –eq $ruleName}
    if(!$RuleCHK){
    #$deny_rule_name + " 룰이 생성되어 있지 않습니다."; exit; 
    netsh advfirewall firewall add rule name="$ruleName" localip=any dir=in action=block profile="any" interfacetype="any"
    }
}
######  룰이 있는 지 체크 ########


$count=1
foreach ($geoIP in $geoData)
{
    #$remoteIP+=@($geoIP.sIP+"-"+$geoIP.eIP+",") #배열로 저장.
     $remoteIP+=$geoIP.sIP+"-"+$geoIP.eIP+","
     
     #remoteAddr가 한개의 룰에 약 300개 이상이면 등록이 안됨. 안전하게 200으로 설정.
    if(($count%200) -eq 0)
    {
        $makeRuleName=$ruleName+$countryCode+$count
        ruleExistsChk($makeRuleName)
        netsh advfirewall firewall set rule name=$makeRuleName new remoteip="$remoteIP"
        $remoteIP=""
    }elseif($geoDataTotal -eq $count){
        $makeRuleName=$ruleName+$countryCode+$count
        ruleExistsChk($makeRuleName)
        netsh advfirewall firewall set rule name=$makeRuleName new remoteip="$remoteIP"
        $remoteIP=""
    }

     $count++

}

예전 차단하는 스크립트에서도 썼지만 remoteAddress 에 limit 이 걸려 있다.

단일 IP는 약 1000개 인데, IP range는 약 300개 정도이다.

그래서 200개 단위로 rule을 다시 생성한다.



ps. 위의 소스를 이용해서 한국만 허용하고 해외는 모두 차단 하는 스크립트를 만들었는 데, 안된다. 리눅스의 iptable 같은 경우 순서에 따라 적용이 되기 때문에 모든 IP 차단, 한국 IP 허용 으로 하면 된다.

윈도우 방화벽은 순서에 따라 적용되지 않는다. 한국 IP 허용, 모든 IP 차단 해도 안되고, 순서를 바꿔서 등록 해도 역시 안된다.

방법은 있는데, 기존에 등록되어 있는 허용 포트 부분을 모두 지정하는 것이다. 한국 IP 만 등록해 놓은 룰을 적용한 후, local port 를 설정하고, 기존에 적용되어 있던 부분을 삭제 하면 된다.

문제는 포트별로 다른 IP 차단이 안된다는 점. 해외 IP를 전부 등록해야...;;

ps2. 방화벽 규칙에서 여러 룰에서 차단과 허용이 둘다 있으면 차단 시킨다.

https://technet.microsoft.com/ko-kr/library/cc755191(v=ws.10).aspx

2015년 11월 26일 목요일

xenCenter "Unable to mount the directory specified in device configuration request" 에러

"Creating SR
Unable to mount the directory specified in device configuration request.
Check your settings and try again"

해결책
1. cifs 설정시 아디와 패스워드를 무조건 집어 넣어 줘야 됨.
2. 이게 내 문제였는데, 방화벽 오픈되어 있어야 함.

아래 명령어로 추가. or 제어판 방화벽에서 제어.
rem tcp 445
netsh advfirewall firewall set rule name="파일 및 프린터 공유(SMB-In)" profile=public new enable=yes
rem udp 137
netsh advfirewall firewall set rule name="네트워크 검색(NB-Name-In)" profile=public new enable=yes
rem tcp 139
netsh advfirewall firewall set rule name="파일 및 프린터 공유(NB-Session-In)" profile=public new enable=yes
rem udp 138
netsh advfirewall firewall set rule name="파일 및 프린터 공유(NB-Datagram-In)" profile=public new enable=yes
netsh advfirewall firewall set rule name="Netlogon 서비스(NP-In)" new enable=yes

3. cifs 폴더의 하위는 나오지 않는다. 예를 들어 마운트를 111.222.333.444/share 로 했으면  share 폴더에 있는 iso 만 나오고, 그 밑의 하위로 폴더가 있다면 나오지 않는다.

2014년 5월 23일 금요일

원격데스크탑(RDP) 공격 자동 차단 파워쉘

EvlWatcher 를 사용하여 무작위 공격에 대해서 차단을 진행 했었는데, 이게 윈도우 2012에서는 작동을 안한다.

그래서 이벤트로그를 파악하여 지정된 회수 이상 접속 실패를 발생할 시 윈도우 방화벽에 차단 등록하는 스크립트를 만들었다.
# 이벤트로그를 사용하여 특정 회수 이상 로그인 실패 아이피에 대하여 
# MY BLACKLIST 방화벽 등록
# 2014.05.22 NDH
# version 1.1


###################### Config ######################
#regex2 부분이 영문 윈도우OS 같은 경우 source network address 인가로 바꿔주면 된다.
#MyIp 부분은 내 아이피를 등록하여 내꺼는 막히지 않도록 하는 부분이고,
#deny_count 는 5회이상 접속시도 실패 로그가 있을 시 방화벽에 차단 등록하는 변수이다.
#deny_rule_name 는 윈도우 방화벽에 차단하는 해당 룰 이름이 설정되어 있어야 한다.

#English versoin Windows
#$regex2 = [regex] "Source Network Address:\t(\d+\.\d+\.\d+\.\d+)";
#Korean version Windows
$regex2 = [regex] "원본 네트워크 주소:\t(\d+\.\d+\.\d+\.\d+)";
$MyIp = "111.222.333.*";
$deny_count = 5;
$deny_rule_name = "MY BLACKLIST"
###################### Config ######################

$fw=New-object -comObject HNetCfg.FwPolicy2; # http://blogs.technet.com/b/jamesone/archive/2009/02/18/how-to-manage-the-windows-firewall-settings-with-powershell.aspx
$RuleCHK=$fw.rules | where-object {$_.name –eq $deny_rule_name}
if(!$RuleCHK){ $deny_rule_name + " rule does not generate."; exit; }


$blacklist = @();
$list ="";

$startTime = (get-date);

"-----------------------------"
"log searching Start : " + $startTime;
"-----------------------------"


$ips = get-eventlog Security | Where-Object {$_.EventID -eq 4625 } | foreach {
$m = $regex2.Match($_.Message); $ip = $m.Groups[1].Value; $ip; } | Sort-Object | Tee-Object -Variable list | Get-Unique


if($list.length -gt 0) {
foreach ( $attack_ip in $list)
{
if($attack_ip){
$myrule = $fw.Rules | where {$_.Name -eq $deny_rule_name} | select -First 1; # Potential bug here?

if (-not ($blacklist -contains $attack_ip))
{
$attack_count = ($list | Select-String $attack_ip -SimpleMatch | Measure-Object).count;
if ($attack_count -ge $deny_count) {
if (-not ($myrule.RemoteAddresses -match $attack_ip) -and -not ($attack_ip -like $MyIp))
{
"Found RDP attacking IP on 3389: " + $attack_ip + ", with count: " + $attack_count;
$blacklist = $blacklist + $attack_ip;
"Adding this IP into firewall blocklist: " + $attack_ip;
$myrule.RemoteAddresses+=(","+$attack_ip);
#echo $attack_ip >> C:\BlackListIP.txt

} else {
$attack_ip + " : Already registered IP"
}
}
}
}

}
< # $answer = read-host "`ndo you want delete security event log , yes or no" if ($answer -like "*y*" -and -not $Verbose) { Clear-EventLog -LogName Security cls "Security event log has been deleted" } else { # "`nScript terminated.`nPlease use your testing VM instead.`n" ; exit } #>


}else{
"인증 실패 이벤트 로그가 없습니다."
}

$endTime = (get-date);



"-----------------------------"
"log searching End : " + $endTime;
" 총 걸린 시간 : " + ($endTime - $startTime ) ;
".........실행 완료..........."
"-----------------------------"

regex2 부분이 영문 윈도우OS 같은 경우 source network address 인가로 바꿔주면 된다.
MyIp 부분은 내 아이피를 등록하여 내꺼는 막히지 않도록 하는 부분이고,
deny_count 는 5회이상 접속시도 실패 로그가 있을 시 방화벽에 차단 등록하는 변수이다.
deny_rule_name 는 윈도우 방화벽에 차단하는 해당 룰이 설정되어 있어야 한다. 설정하는 법은 여기

윈도우 2008,2012에서 정상 동작 확인 하였다.

 

스케쥴러 등록해서 사용.
schtasks /create /sc daily /ST 15:00 /tr "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\Users\Administrator\Documents\rdp_block.ps1" /tn "RDP AUTO BLOCK"

 

ps1. 에러 발생.

Found RDP attacking IP on 3389: 1.234.45.48, with count: 23
Adding this IP into firewall blocklist: 1.234.45.48
"RemoteAddresses"을(를) 설정하는 동안 예외가 발생했습니다. "배열 경계가 잘못되었습니다. (예외가 발생한 HRESULT: 0x800706C6)"
위치 D:\관리프로그램\rdp_block.ps1:56 문자:37
+ $myrule. <<<< RemoteAddresses+=(","+$attack_ip);
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException

RemoteAddresses가 1000가 넘어가니 위의 에러 발생.

 

ps2. netsh.exe advfirewall firewall set rule name="$deny_rule_name" new remoteip="1.34.248.103/255.255.255.255,1.93.2.152/255.255.255.255,1.93.4.12/255.255.255.255,.." 이런식으로 추가 하려고 했으나,
잘못된 IP 주소 또는 주소 키워드를 지정했습니다. << 에러 발생.

결론.RemoteAddresses 가 1000개 이상 넘어 갈 수 없음.

 

ps.2016.05.25

remoteip 등록을 ip range로 등록시 대략 300개 정도를 추가하면 아래 오류가 나온다.
지정한 IP 주소 또는 주소 키워드가 올바르지 않습니다.

역시 limit이 있는 걸로 확인.

깃허브에 한번 등록 해봄.