세이박스

Apache httpd.conf 에서 서브 도메인 redirect시 RewriteRule 적용

서버,보안

서브 도메인을 특정 도메인으로 redirect 할 경우 페이지를 찾을수 없는 경우가 발생하곤 하는데 이를 경우 방문자를 잃을수 있습니다.

예를들어 http://www.saybox.net 도메인으로 서비스를 하다가 어느날 http://www.saybox.co.kr 도메인으로 서비스를 이용하게 되어서
redirect / http://www.saybox.co.kr
처럼 redirect 할 경우 발생할 수 있는 문제점이 있습니다.

회원이 즐겨찾기 해둔 URL이 만약 http://www.saybox.co.kr/index.php 였다면 redirect에서 처리를 할 수 없게 됩니다.
그래서 뒤에 어떠한 URL 파라미터가 붙더라도 redirect 되도록 할려면 여러가지 방법이 있는데 그중 한가지가 RewriteEngine을 이용한 방법입니다.

일단, RewriteEngine을 On 해주시고, RewriteRule에 /.* 라고 적습니다.
즉, 도메인 / 뒤에 붙는 .* 모든 내용을 지정한 URL로 이동 시켜라 그런 내용입니다

<VirtualHost *:80>
..... 생략 ...
RewriteEngine On
RewriteRule /.* http://www.saybox.co.kr
</VirtualHost>


 

리눅스 서버 apache php 오류 Cannot load /usr/local/apache/libexec/libphp4.so into server: /usr/local/apache/libexec/libphp4.so: cannot restore segment prot after reloc: Permission denied

서버,보안

아파치 서버에 PHP를 이용시 아래와 같은 오류가 발생시 :

[root@ ~]# /usr/local/apache/bin/apachectl restart
/usr/local/apache/bin/apachectl restart: httpd not running, trying to start
Syntax error on line 56 of /usr/local/apache/conf/httpd.conf:
Cannot load /usr/local/apache/libexec/libphp4.so into server: /usr/local/apache/libexec/libphp4.so: cannot restore segment prot after reloc: Permission denied
/usr/local/apache/bin/apachectl restart: httpd could not be started

해결 방법 :

[root@ ~]# chcon -t texrel_shlib_t /usr/local/apache/libexec/libphp4.so

위 명령어 한번 실행 해 주고나서 apache 다시 시작 해 보세요!
간단히 해결 되죠!

리눅스 sulinux 2.0 + APM 설치후 아파치 실행시 아파치 오류 해결

서버,보안
리눅스 sulinux 2.0을 설치후 APM을 겨우 설치를 마치고 apache를 실행을 했더니 아래와 같은 오류가 발생한다.

# /usr/local/apache/bin/apachectl restart
httpd: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

