06 2월

게이트웨이 핑체크

Gateway ping 확인하는 스크립트

eth0 – 192.168.100.1
eth1 – 192.168.200.1

default gateway는  192.168.100.1 로 등록되어 있는 상태에서 192.168.100.1로 핑을 계속 보내면서 네트워크를 확인한다.

최대 실패횟수가 초과하면 현재 default gateway를 제거하고 eth1의 게이트웨이를 등록하고 관리자에게 이메일을 발송한다.

 


#!/bin/sh

#####################################################################
# edit config
GW1="192.168.100.1"
GW2="192.168.200.1"
MAX_FAIL_COUNT=5
ERROR_MAILTO="me@jongwan.com"

#####################################################################
# path exec
EXEC_PING="/bin/ping"
EXEC_ROUTE="/sbin/route"
EXEC_MAIL="/usr/bin/mail"

#####################################################################
# prevent duplicate run
ME=`basename "$0"`
CHK_RUN=`pgrep -o $ME`
if [ $CHK_RUN -ne $$ ]; then
    exit
fi

#####################################################################
# checking
FAIL_COUNT=0
while(true) do
    # check ping
    CHK=`$EXEC_PING -c1 $GW1 > /dev/null; echo $?`

    # 0 is reachable, 2 is unreachable
    if [ $CHK -ne "0" ]; then
        FAIL_COUNT=$(($FAIL_COUNT+1))
    else
        FAIL_COUNT=0 # init fail_count if success ping
    fi

    # check fail count
    if [ $FAIL_COUNT -ge $MAX_FAIL_COUNT ]; then
        # add/del gateway
        echo "Gateway connection failed : $GW1"
        CMD1=`$EXEC_ROUTE del default gw $GW1`
        CMD2=`$EXEC_ROUTE add default gw $GW2`

        # send email
        CMD3=`echo "Gateway connection failed : $GW1" | $EXEC_MAIL -s "Gateway connection failed : $GW1" $ERROR_MAILTO`

        # exit shell
        break
    fi

    sleep 1
done

21 9월

find 명령으로 오래된 파일찾기

find 명령으로 오래된 파일을 찾아본다

현재위치에서 *.txt파일중 30일이 지난 파일을 출력

# find . -name “*.txt” -type f  -ctime +30 -print

현재위치에서 30일이 지난 모든 파일을 삭제

# find . -type f -ctime +30 | xargs rm

현재위치에서 30일이 지난 모든 디렉토리를 삭제

# find . -type d -ctime +30 | xargs rm -rf

현재 위치에서 7일안에 생성된 파일을 출력

# find . -type f -ctime -7 -print

 

옵션설명

-type f(파일) d(디렉토리) l(링크)

-ctime : 생성시간

-mtime : 수정시간

-atime : 접근시간

 

100kb이상인 파일을 출력

# find . type f -size +100k -print

12 9월

fail2ban – 워드프레스 로그인 차단 (wp-login.php)

워드프레스 악의적인 로그인 차단

