웹해킹 서버 분석과 웹쉘 탐지 및 대응방법 2편

리눅스/Security|2015. 1. 26. 18:05
반응형

이번에는 웹쉘이 서버에 올라갔을 때의 탐지 및 대응 방법에 대해 알아 보려고 한다. 일단 웹쉘이 서버에 업로드 되면 그 서버는 해커의 수중에 들어 갔다고 보아야 한다. 이후 해커는 다양한 방법으로 서버의 정보를 취득하고 해킹툴을 이용해서 권한 상승을 노린다.

 

allow_url_fopen = On인 웹 페이지 취약점을 통해 다음과 같이 쉘권한을 얻을 수 있다. 

  
http://www.test.com/Test.php  ----------------->   http://hack.com/webshell.txt
  

타킷서버의 Test.php에 취약점이 존재하는 경우 hack.com에 존재하는 webshell을 불러들여 쉘 권한을 획득 한 다음 내부 서버의 정보를 모으고 백도어를 설치하고 권한 상승을 노린다. 대표적으로 구 제로보드에서 많이 발생하고 있다.

웹쉘 실행 화면

웹쉘 실행 화면

이제부터 이러한 웹쉘에 대한 대응 방법에 대해 몇 가지 알아 보려고 한다.

 

우선 첫째로 당연한 것이겠지만 자신이 운영하고 있는 웹소스에서 보안 취약점을 제거해야 한다. 하지만 이것은 실제적으로 침해사고를 당하지 않는 한 탐지하기가 어려운 면이 있다. 특히 자신이 개발자가 아니고 단순히 운영만 하는 입장이라면 더욱 그렇다. 하지만 널리 알려진 웹 보안 취약점은 modsecurity 같은 무료 웹 방화벽으로 공격을 사전 차단 할 수 있을 뿐 아니라 차단 기능을 꺼 놓고 로그만 기록하게 해도 나중에 사고를 당했을시 로그 분석을 통해 원인을 찾는데 도움이 되므로 가능한 운영하는게 좋다. 공개 무료 웹방화벽 운영에 관한 자료는 정보보호진흥원에서 운영하는 다음 사이트에서 많은 도움을 받을 수 있다.

http://www.krcert.or.kr/firewall2/index.jsp

 

두번째는 필요없는 php 함수들은 사용 할 수 없게 하는 것도 하나의 방법이다. 설정은 php.ini  다음과 같은 방법으로 할 수 있다.

 

대부분이 서버의 정보를 보여주는 설정들이다. 서비스에 별 필요 없는 기능들이고 서버에 어떠한 영향을 주는 함수들은 아니지만 해커에 의해 악용 될 수 있기 때문에 막아 놓은 것이 나을것이다.

disable_functions = php_uname, ini_set, getenv, get_user, phpversion, ini_get, ini_get_all, phpinfo, system, exec, passthru, escapeshellcmd, pcntl_exec, shell_exec

특히 주의할 점은 system, exec, passthru, escapeshellcmd, pcntl_exec, shell_exec 함수들은 서버상에서 운영체제 명령어를 실행 시키는 명령들이다. 일단 웹쉘이 업로드 되면 위의 함수들로 서버상에서 작업을 할 수 있으므로 막는게 좋으나 실제 운영되고 있는 홈페이지에서도 사용 할 수 있으므로 잘 알아 보고 필요한 함수는 빼고 설정 하는 것이 좋다.

 

세번째는 파일업로드 기능을 사용하지 않는다면 php.ini 에서 file_uploads 기능을 off 시키거나 파일 업로드를 한다면 업로드 디렉터리.htaccess을 사용해 업로드 되는 디렉터리에서는 php를 아예 사용 할 수 없게 하는 것이다.

 

파일을 업로드 시키는 디렉터리에 다음과 같이 .htaccess 파일을 작성하자.

 

<FilesMatch ".(html|htm|php|pl|cgi|inc|lib)">

Order allow,deny

Deny from all

</FilesMatch>

해당 확장자로 끝나는 파일들은 접속이 금지된다.

 

이 방법은 해커가 웹쉘을 업로드 할 때도 사용 할 수 있다.

만약 php확장자를 가진 소스를 업로드 하지 못하게 했다면 해커는 다음과 같이 하여 확장자를 우회할 수 있다.

다음 내용을 가진 .htaccess파일을 업로드 시킨다.

AddType application/x-httpd-php  .txt

이후 txt 파일은 모두 php로 인식한다. 해커는 웹쉘의 확장자를 txt파일로 변경하여 서버에 올리면 된다. 마찬가지 방법으로 다음과 같은.htaccess 파일을 올려서 바이러스나 해킹툴을 설치하기도 한다.

ErrorDocument 403 http://www.hacktest.co.kr/hack.txt

ErrorDocument 404 http://www.hacktest.co.kr/hack.txt

 

이는 다음과 같은 명령어로 탐지가 가능하다.

find `locate .htaccess` -exec egrep -l -i ‘txt’ {} ; 2>/dev/null

find `locate .htaccess` -exec egrep -l ?I ‘http://’ {} ; 2>/dev/null

 

그 다음으로 할 일은 서버에 업로드 된 웹쉘을 제거하는 일이다. 한국 정보보호진흥원에서 개발한 웹 쉘 탐지 프로그램 Whistl을 이용하여 서버에 업로드 된 웹쉘을 제거 할 수 있다. 이 프로그램은 리눅스는 물론 윈도우에서도 동작하고 정확성도 높기 때문에 웹쉘 탐지 및 제거에 매우 추천 할 만한 프로그램이다.

프로그램은 다음 사이트의 공지사항에서 신청서를 작성한 후 신청하면 사용 할 수 있다.

http://www.krcert.or.kr/index.jsp

사용방법은 상당히 직관적이고 쉬운편이다. 보내온 프로그램의 압축을 풀면 프로그램과 함께 설명서에 사용법이 적혀져 있다. 다음과 같이 간단히 사용 할 수 있다.

./whistl_kernel_2.6 ?c

우선 자기 서버에 맞게 환경 설정을 해준다.

whistl Configuration

        [1] Checking Directory : /home/sungon

        [2] Inspection Center directory : /tmp

        [3] Extension of php     : inc,php,php3,php4,php5,ph

        [4] Extension of jsp     : jsp,js

        [s] save

        [q] quit

1번 메뉴를 누르고 검사할 디렉터리를 지정해 준다. /home 폴더 전체를 지정해 줄 수도 있다.

Choose Menu : 1

Checking Directory :/var/www/html

 

        [1] Checking Directory : /var/www/html

        [2] Inspection Center directory : /tmp

        [3] Extension of php     : inc,php,php3,php4,php5,ph

        [4] Extension of jsp     : jsp,js

        [s] save

        [q] quit

3번 메뉴을 누르고 검사할 파일의 확장자를 지정해 준다. txt확장자를 추가해 주었다.

Choose Menu : 3

Extension of php :inc,php,php3,php4,php5,ph,txt

 

        [1] Checking Directory : /var/www/html

        [2] Inspection Center directory : /tmp

        [3] Extension of php     : inc,php,php3,php4,php5,ph,txt

        [4] Extension of jsp     : jsp,js

        [s] save

        [q] quit

Choose Menu : s

 

        [1] Checking Directory : /var/www/html

        [2] Inspection Center directory : /tmp

        [3] Extension of php     : inc,php,php3,php4,php5,ph,txt

        [4] Extension of jsp     : jsp,js

        [s] save

        [q] quit

Choose Menu : q

 

다음과 같이 검사를 하면

./whistl_kernel_2.6

id : testid

pwd : password

Checking the configration

        [Config] Checking directory : /var/www/html

        [Config] Inspection Center directory : /tmp

 

Checking the update status

        [INFO] Pattern Update Finished

 

Checking /var/www/html directory

        [5 Found] /var/www/html/test2.php

        [18 Found] /var/www/html/test.txt

 

Check Result

        [INFO] 2 Files checked

        [INFO] 2 Suspected WebShell

        [INFO] Time cost : 00:00:10

        [INFO] Finish sending the checking result

웹쉘이 탐지되는 것을 알 수 있다. [5 Found]  [18 Found] 같은 숫자는 해당 파일에서 모두 5개의 웹쉘 패턴이 일치되었다는 것을 말한다. 5이상은 웹쉘이 거의 확실하지만 일치되는 패턴 숫자가 1이나 2이라면 정상적인 파일이 아닌지 확인해 봐야 한다. 경험상 1이나 2는 거의 정상적인 파일이고 패턴대응 숫자가 5이상이면 웹쉘이 확실하다고 보면 된다.

다만 아쉬운 점은 프로그램이 복수의 확장자를 지원하지 않는다는 사실이다. 아파치(apache)에서는 복수의 확장자를 지원하기 때문에webshell.php.test 같은 확장자를 가진 프로그램도 모두 php로 인식한다. 때문에 확장자를 약간만 변경하면 탐지프로그램을 우회할 수 있다.

이 부분은 추후에 개선이 되야 할 사항 같다.

 

리눅스를 사용하는 경우에는 디렉터리나 파일의 퍼미션에도 신경을 써야 한다. 777 퍼미션이나 파일이나 디렉터리 apache nobody로 소유권을 설정하는 것은 가능한 피해야 한다.

업로드 디렉터리나 세션이 저장되는 디렉터리에는 어쩔 수 없이 707 퍼미션을 주어야 겠지만 그 외의 디렉터리에는 701 퍼미션을 주고 파일에는644 퍼미션을 준다. cgi같은 경우에는 755퍼미션을 주지 않으면 실행이 되지 않으므로 주의한다.

 

그외에도 /etc/cron.daily에 스크립트를 하나 만들어 다음과 같이 명령어에 제한을 걸어 슈퍼유저외에는 사용을 못하게 할 수도 있다.

 

#!/bin/sh

chmod 701 /

chmod 701 /home

 

cd /etc

chmod 600 fstab

chmod 600 hosts.*

chmod 600 modprobe.conf

chmod 600 sysctl.conf

chmod 600 redhat-release

 

cd /usr/bin

chmod 700 wget

chmod 700 lynx

chmod 700 curl

chmod 700 lwp-*

chmod GET

 

만약 사용되고 있는 서버가 여러 유저들이 모두 같이 사용하는 서버라서 명령어 제한이 자유롭지 못하다며 acl 기능을 사용해서 nobody권한의 유저만 제한을 걸 수 도 있다.

acl 기능은 다음과 같이 하면 사용 할 수 있다.

 

vi /etc/fstab

/dev/sda8               /                       ext3    defaults,acl        1 1

/dev/sda7               /usr                    ext3    defaults,acl        1 2

이렇게 acl을 옵션으로 붙여주고 다시 리마운트 한다.

mount -o remount /

mount -o remount /usr

 

다음과 같이 제한하고자 하는 명령어에 nobody유저만 접근이 안되게 한다.

setfacl -R -m u:nobody:- `which find`

setfacl -R -m u:nobody:- `which ls`

setfacl -R -m u:nobody:- `which chmod`

setfacl -R -m u:nobody:- `which echo`

setfacl -R -m u:nobody:- `which cat`

 

정책이 정확하게 적용이 되었는지 확인한다.

ls ?al `which find`

-rwxr-xr-x+ 1 root root 52460 Oct 20  2004 /usr/bin/find

끝에 +가 붙어 있으면 acl기능이 작동을 하는 것이다. acl기능을 제거 하려고 하면 다음과 같이 하면 된다.

setfacl -b /usr/bin/find

이상으로 웹 해킹 서버에 대한 간단한 분석 방법과 서버에서의 웹쉘에 대한 대처 방법에 대해 마치려고 한다. 웹서버 보안은 하나의 보안 어플리케이션으로 모든 것을 완벽하게 막을 수는 없다. 가능한 알고 있는 모든 방법을 다 적용하여서 조금씩 보안 허점을 줄여 나가는 수밖에 없다. 또한 리눅스 같은 경우 반드시 방화벽 정책을 수립하여 운영함으로써 해커가 서버를 악의적으로 운영하거나 외부로 공격을 하지 못하게 해야 한다. 이에 관해서는 차후에 다루어 보도록 하겠다.

 

 