이와 같은 오류는 httpd.conf 파일 내용중 아래 ServerName 이라는 부분이 주석(#) 처리 되어 있는데 해당 부분에 주석을 제거하고 도메인 또는 서버의 IP를 입력해 주시면 됩니다.

#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If this is not set to valid DNS name for your host, server-generated
# redirections will not work.  See also the UseCanonicalName directive.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
# You will have to access it by its address anyway, and this will make
# redirections work in a sensible way.
#
#ServerName exam.defaultdoman....:80

ServerName 127.0.0.1:80

잘 모르겠으면 위처럼 127.0.0.1:80 이라고 하셔도 됨.

리눅스 sulinux 2.0 설치후 Apache make시 오류 발생 처리

서버,보안

IBM 345 서버에 페도라 10을 설치할려고 하니 Raid 카드 인식이 되지 않아 결국 sulinux 2.0 을 설치 하였다.
역시 IBM에서 지원하는 OS라 그런지 쉽게 Raid카드가 인식되어 설치 성공하였다.
문제는 mysql 설치 후 apache를 설치 하는 과정중 make시에 다음과 같은 오류가 나타났다.

sockopt.c: In function 'apr_socket_opt_set':
sockopt.c:216: error: 'SCTP_NODELAY' undeclared (first use in this function)
sockopt.c:216: error: (Each undeclared identifier is reported only once
sockopt.c:216: error: for each function it appears in.)
make[4]: *** [sockopt.lo] 오류 1
make[4]: Leaving directory `/usr/local/src/httpd-2.0.49/srclib/apr/network_io/unix'
make[3]: *** [all-recursive] 오류 1
make[3]: Leaving directory `/usr/local/src/httpd-2.0.49/srclib/apr/network_io/unix'
make[2]: *** [all-recursive] 오류 1
make[2]: Leaving directory `/usr/local/src/httpd-2.0.49/srclib/apr'
make[1]: *** [all-recursive] 오류 1
make[1]: Leaving directory `/usr/local/src/httpd-2.0.49/srclib'
make: *** [all-recursive] 오류 1

위와 같은 오류가 발생시 lksctp-tools-devel 을 yum 으로 손쉽게 설치를 하고 나면 이후엔 오류가 발생하지 않았었다. 하지만, 이상하게도 아래와 같은 오류가 나타났다.
페도라10과 sulinux 2.0에서 yum 설치시 요청하는 업데이트 서버가 틀린가 보다.

# yum install lksctp-tools-devel
Setting up Install Process
Parsing package install arguments
Requested dep: lksctp-tools-devel is provided by installed package
Nothing to do

그래서 rpm을 직접 받아서 설치후 make 성공 하였다.

lksctp-tools-devel 다운로드 받는 곳 :
http://sourceforge.net/projects/lksctp/files/

여기서 자신의 os에 해당하는 파일 다운로드
저의 경우 lksctp-tools-devel-1.0.10-1.i386.rpm 로 다운 받았습니다.
http://sourceforge.net/projects/lksctp/files/lksctp/lksctp-tools-1.0.10/lksctp-tools-devel-1.0.10-1.i386.rpm/download

다운로드 페이지에 광고가 있는데 잘 찾아 보시면 하늘색으로 된 "direct link" 라는 링크가 있을꺼에요 그걸 클릭하시면 됩니다.
또는 서버에서 해당 링크를 wget으로 받으셔도 됩니다.

wget http://downloads.sourceforge.net/project/lksctp/lksctp/lksctp-tools-1.0.10/lksctp-tools-devel-1.0.10-1.i386.rpm?use_mirror=jaist

* rpm 설치
rpm -Uvh lksctp-tools-devel-1.0.10-1.i386.rpm



그리고 기존에 설치 하셨던 apache는 삭제 하시고 원소스를 다시 압축 푸셔서 처음부터 다시 configure > make 진행 하세요!

세이박스에서는 제가 접한 오류들을 해결하는 과정을 매일 기록하고 있습니다.
전문적인 답변은 아닐지라도 분명 어떤분께는 도움일 자료가 될거라 생각합니다.

해당글은 세이박스에서 작성한 글이므로 퍼가실땐 꼭 출처를 남겨 주세요! ^^ ㅋㅋ

리눅스 페도라 10 버전에서 아파치 Httpd-2.0.49 설치 하기

서버,보안

아파치를 이미 설치 해보신 분이 설치하는 것으로 생각하며 디테일한 설명은 생략했으니 참고하셔서 활용 하시기 바랍니다.
아파치는 PHP보다 먼저 설치 되어야 하며 한 서버에 MySQL도 같이 설치 하신다면 아파치 보다 MySQL이 먼저 설치 되어야 합니다.
설치순서 : MySQL > Apache > PHP

1. 아파치 설치전 yum 으로 필요한 라이브러리 설치
yum install lksctp-tools-devel


2. 다운로드 후 압축풀기
wget http://ftp.superuser.co.kr/pub/apache/httpd-2.0.49.tar.gz
tar xvzf httpd-2.0.49.tar.gz
cd httpd-2.0.49

* 위 url로 다운로드 되지 않을 경우 아래 파일을 직접 받으셔도 됩니다.



3. 소스파일 일부 수정
vi server/mpm/prefork/prefork.c
수정전 : #define DEFAULT_SERVER_LIMIT 256
수정후 : #define DEFAULT_SERVER_LIMIT 4096

vi server/mpm/worker/worker.c
수정전 : #define DEFAULT_SERVER_LIMT 16
수정후 : #define DEFAULT_THREAD_LIMT 256


4. 환경설정
./configure --enable-so --prefix=/usr/local/apache
make
make install


5. 아파치를 어디에서나 실행할 수 있게 환경변수를 등록
PATH=$PATH:/usr/local/apache/bin


* 아파치 실행시 libphp5.so error 발생시
cd /usr/local/apache2/modules
restorecon -v libphp5.so
chcon -t texrel_shlib_t libphp5.so


* 아파치 설치시 make 오류
sockopt.c: In function 'apr_socket_opt_set':
sockopt.c:216: error: 'SCTP_NODELAY' undeclared (first use in this function)
sockopt.c:216: error: (Each undeclared identifier is reported only once
sockopt.c:216: error: for each function it appears in.)
make[4]: *** [sockopt.lo] 오류 1
make[4]: Leaving directory `/usr/local/src/httpd-2.0.49/srclib/apr/network_io/unix'
make[3]: *** [all-recursive] 오류 1
make[3]: Leaving directory `/usr/local/src/httpd-2.0.49/srclib/apr/network_io/unix'
make[2]: *** [all-recursive] 오류 1
make[2]: Leaving directory `/usr/local/src/httpd-2.0.49/srclib/apr'
make[1]: *** [all-recursive] 오류 1
make[1]: Leaving directory `/usr/local/src/httpd-2.0.49/srclib'
make: *** [all-recursive] 오류 1

yum install lksctp-tools-devel
(설치전 미리 먼저 설치 해두는게 좋음)


위 내용은 세이박스에서 작성한 내용으로 퍼가실때에는 반드시 출처를 남겨 주세요!

Apache Web Server 의 DOS공격 막기

서버,보안
작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 2003.8.20(수) apache v1.3.x
수정일 : 2003.8.25(월) apache v2.x 부분 추가

특정 URL이나 IP일 경우나 특정한 브라우저를 이용하여 DoS(Denial of Service, 서비스거부)
공격이 들어온다면 httpd.conf 에서 SetEnvIf, SetEnvIfNoCase 등과 Allow, Deny 설정으로
간단히 막을 수 있겠지만 일정한 유형이 없다면 해결점을 찾기가 쉽지 않다.

다행히 Apache용 mod_dosevasive 모듈로 DoS 공격을 쉽게 막을 수 있다.
며칠전 1.7버전 발표로 apache 2.x에서도 정상적으로 이 모듈을 이용할 수 있게 됐다.

1. mod_dosevasive 설치

http://www.nuclearelephant.com/projects/dosevasive/
에서 mod_dosevasive (현재 최신버전은 1.7)을 받아온다.

1) 기존에 사용하던 apache 1.3.x에 모듈만 추가할 때

