웹마스터 팁

네이버 리눅서 유저 그릅                                                          질풍볼프(pciswife) 님의 글입니다.


이 스크립트는 리눅스에서 기본적으로 제공하는 로그를 이용하여 10분 간격으로 로그를 추출하고

20회 이상 Fail Password를 발생시킨 아이피를 Tcp-Wrapper(/etc/hosts.deny)에 등록시켜

더이상 해킹 시도를 방지한다.



Caution : 10분이내에 뚫리면 어찌할 수 없음... =,.=;



ps. 스크립트의 제작의 편리를 위해서 중복 등록확인은 없음... ^^;



기본환경 : 리눅스, PHP Shell Script

작성언어 : PHP



동작원리

1. /var/log/secure 파일에서 10분대의 로그를 추출한다.

  예 : 현재시간이 18:25:00 이라면 추출하는 시간은 18:10~19분을 추출한다.

2. 아이피 별로 갯수를 통계낸다.

3. 한 아이피에서 20회 이상 sshd로 비밀번호가 틀렸다면 /etc/hosts.deny에 "ALL:아이피주소"의

   형태로 등록된다.

4. xinetd 데몬을 재시작한다.

5. 등록한 아이피 목록을 지정된 메일 주소로 발송한다.



실행방법

./secure_analysis.sh sshd



crontab 등록시

*/10 * * * * /경로명/secure_analysis.sh sshd



소스

#!/usr/local/bin/php
<?
// 개요
// secure log 를 분석해서 sshd로 불법적인 접속을 시도하는 IP를 /etc/hosts.deny에 등록하는 작업을 한다.

// Log Example : Jun  5 07:49:18 p1 sshd[1110]: Failed password for root from 211.114.190.196 port 52944 ssh2
// 추출 명령어 : grep "Jun  7 09" secure | grep "sshd" | grep "Failed password" | awk -F "from" '{print $2}' | awk '{print $1}'

// 지정된 입력값을 입력하지 않으면 실행하지 않는다.

if($argc > 1)
{
$RECEIVE_EMAIL = "수신 메일주소";
$Hostname = trim(exec("hostname"));

$Date = date("Y-m-d H:i:s");

// 10분전 분을 구한다.
$TenAgo = substr(date("i",mktime (date("H"), date("i")-10, 0, date("m"), date("d"), date("Y"))),0,1);

if(!file_exists("/service/log_temp"))
{
  mkdir("/service/log_temp");
}

    if(!file_exists("/service/log_temp/secure_analysis.log"))
    {
        exec("touch /service/log_temp/secure_analysis.log");
    }

// 날짜에 따라서 검색어의 공백처리가 틀린 관계로 ... =,.=;
$DayLength = strlen(date("j"));

if($DayLength == 2)
{
  $now = date("M j H:");
}
else
{
  $now = date("M  j H:");
}

if($argv[1] == "sshd")
{
  exec("grep "$now$TenAgo" /var/log/secure | grep "sshd" | grep "Failed password" | awk -F "from" '{print $2}' | awk '{print $1}' > /service/log_temp/secure_log_".$argv[1]);
}

$Fail_IP_File = file("/service/log_temp/secure_log_".$argv[1]);

for($i=0; $i < count($Fail_IP_File); $i++)
{
  $Fail_IP_File[$i] = trim($Fail_IP_File[$i]);
}

$Fail_Statistics = array_count_values($Fail_IP_File);

exec("echo "" > /service/log_temp/DenyIP.list_".$argv[1]);

while (list ($Ip, $Count) = each ($Fail_Statistics))
{

// 여기의 20을 조정하여 등록을 조절할 수 있다.
  if($Count > 20)
  {
   $Now_Time = date("Y년 m월 d일 H시 i분 s초");
   exec("echo "#Regist $Now_Time" >> /etc/hosts.deny");
   exec("echo "ALL : $Ip" >> /etc/hosts.deny");
   $Restart_Xinetd = 1;
   exec("echo "$Now_Time | $Ip | $Count 회" >> /service/log_temp/DenyIP.list_".$argv[1]);
  }
  exec("echo "$Datet$Ipt$Count" >> /service/log_temp/secure_analysis.log");
}

if($Restart_Xinetd)
{
  exec("killall -HUP xinetd");
  exec("cat "/service/log_temp/DenyIP.list_".$argv[1]."" | mail -s "$Hostname Deny IP List - $Date " $RECEIVE_EMAIL");
}
}
else
{
echo("Missing Argument... Confirm Execute ...n");
}
?>

  
제목 글쓴이 날짜
용인오피 용인OP ⦑오피쓰.COM⦒ 용인휴게텔 용인오피 용인오피 koykoyah 2025.02.21
대구오피 대구출장안마 ⦑출장안마사이트.COM⦒ 대구OP 대구오피 대구오피 koykoyah 2025.02.21
평촌오피 ⦑오피쓰주소.COM⦒ 평촌마사지 평촌오피 평촌오피 평촌OP koykoyah 2025.02.21
신천오피 ⦑오피쓰.COM⦒ 신천오피 신천OP 신천건마 신천오피 koykoyah 2025.02.21
산본오피 산본출장안마 ⦑출장마사지안내.COM⦒ 산본OP 산본오피 산본오피 koykoyah 2025.02.21
신천오피 ⦑오피쓰.COM⦒ 신천OP 신천오피 신천출장샵 신천오피 koykoyah 2025.02.20
연신내오피 ⦑출장안마사이트.COM⦒ 연신내오피 연신내OP 연신내건마 연신내오피 koykoyah 2025.02.20
일산오피 일산출장안마 ⦑오피사이트.NET⦒ 일산OP 일산오피 일산오피 koykoyah 2025.02.20
구미오피 구미오피 ⦑출장마사지안내.COM⦒ 구미OP 구미스파 구미오피 koykoyah 2025.02.20
신촌오피 ⦑오피쓰주소.COM⦒ 신촌마사지 신촌오피 신촌오피 신촌OP koykoyah 2025.02.20
가락오피 가락오피 ⦑오피쓰.COM⦒ 가락OP 가락스파 가락오피 koykoyah 2025.02.20
인천오피 인천출장안마 ⦑오피쓰주소.COM⦒ 인천OP 인천오피 인천오피 koykoyah 2025.02.20
답십리오피 답십리출장안마 ⦑오피쓰주소.COM⦒ 답십리OP 답십리오피 답십리오피 koykoyah 2025.02.20
가락오피 가락오피 ⦑오피.CLUB⦒ 가락OP 가락스파 가락오피 koykoyah 2025.02.20
서면오피 ⦑출장마사지안내.COM⦒ 서면오피 서면출장마사지 서면오피 서면OP koykoyah 2025.02.20
신천오피 ⦑출장마사지안내.COM⦒ 신천오피 신천출장마사지 신천오피 신천OP koykoyah 2025.02.20
선릉오피 선릉오피 ⦑오피사이트.NET⦒ 선릉OP 선릉스파 선릉오피 koykoyah 2025.02.20
대전오피 대전출장안마 ⦑오피쓰주소.COM⦒ 대전OP 대전오피 대전오피 koykoyah 2025.02.20
광주오피 ⦑오피쓰주소.COM⦒ 광주오피 광주출장마사지 광주오피 광주OP koykoyah 2025.02.20
의정부오피 ⦑오피.CLUB⦒ 의정부마사지 의정부오피 의정부오피 의정부OP koykoyah 2025.02.20