[출처] 블루웹 | 시스템연구개발팀 양선곤 (http://blog.blueweb.co.kr)

반응형

댓글()

웹해킹 서버 분석과 웹쉘 탐지 및 대응방법 1편

리눅스/Security|2015. 1. 26. 18:05
반응형

가끔 접속 자 수도 많지도 않은데 로드가 높아서 서버 접속이 원활하지 못하다거나 나의 서버가 스팸서버로 지정 되어서 상대방에게 메일을 보냈는데도 차단되었다거나 혹은 idc 보안 관제 센터에서 당신네 서버가 외부로 ddos공격을 하고 있으니 빨리 조치를 취하지 않으면 네트워크를 차단시키겠다는 경고성 전화를 받았을 때 어떻게 조치를 취해야 하는지 막막할 경우가 있다.

 

이럴 경우 웹 해킹에 의해서 서버가 해커에 의해 조종되고 있지 않는지 살펴 볼 필요성이 있다. 이번에는 실제 사례를 가지고 웹 해킹 침해 사고 시 대처 방법을 소개해 보고자 한다.

 
해킹된 서버는 redhat9를 사용하고 있으며 커널 버전은 2.4.20-8이다. 웹서버는 apache + php + mysql 기반으로 돌아가고 있으며 앞으로 모든 설명을 여기에 맞추어서 진행 하려고 한다. (윈도우에 asp는 해당 사항이 아니다.) 


pstree

init-+-bdflush

     |-crond

     |-httpd-+-40*[httpd]

     |       `-2*[httpd---read.cgi]

     |-httpd---httpd

     |-httpd

     |-kapmd

     |-keventd

     |-khubd

     |-10*[kjournald]

     |-2*[klogd]

     |-kscand/DMA

     |-kscand/HighMem

     |-kscand/Normal

     |-ksoftirqd_CPU0

     |-kswapd

     |-kupdated

     |-mdrecoveryd

     |-6*[mingetty]

     |-named

     |-nohup---a---sshd---101*[sshd]

     |-perl

     |-rhnsd

     |-safe_mysqld---mysqld

     |-sshd---sshd---bash---pstree

     |-11*[sshd]

     |-syslogd

     |-vsftpd

     |-us1---us1

     |-us10---us11

     |-us12---us12

     |-us13---us13

     |-us14---us14

     |-us15---us15

     |-us16---us16

     |-us17---us17

     |-us18---us18

     |-us19---us19

     |-us2---us2

     |-us21---us21

     |-us22---us22

     `-xinetd

pstree명령어는 현재 돌아가고 있는 서버의 프로세스를 한눈에 파악할 수 있는 아주 중요한 명령어이다. 리눅스 사용자는 pstree명령어에 익숙해 져야 한다. 그냥 시간 날 때 마다 pstree치면서 나오는 결과를 눈에 익도록 하는 게 낫다.

 

위에 출력 결과를 한번 분석해 보도록 하자.

|-httpd-+-40*[httpd]

|       `-2*[httpd---read.cgi]

|-httpd---httpd

|-httpd

 

아파치 웹 서버가 돌아가면 위와 같은 프로세스가 보인다. 허나 진짜 웹 서버는 첫째 줄 뿐이다. 나머지는 두번째 줄과 세번째 줄은  웹 서버로 위조된 해킹 프로세스이다.

|-nohup---a---sshd---101*[sshd]

이 부분을 보자 외부로 ssh Login Brute force scan 공격을 하고 있다. 마찬가지로 us로 시작하는 프로세스도 모두 외부로 공격하는 해킹프로세스이다. 정상적인 서버에서는 절대 볼 수 없는 프로세스들이다. 이외에도 perl같은 프로세스도 비정상 프로세스이다.

현재 이 서버는 외부로 공격을 수행하는 해킹 프로세스들이 매우 많이 수행되고 있는 중이다.

 

포트 상태를 점검해서 좀더 자세한 상황을 살펴보자.

# netstat -nlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address              Foreign Address   State                    PID/Program name  

tcp         0      0 0.0.0.0:3306                        0.0.0.0:*               LISTEN                655/                

tcp         0      0 0.0.0.0:80              0.0.0.0:*               LISTEN                26032/httpd        

tcp         0      0 0.0.0.0:2                             0.0.0.0:*               LISTEN                612/vsftpd         

tcp         0      0 192.168.10.1:53                    0.0.0.0:*               LISTEN                575/               

tcp         0      0 127.0.0.1:53                        0.0.0.0:*               LISTEN                575/               

tcp         0      0 0.0.0.0:22              0.0.0.0:*               LISTEN                588/sshd           

tcp         0      0 127.0.0.1:953                       0.0.0.0:*               LISTEN                575/               

udp        0      0 0.0.0.0:32768                       0.0.0.0:*                                          575/               

udp        0      0 0.0.0.0:37028                       0.0.0.0:*                           25089/sshd         

udp        0      0 0.0.0.0:37029                       0.0.0.0:*                           25479/httpd        

udp        0      0 192.168.10.1:53                    0.0.0.0:*                           575/               

udp        0      0 127.0.0.1:53                        0.0.0.0:*                           575/               

Active UNIX domain sockets (only servers)

Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path

unix  2      [ ACC ]     STREAM     LISTENING     1318   655/                /var/lib/mysql/mysql.sock

 

정상적인 웹 서버는 다음과 같이 나타난다. 80포트가 열려져 있는 것을 알 수 있다. 26032는 실행되고 있는 아파치 프로세스의 pid이다.

tcp         0      0 0.0.0.0:80              0.0.0.0:*               LISTEN                26032/httpd

 

udp        0      0 0.0.0.0:37029                       0.0.0.0:*                           25479/httpd        

위의 프로세스를 보자. pid 25479인 이 프로세스는 아파치 웹서버 프로세스로 위장 되어 있지만 실질적으로는 37029번 포트로 서비스 되고 있는 hack 프로세스이다. 그리고 tcp가 아니 udp를 사용하고 있는 것도 눈에 띈다. sshd 프로세스도 마찬가지이다. 22번 포트를 LISTEN하고 있는pid 588 프로세스가 정상적인 sshd 프로세스이다. 25089프로세스는 sshd로 위장된 비 정상적인 프로세스이다.

3306포트와 53번 포트를 리슨하고 있는 것은 각각 mysqld named프로세스로 정상적인 프로세스들이다.

 

이제는 좀더 깊이 들어가서 이 프로세스들이 어디서 실행되고 있는지 한 번 살펴 보자.

lsof -p 25479

lsof 명령어는 파일과 프로세스의 입출력 상태를 나타내주는 명령어로 pstree netstat 다음으로 사용법을 잘 익혀둘 필요가 있는 매우 유용한 명령어이다. p옵션은 프로세스 id의 입출력 상태를 나타내주는 옵션으로 다음 부분을 살펴볼 필요가 있다.

 

COMMAND   PID   USER   FD   TYPE    DEVICE    SIZE      NODE NAME

httpd       25479      apache   cwd       DIR         0,8     280 321300582 /dev/shm/bq

httpd       25479      apache   txt          REG       0,8  612470 321300590 /dev/shm/bq/httpd

httpd       25479      apache   0u          IPv4        563618039 TCP 192.168.10.1:48562

->irc2.saunalahti.fi:ircd (ESTABLISHED)

httpd   25479 apache    5u   REG       3,7       0        55 /tmp/ZCUDUzGlho (deleted)

httpd   25479 apache    6u  IPv4 321303856               UDP *:37029

 

일단 이 위장 프로세스가 실행되고 있는 위치는  /dev/shm/bq/httpd라는 것을 알 수 있다.

192.168.10.1:48562->irc2.saunalahti.fi:ircd (ESTABLISHED)

이 부분을 주의 깊게 살펴 보자. 현재 해킹된 서버에서 irc2.saunalahti.fi 서버의 6667(ircd)포트로 접속 되어 있는 것을 알 수 있다. 즉 이 서버는 현재 좀비 컴퓨터화 되어 있다. 한마디로 말해서 해커가 원격에서 irc bot을 이용하여 이 서버를 자신이 원하는 데로 조종할 수 있다는 말이다. 이러한 좀비 컴퓨터를 대량으로 확보하면 해커는 보통 분산 서비스 거부 공격(DDOS ATTACK)을 하는데 이용하거나 돈을 받고 팔기도 한다. 특히IDC에 상주되어 있는 서버가 해커 손에 넘어가면 최대 100M급의 트래픽 공격을 할 수 있는 든든한 무기를 손에 넣게 된다.

 

USER부분을 살펴보자 apache라고 되어 있다. 현재 이 서버에서 실행되고 있는 웹서버의 권한이 apache로 웹해킹을 통해서 서버의 apache권한을 획득한 것을 볼 수 있다.

 

다음과 같은 명령으로 이서버의 전체적인 입출력 상태를 체크해 볼 수 있다.

lsof ?I ?n |grep apache

문제가 되는 apache권한만 살펴 보면 다음과 같은 입출력 상태가 2~300개씩 나타나고 있었다.

 

sshd    23901 apache    8u  IPv4 397205096       TCP 192.168.10.1:56970->217.18.114.168:ssh (ESTABLISHED)

외부에 ssh스캔 공격을 하고 있을 때의 대표적 증상이다. 만약 다량의 스팸 메일을 보낸다면 외부 ip 25번포트(SMTP포트)로 수많은 연결이 보일 것이다. 이 외에도 ircd로의 접근도 포착 될 것이다.

lsof 명령어는 서버의 입출력 상태를 점검할 때 매우 유용한 명령어이니 잘 익혀두는 것이 좋다.

 

일단 hack process가 설치된 /dev 디렉터리를 좀더 자세히 점검해 보자.

find /dev ?type f

일단 정상적인 경우를 살펴보자

 

/dev/.udev.tdb

/dev/MAKEDEV

centos5같은 경우

/dev/.udev 디렉토리와 그 아래 디렉토리만 파일들만 있어야지 정상이다.

 

find 명령어로 살펴보니 아래와 같은 많은 수많은 hack tool들이 설치 되어 있는 것을 확인 할 수 있었다.

/dev/MAKEDEV

/dev/shm/stopex.pl

/dev/shm/bq/raw.session

/dev/shm/bq/Presedinte.seen

/dev/shm/bq/Silvic.seen

/dev/shm/bq/RamonaT.seen

/dev/shm/bq/httpd

/dev/shm/bq/3

/dev/shm/st/src/dcc.c

/dev/shm/st/src/parse.c

/dev/shm/st/src/main.c

/dev/shm/st/src/gencmd.c

/dev/shm/st/src/Makefile

 

웹쉘 권한을 얻었을 때 이와 같은 툴들이 설치되는 이유는 퍼미션 때문이다.

 

ll ?ld /dev/shm

drwxrwxrwt 2 root root 40 Nov  6 13:33 /dev/shm

/dev/shm, /var/tmp, /tmp 폴더등은 1777권한을 가지고 있기 때문에 웹쉘을 통해 권한을 얻었을 경우 쉽게 해킹툴들을 업로드 하고 이를 실행 시키는데 사용되는 디렉터리로 평소 주의를 기울여 관리해야 한다. 이외에도 디렉터리에 apache nobody유저에 쓰기 권한을 주거나 777같은 퍼미션을 주는 경우는 매우 잘못된 습관이라고 할 수 있다.

 

# cd /dev/shm/st

[root@canacom st]# ll

합계 836

-rwxr-xr-x    1 apache   apache       2156  7 11  2005 Makefile

-rwxr-xr-x    1 apache   apache      20358  1  2  2003 configure

-rwxr-xr-x    1 apache   apache     585643  1  4  2007 sshd

-rwxr-xr-x    1 apache   apache      17495  1  4  2007 stealth

 

보면 apache권한을 가지고 있는 것을 알 수 있다.

lsof 명령어로 보여주는 결과 값이 너무 길어서 의미가 있는 것 만 적었다. 다음 perl명령어는 원격에서 root로 쉘 권한을 가지고 직접 접속해서 명령을 내린 것으로 해커가 어떤 방법을 써서 아파치 권한에서 root로 권한이 상승 된 것을 확인 할 수 있다.

 

lsof -p 6411

COMMAND  PID USER   FD   TYPE    DEVICE     SIZE   NODE NAME

perl    6411 root  cwd    DIR       3,7     4096  87745 /tmp/.tmp

perl    6411 root  rtd    DIR      22,9     4096      2 /

perl    6411 root  txt    REG       3,5    12572  33642 /usr/bin/perl

perl    6411 root    0u   CHR     136,1               3 /dev/pts/1

perl    6411 root    1u   CHR     136,1               3 /dev/pts/1

perl    6411 root    2u   CHR     136,1               3 /dev/pts/1

perl    6411 root    3r   REG       3,7   116030  87748 /tmp/.tmp/bnc

perl    6411 root    4u  IPv4 398045837             TCP *:24338 (LISTEN)

perl    6411 root    5r   DIR       3,7     4096  43873 /tmp/.tmp/logs

perl    6411 root    6u  IPv4 398046908             TCP 192.168.10.1:24338->189.14.64.131:1327 (ESTABLISHED)

perl    6411 root    7u  IPv4 398046908             TCP 192.168.10.1:24338->189.14.64.131:1327 (ESTABLISHED)

perl    6411 root    8u  IPv4 398049150             TCP 192.168.10.1:35825->own.ipapo.org:ircd (ESTABLISHED)

 

다음 부분을 주목해서 보자.

perl    6411 root    0u   CHR     136,1               3 /dev/pts/1

원격 터미널을 통해서 슈퍼유저 권한으로 로그인한 것으로 추정된다. 이 상태에서 이미 최상위 권한을 탈취했으므로 이 시스템은 완전히 해커에게 장악 당했다고 볼 수 있다.

 

다음과 같은 명령으로 서버에서 실행되는 백 도어 프로세스에 관한 좀더 자세한 정보를 알 수 있다. 테크노트 게시판의 취약점을 이용해서 원격에서 쉘 명령어를 실행 시킨 것을 알 수 있다.

 

#ps -auxe --cols=3000

/usr/sbin/sshd shd _CMD=cd /dev/shm/n; nohup ./start 217 >>/dev/null & 2>&1;pwd SERVER_SIGNATURE=<ADDRESS>Apache/1.3.31 Server at test.co.kr

Port 80</ADDRESS>?

HTTP_USER_AGENT=Getter/0.1

SERVER_PORT=80

HTTP_HOST=www.test.co.kr

DOCUMENT_ROOT=/home/test/public_html SCRIPT_FILENAME=/home/test/public_html/technote/main.cgi REQUEST_URI=/technote/main.cgi?down_num=784879&board=any&command=down_load&filename=getfile.txt%3Bsh%20-c%20%22%24HTTP_CMD%22| SCRIPT_NAME=/technote/main.cgi

REMOTE_PORT=55507

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin

HTTP_TE=deflate;q=0.3

PWD=/dev/shm/n

QUERY_STRING=down_num=784879&board=any&command=down_load&filename=getfile.txt%3Bsh%20-c%20%22%24HTTP_CMD%22|

SERVER_ADDR=192.168.10.1

GATEWAY_INTERFACE=CGI/1.1

SERVER_PROTOCOL=HTTP/1.0

REQUEST_METHOD=GET _=./sshd

 

테크노트 cgi 관한 원격 명령어 실행 취약점은 국정원에서 발표한 보안 취약점 8종의 한가지로 반드시 최신 버전의 테크노트로 업그레이드 하여야 한다.

 

또한 php를 사용할 경우는 반드시 php.ini 파일에

allow_url_fopen = Off

register_globals = Off

로 해놓는 것을 명심하자. 지금까지 경험한 바로 php경우 대부분 저 두 옵션으로 인하여 문제가 발생했다.

또한 php 개발자분들께 당부하고 싶은 것은 위의 두 옵션을 끄고 코딩을 해야 한다는 것이다. 그렇지 않을 경우 원한 던 그렇지 않던 잠재적인 보안 위협을 가진 소스를 만들어 내게 된다.

 

지금까지 웹 해킹 침해 사고를 당한 시스템을 간단하게 분석해 보았다. pstree, netstat, lsof, ps 명령어등은 리눅스에서 트러블슈팅을 하는데 정말 요긴하게 사용하는 명령어이므로 사용법을 자세하게 알아둘 필요가 있다. 일단 해커가 웹 쉘 권한을 얻으면 가능한 모든 디렉터리에 웹 쉘을 업로드 하여 하나의 침입경로가 막히면 다른 경로로 들어오기 때문에 대처하는데 어려움이 따른다.

 

그렇기 때문에 다시 한번 강조하지만 allow_url_fopen = Off, register_globals = Off 잊지 말도록 하자.

다음에는 웹 원격 취약점을 통해 해커가 서버에 침입했을 경우 서버에서의 대응 방법에 대해 알아 보도록 하겠다.

 

 

[출처] 블루웹 | 시스템연구개발팀 양선곤 (http://blog.blueweb.co.kr)

반응형

댓글()

check pass; user unknown 메세지로그 차단

리눅스/Security|2015. 1. 26. 18:04
반응형

불법 접근(SSH 무작위 접속시도, 스패머 릴레이 시도) 자동 차단, 통보 스크립트  
" 아래의 메세지가 /var/log/message
check pass; user unknown
Aug  9 14:17:40 localhost sshd(pam_unix)[9144]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=

 

 

 

vi  sshsecurity.sh
======================================================================================

 

#!/bin/sh

IPTABLES="/sbin/iptables" # iptables 의 절대 경로
#IPTABLES="/usr/local/sbin/iptables" # iptables 의 절대 경로
NUMBER=20   ## 1일 Block 적용 대상에 포함될 최대 체크 횟수 (Default:하루에 10번 이상 체킹 되면 해당 IP 패킷은 모두 DROP)
ORDER=4     ## iptables 정책에 몇번째 라인에 DROP 라인을 삽입할것인가 (Default:4번째 라인에 삽입)

 

## 작업디렉토리 지정, 없을시 생성
if [ ! -d "/root/root_dir" ] ; then
                mkdir -p "/root/root_dir"
                chmod 700 "/root/root_dir"
fi
#########################################
##### 211.43.205.124를 자기 서버 아피를 적는다.    #
########################################
## 최초 실행시(/root/root_dir/iptables.deny 파일이 비존재시) 실행되는 부분

 


if [ ! -f /root/root_dir/iptables.deny ]; then
        cd /root/root_dir

 

        grep "illegal" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' > temp
        sed -e "s/illegal//g" temp > iptables.deny.tmp

 

        grep "Invalid" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $6 $10}' > temp
        sed -e "s/Invalid//g" temp >> iptables.deny.tmp

 

        grep "invalid" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' > temp
        sed -e "s/invalid//g" temp >> iptables.deny.tmp

 

        grep "authentication failure" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' | awk -F"host=" '{print $2}' > temp
        #빈줄 없앰
        sed -e "/^$/d" temp > temp.tmp
        mv temp.tmp temp
        sed -e "s/uid=0rhost=//g" temp >> iptables.deny.tmp

 

        grep "Relaying denied" /var/log/maillog | egrep -v "211.43.205.124" | awk '{print $9}' | awk -F"[" '{print $2}' | awk -F"]" '{print $1}' > temp
        #빈줄 없앰
        sed -e "/^$/d" temp > temp.tmp
        mv temp.tmp temp
        sed -e "s/^//g" temp >> iptables.deny.tmp

 

if [ -s /root/root_dir/iptables.deny.tmp ]; then
sort iptables.deny.tmp | uniq > iptables.deny.uniq
# 일정 횟수 이상만 차단
for block_ip in $(cat iptables.deny.uniq)
        do
                num=`grep "$block_ip" iptables.deny.tmp | wc -l`
                if [ $num -gt $NUMBER ]
                        then
                        echo $block_ip >> iptables.deny
                fi
done

 

if [ -s /root/root_dir/iptables.deny ]; then
        sort iptables.deny | uniq > iptables.deny.uniq
        mv iptables.deny.uniq iptables.deny
fi
        ## 포착된 IP 관리자 메일로 통보
        if [ -s /root/root_dir/iptables.deny ]; then
        mail -s "[IPTABLES]불법 접근 IP 발견!! 방화벽:ALL 포트 차단" root@localhost < iptables.deny
        fi
        
        ## 방화벽 정책에 DROP 정책 추가
        if [ -s /root/root_dir/iptables.deny ]; then
        for DENY_LIST in $(cat iptables.deny);
                do $IPTABLES -I INPUT $ORDER -s $DENY_LIST -j DROP;
        done;
        fi

 

        rm -f /root/root_dir/temp
        rm -f /root/root_dir/illegal
        rm -f /root/root_dir/invalid
        rm -f /root/root_dir/authentication
        rm -f /root/root_dir/smtp_block
        rm -f /root/root_dir/iptables.deny.tmp

 

fi
else

 


### 최초 실행이 아닐경우에 구동되는 부분(/root/root_dir/iptables.deny 파일이 존재하고 있을경우)
cd /root/root_dir

 

sort iptables.deny | uniq > iptables.deny.uniq
mv iptables.deny.uniq iptables.deny
#빈줄 없앰
sed -e "/^$/d" iptables.deny > iptables.deny.uniq
mv iptables.deny.uniq iptables.deny

 


grep "illegal" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' > temp
sed -e "s/illegal//g" temp > iptables.deny.tmp

 

grep "Invalid" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $6 $10}' > temp
sed -e "s/Invalid//g" temp >> iptables.deny.tmp

 

grep "invalid" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' > temp
sed -e "s/invalid//g" temp >> iptables.deny.tmp

 


grep "authentication failure" /var/log/messages | egrep -v "211.43.205.124" | awk '{print $9 $13}' | awk -F"host=" '{print $2}' > temp
#빈줄 없앰
sed -e '/^$/d' temp > temp.tmp
mv temp.tmp temp
sed -e "s/uid=0rhost=//g" temp >> iptables.deny.tmp

 

grep "Relaying denied" /var/log/maillog | egrep -v "211.43.205.124" | awk '{print $9}' | awk -F"[" '{print $2}' | awk -F"]" '{print $1}' > temp
#빈줄 없앰
sed -e '/^$/d' temp > temp.tmp
mv temp.tmp temp
sed -e "s/^//g" temp >> iptables.deny.tmp


if [ -s /root/root_dir/iptables.deny.tmp ]; then
sort iptables.deny.tmp | uniq > iptables.deny.uniq
# 일정 횟수 이상만 차단
for block_ip in $(cat iptables.deny.uniq)
        do
                num=`grep "$block_ip" iptables.deny.tmp | wc -l`
                if [ $num -gt $NUMBER ]
                        then
                        echo $block_ip >> iptables.deny.tmp.tmp
                fi
done

 

if [ -s /root/root_dir/iptables.deny.tmp.tmp ]; then
sort iptables.deny.tmp.tmp | uniq >> iptables.deny.tmp.tmp.uniq
mv iptables.deny.tmp.tmp.uniq iptables.deny.tmp.tmp

 

diff iptables.deny.tmp.tmp iptables.deny | awk -F"< " '{print $2}' > deny.new
#빈줄 없앰
sed -e '/^$/d' deny.new > deny.new.tmp
mv deny.new.tmp deny.new

 

sort deny.new | uniq >> deny.new.tmp
mv deny.new.tmp deny.new
fi

 

## 포착된 IP 관리자 메일로 통보
if [ -s /root/root_dir/deny.new ]; then
        mail -s "[IPTABLES]불법 접근 IP 발견!! 방화벽:ALL 포트 차단" root@localhost < /root/root_dir/deny.new
fi

 

## 방화벽 정책에 DROP 정책 추가
if [ -s /root/root_dir/deny.new ]; then
for DENY_LIST in $(cat deny.new);
        do $IPTABLES -I INPUT $ORDER -s $DENY_LIST -j DROP;
done;
cat deny.new >> iptables.deny

 

fi

 

## 스크립트 실행 중 생성된 임시 파일들 삭제
rm -f /root/root_dir/temp
rm -f /root/root_dir/illegal
rm -f /root/root_dir/invalid
rm -f /root/root_dir/authentication
rm -f /root/root_dir/smtp_block
rm -f /root/root_dir/deny.new
rm -f /root/root_dir/iptables.deny.tmp
rm -f /root/root_dir/iptables.deny.tmp.tmp

 

sort iptables.deny | uniq > iptables.deny.uniq
mv iptables.deny.uniq iptables.deny
#빈줄 없앰
sed -e '/^$/d' iptables.deny > iptables.deny.uniq
mv iptables.deny.uniq iptables.deny

 

fi

 

fi

 

cd - > /dev/null 2>&1

 

======================================================================================


* 위의  스크립트를  임의의 파일명으로
 /etc/cron.1min/sshsecurity.sh  아래에 위치시키고,

 

 /etc/crontab 에 */1 * * * * root run-parts /etc/cron.1min

 

라인을 추가시키면 매, 1분마다 불법접근을 분석후 차단시킴.

 

* 하루에 10번(패스워드 입력 실패, 불법 릴레이 시도, 비존재 계정 접근 시도 등..)의 제한을 두었으므로, 로그파일(/var/log/messages)역시 하루에 한번 로테이션 되게 설정.

 

* 매일 리셋되어야 하므로,  /root/root_dir/iptables.deny 파일 내용을 하루에 한번 리셋(클리어) 해주어야 함
- 리셋 스크립트 내용을 아래의 디렉토리에 만들어주고 (/etc/cron.daily/reset_iptables_deny.sh)
======================================================================================
#!/bin/bash
cat /root/root_dir/iptables.deny >> /root/root_dir/iptables.deny_history
cat /dev/null > /root/root_dir/iptables.deny
uniq /root/root_dir/iptables.deny_history > /root/root_dir/iptables.deny_history.tmp
mv /root/root_dir/iptables.deny_history.tmp /root/root_dir/iptables.deny_history
/etc/rc.d/rc.firewall
======================================================================================

 

* 방화벽 구동시 차단된 아이피 자동 로딩 부분 추가 
 (/etc/rc.d/rc.firewall 파일 하단에 아래 스크립트 추가)함
======================================================================================
############# 불법 접근 시도 IP 차단 (해당 스크립트 구동시) #########################
if [ -s /root/root_dir/iptables.deny ]; then
for DENY_LIST in $(cat /root/root_dir/iptables.deny);
        do $IPTABLES -I INPUT 4 -s $DENY_LIST -j DROP;
#### 4 는 정책이 들어간 순서(몇번째 라인에 삽입할것인가 임)
done;
fi
======================================================================================

반응형

댓글()

iframe 삽입 파일 스캔

리눅스/Security|2015. 1. 26. 18:04
반응형

[root@sysdocu ~]# find ./ | egrep -i ".php|.htm|.html" | xargs grep -ri 'iframe src="http' | awk -F: '{print $1}' | xargs ls -l

 

위의 명령어를 사용하시면 됩니다.

고객님 다른 서버에서 사용하실 경우에 위의 명령이 되지 않는 경우가 있습니다.

커널의 차이때문인데, 이 경우 아래의 명령어로 확인이 가능합니다.

 

[root@sysdocu ~]find ./ | grep ".*/.*..*" | xargs grep -r "iframe src="./.*http"
또는

[root@sysdocu ~]find ./ -exec grep -l 'iframe' {} ;

 

반응형

댓글()

리눅스용 백신 - f-prot 설치 및 사용법

리눅스/Security|2015. 1. 26. 18:01
반응형

f-prot 리눅스용 홈버젼을 다운받는다.

 

# cd /root

# wget http://files.f-prot.com/files/unix-trial/fp-Linux-x86_32-ws.tar.gz

# tar xvfz fp-Linux-i686-ws.tar.gz

# cd f-prot

# ./install-f-prot.pl

그냥 무조건 엔터 엔터 로 설치...

 

 

▶바이러스 스캔 방법

 

# fpscan -a

--------------------------------------------------------------
fpscan -a                    하드 전체 검사(스캔만)
fpscan -a --disinfect        하드 전체 검사(스캔만)+자동치료
fpscan /test                 /test 디렉토리만 검사
fpscan -b                    부팅섹터만 검사
fpscan / --exclude=*.doc     확장자 hwp인 파일만 제외하고 검사
fpscan / --exclude=/var/     / 밑에 var 폴더만 제외하고 검사
---------------------------------------------------------------


스캔화면

---------------------------------------------------------------------------------------------------------------

F-PROT Antivirus version 6.3.3.5015 (built: 2009-12-23T13-43-55)


FRISK Software International (C) Copyright 1989-2009
Engine version:   4.5.1.85
Arguments:        -a 
Virus signatures: 201011301301fba630179f01eccae250deb4f6029fd5
                  (/root/f-prot/antivir.def)

[Found possible security risk] <w32 eldorado="Eldorado" heuristic-210="Heuristic-210" damaged="damaged" not="not" disinfectable="disinfectable">        /util/ftp_data/security/blackenergy_11.9.2_ddos_tool.zip->Black Energy 1.9.2.exe->(embedded)->(YZPack)
[Contains infected objects]     /util/ftp_data/security/blackenergy_11.9.2_ddos_tool.zip      </w32>

Scanning: /

 

----------------------------------------------------------------------------------------------------------------

 

 

▶백신 자동 업데이트 방법

 

# crontab -e
---------------------------------------------------
30 * * * * root /root/f-prot/fpupdate > /dev/null
---------------------------------------------------

 

[출처] ::: 인생은 끝없는 삽질이다. ::: | 삽질맨 (http://blog.naver.com/nforce7050?Redirect=Log&logNo=140119066453)

반응형

댓글()

arp 스푸핑 방지

리눅스/Security|2015. 1. 26. 18:00
반응형

/etc/sysctl.conf 파일에 아래내용 삽입

 

net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

저장후 아래명령어로 적용합니다.

 

sysctl -p

반응형

댓글()

SSH 포트22번 불량 접속 시도 IP 자동 막기

리눅스/Security|2015. 1. 26. 18:00
반응형

SSH를 돌리면 /var/log/secure 에 22번포트로 접속시도가 많이 보인다. 부적절하게 접속시도하는 IP 들을 자동으로 차단하는 스크립트를 만들어 보겠다.

과정은 /var/log/secure 에서 불량 ssh 접속 ip를 추려내서 /etc/hosts.deny 에 등록된다.

 


# grep "Failed password for" /var/log/secure | egrep -v "invalid user" | egrep -v "{USERID}|{LOGINIP}" | awk '{ print $11}' | uniq | sed "s/^/all:/" > /root/ssh-login-ip
# grep "Failed password for invalid user" /var/log/secure.1 | awk '{ print $13}' | uniq | sed "s/^/all:/" >> /root/ssh-login-ip

 

[위의 명령어 설명]    USERID=관리자 ssh 접속계정  LOGINIP=관리자 ssh접속계정의 공인 ip  :  직접 입력해야함.

-------------------------------------------------------------------------------------------------------------

grep "Failed password for" /var/log/secure     : /var/log/secure 파일 내에서 "Failed password for" 문장이 들어간 행만 뽑아냄

egrep -v "invalid user"   : 위 결과에서 "invalid user" , "USERID" , "LOGINIP" 가 들어간 부분은 제외

egrep -v "{USERID}|{LOGINIP}"   : 위 결과에서 관리상 필요에 의해 접속했던 계정, IP는 제외

awk '{print $11}'    : 위 결과에서 각 행마다 11번째 문장을 뽑아냄  -> 비정상 IP

uniq     : 중복된 문장을 하나씩만 출력

sed "s/^/all:/" > /root/ssh-login-ip   : 각 행의 맨 앞에 "all:" 을 입력 후 /root/ssh-login-ip 파일에 저장

 

grep "Failed password for invalid user" /var/log/secure.1     : var/log/secure.1 파일에서 "Failed .... user" 문장이 들어간 행만 추출

awk '{print $13}'     : 각 행마다 11번째 문장만 뽑아냄  ->  비정상 IP

>> /root/ssh-login-ip     : 위의 /root/ssh-login-ip 파일에 뒤이어 내용을 첨가함

-------------------------------------------------------------------------------------------------------------

 

# cat /root/ssh-login-ip /etc/hosts.deny | sort  | uniq >> /root/hosts.deny      : hosts.deny에 블럭킹할 ip 등록

 

 

crontab 등록

# crontab -e

------------------------------------------------------------------------------------------------------------------

05,15,25,35,45,55 * * * * grep "Failed password for" /var/log/secure | egrep -v "invalid user" | egrep -v "{USERID} | {LOGINIP}" | awk '{ print $11}' | uniq | sed "s/^/all:/" > /root/ssh-login-ip

06,16,26,36,46,56 * * * * cat /root/ssh-login-ip /etc/hosts.deny | sort | uniq > /root/hosts.deny

07,17,27,37,47,57 * * * * cp /root/hosts.deny /etc/hosts.deny

-------------------------------------------------------------------------------------------------------------------

 


반응형

댓글()

SSH 스캔(접속시도) 공격 차단 룰 - recent 모듈 이용

리눅스/Security|2015. 1. 26. 18:00
반응형

계속 그래 왔지만 왠지 느낌이 요즘에 더 비번히 발생하는듯하네요.

하루도 안쉬고 들어오는 ssh 접근시도 머 얻어갈것도 없는 서버에 왜이리 접근을 하는지

디스크 공간만 잡아먹고 참 불필요한 행위가 서버로 계속시도 되고 있습니다.

ssh 스캔 공격을 막는 방법은 포트를 변경한다던지 여러가지 방법이 나와 있지요.

iptables의 recent 라는 모듈을 이용해 차단하는 방법입니다.

 

[iptables] SSH 스캔(접속시도) 공격 차단 룰 - recent 모듈 이용

----------------------------------------------------------------------------------------------
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSHSCAN
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 --rttl --name SSHSCAN -j LOG --log-prefix SSH_Scan:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 --rttl --name SSHSCAN -j DROP
----------------------------------------------------------------------------------------------

위 룰에 필요한 입맛대로 수정 가능.

 

 

[출처] 365매니지드 (http://community.365managed.com/865)

반응형

댓글()

iptables 접속 차단 스크립트

리눅스/Network|2015. 1. 26. 17:59
반응형

#!/bin/sh

# 초기화
iptables -F

# 포트 스캔 방지
iptables -A INPUT -d 0.0.0.0/0 -p icmp -j DROP

# DoS 공격 방지
iptables -N syn-flood
iptables -A syn-flood -m limit --limit 12/second --limit-burst 24 -j RETURN
iptables -A syn-flood -j DROP

# ssh 정책(root, webpage 계정만 접속 가능)
# ssh 포트 : 22, root 번호: 0, webpage 번호:500 
iptables -A INPUT -p tcp --dport 22 -m owner --uid-owner 0 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m owner --gid-owner 0 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -m owner --uid-owner 0 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -m owner --gid-owner 0 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m owner --uid-owner 500 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m owner --gid-owner 500 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -m owner --uid-owner 500 -j DROP
iptables -A OUTPUT -p tcp --dport 22 -m owner --gid-owner 500 -j DROP

# 1초에 15번 이상의 HTTP 접근을 할 경우 차단
iptables -A INPUT -p tcp --dport 80 -m recent --update --seconds 1 --hitcount 15 --name HTTP -j DROP

#--------------------------------------------------------------------
# 커널 컴파일 및 iptables 패치 후, connlimit 사용이 가능한 경우
# 1초에 15번 이상의 HTTP 접근을 할 경우 차단
#iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 -connlimit-mask 24 -j DROP

#메일서버의 경우 동시에 5개이상 SMTP 접근일 경우 5분동안 접근 제한
#iptables -A INPUT -m recent --name spammer --rcheck --seconds 300 -j DROP
#iptables -A INPUT -p tcp --syn --dport 25 -m connlimit --connlimit-above 5 -m recent --name spammer --set -j DROP
#---------------------------------------------------------------------

#----------------------------------------------------------------------
# STRING 필터기능
# MSN 문자열이 들어간 패킷 차단
#iptables -A FORWARD -m string --string "messenger.msn.com" -j DROP

# 싸이월드 접속차단
#iptables -A FORWARD -p tcp --dport 80 -m string --string "Host: cyworld.nate.com" -j DROP
#----------------------------------------------------------------------

# 서버가 해킹당했을 때 DoS공격지로 사용될 경우에 적용.
# DNS 쿼리 이외 UDP 패킷 전송 방지
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp ! --dport 53 -m state --state NEW -j DROP

 

스크립트 실행 후

# service iptables save

# service iptables restart


당연한 이야기지만, 이 스크립트는 root 권한으로 실행시켜야 한다. 
시스템이 부팅될 때 이를 실행하고자 한다면, /etc/rc.local 에 등록해두자.

이를 해제하기 위해서는 

iptables -F
iptables -F syn-flood
iptables -X syn-flood


를 실행해주면 된다.

 

[출처] [적용] iptables 접속 차단 스크립트|작성자 아람조

반응형

댓글()

리눅스 보안 및 관리

리눅스/Security|2015. 1. 26. 17:59
반응형
***********************************************************
* 리눅스서버 보안관리
***********************************************************
* 리눅스서버 기본 보안설정하기(설치직후 초기보안셋팅하기)
1. 중요한 시스템 파일들 퍼미션과 속성 재설정
 
2. 중요한 시스템파일들 별도 압축보관하기
 
3. 시스템디스크와 데이터디스크를 가능한 구분하라.
 
4. 백업데이터 자정공간을 별도의 파티션이나 별도의 디스크를 이용
 
5. root의 crontab에 로컬백업설정해 두기
 
6. /etc/xinetd.d/ 에서 불필요한 서비스 파일들 삭제
 
7. /etc/rc.d/init.d/에서 불필요한 초기화 파일들 삭제
 
8. /etc/services에서 사용하지 않는 포트정보 주석처리
 
9. /etc/hosts.allow, /etc/hosts.deny 파일에서 접근허용 설정
 
10. ssh에서 root의 원격접속 금지설정
# vi /etc/ssh/sshd_config
PermitRootLogin yes -> root 로그인 허용
PermitRootLogin no -> root 로그인 허용하지 않음
 
11. FTP서비스에서 root의 원격접속 금지설정
# vi proftpd.conf
RootLogin off
 
12. 일반사용자의 FTP접속에서 상위디렉토리 이동제한 설정하기
# vi proftpd.conf
DefaultRoot ~
DefaultRoot ~ !wheel
 
13. FTP 익명(anonymous) 접속금지 설정
 
14. su 명령어 사용제한설정 및 중요한 관리자 명령어 사용제한 설정하기
# chmod 4750 /bin/su
# chown root:wheel /bin/su
# chattr +i /bin/su
# grep wheel /etc/group
wheel:x:10:root,bible,admin
# chmod 750 /usr/sbin/useradd
# chmod 750 /usr/bin/top
# chmod 750 /sbin/fdisk
# chmod 750 /sbin/mkfs
# chmod 750 /sbin/fsck
# chown root:wheel /usr/sbin/useradd
# chown root:wheel /usr/bin/top
# chown root:wheel /sbin/fdisk
# chown root:wheel /sbin/mkfs
# chown root:wheel /sbin/fsck
# chattr +i /usr/sbin/useradd
# chattr +i /usr/bin/top
# chattr +i /sbin/fdisk
# chattr +i /sbin/mkfs
# chattr +i /sbin/fsck
 
15. root소유의 setuid, setgid 파일 찾아서 조치하기
# find / -user root -perm -4000 -print
 
16. 기본 실행되는 불필요한 프로세스를 죽이기
 
17. ntsysv에서 초기 실행할 서비스데몬 내리기
18. 리눅스서버 설치직후 파일시스템의 badblock 점검하기
 
19. 시스템 정보유출파일 삭제 및 수정하기
    /etc/issue  콘솔에서 로그인 시도시에 보여줄 메시지 저장
    /etc/issue.net 원격에서 로그인 시도시에 보여줄 메시지 저장
    /etc/redhat-release 원격에서 로그인 시도시에 리눅스 배포판 정보를 보여주는 메시지
    /etc/motd  로그인 이후에 보여줄 공지사항 저장
20. rootkit점검을 위한 chkrootkit 설치 및 실행결과 확인
21. 파일 무결성을 위한 tripwire 설치 및 초기화 설정
 
22. /etc/sysctl.conf파일에서 커널 옵션값 설정하기
23. 로그보안을 위한 원격로그서버 설정
24. /etc/rc.d/rc.local내에 부팅시 실행할 내용 등록
 
25. 서버의 정확한 시간을 위한 설정
# crontab -l | grep rdate
00 01 * * * su - root /usr/bin/rdate -s time.bora.net && /sbin/clock -w
26. 아파치 설정파일(httpd.conf) 보안설정하기
* setuid, setgid, stickybit 다루기
- 4XXX : setuid 비트를 의미함
- 2XXX : setgid 비트를 의미함
- 1XXX : sticky-bit 비트를 의미함
* 보안을 위한 find
- 지정된 일자 이후에 변경된 모든 파일 찾기
# find / -used 2 -exec ls -l {} ;
  -> 2일전부터 현재까지 변경된 적이 있는 파일들을 검색
- 지정된 파일보다 이후에 생성된 파일 찾기
# find / -newer /root/file1.txt -exec ls -l {} ;
  -> /root/file1.txt라는 파일이 생성된 날짜 이후에 생성된 파일들만을 검색
- root 소유의 setuid파일 찾기
# find / -user root -perm -000 -print
  -> 소유자가 root이고 setuid가 설정되어 있는 파일을 검색
# find / -type f ( -perm -004000 -o -perm -002000 ) -exec ls -lg {};
  -> 퍼미션에 setuid가 있거나 setgid가 있는 파일들을 모두 검색
- 서버내의 백도어파일 찾기
# find /dev -type f -exec ls -l {} ;
  -> /dev 내에 존재하는 파이들 중 일반적인 보통파일을 검색
- 서버내부의 .rhosts 파일 찾아서 확인
# find / -name .rhosts -exec ls -l {} ;
- 서버내부에 .bash_history파일을 모두 찾아서 확인
# find / -name .bash_history -exec ls -l {} ;
  -> 시스템전체를 대상으로 .bash_history파일을 찾아서 보여달라는 의미.
- 소유자가 없는 파일 또는 소유그룹이 없는 무적파일을 찾기
# find / -nouser -o -nogroup -print
  -> 소유자가 없거나 소유그룹이 없는 파일을 검색한다.
* 파일속성설정으로 리눅스파일 보안 구현(chattr, lsattr)
chattr 사용법 : # chattr [-RV] [-v 설정버전] [+-=설정모드] 대상파일들
  -R : 서브디렉토리이하까지 그 속성을 변경할 수 있다.
  -V : 자세한 출력모드를 제공한다.
  -v version : 지정된 파일에 버전을 설정할 수 있다.
                [설정모드]
    + : 지정한 속성을 부여한다.
    - : 지정한 속성을 해제한다.
    = : 원래 파일이 가지고 있던 그 속성만을 유지하게 한다.
    -a : 해당 파일을 추가만 할 수 있다.
    -c : 이 속성이 설정된 파일은 커널에 의해 디스크상에 자동적으로 압축된 상태로 저장이 된다.
    -d : 이 속성이 설정된 파일은 dump로 백업이 되지 않는다.
    -i : 이 속성이 지정되어 있다면 해당파일의 변경, 삭제, 이름변경뿐 아니라 파일추가 및 리으파일도 만들수 없게 된다.
    -s : 이 속성이 설정된 파일은 파일삭제가 될 경우에 해당블럭이 모두 0으로 되어버리고 디스크에 다시 쓰기가 발생하나.
    -S : 이 속성이 설정된 파일은 변경이 될 경우에 디스크동기화가 일어나는 효과를 그대로 누릴 수 있다.
    -u : 이 속성을 가진 파일이 삭제가 되었을 경우에는 그 내용이 저장이 되며 삭제되기 전의 데이터로 복구가 가능해진다.
lsattr 사용법 : # lsattr [-RVadv] [대상파일들]
- 파일의 삭제, 변경, 추가등을 불가능하게 하는 속성 설정
# lsattr rc.local
------------- rc.local
# chattr +i rc.local 
# lsattr rc.local
----i-------- rc.local
# rm -f rc.local 
rm: cannot remove `rc.local': 명령이 허용되지 않음
- 파일의 삭제, 변경, 추가 등을 불가능하게 하는 i속성 제거
# chattr -i rc.local 
# lsattr rc.local 
------------- rc.local
# rm -f rc.local 
#
- 파일의 삭제는 불가능하지만 내용추가는 가능하도록 하는 속성 설정하기
# chattr +a messages 
# lsattr messages 
-----a------- messages
# rm -f messages 
rm: cannot remove `messages': 명령이 허용되지 않음
# chattr -a messages 
# lsattr messages 
------------- messages
# rm -f messages 

- 특정 디렉토리내의 모든 파일과 디렉토리에 대하여 한번에 속성부여하고 확인하기
# chattr -R +i directory
- 특정 디렉토리내의 모든 파일과 디렉토리에 부여되어 있는 속성을 동시에 제거하기
# chattr -R -i directory
* nmap
사용형식 : nmap [스캔타입] [옵션] <대상서버[네트워크|IP주소]>
           스캔옵션
    -sS                          : TCP SYN 스캔
    -sT                          : TCP 연결을 스캔
    -sF -sX -sN                  : Stealth FIN, Xmas Tree, 또는 NUll 스캔모드
    -sP                          : Ping 스캐닝
    -sU                          : UDP 스캐닝
    -sO                          : IP 프로토ㅗㄹ 스캔
    -sI <zombi host[:probeport]> : Idle scan
    -sA                          : ACK 스캔
    -sW                          : Window 스캔
    -sR                          : RPC 스캔
    -sL                          : LIST 스캔
- nmap 설치
# wget http://download.insecure.org/nmap/dist/nmap-3.75.tgz
# tar xvf nmap-3.75.tgz
# cd nmap-3.75
# ./configure
# make
# make install
- nmap으로 로컬서버 스캔하기
# nmap -sT -O -v localhost
  -sT : TCP conect에 대한 스캔을 한다.
  -O  : TCP/IP fingerprinting을 통하여 지정한 서버를 확인한다.
  -v : 스캔별과를 자세히 보여준다.
- 원격지의 특정 서버에 대한 스캔작업하기
# nmap -sT -O -v 192.168.0.101
- 원격서버의 UPD 사용포트 스캔작업하기
# nmap -sU -O -v 192.168.0.101
* root의 원격접속제한
# grep PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin no
# grep RootLogin /etc/proftpd/conf/proftpd.conf
RootLogin off
* 포트번호를 바꾸어서 서비스하는 서버보안
# grep telnet /etc/services 
telnet          30023/tcp
# /etc/init.d/xinetd restart
* PortSentry를 이용한 실시간 해킹방어 구현
원격지에서 스ㅐㄴ하는 것을 실시간으로 차단할 수 있는 도구이다.
portsentry는 ping이나 기타 다른 도구들을 이용하여 불법적인 스캔을 이지하고 이를 차단하려고 할 때 /etc/hosts.deny파일에 실시간으로 추가되어 서버접근 및 포트스탬을 막는 막강한 보안툴이다.
portsentry는 다음과 같은 프로톸ㄹ의 스캔을 실시간으로 차단할 수 있다.
tcp  프로토콜 스캔차단(basic port-bound TCP mode)
stcp 프로토콜 스캔차단(Stealth TCP scan detection)
atcp 프로토콜 스캔차단(Advanced Stealth TCP scan detection)
udp  프로토콜 스캔차단(basic port-bound UDP mode)
sudp 프로토콜 스캔차단(Stealth UDP scan detection)
audp 프로토콜 스캔차단(Advanced Stealth UDP scan detection)
- 설치
# wget ftp://ftp.superuser.co.kr/secureity/portsentry/portsentry-1.0.tar.gz
# tar xvfz portsentry-1.0.tar.gz
# cd portsentry-1.0
# make linux
# make install
# ls -l /usr/local/psionic/portsentry/
# cat /etc/rc.d/rc.local
#!/bin/sh
/usr/local/psionic/portsentry/portsentry -tcp # tcp  프로토콜 스캔차단
/usr/local/psionic/portsentry/portsentry -stcp # stcp 프로토콜 스캔차단
/usr/local/psionic/portsentry/portsentry -atcp # atcp 프로토콜 스캔차단
/usr/local/psionic/portsentry/portsentry -udp # udp  프로토콜 스캔차단
/usr/local/psionic/portsentry/portsentry -sudp # sudp 포트토콜 스캔차단
* tripwire를 이용한 파일무결성 구현
tripwire는 파일시스템무결성 점검을 하는 서버보안도구로서 파일들의 변경사항유무를 검사할 수 있는 대표적인 보안툴이다.
이 툴을 이용하면 파일들의 추가/삭제/변경유무를 확인할 수 있다.
- 설치
# wget ftp://ftp.superuser.co.kr/security/tripwire/tripwire-2.3-47.bin.tar.gz
# tar xvfz tripwire-2.3-47.bin.tar.gz
# cd tripwire-2.3
# ./install.sh
- 파일확인
/usr/sbin/tripwire  tripwire의 주된 실행파일
/usr/tripwire/*   tripwire에 관련된 설정파일과 key파일 및 정책파일들이 저장될 디렉토리
/var/lib/tripwire/report tripwire실행결과 보고서가 저장될 디렉토리
/var/libtripwire  tripwire DB파일이 저장될 디렉토리
- tripwire 데이터베이스 생성하기(tripwire 초기화)
tripwire 초기화는 점검했던 파일들의 무결성 점검결과를 저장하고있던 DB를 초기화 하다는 것이다.
즉, 초기화시키기 전의 변공사항은 이후에는 적용되지 않는다.
# tripwire --init
- tripwire 실행으로 파일 생성/변조/삭제유무 점거마기
# tripwire --check
- tripwire 설정파일확인 및 변경
twcfg.txt 파일은 tripwire의 주설정파일로서 /etc/tripwire/twcfg.txt 에 존재한다.
이 파일은 tripwire가 어떤 환경으로 실행될 것인가를 정의해둔 파일이다.
즉, tripwire실행파일의 위치, 정책파일(tw.pol)의 위치, tripwire 데이터베이스파일의 위치등을 모두 이 파일에서 정의하고 있다.
- tripwire정책파일 수정 및 변경
tripwire는 /etc/tripwire/twcfg.txt파일을 이용하여 점검할 대상파일을 결정한다.
이 파일을 수정해서 점검할 파일을 추가/삭제할 수 있다.
이 파일에 등록된 파일들은 tw.pol파일(바이너리로 되어있음)에 적용되어 tripwire에서 사용하게 된다.
* chkrootkit을 이용한 rootkit 탐지
백도가 설치되어 있는가를 검사하는 툴이다.
chkrootkit을 이용해서 다음과 같은 검색이 가능하다.
  rootkit의 흔적 및 설치여부를 검색(chkrootkit)
  NIC으 promisc모드 설정여부 검색(ifpromisc)
  lastlog의 변조 및 삭제여부 검색(chklastlog)
  wtmp의 변조 및 삭제여부 검색(chkwtmp)
  기타 파일벼조여부를 검색
chkrootkit툴에는 다음가 같은 파일들이 존재하며 이 파일들은 다음과 같은 역할을 한다.
  ifpromisc.c 랜카드가 promiscuous mode로 설정되어 있는가를 검사
  chklastlog.c /var/log/lastlog의 삭제유무 검사
  chkwtmp.c /var/log/wtmp의 삭제유무 검사
  check_wtmpx.c wtmpx파일의 삭제유무검사(Solaris의 경우만 해당됨)
  chkproc.c LKM트로이목가 검사
  strings.c 점검되는 파일들의 변조여부 검사
- 설치
# chkroot.tar.gz다운로드
# tar xvfz chkrootkit.tar.gz
# cd chkrootkit-0.44
# 컴파일 전 로그파일위치 확인 및 수정하기
  모든 파일을 열어서 로그파일의 정확한 위치를 확인한다.
  chklastlog.c 파일에 리눅스에 대한 설정부분을 추가해 준다.
  #ifdef _LINUX_
  #define WTMP_FILENAME  "/var/log/wtmp"
  #define LASTLOG_FILENAME "/var/log/lastlog"
  #endif
# make sense
- chkrootkit으로 rootkit설치여부 및 서버점검하기
# ./chkrootkit
 
 
***********************************************************
* 리눅스 서버관리를 위한 쉘스크립트
***********************************************************
* 쉘프로그램에서 실행상태 반환하는 true와 false
쉘프로그램내에서 실행한 명령의 결과가 정상적으로 종료되었다는 의미로 true를 실행하여 실행이 정상적으로 완료되었음을 알려주는 역할을 한다.
이 때 true가 반한하는 종료상태값은 실행성공을 의미하는 0이다.
그리고 false는 쉘프로그램내에서 특정 명령수행이 항상 실패햤음을 의미하는 1을 반환한다.
 
* 쉘프로그램에서 사용자 입력값 받아서 처리하기
- 사용자 입력값 처리하는 read문 기본 사용법
read -p "Select Number(1, 2, 3 or 4): " MENU1
화면에 "Select Number(1, 2, 3 or 4): "가 출력이 된 후에 사용자의 입력을 대기한다. 사용자가 입력한 내용을 MENU1에 저장한다.
- 쉘프로그램내에서 read 문에서 배열로 받아서 처리하기
입력내용을 받아들일 지정된 변수를 배열변수로 사용하려면 -a 옵션을 사용해야 한다.
쉘프로그램에서도 C와 마찬가지로 배열인자는 0부터 시작한다.
배열변수를 출력하려면 ${변수명[인자]}와 같은 형식을 사용한다.
 
* 쉘프로그램 실행시 발생되는 메시지 처리하기
logger는 로그메시지를 시스템로그파일(/var/log/messages 등)에 기록할 수 있는 로그리고기이다.
logger명령어를 사용하여 원하는 로그를 기록하면 지정된 메시지가 시간표시와 함께 시스템로그파일(/var/log/messages)에 기록된다.
사용형식 : logger [-is] [-f file] [-p pri] [-t tag] [메시지]
# logger SystemCheck
# tail -1 /var/log/messages
Apr  3 00:55:03 rh9  4월  3 00:55:03 widemail: SystemCheck
* 반복메뉴방식의 쉘프로그램 만들기
select문은 반복되는 메뉴방식의 쉘프로그램을 만들 때에 최적이다.
사용형식 :
 select 변수 in 메뉴리스트
 do
  실행될 명령문들
 done
select문으로 반복메뉴방식의 쉘프로그램을 작성할 때에는 PS3라는 쉘변수를 사요하는 것이 일반적이다.
즉, PS3쉘변수를 사용하면 PS3에 지정된 메시지를 화면으로 출력하고 사용자의 입력을 기다린다.
select문이 실행되면 in 다음의 메뉴리스트에 번호를 붙여서 화면으로 출력한다.
그리고 선택된 번호가 지정되면 변수에 메뉴리스트에서 선택된 해당리스트를 저장한 다음 "do ~ done"의 내용이 실행된다.
 
* 동종류 프로세스 한번에 죽이는 쉘명령어 직접만들기
# cat prokill.sh
#!/bin/sh
ps -ef | grep $1 | awk '{ print $2 }' | xargs kill -9 {}
* superuse 사이트에 있는 스크립트를 이용하자.
 
 
***********************************************************
* 리눅스서버 응급복구와 삭제파일 복구
***********************************************************
 
[1] 다운된 리눅스서버 응급복구
* 복구보다는 백업을 우선하라.
 
* 파일시스템이 깨졌을 때 부팅안되는 상황 조치
# fdisk -l    -> 깨진 파일시스템 확인
# e2fsck -j ext3 /dev/sda3 -> 파일시스템 점검
 
* 리눅스CD linux rescue 모드로 보구하기
파일시스템이 깨졌을 때 : e2fsck로 파일시스템 복구
비밀번호 및 로그인장애 : /etc/passwd 파일 점검
grub정보로 부팅장애    : /boot/grub/grub.conf 파일 점검
부팅시 마운트정보 장애 : /etc/fstab 점검
 
* 리눅스CD linux rescue nomount 로 복구하기
현재 상태에서는 장치파일명이 생성되어있지 않으며 마운트도 되어있지 않기 때문에 현재 시스템의 어떠한 수정작업도 할 수 없는 상황이다.
먼저 필요할 것 같은 장치명들을 임의대로 생성한다.
# mknod /dev/sda -> /dev/sda  장치명 생성
# mknod /dev/sda1 -> /dev/sda1 장치명 생성
# mknod /dev/sda2 -> /dev/sda2 장치명 생성
생성한 장치와 마운트할 마운트포인트(디렉토리)를 생성한다.
# mkdir /temp
# mkdir /temp1
# mkdir /temp2
위에서 생성한 각 장치명과 각 디렉토리들을 마운트한다.
# mount /dev/sda1 /temp1
# mount /dev/sda2 /temp2
 
* 리눅스 시스템업그레이드 방법으로 복구하기
 
* 시스템 서버 다운시 매직키를 이용한 응급조치 
- ALT + SysRq + S : Alt키와 SysRq키와 S키를 동시에 누른다. sync 작업
- ALT + SysRq + E : Alt키와 SysRq키와 E키를 동시에 누른다. tem SIG 작업
- ALT + SysRq + U : Alt키와 SysRq키와 U키를 동시에 누른다. umount 작업
- ALT + SysRq + B : Alt키와 SysRq키와 B키를 동시에 누른다. reboot 작업
 
[3] 삭제된 파일 복구하기
* 리눅스 휴지통(safedelete)을 이용한 삭제파일 복구하기
safedelete라는 명령어는 파일을 삭제하는 명령어이다.
단 rm과는 달리 safedelete라는 명령어로 파일을 삭제하면 특정한 디렉토리에 삭제된 파일을 보관하게 된다.
그리고 삭제된 사용자의 홈디렉토리에 삭제 파일리스트를 저장하고 있는 로그파일에 그 파일정보들을 보관한다.
그리고 safedelete명령어로 삭제된 파일은 undelete라는 명령어로 복구가 가능하다.
따라서, 이 툴로서 삭제된 파일을 복구하려면 파일삭제시에 사용하는 명령어를 rm 대신에 safedelete 명령어를 사용해야한다.
이 툴의 이름은 safedelete이며 삭제와 복구시에 사용되는 명령어는 다음과 같다.
    safedelete : rm 대신에 사용하게 될 파일보구가 가능한 삭제명령어
    undelete   : safedelete로 삭제한 파일을 복구하는 명령어
    safecnvt   : safedelete 로그파일(.safedelete.log)을 컨버전하는 명령어
    safedelchk : 지정한 일자 이후의 safedelete로 삭제한 파일을 완전 삭제함
- safedelete 설치
# wget ftp://ftp.nuri.net/pub/RedHat/redhat/redhat-7.1-en/powertools/i386/RedHat/RPMS/saedelete-1.3-0.i386.rpm
# rpm -Uvh saedelete-1.3-0.i386.rpm
- rm 명령어를 safedelete로 대체하기
# grep safedelete ~/.bashrc
alias rm='safedelete'
* tct의 unrm으로 삭제파일 복구하기
- 설치
http://www.fish.com/tct 에서 다운로드한다.
# tar xvfpz tct-.09.tar.gz
# cd tct-1.09
# make
# cd bin
# cp rnrm /usr/local/bin
# cp lazarus /usr/local/bin
- 삭제파일 복구
# /usr/local/bin/unrm /dev/sda1 > /tmp_dir/dump_temp
# /usr/local/bin/lazarus -h /tmp_dir/dump_temp
* e2fsck 파일시스템 점검복구유틸리티
- e2fsck 종료코드
  0 - 에러없이 정상적인 종료를 의미함
  1 - 파일시스템을 복구하였음을 의미함
  2 - 파일시스템이 복구되어 시스템이 재부팅되어야함을 의미함.
  4 - 작업대상 파일시스템에 문제가 있으나 복구하지 않고 그대로 두었음을 의미함.
  8 - 실행에러를 의미함
  16 - 사용법 또는 문법에러를 의미함
  32 - e2fsck작업이 사용자에 의해서 취소되었음을 의미함.
  128 - 공유 라이브러리에러를 의미함
- e2fsck작업에서 기본적으로 점검하는 항목
  inode 점검
  blocks 점검
  sizes 점검
  디렉토리구조 점검
  디렉토리 연결성점검
  파일링크 정보
  전체파일갯수 점검
  전체블록수중 사용중인 블록 정검
- 사용형식
  e2fsck [-pacnyrdfvtFV] [-b 수퍼블록] [-B 블록크기] [-l|-L 배드블록목록화일] 장치명
  마운트되어 있는 상태에서 e2fsck실행을 자제한다.
- e2fsck 명령어로 특정 파일시스템의 점검 및 복구하기
# e2fsck /dev/hda1
- e2fsck로 특정 파일시스템 강제 점검 및 복구하기
# e2fsck -f /dev/hda1
- ext3(저널링)파일시스템 점검 및 복구하기
# e2fsck -j ext3 /dev/hda1
- e2fsck로 특정 파일시스템 강제 점검 및 상세 작업내역보기
# e2fsck -fv /dev/hda1
- 파일시스템의 수퍼블록을 이용한 파일시스템 복구
       -b superblock
              Instead  of  using  the  normal  superblock,  use an alternative
              superblock specified by superblock.   This  option  is  normally
              used  when the primary superblock has been corrupted.  The loca-
              tion of the backup superblock is dependent on  the  filesystem's
              blocksize.    For  filesystems  with  1k  blocksizes,  a  backup
              superblock can be found at block 8193; for filesystems  with  2k
              blocksizes,  at  block  16384;  and  for 4k blocksizes, at block
              32768.
              Additional backup superblocks can be  determined  by  using  the
              mke2fs  program  using  the  -n  option  to  print out where the
              superblocks were created.   The -b option to mke2fs, which spec-
              ifies blocksize of the filesystem must be specified in order for
              the superblock locations that are printed out to be accurate.
              If an alternative superblock is specified and the filesystem  is
              not  opened  read-only,  e2fsck  will make sure that the primary
              superblock is  updated  appropriately  upon  completion  of  the
              filesystem check.
# e2fsck -b 8193 /dev/hda1
# e2fsck -b 16385 /dev/sda1
- e2fsck로 파일시스템 점검시 버퍼캐쉬의 내용을 디스크에 저장하기
-F옵션을 사용하면 e2fsck를 수행하기 이전에 sync작업을 수행한다.
# e2fsck -F /dev/sda1
- e2fsck로 특정 파일시스템 점검시 오류 자동수정하기
# e2fsck -p /dev/sda1
- e2fsck로 파일시스템 점검시 모든 질문항목에 yes라고 자동입력하기
# e2fsck -y /dev/sda1
- e2fsck로 파일시스템 점검시 모든 질문항목에 no라고 자동입력하기
# e2fsck -n /dev/sda1
 
 
 
***********************************************************
* 리눅스서버 NFS와 NIS
***********************************************************
* NFS 서버와 NFS 클라이언트의 필요한 데몬들
- rpc.nfsd : NFS 데몬
- rpc.mountd : rpc 기반하에서 NFS 사용을 위한 마운트를 가능하게 하는 데몬
- portmap : NFS가 원래 RPC기반하에서 작동되는 깃이기 때문에 rpcbind를 필요로 하면, rpcbind의 매핑을 위해 필요한 데몬이 portmap이다.
- /etc/exports : 마운트를 허용한 디렉토리와 사용옵션 nfs 설정파일
 
* NFS 서버와 클라이언트의 데몬 시작, 종료 및 재시작
- NFS 데몬
# /etc/init.d/nfs start
# /etc/init.d/nfs stop
# /etc/init.d/nfs restart
- portmap 데몬
# /etc/init.d/portmap start
# /etc/init.d/portmap stop
# /etc/init.d/portmap restart
 
* NFS 관련 데몬들의 실행점검
"rpcinfo -p"라고 하면 현재 NFS서버에서 구동중인 NFS관련 데몬들을 점검해 볼 수 있다.
관련된 데몬은  portmapper, mountd, nfs, nlockmgr, rquotad, status 가 있다.
# rpcinfo -p
   프로그램 버전 원형   포트
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100011    1   udp    736  rquotad
    100011    2   udp    736  rquotad
    100011    1   tcp    739  rquotad
    100011    2   tcp    739  rquotad
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100021    1   udp  32780  nlockmgr
    100021    3   udp  32780  nlockmgr
    100021    4   udp  32780  nlockmgr
    100005    1   udp  32781  mountd
    100005    1   tcp  33434  mountd
    100005    2   udp  32781  mountd
    100005    2   tcp  33434  mountd
    100005    3   udp  32781  mountd
    100005    3   tcp  33434  mountd
# rpcinfo -p 192.168.0.102
   프로그램 버전 원형   포트
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100011    1   udp    736  rquotad
    100011    2   udp    736  rquotad
    100011    1   tcp    739  rquotad
    100011    2   tcp    739  rquotad
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100021    1   udp  32780  nlockmgr
    100021    3   udp  32780  nlockmgr
    100021    4   udp  32780  nlockmgr
    100005    1   udp  32781  mountd
    100005    1   tcp  33434  mountd
    100005    2   udp  32781  mountd
    100005    2   tcp  33434  mountd
    100005    3   udp  32781  mountd
    100005    3   tcp  33434  mountd
* NFS설정파일(/etc/exports)
설정형식 : [마운트할 디렉토리] [허용할 NFS크라리언트](설정옵션들)
# cat /etc/exports
/web_data 192.168.0.101(rw)  # 192.168.0.101 NFS 클라이언트에서 NFS 서버의 /web_data 로 read와 write가 가능하도록 마운트를 허용한다.
/db_data 192.168.0.101(rw)
/data  192.168.0.109(ro)  # NFS서버의 /data 디렉토리를 NFS클라이언트에서 read 만 가능하도록 마운트 허용
/home  192.168.0.109(rw)  # NFS서버의 /home 디렉토리 전체를 NFS 클라이언트가 마운트하도록 허용
/home/sspark 192.168.0.109(noaccess)  # /home/sspark 은 NFS마운트를 허용하지 않는다.
/var/log 192.168.0.109(rw,root_squash) # NFS클라이언트에서 NFS서버로 root권한으로 마운트를 할 경우에 NFS서버에서 root권한을 부여하는 것이 아니라 nfsnobody권한을 부여한다.
        NFS클라이언트에서 NFS서버의 마운트시에 root를 일치시키려면 no_root_squash 옵션을 사용한다.(기본값은 root_squash)
/var/log 192.168.0.109(rw,no_root_squash)# NFS클라이언트그의 root는 NFS서버로 마운트 할 때 NFS서버에서의 root와 일치한다. 가능한 이 설정은 보안을 위해 사요하지 마라.
/home  192.168.0.109(rw,all_squash) # root사용자와는 반대로 일반사용자으 경우에는 no_all_squash가 기본값이다.
        NFS클라이언트에서 NFS서버로 마운트할 때 동일사용자가 존재한다면 root를 제외한 일반사용자는 도일한 사용자로 매핑이 된다.
        all_squash라는 옵션을 사용했기 때문에 일반사용자의 경우에도 모두 nfsnobody로 매핑이 된다.
 
* NFS마운트 방법
설정형식 : mount -t nfs NFS서버_IP주소_또는_호스트명:/NFS서버_마운트포인트 /NFS클라이언트_마운트포인트
           -t nfs   파일시스템형식을 nfs로 지정
    NFS서버_IP주소_또는_호스트명 NFS서버의 IP주소 또는 호스트명
    NFS서버_마운트포인트  NFS서버에서 NFS클라이언트의 마운트가 허용되어 있는 위치를 지정
    NFS클라이언트_마운트포인트 NFS클라이언트의 마운트포인트 지정
# mount -t nfs 192.168.0.102:/web_data /web_data
# mount -t nfs 192.168.0.103:/db_data /db_data
* 부팅시 NFS 자동마운트 설정
/etc/fstab 에서 사용가능한 NFS 마운트 옵션들
- rsize=n 지정된 NFS서버로부터 읽어오는 바이트수를 지정. 기본값은 1024
- wsize=n 지정된 NFS서버에 쓰기를 할 때 사용하는 바이트수를 지정. 기본값은 1024
- timeo=n RPC타임아웃이 발생되고 나서 첫번째 재전송요구를 보낼 때 사용되는 시간
- retrans=n timeout이 발생시 재전송시도 횟수를 제한한 것임. 기본값은 3
- port=n 지정된 NFS서버와 연결할 때의 포트번호 지정
- fg  첫번째 마운트시도하여 timeout되면 바로 중단됨. default값
- intr  timeout발생시 신호를 보내는 NFS호추를 인터럽트함.
- hard  timeout이 발생하면 "server not responding"이라는 메시지를 출력한 후에 계속 재시도 함
- soft  timeout이 발생하면 I/O에러가 발생하였을을 알려줌.
# cat /etc/fstab | grep nfs
192.168.0.100:/home/bible /bible nfs timeo=10,intr
 
 
***********************************************************
* 리눅스 서버이전
***********************************************************
* 서버이전시 고려할 사항들
- 서버 네트워크환경문제
- 일반사용잘의 ID와 패스워드문제
- 사용자들의 도메인문제
- 서버내의 홈페이지 데이터들의 문제
- 아파치웹서버 이전문제
- MySQL 데이터베이스 이전문제
 
* 서버이전 계획표 작성
구분   이전하기전 서버(A)  이전후 서버(B)
작업자   김길동
작업일시  2006년 4월 5일 새벽 04시부터 06시까지
지역   용산구    구로구
IDC(업체)명  A-IDC    B-IDC
IDC(업체)담당자명 박길동    이길동
IDC(업체)연락번호 111-1111   222-2222
서버모델명(서버명) SU-S2001(A서버)   SU-2002(B서버)
서버IP주소  192.168.0.101   192.168.1.211
네트워크주소  192.168.0.0   192.168.1.0
브로드캐스트주소 192.168.0.255   192.168.1.255
넷마스크주소  255.255.255.0   255.255.255.0
웹서버(위치)  APACHE(/usr/local/apace2) APACHE(/usr/local/apace2)
DB서버(위치)  MySQL(/usr/local/mysql)  MySQL(/usr/local/mysql)
FTP서버   Proftpd(/usr/local/proftpd) Proftpd(/usr/local/proftpd)
DNS서버   BIND9    BIND9
메일서버  SENDMAIL, Qpopper  SENDMAIL, Qpopper
사용자수  10명    10명
기타   gd,libpng,freetype,zlib 등 gd,libpng,freetype,zlib 등
주의사항  이전하기전 사용 도메인 TTL값 최소화
   cron설정주의
   로그파일들 이전주의(/var/log)
   이전후 홈페이지로딩테스트 및 게시판업로드테스트
   작업 7일전 작업관련 홈페이지 공지사항 등록
   각 사용자에게 작업관련 메일발송
 
* 서버에서 서비스하던 도메인들의 TTL값 변경하기
서버이전 작업을 시작하기 쵯 몇일전에 각 도메인들의 DNS정보가 세팅된 네임서버에서 각 도메인들의 zone파일들에 설정된 TTL값을 0또는 1로 설정한다.
즉, 도메인의 IP주소를 변경하기 전에 DNS의 TTL값을 0 또는 1로 설정해 둔다.
 
* 서버의 서비스데몬들 중지하기
- 웹서비스 중지
- 메일서비스 중지
- 데이터베이스 서버 중지
서비스를 중지하는 이유는 서버이전을 하는 도중에 계속 서비스를 하게 되면 작업하는 동안에 업데이트된 데이터들은 유실되기 때문이다.
* 이전대상서버에서 네트워크 설정작업
다음과 같이 네트워크 설정명령어들과 파일들을 통하여 새로운 네트워크 환경을 설정한다.
- route      서버라우팅 설정 명령어
- ifconfig     네트워크 인터페이스 설정 명령어
- netconfig     네트워크 설정 명령어
- /etc/resolv.conf    DNS설정 파일
- /etc/sysconfig/network   기본게이트웨이 설정파일
- /etc/sysconfig/network-scripts/ifcfg-eth0 첫번째 NIC 네트워크 설정파일
- /etc/sysconfig/network-scripts/ifcfg-eth1 두번째 NIC 네트워크 설정파일
- /etc/init.d/network    설정된 네트워크 start|stop|restart
 
* 사용자 계정정보 이전하기
- /etc/passwd파일내의 사용자계정부분 이전하기
  A서버의 /etc/passwd 파일에서 일반사용자들의 계정정보만을 복사해서 B서버의 /etc/passwd에 복사한다.
- /etc/group파일내의 사용자 그룹설정 부분 이전하기
  A서버의 /etc/group파일에서 시스템사용 그룹설정 부분을 제외한 나머지 그룹부분들을 그대로 복사하여 B서버의 /etc/group파일에 그대로 추가한다.
- /etc/shadow 파일내의 사용자 설정부분 이전하기
  /etc/shadow파일에서 사용자들의 정보만을 복사해서 B서버의 /etc/shadow에 복사한다.
 
* 일반사용자 홈디렉토리 파일들 이전하기
- A서버에서 home을 모두 압축한다.
# cd /
# tar cvfpz home.tar.gz home
- B서버에서 home.tar.gz 파일을 가져온다.
# cd /
# ncftp -u bible 192.168.0.101
ncftp / > get /home.tar.gz
- B서버에서 가져온 home.tar.gz 압축을 해제한다.
# tar xvfpz home.tar.gz -C /
 
* APACHE 웹서버 이전하기
아파치를 이전할 때에는 다음과 같은 주의사항이 있다.
1. httpd.conf파일 내에 설정되어 있는 가상호스트정보 수정
2. httpd.conf파일 내의 DocumentRoot정보의 확인 및 수정
3. httpd.conf파일 내의 ServerName정보의 확인 및 수정
4. httpd.conf파일 내의 UserDir정보의 확인 및 수정
- A서버에서 APACHE 디렉토리를 압축한다.
# cd /usr/local
# tar cvfp apache2.tar.gz apache2
- B서버에서 A서버에 있는 apache2.tar.gz 파일을 가져오고 압축을 해제한다.
# cd /usr/local
# ncftp -u bible 192.168.0.101
ncftp /usr/local > get /usr/local/apache2.tar.gz
# tar xvfpz apche2.tar.gz
- httpd.conf 파일 수정
  NameVirtualHost 값 수정
  VirutalHost 부분 수정
  DocumentRoot 저옵 수정
  ServerName 정보 수정
- php와 Zend 이전
 
* MySQL 데이터베이스 이전하기
- A서버에서 MySQL을 압축한다.
# cd /usr/local
# tar xvfpz mysql.tar.gz mysql
- A서버에서 압축한 파일을 B서버로 가져오고 압축을 해제한다.
# cd /usr/local
# ncftp -u bible 192.168.0.101
ncftp /usr/local > get /usr/local/mysql.tar.gz
# tar xvfpz mysql.tar.gz
- MySQL 실행에러문제 해결하기
  호스트명 인식불능문제
  /usr/local/mysql/var/호스트명.pid
  /usr/local/mysql/var/호스트명.err
  /usr/local/mysql/var 소유자 계정확인
 
* 메일서버 이전하기
- A서버에서 /etc/mail 디렉토리를 압축하여 B서버로 가져온 후에 원래위치에 압축해제한다.
- A서버의 /usr/local/lib/popper파일을 B서버로 가져와서 원래위치에 넣어둔다.
- A서버의 /var/spool/mail 디렉토리내용과 /var/spool/mqueue 디렉토리의 내요을 그대로 가져와서 B서버에 넣어둔다.
- A서버의 /etc/xinetd.d 디렉토리내에 있는 pop3파일을 B서버로 가져와서 넣어둔다.
- A서버의 /usr/sbin/sendmail 파일과 /etc/aliases 파일을 B서버로 가져와서 각자 위치에 넣어둔다.
- 이와 같이 작업한 후에 B서버에서 /etc/init.d/sendmail 스크립트를 이용하여 sendmail을 재시작하고 /etc/init.d/xinetd 스크립트를 재시작하여 /etc/xinetd.d/pop3 파일이 적용되도록 한다.
 
* 기타 서버이전시 작업해야할 사항들
- A서버의 /etc/hosts파일의 정보를 확인하고 필요한 정보는 B서버의 /etc/hosts파일에 등록한다.
- A서버의 /etc/hosts.allow파일과 /etc/hosts.deny파일의 내용을 B서버에 그대로 설정한다.
- A서버의 /var/spool/cron 디렉토리내의 파일들을 B서버로 그대로 가져와서 설정한다.
- A서버의 /var/log 디렉토리내에 존재하는 필요한 로그파일들(특히 wtmp, secure 파일)을 B서버로 가져와서 /var/log에 저장한다.
- A서버의 /etc/sysctl.conf 파일의 내용을 B서버의 서버사양에 맞도록 수정하여 적용한다.
- A서버의 /etc/motd, /etc/issue, /etc/issue.net 파일들의 니용을 B서버로 가져와서 해당 파일들에 저장한다.
- A서버의 /etc/rc.d/rc.local 파일을 그대로 가져와서 B서버에 복사한다.
 
* DNS 서버에서 해당 도메인들의 IP주소 변경작업
도메인들의 DNS서버에서 각 도메인들의 IP주소를 B서버의 IP주소(192.168.1.211)ㄹ 변경한다.
TTL값을 원래의 값으로 복원한다.
* 서버이전후 확인할 사항들
1. 홈페이지가 정상로딩 테스트
2. 홈페이지의 게시판 및 업로드 테스트하기
3. 사용자계정 정보확인 및 로그인 테스트
4. 메일수발신 테스트와 MySQL접속 테스트
5. B서버에서 응용프로그램들의 경로 확인하기
 
 
***********************************************************
* PROC 파일시스템을 이용한 커널최적화 및 시스템튜팅
***********************************************************
* /proc파일시스템에 존재하는 커널파라미터 변경하는 방법들
1. /etc/sysctl.conf 파일에 등록한다.
   지속적으로 적용하려면 이 파일에 넣어둔다.
2. sysctl 명령어를 이용한다.
   "sysctl -w 파라미터변수=값"의 형식으로 변경이 가능하다.
3. /proc/sys 디렉토리내에 존재하는 각가의 파일들을 vi로 열어서 직접 변경한다.
   좋지않은 방법으로 추천하지 않는다.
4. echo 명령어를 이용한다.
   "echo 1 > 파일위치"와 같은 방법으로 간편하게 수정할 수 있다.
5. redhat-config-proc을 이용한다.
 
* sysctl을 이용한 커널 옵션 설정 및 확인
- sysclt
  configure kernel parameters at runtime 으로서 커널 파라미터를 설정하는 명령어이다.
- 커널옵션값 전체 확인하기
# sysctl -a
- 특정커널옵션값의 설정
# sysctl -w net.ipv4.tcp_syncookies=1
 
* /proc/sys/kernel에서 획득할 수 있는 몇가지 커널 정보들
- 서버의 호스트네임 확인
# cat /proc/sys/kernel/hostname
- 커널버전 확인
# cat /proc/sys/kernel/osrelease
- 운영체제명 확인
# cat /proc/sys/kernel/ostype
- 커널 매직키(Magic Key)사용가능 확인
# cat /proc/sys/kernel/sysrq
 
* /proc/sys/net/ipv4에서 설정 가능한 서버보안
- 외부의 ping 막기
# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
- smurf 공격방지를 위한 broadcast 패킷방지하기
# cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
0
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
- 세션 종료시간 조정
  tcp_fin_timeout은 TCP 세션이 종료된 후에 얼마나 오랫동안 세션연결을 유지하고 있을 것인가를 설정한다.
# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
# echo 20 > /proc/sys/net/ipv4/tcp_fin_timeout
- tcp keepalive time 설정
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
# echo 1200 > /proc/sys/net/ipv4/tcp_keepalive_time
- 서버에서 로컬 포트사용범위 설정
# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
- IP 포워딩(forwarding)기능 막기
# cat /proc/sys/net/ipv4/ip_forward
0
- 서버의 날짜정보 유출막기
# cat /proc/sys/net/ipv4/tcp_timestamps
1
# echo 0 > /proc/sys/net/ipv4/tcp_timestamps
- SYN_Flooding 공격 막기
  일종의 서비스거부공격(DoS: Denial of Service)의 일종이다.
  TCP세션을 맺기 위해서는 패킷을 보낼 서버와 받을 서버간에 몇단계 확인작업을 거치게 되는데 SYN과 ACK패킷을 이용하여 송수신 준비확인을 한다.
  SYN패킷을 박은 목적지 서버는 SYN과 ACK패킷을 보낸 후에 소스서버에서 ACK패킷을 보내기를 기다리게 된다.
  이 때에 계속적으로 기다리는 것이 아니라 백로그큐(Backlog Queue)가 허용하는 공간에 연결정보를 보관한다.
  이런 상태가 숟없이 쌓이게 되면 복적지 서버의 특정 서비스가 정상적으로 이루어 지지않는 서비스다운상태가 된다.
  해결방법은 백로그큐를 늘려주거나 tcp_syncookies값을 로 설정하는 것이다.
# cat /proc/sys/net/ipv4/tcp_syncookies
0
# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
1024
 
* /proc/sys/net/ipv4/conf 에서 가능한 네트워크 설정
- ICMP redirect의 변조된 패킷 차단(accept패킷 차단설정)
# cat /proc/sys/net/ipv4/conf/default/accept_redirects
1
# echo 0 > /proc/sys/net/ipv4/conf/default/accept_redirects
- ICMP redirect 의 변조된 패킷 차단(send 패킷 차단설정)
# cat /proc/sys/net/ipv4/conf/default/send_redirects
1
# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
- DoS공격 source로 사용 차단(IP 스푸핑 방지하기)
# cat /proc/sys/net/ipv4/conf/default/rp_filter
1
# echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
- 스푸핑등의 패킷에 대한 로그를 남기자
# cat /proc/sys/net/ipv4/conf/default/log_martians
0
# echo 1 > /proc/sys/net/ipv4/conf/default/log_martians
- source route 패킷허용 막기(신뢰받는 호스트로 위장하는 것 막기)
# cat /proc/sys/net/ipv4/conf/default/accept_source_route
0
# echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route
 
* /proc/sys/fs 에서의 옵션설정
- 커널에서 사용할 수 있는 푀대파일 수 설정하기
# cat /proc/sys/fs/file-max
102709
- 현재 활동중인 파일 수 확인
# cat /proc/sys/fs/file-nr
834     0       102709
 
* /proc에서 커널정보 확인하기
- cpu 정보 확인
# cat /proc/cpuinfo
- 사용중이거나 사용가능한 장치(device)파일 확인
# cat /proc/devices
- 현재 커널에서 인식되어 있는 파일시스템 타입 확인
# cat /proc/filesystems
- 현재 사용되고 있는 메모리 번지별 사용내역 확인
# cat /proc/iomem
- 입출력포트의 번지별 사용내역
# cat /proc/ioports
- 서버 펴윤부하율 정보 확인
# cat /proc/loadavg
- 메모리 일반정보 확인
# cat /proc/meminfo
- 커널에 로드ㅗ디어 있는 모듈확인
# cat /proc/modules
- 현재 마운트되어 있는 정보확인
# cat /proc/mouts
- 현재 설정된 파티션정보 확인
# cat /proc/partitions
- 커널버전 정보확인
# cat /proc/version
- IRQ값 정보확인
# cat /proc/interrupts
 
 
***********************************************************
* SAMBA 서버
***********************************************************
* 설치
삼바서버패키지 : samba-3.0.8-0.pre1.3
삼바클라이언트 패키지 : samba-client-3.0.8-0.pre1.3
삼바서버와 클라이언트에서 모두 사용하는 파일들 패키지 : samba-common-3.0.8-0.pre1.3
삼바서버 웹관리 패키지 : samb-swat-3.0.8-0.pre1.3
삼바서버 설정툴 패키지 : system-config-samba-1..21-1
# wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samba-3.0.8-0.pre1.3.rpm
# wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samba-client-3.0.8-0.pre1.3.rpm
# wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samba-common-3.0.8-0.pre1.3.rpm
# wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samb-swat-3.0.8-0.pre1.3.rpm
# wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/system-config-samba-1..21-1.rpm
# rpm -Uvh --nodeps samba-3.0.8-0.pre1.3.rpm
# rpm -Uvh --nodeps samba-client-3.0.8-0.pre1.3.rpm
# rpm -Uvh --nodeps samba-common-3.0.8-0.pre1.3.rpm
# rpm -Uvh --nodeps samb-swat-3.0.8-0.pre1.3.rpm
# rpm -Uvh --nodeps system-config-samba-1..21-1.rpm
설치된 주요 파일들
/etc/logrotate.d/samba : 삼바로그를 관리하기 위한 삼바로그 로테이트 스크립트 파일
/etc/init.d/smb : 삼바데몬(nmbd, smbd)을 실행(종료, 재시작)하기 위한 스크립트파일
/etc/sysconfig/samba :삼바 제어판 설정파일
/usr/bin/smbstatus : 삼바서버에 로그인한 정보를 확인하기 위한 유틸리티
/usr/sbin/nmbd : 삼바 NetBIOS 데몬
/usr/sbin/smbd : 윈도우서버와 파일 및 프린터공유를 위한 삼바 주데몬
/usr/bin/smbclient : 삼바 클라이언트 유틸리티로서 삼바서버로 접속이 가능하도록 제공함.
/usr/bin/smbmount : 삼바 원격마운트 유틸리티
/usr/bin/smbumount : 삼바 원격마운트 해제 유틸리티
/etc/samba : 삼바의 주된 디렉토리
/etc/samba/lmhosts : 삼바서버 NetBIOS 호스트파일(삼바서버에서 사용하는 호스트정보파일)
/etc/samba/smb.conf : 삼바서버의 주설정파일
/usr/bin/smbpasswd : 삼바사용자 생성, 삭제 및 삼바사용자 패스워드 설정, 변경 유틸리티
/usr/bin/testparm : 삼바서버 설정파일(smb.conf)점검 유틸리티
/etc/xinetd.d/swat : 삼바서버의 웹관리를 위한 xinetd환경의 삼바설정파일
/usr/sbin/swat : 삼바서버 웹관리툴
/usr/bin/system-config-samba : X환경에서의 삼바설정 유틸리티
/var/log/samba/ : 삼바로그 저장 디렉토리
/etc/samba/smbusers : 리눅스ID와 삼바ID가 다를 경우에 이를 매칭하기 위한 매칭 테이블파일
 
* 삼바서비스 데몬
- 삼바데몬 시작
# /etc/init.d/smb start
# /usr/sbin/smbd -D
# /usr/sbin/nmbd -D
 
* 삼바 설정파일 smb.conf 다루기
/etc/samba/smb.conf 파일의 설정에는 다음과 같이 기본적으로 세부분으로 나뉘어져 있습니다.
  1. 글로벌 설정: 이 설정은 삼바서버가 공유하는 자원들에 공통적으로 적용할 기본값을 설정하는 곳이다.
                  이 글로벌설정은 [global]이라는 선언으로 시작하는 부분이다.
  2. 자동홈디렉토리 : 리눅스 사용자들의 홈디렉토리를 로그인홈으로 사용하기 위한 설정으로서 [homes]로 시작하는 부분의 설정이다.
  3. 프린터설정 : 네트워크 공유프린트에 대한 설정부분으로서 [printers]로 시작하는 부분의 설정이다.
- unix charset = cp949
  dos charset = cp949
  display charset = cp949
  리눅스(유닉스) 문자셋, 도스문자셋, 그리고 디스플레이 문자셋을 각각 설정한다.
- workgroup = superuser
  workgroup옵션에는 NT도메인명 또는 워크그룹명을 지정하면 된다.
  작업그룹명이므로 윈도우에서 Workgroup으로 사용하는 이름을 입력한다.
- server string = SUPERUSER File Server
  삼바서버의 이름쯤으오 생각하면 된다.
- hosts allow = 192.168.1. 192.168.2. 127.
  이 옵션은 삼바서버의 보안을 위하여 매우 중요한 옵션이다.
  이 옵션은 삼바서버로의 접근을 허용하기 위한 설정이다.
- load printers = yes
  자동프린트 목록을 사용하기 위한 값으로 yes를 주면 된다.
  네트워크 프린터를 삼바서버에서 관리하도록 하려면 반드시 yes로 설정한다.
- printcap name = /etc/printcap
  printcap파일의 위치가 다른 곳에 있다면 그곳을 지정한다.
- printing = bsd
  사용하는 프린터가 표준이 아니라면 주석처리를 하는 것이 좋다.
  현재 지원되는 프린터시스템의 종류로는 bsd, sysv, plp, lprng, aix, hpux, qnx 등이 있다.
- guest account =pcguest
  삼바서버의 guest사용자를 허용하고자 할 때에는 이 주석을 제거한다.
  이 옵션은 삼바서버에 손님권한으로 접속할 때 어떤 권한을 부여할 것인가를 설정한다.
  가능한 시스템에 특별한 권한이 없는 nobody와 같은 권한으로 설정한다.
- log file = /var/log/samba/log.%m
  이 설정은 삼바서버로 접속하는 개별 사용자들의 호스트정보를 %m 으로 받아서 개별 로그파일을 생성하도록 한다.
- log file = /var/log/samba/smbd.log
  접속한 호스트별로 로그파일을 사용하지 않는다면 하나의 로그파일을 사용할 수도 있다.
- max log size = 50
  로그파일의 용량크기를 KB단위로 제한하기 위한 옵션이다.
  제한하지 않으려면 0을 입력한다.
- security = share
  보안모드를 설정하는 것으로서 대부분의 삼바접속자들에게는 user레벨이 가장 알맞다.
  user레벨을 설정하면 삼바서버에 접속하는 사용자는 반드시 윈도우에서 사용하는 로그인ID와 동일해야 한다.
  만약 위의 설정과 같이 share레벨은 공유디렉토리등에 설정하는 것으로서 ID와 패스워드의 인증엇이 접속하는 것을 허용하는 레벨이다.
  또한 server레벨은 별도의 인증서버에서 ID와 패스워드인증을 받도록하는 레벨이다.
  가능하면 삼바서버보안을 위하여 user레벨을 사용하는 것이 좋다.
- password server = <NT-Server-Name>
  위의 security 옵션값이 server로 설정되었을 때에만 설정할 수 있는 옵션으로서 인증서버로 사용할 서버를 지정하는 옵션이다.
- password level = 8
  패스워드 문자로 대소문자를 조합하여 사용할 문자의 개수를 지정한 옵션이다.
- username level = 8
  삼바사용자명을 대소문자 조합하여 사용할 문자의 개수를 지정한 옵션이다.
- encrypt passwords = yes
  패스워드를 암호화하여 사용하려면 "encrypt passwords" 옵션값을 yes로 설정한다.
- smb passwd file = /etc/samba/smbpasswd
  이 옵션은 삼바사용자들의 암호파일의 위치를 지정한 것이다.
- unix password sync = Yes
  passwd program = /usr/bin/passwd %u
  passwd chat = *New*UNIX*password* %nn *ReType*new*UNIX*password* %nn *passwd:*all*authenticateion*tokens*updated*successfully*
  삼바사용자가 원격지에서 삼바패스워드를 변경할 수 있도록 하기위한 설정이다.
  이 설정을 사용하여 원격에서 패스워드를 변경하도록 허용하려면 앞의 encrypt passwords옵션값에 yes라고 해야하고 smb passwd file옵션에 반드시 삼바사용자패스워드파일의 경로를 지정한다.
- username map = /etc/samba/smbusers
  대부분 삼바에서 사용하는 ID와 리눅스계정ID는 동일하게 사용한다.
  만약 삼바사용자명과 리눅스 계정사용자명을 다르게 사용할 경우에 이를 매칭할 수 있도록 하기 위한 옵션이다.
  매칭테이블 파일을 /etc/samba/smbusers 파일로 사용하는 설정이다.
- include = /etc/samba/smb.conf.%m
  이 옵션은 삼바접속자의 플랫폼에 따라서 각기 다른 설정파일을 적용할 수 있도록 지원하기 위해 사용하는 옵션이다.
  %m 은 접속자 시스템의 NetBIOS이름으로 대체되어 접속한 사용자의 플랫폼종류에 따라서 각기 다른 삼바설정파일을 적용할 수 있다.
- socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
  삼바서비스 성능향상을 위한 옵션이다. speed.txt 파일을 참조하라.
- interfaces = 192.168.12.2/24 192.168.13.2/24
  삼바서버에서 두개 이상의 네트워크 인터페이스(NIC)를 사용하도록 지원하기 위한 옵션이다.
- remote browse sync = 192.168.3.25 92.168.5.255
  remote annouce = 192.168.1.255 192.168.2.44
  지역서브넷에서 삼바서버를 잘 인식하도록 하기 위하여 자기자신을 알리도록 한다.
- local master = no
  이 옵션은 특정 서브네트워크내에서 삼바서버가 로컬마스트브라우즈가 되도록 하는 옵션이다.
- os level = 33
  이 옵션은 마스터브라우즈 선거(master browser elections)에서 이 서버의 우선구너을 가질 수 있도록 허용한다.
- domain master = yes
  삼바서버가 Domain Master Browser가 되도록 한다.
  삼바가 Domain Master Browser가 되면 서브네트워크들로부터 브라우즈 목록을 수집하는 역할을 한다.
- domain logons = yes
  삼바서버를 윈도우95기반의 워크스테이션에 대한 도메인로그인서버 역할을 하도록 하려면 이 옵션을 사용하라.
- logon script = %m.bat
  각 플랫폼별 또는 각 사용자별로 로그온스크립트(login script)를 구분하여 사용할 수 있도록 한다.
- logon path = file://%25L/Profiles/%25U
  오직 윈도우95 또는 윈도우NT에서 로우빙프로파일(roving profile)을 어디에 저장해 둘것인가를 지정하는 설정이다.
- wins support = yes
  윈도우 인터넷네임서비스인 WINS를 지우너하기 위한 섹션이다.
- wins server = w.x.y.z
  WINS 서버를 지정한다.
- wins proxy = yes
  WINS프락시 : WINS기능이 없는 클라이언트 대신 질의에 답하도록 하기위한 옵션이다.
- dns proxy = no
  DNS의 nslookup을 사용하여 NetBIOS이름을 찾을 것인가 아닌가를 지정하는 옵션이다.
- preserve case = no
  short preserve case = no
  대소문자를 유지보존할 것인가를 지정하는 옵션이다.
- default case = lower
  DOS파일들의 기본 문자는 대문자로 인식한다.
  만약 lower로 설정하면 소문자로 인식한다.
- case sensitive = no
  대소문자의 구분을 할것인가 말것인가를 지정하는 옵션이다.
- [homes]
  comment = Home Directories
  browseable = no
  writable = yes
  사용자들의 홈디렉토리서버스에서 사용하는 기본적인 설정값이다.
- [netlogon]
  comment = Network Logon Service
  path = /home/netlogon
  guest ok = yes
  writable = no
  share modes = no
  도메인로그온 기능을 사용하기 위한 netlogin을 위한 설정이다.
- [Profiles]
  path = /home/profiles
  browseable = no
  guest ok = yes
  로우빙프로파일(roving profile)을 지정하려면 주석을 제거한다.
- [printers]
  comment = All Printers
  path = /var/spool/samba
  browseable = no
  guest ok = no
  writable = no
  printable = yes
  BSD타이의 프린트시스템을 가지고 있다면 개별 설정없이 바로 사용할 수 있다.
- [tmp]
  comment = Temporary file space
  path = /tmp
  read only = no
  public = yes
  삼바사용자들의 임시공유 디렉토리로 사용하기 위한 설정이다.
- [public]
  comment = Public Stuff
  path = /home/samba/public
  public = yes
  read only = no
  write list = @staff
  삼바사용자라면 누구나 접근이 가능한 공유디렉토로서 staff그룹에 등록된 사용자들을 제외한 일반사용잗ㄹ은 읽기전용으로만 사용할 수 있다.
 
* 삼바클라이언트 유틸리티 smbclient
사용형식 : smbclient '\서버서비스' [-U 삼바사용자] [패스워드] [옵션]
# smbclient -L localhost  -> 리눅스서버에 설치되어 있는 삼바서버의 접속 및 운용상태 확인
# smbclient '\filespapa' -U papa -> 원격지의 file이라는 로스트로 papa라는 계정을 이용하여 삼바서버로 접속
  서버명으로 file이라는 호스트명을 사용하려면 /etc/samba/lmhosts파일에 호스트정보가 등록되어 있어야 한다.
# smbclient -L 192.168.0.100
# smbclient -U papa -L 192.168.0.100
 
* 삼바 원격마운트를 위한 smbmount와 smbumount
사용형식 : smbmount //호스트명(또는 IP)/서비스 /마운트포인트
           smbumount /마운트포인트
# smbmount //192.168.0.100 /tmp/share
# smbumount /tmp/share
 
* 삼바 사용자 관리
- 새로운 삼바사용자 생성과 패스워드 설정하기
  삼바서버에서 사용자를 드록하기 위해서는 smbpasswd라는 명령어를 사용한다.
  삼바사용자의 삼바패스워드 또는 smbpasswd라는 명령어를 사용한다.
  삼바사용자를 새로 생성하기 전에 리눅스 계정생성을 먼저해야 한다.
# useradd dhan
# passwd dhan
# smbpasswd -a dhan
- 삼바사용자 패스워드 변경하기
  root 사용자일 경우 : smbpasswd [options] [username]
  root 사용자가 아닌 경우 : smbpasswd [options]
- 삼바사용자 사용하지 못하도록 사용중지 설정하기
# smbpasswd -d dhan -> 사용 중지
# smbpasswd -e dhan -> 사용 재개
- 삼바사용자 삭제하기
# smbpasswd -x dhan
 
* 삼바서버의 로그인정보 확인을 위한 smbstatus
사용형식 : smbstatus [-P] [-b] [-d] [-L] [-p] [-S] [-s <설정파일>] [-u 삼바계정]
# smbstatus  -> 현재 삼바서버로 로그인되어 있는 사용자들을 확인
# smbstatus -b  -> 삼바서버로 로그인한 삼바사용자염을 간단하게 확인
# smbstatus -u papa -> 특정 계정의 삼바사용자의 로그인 정보만을 확인
 
* 삼바서버의 NetBIOS 호스트 파일 lmhosts
이 파일의 주된 목적은 삼바에서 사용할 호스트명정보(주로 IP주소)를 쉽게 찾을 수 있돍 하기위한 것이다.
이 파일에 등록된 호스트정보를 이용하여 smbclient와 같은 삼바유틸리티에서 등록된 호스트의 삼바서버로 접속할 때에 호스트명만으로 사용할 수 있다.
 
* 삼바설정파일 점검하기 위한 testparm
사용형식 : testparm [-s] [-h] [-x] [-L <서버명>] 설정파일명 [호스트 IP]
# testparm
# testparm -l 192.168.0.100
 
* 삼바서버를 이용한 웹폴더 구축
- 웹폴더 사용을 위한 삼바서버 설정
# useradd dhan
# passwd dhan
Changing password for user dhan.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
# smbpasswd -a dhan
New SMB password:
Retype new password:
Added user dhan.
# vi /etc/samba/smb.conf
[dhan]
comment dhan web folder
path = /home/dhan
valid users = dhan
read only = no
writable = yes
public = no
browseable = yes
printable = no
crate mask = 0750
# /etc/init.d/smb restart
- 개인 PC의 탐색기에서 운격삼바디스크 사용하기
- 웹브라우즈에서 웹폴더 형식으로 사용하기
 
 
***********************************************************
* DHCP 서버
***********************************************************
* 설치
- dhcp서버 rpm으로 설치 및 dhcp서비스 파일들
# wget http://ftp.superuser.co.kr/pub/redhat/9/RPMS/dhcp-3.0pl1-23.i386.rpm  DHCP서버와 중계 에이전트
# wget http://ftp.superuser.co.kr/pub/redhat/9/RPMS/dhcp-devel-3.0pl1-23.i386.rpm DHCP서버와 접속시키기 위한 개발용 헤더 파일들과 라이브러리들
# wget http://ftp.superuser.co.kr/pub/redhat/9/RPMS/dhclient-3.0pl1-23.i386.rpm  DHCP서버와 접속시키기 위한 클라이언트
# rpm -Uvh dhcp-3.0pl1-23.i386.rpm
# rpm -Uvh dhcp-devel-3.0pl1-23.i386.rpm
# rpm -Uvh dhclient-3.0pl1-23.i386.rpm
- dhcp 서버 소스로 컴파일하여 설치하기
1. dhcp 소스가져오기
# wget ftp://ftp.isc.org/isc/dcp/dhcp-3.0.1.tar.gz
2. dhcp 소스 압축풀기
# tar xvfz dhcp-3.0.1.tar.gz
3. configure하기
# ./configure
4. 컴파일하기(make)
# make
5. 컴파일된 파일 설치하기
# make install
* 환경파일들
- DHCP 데몬파일
  dhcp 서버데몬 : /usr/sbin/dhcpd
  dhcp 릴레이에이전트 데몬 : /usr/sbin/dhcrelay
- DHCP 메인설정파일
  dhcp서버의 설정파일 : /etc/dhcpd.conf
- DHCP IP할당로그파일
  dhcp IP할당ㄹ그파일 : /var/lib/dhcp/dhcpd.leases
- DHCP서버 실행과 종료 및 재시작
# /etc/init.d/dhcpd start
# /etc/init.d/dhcpd restart
# /etc/init.d/dhcpd stop
 
* DHCP 서버 설정파일 dhcpd.conf
이 파일은 /usr/share/doc/dhcp-3.0pl1/ 디렉토리에 존재하는 dhcpd.conf.sample 파일을
/etc/dhcpd.conf 파일로 복사하여 편집한다.
subnet 192.168.0.0 netmask 255.255.255.0 {
  -> 192.168.0.0/255.255.255.0 네트워크의 범위에 해당하는 IP주소 가운데 아래 reage항목에 나오는 바와 같이 192.168.0.128부터 192.168.0.255까지의 IP주소를 DHCP클라이언트 컴퓨터에 유동사설IP주소를 할당하기 위한 설정이다.
# -- default gateway
  option routers 192.168.0.1;
  -> DHCP클라이언트들이 사용할 기본게이트웨이이다.
  options subnet-mask 255.255.255.0;
  -> IP주소를 할당받은 DHCP클라이언트가 사용할 Subnet Mask를 의미한다.
  option nis-domain "domain.org";
  option domain-name "domain.org";
  -> DHCP 서버의 자체 도메인이름을 의미한다.
  option domain-name-servers 192.168.1.1;
  -> IP주소를 할당받은 DHCP클라이언트가 사용할 DNS서버를 설정한다.
  option time-offset -18000;
# option ntp-servers 19.168.1.1;
# option netbios-name-servers 192.168.1.1;
# - Select point-to-point node(default is hybrid). Don't change this unless you understand NetBIOS very well
# option netios-node-type 2;
  range dynamic-bootp 192.168.0.128 192.168.0.254;
  -> DHCP클라이언트에게 할당할 수 있는 IP주소의 범위이다.
  default-lease-time 21600;
  -> 할당시간이 설정되어 있지 않은 DHCP클라이언트가 할당받은 IP주소를 가지고 있을 수 있는 시간을 의미한다.
  max-lease-time 43200;
  -> 할당된 IP주소를 DHCP클라이언트가 임대할 수 있는 최대 시간을 의미한다.
  # We want the nameserver to apperar at a fixed address
  host ns {
    -> DHCP서버를 이용하여 통신을 하는 많은 DHCP클라이언트들 가운데 특정 호스트에게만 항상 고정IP를 사용할 수 있도록 하기 위한 설정이다.
    next-server marvin.redhat.com;
    hardware ethernet 12:34:56:78:AB:CD;
    -> 고정IP주소를 할당할 DHCP클라이언트의 MAC주소를 설정한다.
    fixed-address 207.176.4.254;
    -> 위의 MAC주소를 가진 DHCP클라이언트에게 할당할 고정 IP주소
  }
}
 
* DHCP서버의 네트워크 설정
DHCP서버로 사용되기 위해서는 DHCP서버의 ethernet에 멀티캐스트가 가능하도록 설정되어 있어야 한다.
 
* DHCP서버를 사용하는 DHCP클라이언트 설정
- 리눅스에서 자동 IP할당 받기 위한 DHCP 클라이언트 설정
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
omBOOT=yes
BOOTPROTO=dhcp
# /etc/init.d/network restart
- 윈도우에서 자동 IP할당받기 위한 DHCP클라이언트 설정
 
***********************************************************
* PROXY 서버
***********************************************************
 
***********************************************************
* MRTG 트랙픽서버
***********************************************************
* SNMP
# wget http://ftp.superuser.co.kr/pub/redhat/9/RPMS/net-snmp-5.0.6-17.i386.rpm
# rpm -Uvh net-snmp-5.0.6-17.i386.rpm
# /etc/init.d/snmpd start
SNMP패키지를 설치하면 /etc/snmp/snmpd.conf 라는 SNMP설정파일이 있다.
이 설정파일에서 SNMP커뮤니티네임(community name)과 시큐리티네임(security name)을 각각 설정한다.
com2sec notConfigUser default bible
group notConfigGroup v1 bible
group notConfigGroup vc bible
 
* MRTG 트랙픽서버 구축
- 필요한 프로그램들 설치하기
  perl
  zlib
  libpng
  freetype
  jpeg
  gd
  apache
- MRTG 설치
# wget ftp://ftp.ntua.gr/pub/net/monitoring/mrtg/mrtg-2.11.1.tar.gz
# tar xvf mrtg-2.11.1.tar.gz
# cd mrtg-2.11.1
# ./configure --with-gd=/usr/local/gd --wit-z=/usr/local/zlib --wit-png=/usr/local/libpng
# make
# make install
# cd /usr/local/mrtg
# mkdir conf
- MRTG설정파일 생성하기
# CFGMAKE --GLOBAL 'WorkDir: /home/mrtg/www/kebia_1' --global 'Options[_]: bits,growright' --output /home/mrtg/conf/bible.cfgbible@192.168.0.5
  WorkDir: 옵션은 MRTG의 실행결과 파일들을 저장할 위치를 지정
  Options에 설정한 부분은 그래프의 단위와 어느쪽으로 그릴 것인가를 지정
  /home/mrtg/conf/bible.cfg는 생성될 결과파일을 지정
  bible@192.168.0.5에서 192.168.0.5는 MRTG의 분석대상이며 bible은 대상서버에 설치된 snmp의 커뮤니티네임(community name)이다.
- cfg파일 분석
- MRTG 실행
# /usr/local/mrtg/bin/mrtg /home/mrtg/conf/kebia_1.cfg
 
 
[출처] Tong - desnlife님의 자료지기통 (http://gilgal.co.kr)


반응형

댓글()

/var/log/secure 로그로 /etc/hosts.deny 에 자동 등록시키는 스크립트

리눅스/Security|2015. 1. 26. 17:58
반응형

10분간의 로그 중 20회 이상 Fail Password를 발생시킨 아이피를 차단한다.

php 스크립트로 작성.

동작원리
1. /var/log/secure 파일에서 10분전의 로그 추출.
2. 아이피 별로 갯수 통계
3. 한 아이피에서 20회 이상 sshd로 비밀번호가 틀렸다면 /etc/hosts.deny에 "ALL : 아이피"의 형태로 저장
4. xinetd 데몬 재시작
5. 등록한 아이피 목록을 메일 주소로 발송

실행
./secure_analysis.sh sshd

crontab 등록
*/10 * * * * /경로명/secure_analysis.sh sshd

소스
#!/usr/local/php/bin/php
<?
//개요
// secure log를 분석해서 sshd로 불법적인 접속을 시도하는 IP를 /etc/hosts.deny에 등록하는 작업을 한다.
// Log Example : Jun 5 07:48: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 = "withsky@withsky.co.kr";
        $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("/var/log/sshd_log")) {
                exec("mkdir -p /var/log/sshd_log");
        }
        if (!file_exists("/var/log/sshd_log/secure_analysis.log")) {
                exec("touch /var/log/sshd_log/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 $1}' > /var/log/sshd_log/secure_log_".$argv[1]);
        }
        $Fail_IP_File = file("/var/log/sshd_log/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 "" > /var/log/sshd_log/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 회" >> /var/log/sshd_log/denyIP.list_".$argv[1]);
                }
                exec("echo "$Datet$Ipt$Count" >> /var/log/sshd_log/secure_analysis.log");
        }
        if ($Restart_Xinetd) {
                exec("killall -HUP xinetd");
                exec("cat "/var/log/sshd_log/denyIP.list_".$argv[1]."" | mail -s "$Hostname Deny IP LIST - $Date " $RECEIVE_EMAIL");
        }
} else {
        echo("Missing Argument... Confirm Execute...n");
}
?>

 

 

[출처] 밍구's life (http://blog.withsky.co.kr/152)

반응형

댓글()