mod_dosevasive.tar.gz 을 푼다음 apxs로 설치

----------------------------------------------
# tar xvfz mod_dosevasive.tar.gz 
# cd dosevasive
# /bin/apxs -iac mod_dosevasive.c
...
[activating module `dosevasive' in /usr/local/apache/conf/httpd.conf]
cp mod_dosevasive.so /usr/local/apache/libexec/mod_dosevasive.so
chmod 755 /usr/local/apache/libexec/mod_dosevasive.so
...
----------------------------------------------

httpd.conf의 LoadModule, AddModule는 apxs가 알아서 추가해준다.

2) apache 1.3.x부터 새로 컴파일할 할 때

mod_dosevasive.tar.gz 을 apache_source_홈/src/modules 에 푼 다음
기존에 apache 컴파일하는 것과 동일한 방법으로 하되, --add-module=... 옵션만
추가해준다.

----------------------------------------------
./configure --prefix=/usr/local/apache \
--enable-module=all --enable-shared=max \
--add-module=src/modules/dosevasive/mod_dosevasive.c  <-- 추가함
make
make install
----------------------------------------------

3) apache 2.x에 모듈만 붙일 때

/bin/apxs -iac mod_dosevasive20.c

2. 설정

httpd.conf 에 아래 설정이 있는지 확인한다.

apache 1.3.x
----------------------------------------------
...
LoadModule dosevasive_module libexec/mod_dosevasive.so
...
AddModule mod_dosevasive.c
----------------------------------------------

apache 2.x
----------------------------------------------
LoadModule dosevasive20_module modules/mod_dosevasive20.so
----------------------------------------------

httpd.conf에는 다음과 같이 설정을 추가한다.
( 단, 아래 설정 중에 apache 2.x일 때는 < IfModule mod_dosevasive20.c> 로 )
----------------------------------------------
< IfModule mod_dosevasive.c>
  DOSHashTableSize  3097
  DOSPageCount    3
  DOSSiteCount    50
  DOSPageInterval   1
  DOSSiteInterval   1
  DOSBlockingPeriod  30
< /IfModule>
----------------------------------------------
DOSHashTableSize  3097

hash table의 크기. IP, URI등을 분석하기 위한 공간으로 쓰이는 것 같은데 정확히는
모르겠다. 접속이 많은 서버이면 수치를 높인다.

DOSPageCount    3
DOSPageInterval   1

DOSPageInterval에서 지정한 시간(초단위)동안 같은 페이지를 3번 요청한 경우
해당 클라이언트 IP를 블럭킹한다. 블럭킹되는 동안에 사용자에게는 403(Forbidden)
코드가 전송된다.

DOSSiteCount    50
DOSSiteInterval   1

DOSSiteInterval에서 지정한 시간동안 어느 페이지나 이미지든 요청 건수가 50번을 넘는
경우 해당 클라이언트 IP를 블럭킹한다. 403코드 보내는 것은 마찬가지.
HTML 내에 이미지가 10개이면 요청 건수는 HTML포함하여 11번이 되므로 이미지가 많은
사이트는 숫자를 크게한다.

DOSBlockingPeriod  30

블럭킹된 IP는 30초동안 접속을 할 수 없다.

3. 모듈 사용을 중지하려면

차단 기능을 이용하지 않기 위해

DOSPageCount 0
DOSSiteCount 0

와 같이 하면 모듈 내부의 default값을 이용해서 동작하므로 LoadModule, AddModule를
주석 처리하는 방법을 써야한다. 또는 Count값을 상당히 큰 수를 지정할 수도 있겠다.

4. 차단하는지 테스트

간단한 테스트 툴로 test.pl을 제공한다.
12번째 줄에

printf("%03d ", $_ );

를 추가하고

apache를 실행시킨 다음 perl test.pl을 해보면 200 OK, 403 Forbidden 된 것을 쉽게
확인할 수 있을 것이다.

DOSPageCount, DOSSiteCount 수치를 너무 낮게 하면 정상적인 접속에 대해서도 차단될 수
있으므로 주의해야 한다. 수치를 낮추고, 같은 페이지를 reload(Ctrl+R)를 여러번했더니
바로 403 페이지가 등장.

403 페이지를 별도로 만드는 것이 좋을 듯 싶다. httpd.conf에 ErrorDocument 403 ... 설정
으로 html을 만들어두면 방문자에게 도움이 되지 않을까...

이젠 ab, lynx 등으로 게시물 조회수를 순간적으로 올린다거나, 시스템 로드를 증가시키는
것까지도 어느정도 막을 수 있을 것이다.

※ syslog 로 로그 남기는 기능과 DOSEmailNotify, DOSSystemCommand 옵션은 제대로 적용
  되지 않아 이 글에 적지 않았다. 정상동작이 확인되면 그 때 추가할 것이다


아파치 데몬 감시 스크립트

서버,보안
Apache 데몬 모니터링을 위한 스크립트
 
아파치 서비스를 운영하다 보면 접속자가 너무 많거나 이상 증상으로 데몬이 죽어 버리는 경우 상시 모니터링 하지 않는 이상 관리자가 확인 하기 전까지 서버는 웹 서비스를 멈추어 버린체 방치하게 된다. 그래서 적어도 한시간 이내에 한번은 데몬이 죽은는지 체크해서 다시 살리는 시스템을 생각하게 된다.
 
# 적당한 위치에 스크립트 파일 만들기
cd /usr/local/apache/bin
vi httpd_check.sh
#/bin/sh
DAEMON="httpd"
COUNT=$(ps acx | grep -c $DAEMON)
if [ "$COUNT" -gt "0" ]; then
   /usr/local/apache/bin/apachectl restart
else
   /usr/local/apache/bin/apachectl start
fi
 
# 스크립트 파일 실행 권환 주기
chmod +x httpd_check.sh
 
# 매 시간마다 위 스크립트 실행되도록 crontab 적용
crontab -e
00 * * * * /user/local/apache/bin/httpd_check.sh