fail2ban 을 이용하여 워드프레스(https://wordpress.org/) 로그인 페이지를 안전하게 해보자

1

어느날 갑자기 무차별대입공격(brute force attack)으로 로그가 엄청나게 늘어나 버렸다.

워드프레스에 Wordfence 플러그인이 설치되어 있었지만 차단해주지는 못했다.

때문에 로그파일을 읽어 방화벽(iptables)에 등록해주는 fail2ban 을 이용하여 직접 방어해본다.

 

기본환경

ubuntu 14.04에 apache2가 설치되어 있다.

 

fail2ban 설치하기

fail2ban은 지정된 로그파일을 모니터링하면서 정규식을 이용, 특정패턴을 읽는다. 패턴이 일정이상 반복되면 bantime (초) 만큼 방화벽에 아이피를 등록하여 차단한다.

우분투 패키지매니저를 통한 설치

#sudo apt-get install fail2ban

소스설치

https://github.com/fail2ban/fail2ban 에서 소스파일을 다운로드한다.

로그파일 확인

워드프레스의 로그인 파일(wp-login.php)에 접근한 로그를 확인하기 위해 아파치 로그폴더를 확인해 본다

# cat /var/log/apache2/access.log | grep wp-login.php

91.200.12.42 – – [12/Sep/2016:02:02:49 +0900] “POST /wp-login.php HTTP/1.1” 200 5527 “http://jongwan.com/wp-login.php” “Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; 125LA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)”
91.200.12.42 – – [12/Sep/2016:02:03:07 +0900] “POST /wp-login.php HTTP/1.1” 200 5527 “http://jongwan.com/wp-login.php” “Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; 125LA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)”
91.200.12.42 – – [12/Sep/2016:02:03:14 +0900] “POST /wp-login.php HTTP/1.1” 200 5527 “http://jongwan.com/wp-login.php” “Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; 125LA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)”
91.200.12.42 – – [12/Sep/2016:02:03:25 +0900] “POST /wp-login.php HTTP/1.1” 200 5527 “http://jongwan.com/wp-login.php” “Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; 125LA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)”
91.200.12.42 – – [12/Sep/2016:02:03:37 +0900] “POST /wp-login.php HTTP/1.1” 200 5527 “http://jongwan.com/wp-login.php” “Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; 125LA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)”

wp-login.php 파일에 수초간격으로 계속 접근을 시도한 것을 확인할 수 있다.

 

fail2ban 룰 작성

fail2ban에서 사용하는 failregex 라는 룰을 작성한다. 로그파일을 확인해 보면 아래와 같이 작성할 수 있다.

^<HOST> .* “POST /wp-login.php

 

룰 파일을 생성

fail2ban 은 기본적으로 /etc/fail2ban 에 설치된다.

# vim /etc/fail2ban/filter.d/wordpress-login.php

파일 내용은 아래와 같다


[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
ignoreregex =

 

jail.conf 에 룰을 등록

룰을 생성했드면 jail.conf 에 해당 룰을 등록해 줄 수 있다. /etc/fail2ban/jail.conf 파일을 열어 마지막줄에 아래 내용을 추가해준다.

# vim /etc/fail2ban/jail.conf


[wp-auth]
enabled = true
filter = wordpress-login
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
logpath = /var/log/apache2/*access*.log
bantime = 1200
maxretry = 8

fail2ban 룰 테스트

fail2ban은 아래와 같은 명령을 이용해서 룰을 확인할 수 있다.

#fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/wordpress-login.conf

 

fail2ban 재시작

#service fail2ban restart

07 9월

NCDU – 리눅스에서 폴더별 용량 확인

NCDU

우분투에서 폴더의 사용량을 확인하기 위해 항상 du 명령어를 사용했었다.

간단하게 사용이 가능하지만 한눈에 알아보기 힘든 UI로 인해서 고민하다 비주얼하게 출력해주는 프로그램을 하나 만들어 볼까?? 하던차에 구글링을 해보니, 이미 많이 사용되는 프로그램이 있어 소개해본다

일단 콘솔에서 확인해야 하기에 바오밥(https://en.wikipedia.org/wiki/Disk_Usage_Analyzer) 의 경우 X윈도우가 필요하니 패스~

NCDU 설치방법

NCDU를 사용하기 위해서 우분투기준 아래와 같이 설치를 진행한다

#apt-get install ncdu
#ncdu /

실행하고 한참 탐색을 진행하다 마치면 아래와 같은 화면이 나온다. 폴더별로 사용량이 깔끔하게 출력된다.

NCDU 스크린샷1

NCDU 스크린샷2

 

03 8월

업로드 디렉토리에서 웹쉘 php 실행 방지(webshell)

업로드 디렉토리에서 아래 명령을 실행

# find . -type f | xargs grep -n “eval(”

웹쉘파일

파일은 gif형식인데 내용에는 php 코드가 들어있다.

POST로 데이터를 전송하면 eval() 명령으로 실행이 된다.

위와 같은 상황처럼 이미지에 들어있는 php코드가 실행이 되는 것을 방지하지 위해서

아예 업로드 디렉토리는 php파싱을 하지 않도록 하는 방법을 안내한다

 

/etc/httpd/conf/httpd.conf


<VirtualHost *:80>

...

<Directory /home/web/public_html/data>
php_admin_value engine Off
</Directory>

...

</VirtualHost>

13 4월

tcpdump

tcpdump

# tcpdump [ -AdDefIKlLnNOpqRStuUvxX ][ -B buffer_size ][ -c count ][ -C file_size ][ -G rotate_seconds ][ -F file ][ -i interface ][ -m module ][ -M secret ][ -r file ][ -s snaplen ][ -T type ][ -w file ][ -W filecount ][ -E spi@ipaddr algo:secret,… ][ -y datalinktype ][ -z postrotate-command ][ -Z user ]

# tcpdump -i eth0=> 인터페이스 eth0 을 보여줌

# tcpdump -w tcpdump.log=> 결과를 파일로 저장, txt 가 아닌 bin 형식으로 저장됨

# tcpdump -r tcpdump.log=> 저장한 파일을 읽음

# tcpdump -i eth0 -c 10=> 카운터 10개만 보여줌

# tcpdump -i eth0 tcp port 80=> tcp 80 포트로 통신하는 패킷 보여줌

# tcpdump -i eth0 tcp port 80=> tcp 80 포트로 통신하는 패킷 보여줌

# tcpdump -i eth0 src 192.168.0.1=> source ip 가 이것인 패킷 보여줌

# tcpdump -i eth0 dst 192.168.0.1=> dest ip 가 이것인 패킷 보여줌

 

and 옵션으로 여러가지 조건의 조합 가능

# tcpdump -i eth0 src 192.168.0.1 and tcp port 80=> source ip 가 이것이면서 tcp port 80 인 패킷 보여줌

# tcpdump -i eth0 dst 192.168.0.1=> dest ip 가 이것인 패킷 보여줌

# tcpdump host 192.168.0.1=> host 를 지정하면, 이 ip 로 들어오거가 나가는 양방향 패킷 모두 보여줌

# tcpdump src 192.168.0.1=> host 중에서 src 가 이것인것 만 지정

# tcpdump dst 192.168.0.1=> host 중에서 dst 가 이것인것 만 지정

# tcpdump net 192.168.0.1/24=> CIDR 포맷으로 지정할 수 있다.

# tcpdump tcp=> TCP 인것만

# tcpdump udp=> UDP 인것만

# tcpdump port 3389=> 포트 양뱡항으로 이것인것.

# tcpdump src port 3389=> src 포트가 이것인것.

# tcpdump dst port 3389=> dst 포트가 이것인것.

 

combine : and ( && ) , or ( || ) , not ( ! ) 으로 여러가지를 조합해서 사용 가능

# tcpdump udp and src port 53=> UDP 이고 src 포트가 53 인 것

# tcpdump src x.x.x.x and not dst port 22=> src ip 가 x.x.x.x 이고 dst 포트가 22 가 아닌 것

 

grouping : ( )

# tcpdump ‘src x.x.x.x and ( dst port 3389 or 22 )’=> src ip 가 x.x.x.x 이고 ( dst 포트가 3389 또는 22 ) 인 것  ==> 여기서는 ‘ ‘ 가 반드시 있어야 한다.

06 11월

Mysql Databases/Tables 자동으로 최적화(Optimize)하기

Mysql 데이터베이스/테이블을 자동으로 최적화(Optimize) 하기

Mysql을 사용하다 보면 종종 최적화 되지 않은 테이블을 발견할 때가 있습니다.

일일이 command line에서 `optimize table tablename`을 하는것이 귀찮았었는데,

구글링을 하다 보니 역시나 방법이 있더군요

 

1. 리눅스 스케줄러 데몬(Crond)을 사용

먼저 리눅스에서 제공하는 cron을 사용해서 특정한 시간에 최적화를 시작하도록 설정합니다.

 

2. mysqlcheck 명령

mysqlcheck 명령을 이용해서 특정 테이터베이스나 테이블 혹은 전체 데이터베이스에 대해서 analyze 또는 optimize가 가능합니다.

– 옵션

-o : optimize

-A : 전체 데이터베이스

-a : analyze

 

3. 사용방법

– 먼저 스케줄러를 수정합니다.

# crontab -e

– 적당한 줄에 아래 내용을 추가합니다.

0 1 * * * /usr/bin/mysqlcheck -o -uroot -p(비밀번호) (데이터베이스명) > /dev/null

 

– 예를들어 비밀번호가 1234, abc라는 데이터베이스를 최적화 하려면

0 1 * * * /usr/bin/mysqlcheck -o -uroot -p1234 abc > /dev/null

– 모든 데이터베이스를 최적화

0 1 * * * /usr/bin/mysqlcheck -A -o -uroot -p1234 > /dev/null

27 10월

fax – res_fax_digium 설치 및 라이선스 획득

res_fax_digium 모듈 설치

 

asterisk 11.7.0을 기본설치하면 fax 를 사용하는 모듈이 없으므로 서비스가 불가능합니다.

fax를 서비스하기 위해서 해당 모듈을 다운로드 하고 라이선스를 등록하는 방법을 알아봅니다.

 

1. 라이선스

https://my.digium.com/en/login/register/ 로 이동해서 이메일 주소를 이용해 사용자 등록을 합니다.

에메일주소 인증을 해야 하기 때문에 사용하는 이메일을 정확히 입력합니다.

인증이 끝나고 http://www.digium.com/en/products/software/fax-for-asterisk 페이지로 이동합니다.

윗쪽에 Get 1 Free License 를 찾아서 클릭합니다.

fax
Checkout 을 누르면 0$에 구매가 가능합니다.

구매를 완료하면 주문내역 메일이 오고 잠시후에

Digium Free Fax For Asterisk License for Order: W???????? 이런제목의 메일이 오는데

내용을 살펴보면

Hello Digium Customer,

 

The following is your Free key for one (1) channel of Free Fax For Asterisk:

Key :

F??-N?????????

 

Instructions for using your key may be found at:

http://downloads.digium.com/pub/telephony/fax/README

 

If you require additional channels of fax capability within Asterisk, or if you require technical support, you may purchase paid keys of the Fax For Asterisk product from Digium.  Digium does not provide technical support of any kind for Free Fax For Asterisk.

Thank you for using Asterisk.

 

저기 중간에 키가 무료 라이선스 키입니다.

라이선스키를 얻었으면 등록을 시작합니다.

 

# cd /root
# wget http://downloads.digium.com/pub/register/x86-32/register
# chmod 500 register
# ./register

Digium Product Registration – Version 3.0.5
Copyright (C) 2004-2007, Digium, Inc.
Use the ‘-l’ option to see license information for software
included in this program.

Please select a category

1 – Digium Products
2 – Cepstral Products

0 – Quit

Your Choice: 1

 

You selected 1, Digium Products
Please select a product

1 – Asterisk Business Edition
2 – Asterisk Business Edition C Expansion
3 – Asterisk For Smart Cube
4 – Asterisk For Smart Cube Expansion
5 – G.729 Codec
6 – High Performance Echo Can
7 – Skype For Asterisk
8 – Fax for Asterisk
9 – Free Fax for Asterisk
10 – Vestec Speech Engine
11 – Digium Phone Module for Asterisk

0 – Quit

Your Choice: 9

 

You selected 9, fax for Asterisk

Please enter your Key-ID: (여기에 키를 입력)

 

2. res_fax

# wget http://downloads.digium.com/pub/telephony/fax/res_fax/asterisk-1.6.2.0/x86-64/res_fax-1.6.2.0_1.3.0-x86_64.tar.gz
# tar xfz res_fax-1.6.2.0_1.3.0-x86_64.tar.gz
# cd res_fax-1.6.2.0_1.3.0-x86_64
# cp res_fax.so /usr/lib/asterisk/modules
# cp res_fax.conf /etc/asterisk/

 

3. 파일다운로드(res_fax_digium)

 

fax

 

http://downloads.digium.com/pub/telephony/fax/res_fax_digium/asterisk-11.0/x86-64/

위 링크에서 시스템에 맞는 파일을 다운로드 합니다.

이전에 포스팅 대로 ubuntu 12.04버전이라면 res_fax_digium-11.0_1.3.1-generic_64.tar.gz 파일을 다운로드 합니다.

 

4. 압축해제/복사

# wget http://downloads.digium.com/pub/telephony/fax/res_fax_digium/asterisk-11.0/x86-64/res_fax_digium-11.0_1.3.1-generic_64.tar.gz
# tar xfz res_fax_digium-11.0_1.3.1-generic_64.tar.gz
# cd res_fax_digium-11.0_1.3.1-generic_64
# cp res_fax_digium.so /usr/lib/asterisk/modules
# cp res_fax_digium.conf /etc/asterisk/

27 10월

asterisk 11.7.0 소스 컴파일 및 라이브러리 설치 등

asterisk 11.7.0 소스 컴파일 및 라이브러리 설치

 

asterisk 11.7.0 을 설치하기 위해 소스를 다운로드하고 컴파일을 합니다.

홈페이지는 http://www.asterisk.org/ 이곳이며,

현재 공식버전은 13 까지 나왔습니다만, 여기서는 11.7을 기준으로 합니다.

 

asterisk 11.7.0

 

1. asterisk 11.7.0 다운로드

모든 버전의 asterisk를 확인하기 위해서 다운로드 페이지의 All Asterisk Versions 를 클릭합니다.

http://www.asterisk.org/downloads/asterisk/all-asterisk-versions

필요한 버전을 찾아 설치할 서버에 다운로드 합니다.

 

#cd /usr/local/src

#wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.tar.gz

#tar xfzp asterisk-11-current.tar.gz

 

2. 설치시 필요한 패키지 추가설치

apt-get install ncurses-base ncurses-bin ncurses-term libncurses5-dev

apt-get install libxml2 libxml2-dev

apt-get install sqlite3 libsqlite3-dev

 

3. 소스 컴파일

#./configure

asterisk2

이렇게 나오면 성공~

#make

#make install

+—- Asterisk Installation Complete ——-+
+ +
+ YOU MUST READ THE SECURITY DOCUMENT +
+ +
+ Asterisk has successfully been installed. +
+ If you would like to install the sample +
+ configuration files (overwriting any +
+ existing config files), run: +
+ +
+ make samples +
+ +
+—————– or ———————+
+ +
+ You can go ahead and install the asterisk +
+ program documentation now or later run: +
+ +
+ make progdocs +
+ +
+ **Note** This requires that you have +
+ doxygen installed on your local system +
+——————————————-+

#make samples

 

4. 시작

#asterisk -cvvv

 

5. /etc/init.d/asterisk 서비스 등록

설치폴더에 보면 contrib/init.d/ 가 있는데 살펴보면 rc.debian.asterisk 파일이 있다

이 파일을 /etc/init.d/로 복사를 한다.

#cp contrib/init.d/rc.debian.asterisk /etc/init.d/asterisk

#chmod 755 /etc/init.d/asterisk

#/etc/init.d/asterisk start