RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
AIX 카테고리의 이전 글을 보면 AIX에 Apache + PHP + Oracle을 연동하였는데, 이번에는 APM을 설치해야하는 상황이 왔다. 물론 저번의 APO처럼하면 될 줄 알았는데, 이게 왠걸... 안된다. 역시 SE는 쉽지 않다.

일단 AIX Toolbox는 기본으로 설치하여야한다.
설치가 정상적으로 되어 있는지 확인 해 보자.

1. 컴파일을 위한 GCC 등의 패키지 설치 및 확인
- 버전은 업데이트 될 수 있으니 AIX Toolbox에서 확인하는걸 잊지말자.
xargs rpm -iv << EOF
autoconf-2.59-1.aix5.1.noarch.rpm
automake-1.8.5-1.aix5.1.noarch.rpm
binutils-2.14-3.aix5.1.ppc.rpm
gcc-4.2.0-3.aix5.3.ppc.rpm
gcc-cplusplus-4.2.0-3.aix5.3.ppc.rpm
gcc-locale-4.2.0-3.aix5.3.ppc.rpm
libgcc-4.2.0-3.aix5.3.ppc.rpm
libstdcplusplus-4.2.0-3.aix5.3.ppc.rpm
libstdcplusplus-devel-4.2.0-3.aix5.3.ppc.rpm
gdbm-1.8.3-5.aix5.2.ppc.rpm
gdbm-devel-1.8.3-5.aix5.2.ppc.rpm
libtool-1.5.8-2.aix5.1.ppc.rpm
m4-1.4.1-1.aix5.1.ppc.rpm
make-3.80-1.aix5.1.ppc.rpm
EOF


2. PHP 5에서 필요한 패키지 설치 및 확인
xargs rpm -iv << EOF
bzip2-1.0.5-2.aix5.2.ppc.rpm
gd-1.8.4-3.aix5.1.ppc.rpm
gd-devel-1.8.4-3.aix5.1.ppc.rpm
gd-progs-1.8.4-3.aix5.1.ppc.rpm
gettext-0.10.40-8.aix5.2.ppc.rpm
libpng-1.2.8-9.aix5.2.ppc.rpm
libpng-devel-1.2.8-9.aix5.2.ppc.rpm
libjpeg-6b-6.aix5.1.ppc.rpm
libjpeg-devel-6b-6.aix5.1.ppc.rpm
freetype-1.3.1-9.aix5.1.ppc.rpm
freetype-devel-1.3.1-9.aix5.1.ppc.rpm
freetype2-2.1.7-5.aix5.1.ppc.rpm
freetype2-devel-2.1.7-5.aix5.1.ppc.rpm
libxml2-2.6.21-3.aix5.2.ppc.rpm
libxml2-devel-2.6.21-3.aix5.2.ppc.rpm
zlib-1.2.3-4.aix5.2.ppc.rpm
zlib-devel-1.2.3-4.aix5.2.ppc.rpm
EOF
위 패키지는 최소한의 요구 패키지이니 꼭 설치를 해야하며, 필요하면 bash 등도 설치하는게 좋다.


3. Mysql 설치
Mysql은 일반 소스 버전이 아닌 AIX용으로 나오는 파일을 다운받아야한다.
MySQL 유저와 그룹 생성
# mkuser mysql
# mkgroup -A mysql

다운 받은 파일 압축 풀기
# cd /usr/local
# gunzip mysql-standard-5.0.27-aix5.2-powerpc.tar.gz
# tar xf mysql-standard-5.0.27-aix5.2-powerpc.tar

/usr/local/mysql로 링크걸기
# ln -s mysql-standard-5.0.27-aix5.2-powerpc /usr/local/mysql

MySQL 설정하기
# cd /usr/local/mysql
# scripts/mysql_install_db --user=mysql
# chown -R root.mysql .
# chown -R mysql.mysql data
# chgrp -R mysql .
# nohup bin/mysqld_safe --user=mysql &
이것으로 Mysql은 설치 끝이다. 설치라기보단 그냥 압축풀기 정도..


4. Apache Compile
위의 RPM이 설치가 다 되었다면 이제 컴파일 할 차례.
컴파일 전에 권장사항이 있다면, 컴파일시 너무 느린 관계로 컴파일 할때는 bash shell을 이용하도록 하자.
export CONFIG_SHELL=/opt/freeware/bin/bash
export CONFIG_ENV_ARGS=/opt/freeware/bin/bash
테스트 결과 상당히 컴파일이나 MAKE시에 속도 차이가 있으니 꼭 설정 해 주자.
아니면 한 2~3시간동안 놀다오는 수가 생긴다.

아파치 컴파일은 별다른 무리가 없이 설치가 잘되었다.
CC=gcc CXX=gcc ./configure -C --enable-so --prefix /usr/local/apache --with-included-apr


5. PHP compile
문제가 되는 것은 PHP의 make!!

export PATH=/opt/freeware/bin:$PATH

./configure \
--prefix=/usr/local \
--with-config-file-path=/usr/local/apache/conf \
--with-mysql=/usr/local/mysql \
--enable-shared \
--disable-static \
--enable-maintainer-zts \
--enable-calendar \
--enable-bcmath \
--enable-sockets \
--enable-zip \
--with-gd \
--with-zlib \
--with-libxml-dir=/opt/freeware \
--with-zlib-dir=/opt/freeware \
--with-bz2 \
--with-gettext=/opt/freeware \
--with-jpeg-dir=/opt/freeware \
--with-png-dir=/opt/freeware \
--with-freetype-dir=/opt/freeware

기존의 APACHE APXS를 이용한 so모듈을 생성하기 위해 컴파일 옵션에 아래 항목을 추가했는데...
--with-apxs2=/usr/local/apache/bin/apxs
죽어도 libphp5.so가 생성이 되지 않고 libphp5.a , libphp5.la만 생성이 된다.
결국은 so파일 형식이 아닌 CGI binary 방식으로 컴파일을 하게 된 것이다. 이후 make 와 make install로 PHP 설치를 완료 한다.

6. Config 설정
설치가 완료 된 후 httpd.conf에 php 설정을 해 주자.
ScriptAlias /php5-cgi /usr/local/bin/php-cgi
Action php-cgi /php5-cgi
AddHandler php-cgi .php
so 모듈 생성때와는 다른 설정이니 참조 해 두길 바란다.

7. 문제점
Apache, PHP, Mysql이 설치가 잘 됐는데..
이상하게 PHP에서 Mysql 모듈을 읽어 들이지 못한다. libz.so 파일을 찾는데 일단 Mysql lib디렉토리 안에는 없다! 이 일은 아직 미제다 ㅠ_ㅠ

--> 해결!
/opt/freeware/lib/libz.a 파일을 mysql설치디렉토리/lib 에 넣어주면 된다!!
  | 2011.11.21 18:21
비밀댓글입니다
오류내용)
server/.libs/libmain.a(exports.o).data+0xa44): undefined reference to `apr_os_uuid_get'
collect2: ld returned 1 exit status
make[1]: *** [httpd] Error 1
make[1]: Leaving directory `/opt/httpd-2.2.13'
make: *** [all-recursive] Error 1

해결방법)
아파치 컴파일 시 아래 옵션을 추가 하면 OK!
--with-included-apr

간단하죠!
간혹 로그를 보다보면 쓸모없는 이미지로그 때문에(특히 thumnail) 하루에도 몇 백메가까지 차오르는 것을 봤다.

그런 것을 방지하기 위한 쓸모 없는 로그 안남기는 법!

httpd.conf에 아래와 같이 설정
<IfModule mod_setenvif.c>
        SetEnvIfNoCase Request_URI "\.(gif|jpg|js|css|png|swf|txt|ico)$" do_not_log
        SetEnvIf Remote_Addr "::1" do_not_log
</IfModule>

각 도메인별 로그 부분에서 아래와 같이 설정해주면 된다.

CustomLog uzoogom.com-access_log combined env=!do_not_log


출처 : 대전국제IT교육센터 정성재 강사

 

1. 아파치 웹서버 보안의 개요
리눅스를 사용하는 가장 큰 이유는 웹서버를 운영하기 위해서이다. 이 웹서버를 가능하게 해주는
프로그램이 아파치이다. 가장 많이 쓰이는 아파치 1.3버전의 기초적인 보안에 대해 알아보도록 한다.


2. 보안과 관련있는 httpd.conf 파일의 항목 분석
(1) 태그와 옵션항목분석
   1) 설명: httpd.conf는 <Directory>, <Location>, <Files> 등의 태그를 이용하여 적용범위를
           지정하고 Options 사용하여 그 디렉토리에 권한을 설정한다.
   2) 태그
    ㄱ. <Directory> ~ </Directory> : 현재 서버의 특정디렉토리를 지정할 때 쓴다.
    ㄴ. <Location> ~ </Location> : 특정 서버를 지정할 때 쓴다.
    ㄷ. <Files> ~ </Files> : 현재 서버의 특정파일을 지정할 때 쓴다.
   3) Options
    ㄱ. All : MultiViews를 제외한 모든 옵션을 부여한다.(default 설정값이다.)
    ㄴ. None : 옵션을 주지 않는다.
    ㄷ. ExecCGI : CGI 프로그램을 실행할 수 있도록 한다.
    ㄹ. FollowSymLinks : 심볼릭링크로의 이동을 가능하게 한다.
    ㅁ. Includes : Server Side Includes를 가능하게 한다.
    ㅂ. IncludesNOEXEC : Server Side Includes를 가능하게 하지만 CGI스크립트나 프로그램들은
                        실행할 수 없도록 한다.
    ㅅ. Indexes : 해당 디렉토리안에 DirectoryIndex에 명기된 파일(예를 들면 index.html등)이
                 없을 경우 디렉토리와 파일 목록을 보여준다.
    ㅇ. MultiViews : 유사한 파일이름을 찾아주는 기능을 실행한다. 예를 들면 index라고만 입력하
                    더라도 index.*를 찾아서 보여준다.
    ㅈ. SymLinksIfOwnerMatch: 사용자 아이디와 동일한 링크가 있을 때 심볼릭링크로의 이동을 가능
                             하게 한다.
   4) AllowOverride
    ㄱ. 설명: 이 항목은 클라이언트의 디렉토리 접근 제어에 관한 설정을 나타낸다. 예를 들면 특정
       디렉토리에 접근할 때 해당 디렉토리에 있는 유저 인증파일인 .htaccess를 읽게 되는데, 여기
       를 None으로 설정하면 아파치서버에서 이 파일을 무시하게 된다.
    ㄴ. 값
      None : AllowOverride를 사용하지않는다. 즉 유저 인증파일을 사용하지 않는다.
      All : httpd.conf파일의 AccessFileName 지시자로 설정한 파일을 사용하며 또한 지시자를 사용
           할 수 있다.
      AuthConfig : AccessFileName 지시자에 명시한 파일에 대해서 사용자 인증 지시자 사용을 허락
                  한다. AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType,
                  AuthUserFile, require등을 사용할 수 있다.
      FileInfo : AccessFileName 지시자로 설정한 파일에 대해서 문서 유형을 제어하는 지시자 사용
                을 허락한다. AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument,
                LanguagePriority등을 사용할 수 있다.
      Indexes : AccessFileName 지시자로 설정한 파일에 대해서 디렉토리 Indexing을 제어하는 지시
               자 사용을 허락한다. AddDescription, AddIcon, AddIconByEncoding, AddIconByType,
                DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOpti
                ons, ReadmeName등을 사용할 수 있다.
      Limit : AccessFileName 지시자로 설정한 파일에 대해서 호스트 접근을 제어하는 지시자 사용
             을 허락한다. Allow, Deny, order 등을 사용할 수 있다.
      Options : AccessFileName 지시자에 명시한 파일에 대해서 Options 그리고 XBiHack 등과 같은
               지시자 사용을 허락한다. Options, XBitHack등을 사용할 수 있다.
   5) 사용예
     <Directory "/usr/local/apache/htdocs">

        Options Indexes FollowSymLinks MultiViews
     </Directory>
      => (설명)
          1. Indexes는 index.html등이 없을 때 해당디렉토리의 파일목록이나 디렉토리목록을 웹페
            이지에 보여주는 설정이다. index.html등을 없애고 실행시키면 목록이 보임을 알 수 있
            다. 상당히 위험한 옵션이므로 제거하도록 한다.
          2. FollowSymLinks는 해당디렉토리에 심볼릭링크를 허용한다. /usr/local/apache/htdocs
            로 이동해서 ln -s /etc new(또는 ln -s / list.html같이 해보자)라고 명령내린후에 웹
            브라우저에서 http://localhost/new라고 하면 /etc디렉토리안의 파일들이 보인다. 그중
            에 passwd같은 파일은 다른 사용자들이 볼 수 있으므로 클릭을 하면 현재시스템에 사용
            중인 계정들이 노출된다.
          3. MultiViews는 그냥 비슷한 글자만 쳐도 웹페이지가 열리도록 하는 설정이다. 예를 들면
            웹브라우저에서 http://localhost/index라고 치면 대부분 웹페이지가 보일 것이다.
(2) ErrorDocument 지시자
   1) 설명: 웹서버 구동중에 문제나 에러가 발생하면 Apache는 다음의 4가지 중 1가지 행위를 하게
           된다.
             - 간단한 시스템에서 작성된 에러 메지시 출력
             - 사용자가 수정한 메시지 출력
             - 문제나 에러를 해결하기 위한 로컬 URL을 리다이렉션
             - 문제나 에러를 해결하기 위한 외부 URL을 리다이렉션
           이 중 첫번째가 기본적인 설정이며 나머지를 사용하기 위해서는 필요한 것이 ErrorDocume
           nt 이다.
   2) 사용법
     ErrorDocument error-code document
   3) error-code
    ㄱ. 설명: HTTP 규약(RFC2616)의 10번째 세션 "상태코드 정의"에 자세히 설명되어 있다.
             (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)
    ㄴ. 코드
       1xx : Informational
         100: Continue
         101: Switching Protocols
       2xx : Successful
         200: OK
         201: Created
         202: Accepted
         203: Non-Authoritative Information
         204: No Content
         205: Reset Content
         206: Partial Content
       3xx : Redirection
         300: Multiple Choices
         301: Moved Permanently
         302: Moved Temporarily
         303: See Other
         304: Not Modified
         305: Use Proxy
       4xx : Client Error
         400: Bad Request
         401: Unauthorized
         402: Payment Required
         403: Forbidden
         404: Not Found
         405: Method Not Allowed
         406: Not Acceptable
         407: Proxy Authentication Require
         408: Request Time-out
         409: Conflict
         410: Gone
         411: Length Required
         412: Precondition Failed
         413: Request Entity Too Large
         414: Request-URI Too Large
         415: Unsupported Media Type
       5xx : Server Error
         500: Internal Server Error
         501: Not Implemented
         502: Bad GateWay
         503: Service Unavailable
         504: Gateway Time-out
         505: HTTP Version not supported
   4) 사용예
    ㄱ. ErrorDocument 403 http://kr.yahoo.com
         => 접속이 허락되지 않은 페이지 요청을 http://kr.yahoo.com으로 보낸다. 참고로 이 경우
           에는 access_log에는 403(Forbidden) 상태코드 대신에 302(Moved Temporarily)가 기록된
           다.
    ㄴ. ErrorDocument 404 "요청하신 파일이 존재하지 않습니다.
         => 404(Not Found) 상태코드의 경우에 "요청하신 파일이 존재하지 않습니다."라는 문구를
           출력한다. 설정할 때 쌍따옴표를 앞부분에 하나만 사용한다는 것을 유념해야 한다.
   5) 참고
     ErrorDocument 설정은 웹브라우저에 따라 정확히 작동하지 않을 수도 있다. 특히 인터넷익스플
    로어는 자체 오류메시지로 처리된다.

3. 아파치 설정 보안
(1) 웹문서디렉토리(DocumentRoot)에서 불필요한 문서를 다 지우기
   1) 설명: 소스로 아파치를 설치하게 되면 기본 웹문서가 위치하는 디렉토리가 /usr/local/apache/
           htdocs이다. htdocs 디렉토리에는 아파치관련정보가 들어있는 문서와 공개될 필요가 없는
           문서가 위치하고 있다. 이 문서들을 제거한다.
   2) 방법
     ㄱ. cd /usr/local/apache/htdocs 한뒤에 rm -rf * 로 모두 제거한다.
     ㄴ. 또 다른 방법으로는 httpd.conf에서 DocumentRoot값을 새로운 경로로 지정한다.
(2) 불필요한 CGI 스크립트제거하기
   1) 설명: apache를 설치하면 cgi-bin 디렉토리에 기본으로 CGI스크립트가 설치된다. 이 CGI 스크
           립트가 공격에 이용될 수도 있기 때문에 모두 제거하도록 한다. 특히 초기버전인 경우에
           php.cgi등이 제공되었는데 해킹의 빌미를 제공하였다.
   2) 방법: cgi-bin 디렉토리에 있는 모든 파일을 제거한다.
(3) DocumentRoot에 설정하는 디렉토리 옵션 설정하기
    <Directory "/usr/local/apache/htdocs">
        Options IncludesNoExec
    </Directory>
     => 기본적인 설정을 모두 제거하고 보안과 관련있는 항목만 옵션으로 지정한다.
(4) <Limit> ~ </Limit> 태그 이용하기
   1) 설명: <Limit>태그는 각 디렉토리별로 HTTP Method의 사용여부를 통제하는 태그이다. 파일의
           업로드 및 파일의 수정,삭제를 위해서 사용되는 HTTP Method는 PUT과 POST, DELETE 가 있는데
           이 Method를 제한한다.
   2) 사용예
     <Directory "/home/*/public_html">

        <Limit POST PUT DELETE>
              Require valid-user
        </Limit>
     </Directory>
       => 개인 사용자 홈디렉토리에서 POST, PUT, DELETE Method를 패스워드 파일에 등록된 사용자
         만이 이용가능하도록 제한한 것이다.
(5) 헤더 정보 숨기기
   1) 설명: 클라이언트가 Apache 웹서버에 접속했을 때 웹서버에서느 응답 메시지의 헤더에 웹서버
           버전, 설치된 응용프로그램 등과 같은 정보를 전달한다.
   2) 사용예 - 헤더 정보 확인하기
     [root@www /root]# telnet xxx.xxx.xxx.xxx 80
     Trying xxx.xxx.xxx.xxx...
     Connected to xxx.xxx.xxx.xxx.
     Escape character is '^]'.
     GET / HTTP/1.1

     HTTP/1.1 400 Bad Request
     Date: Sat, 14 Dec 2002 14:24:11 GMT
     Server: Apache/1.3.26 (Unix) PHP/4.2.2
     Connection: close
     Transfer-Encoding: chunked
     Content-Type: text/html; charset=iso-8859-1

Connection closed by foreign host.
      => 이 정보는 공격자에 의해 Apache 웹서버 버전과 구동되고 있는 응용프로그램의 버전을 확인
        하고 알려진 취약점을 이용하여 공격하는데 유용하게 이용될 수 있다.
   3) 헤더 정보 숨기기
    ㄱ. 설명: Apache 웹서버에서는 "ServerTokens"지시자를 수정함으로써 헤더에 의해 전송되는 정
             보를 바꿀 수 있다.
    ㄴ. 사용법
       ServerTokens 키워드
    ㄷ. 키워드와 제공되는 정보
       Prod[ductOnly] : 웹서버 종류만 표기된다. 예) Server:Apache
       Min[imal]: Prod 키워드 제공정보 + 웹서버 버전 예) Server:Apache/1.3.26
       OS: Min 키워드 제공 정보 + 운영체제 예) Server:Apache/1.3.26 (Unix)
       Full: OS 키워드 제공정보 + 설치된 모듈(응용프로그램) 정보
            예) Server: Apache/1.3.26 (Unix) PHP/4.2.2
    ㄹ. 참고: ServerToken은 apache 1.3이상에서 가능하고 ProductOnly키워드는 1.3.12버전 이상에
             서만 사용가능하다. 일반적으로 ServerTokens은 httpd.conf에 명시되어 있지 않는 경우
             가 많다. 이런 경우에는 기본값인 "ServerTokens Full"이 적용되어 모든 정보가 응답
             헤더에 포함되어 클라이언트에게 전송된다. 최소한의 정보를 주기 위해서는
             "ServerTokens Prod"가 좋다.

4. 아파치와 사용자 인증
(1) 개요: 아파치에는 사용자나 호스트 인증과 접근통제를 위한 몇가지 기능이 있다. 특정한 IP주소
          나 서브넷에 따라서 접속을 허락하거나 거부할 수 있고, 사용자 이름과 패스워드에 의해서
          사용자를 인증할 수도 있다.
(2) 사용자 인증의 종류
   1) 기본 사용자 인증: HTTP프로토콜은 기본적으로 인증을 하지 않는 프로토콜이다. 사용자인증에
                       의해 보호되는 자원에 접근하기 위해서는 매번 사용자이름과 패스워드와 같
                       은 인증서를 서버에 보내야만 한다. 하지만 초기 인증을 거친 후 다른 페이
                       지에 접근하기 위해서 매번 사용자 이름과 패스워드를 서버에 전송하는 것
                       은 일반적으로 클라이언트 소프트웨어나 웹브라우저에서 자동으로 이루어진
                       다. 만약 사용자이름이 웹서버의 리스트에 있고, 패스워드가 일치하면 보호
                       된 자원에 접근할 수 있다. 기본적인 인증에서는 패스워드가 암호화되어서
                       저장되지만 클라이언트에서 서버로 전송되지만 클라이언트에서 서버로 전송
                       되는 도중에는 암호화되지 않아 제3자에 의해 도청될 수 있다. 보호된 자원
                       에 접속하는 매 순간마다 ID와 패스워드가 전송되므로 telnet,ftp등 인증을
                       하는 다른 서비스보다 쉽게 도청이 가능하다. 뿐만 아니라 서버에서 클라이
                       언트로 전송되는 어떠한 데이터에 대해서도 암호화가 제공되지 않으므로 내
                       용도 가로채기가 용이하다. 따라서 기밀성이 중요시되는 웹서버에서는 이러
                       한 인증은 권장할 수 없다.
   2) 다이제스트 사용자 인증: 다이제스트 인증은 기본적인 인증과 다르게 네트워크 등의 전송로상
                             에서 패스워드가 평문으로 전송되지 않는다는 점이다. 즉 패스워드를
                             MD5 암호화 해쉬를 시킨 후 전송한다. 다이제스트 인증은 패스워드를
                             암호화해서 전송하고는 있지만 데이터는 평문으로 전송되므로 문제점
                             을 가지고 있고, 또한 모든 웹브라우저가 다이제스트 인증을 지원하지
                             않는다.
   3) DB 인증 모듈: DB 인증 모듈은 사용자이름과 패스워드를 보다 신속하게 확인할 수 있다. 서버
                   에 다수의 사용자 이름과 패스워드가 저장되어 있을 경우 사용자가 데이터에 접
                   근하기 위한 인증과정에 많은 시간이 소모될 수 있다. 일반 파일 시스템이 아닌
                   DB를 이용할 경우 사용자 이름과 패스워드 확인시간을 많이 단축할 수 있다.
(3) 기본 사용자 인증 설정
   1) 기본 설정방법 : 기본 사용자 인증과 다이제스트 사용자 인증의 설정 방법은 매우 유사하다.
                     다음과 같이 두가지 절차를 거쳐 설정할 수 있다.
    ㄱ. 패스워드 파일 생성
    ㄴ. 패스워드 파일을 사용할 수 있도록 Apache 환경 설정
   2) 설정
    ㄱ. 패스워드 파일생성
       [root@www /usr/local/apache/bin]# ./htpasswd -c /usr/local/apache/password posein
       New password:
       Re-type new password:
       Adding password for user posein
        => 패스워드 파일을 처음 생성할 경우에는 -c 옵션을 사용하여 만든다.
       [root@www /usr/local/apache/bin]# ./htpasswd  /usr/local/apache/password prehee
       New password:
       Re-type new password:
       Adding password for user prehee
        => 사용자를 추가할 경우에는 -c 옵션을 빼고 사용하면 된다.만약 -c 옵션을 사용할 경우에
          는 기존의 등독된 사용자들은 지워지므로 주의해야 한다.
       [root@www /usr/local/apache/bin]# cat ../password
       posein:LT30X3txYYEuY
       prehee:/RfZRDXV1N/Eo
        => 패스워드 파일을 확인해보면 사용자ID와 패스워드 필드로 구성되어 있는데, 패스워드
          필드는 암호화되어 저장된다. 또한 두 사용자가 암호를 동일하게 입력해도 암호화된 값
          은 다르게 나타난다.
    ㄴ. 패스워드 파일을 사용가능하기 위한 환경설정(1)
      a. 설명: httpd.conf파일내에서 디렉토리별로 사용자 인증을 하기 위한 설정을 하면 된다.
      b. 방법
        <Directory /home/posein/public_html>
            AllowOverride AuthConfig
        </Directory>

    ㄴ. 패스워드 파일을 사용가능하기 위한 환경설정(2)
      a. 설명: 사용자 인증이 필요한 디렉토리에 아래의 지시자들이 포함된 .htaccess파일을 생성
              한다.
      b. 지시자
        AuthType : 인증형태(Basic 또는 Digest)
        AuthName : 인증영역(웹브라우저의 인증창에 표시됨)
        AuthUserFile : 사용자 패스워드 파일의 위치
        AuthGroupFile : 그룹 파일의 위치(옵션)
        Require : 접근을 허용할 사용자 또는 그룹정의
         예) Require user userid [userid]
             Require group group_name [group_name]
             Require valid-user
      c. 사용법: 앞의 패스워드 파일에 등록된 posein, prehee라는 사용자만을 정해진 디렉토리에
                접속할 수 있도록 설정해보자.
        [posein@www public_html]$ cat .htaccess
        AuthType Basic
        AuthName "Welcome posein's Home
        AuthUserFile /usr/local/apache/password
        Require user posein prehee               // 만약 패스워드파일에 등록된 모든 사용자를
                                                 //접근가능하도록 설정하려면
                                                 //Require valid-user 라고 하면 된다.
   3) 관련명령어
    ㄱ. htpasswd
      a. 설명: 아파치 사용자 인증을 위한 파일을 생성하거나 업데이트를 하는 명령이다.
      b. 사용법
        htpasswd [options] password_file username
      c. options
        -c : 새로운 패스워드 파일을 생성한다.
      d. 사용예
        htpasswd -c /usr/local/apache/password posein
         => password라는 파일을 생성하면서 posein이라는 사용자를 등록한다.
        htpasswd /usr/local/apache/password prehee
         => prehee라는 사용자를 등록한다.
(4) 접근통제
   1) 설명: 클라이언트가 사용하는 호스트의 IP주소나 도메인에 의해서 웹서버의 데이터에 대한
           접근을 통제할 수 있다. 기본적인 서버 설정은 DocumentRoot의 내용에 대해 누구나 접속
           을 허락하도록 설정되어 있다. Apache의 "Allow"와 "Deny"지시자는 사용자 시스템의 호스
           트 이름과 호스트 주소를 근간으로 접속을 허락 또는 차단할 수 있도록 지정할 수 있다.
           또한, "Allow"와 "Deny"지시자를 동시에 사용할 경우 그 순서를 정하는 "Order"지시자를
           사용하여 보다 정교한 정책설정을 할 수 있다.
   2) 사용예
    ㄱ. Order Deny,Allow : Deny지시자가 Allow지시자보다 먼저 검사된다. 접근을 기본적으로 허
                           용된다. 즉 Deny지시자나 Allow지시자에 일치하지 않는 클라이언트의
                           접속을 허용한다.
    ㄴ. Order Allow,Deny : Allow지시자가 Deny지시자보다 먼저 검사된다. 접근을 기본적으로 차단
                           된다. 즉, Deny지시자나 Allow지시자에 일치하지 않는 클라이언트의 접
                           속은 차단한다.
    ㄷ. Order Mutual-failure: Allow 리스트에 있고, Deny리스트에 없는 호스트만 접근을 허용한다.
                             순서는 "Allow,Deny"때와 같다.
     (참고) 일반적인 Firewall이나 라우터의 접근통제 Rule은 순차적으로 비교하다가 최초로 일치하
           는 Rule을 적용하고 그 이후는 비교하지 않지만, Apache에서는 Allow와 Deny를 일단 모두
           비교하고 둘 중에 하나라도 일치할 경우 적용한다는 점에서 차이가 있다. 또한 "Order"
           지시자 사용시 키워드(Allow 또는 Deny)는 콤마(,)에 의해서만 분리되고 공백이 들어가서
           는 안된다.
    ㄹ. Order deny,allow
        deny from all
        allow from 172.16.10
         => "deny from"과 "allow from"지시자는 호스트, 도메인 이름, IP주소, 서브넷마스크를
           가진 주소(예를 들면 172.16.10.0/255.255.255.0), CIDR(Classes InterDomain Routing)
           마스크를 가진 IP주소(172.16.10.0/24)를 사용할 수 있다.
(5) 권한부여
   1) 설명: 권한부여는 특정한 자원에 접근할 사용자 퍼미션이 유효한지를 확인하는 것이다. 어떤
           퍼미션에 의해 허락되고 거부될지는 자원과 그 자원과 관련된 규칙들에 따라서 다양하다.
           각 파일과 디렉토리구조는 다른 접근통제나 사용자인증 방법을 가질 수 있다. 접근통제
           와 사용자 인증방법을 사용하여 각 자원에 대한 다양한 권한을 부여할 수 있다. 가령
           인터넷에서 접속시에는 사용자이름과 패스워드를 확인하고 인트라넷에서 접속시에는
           요구하지 않도록 설정할 수도 있다. 이는 "Satisfy"지시자를 통해서 구현할 수 있다.
   2) 사용법
     Satisfy any | all
      => all은 인트라넷 사용자에 대해 패스워드를 묻지않고 접속이 가능하게 하는 것이고, any는
        인트라넷사용자라도 패스워드를 묻는다.
   3) 사용예
     Order deny,allow
     deny from all
     allow from 172.16.10
     AuthType Basic
     AuthName "Welcome Posein's Home"
     AuthUserFile /usr/local/apache/password
     Require posein prehee
     Satisfy Any
      => AuthName 항목에서 1.3버전에서는 겹따옴표가 앞쪽에 하나이고, 2.0버전에서는 겹따옴표가
        앞뒤로 두개를 써야 한다.
(6) SSL/TLS 인증
   1) 설명: 앞에 열거된 사용자 인증기법들은 모든 웹 컨텐츠를 암호화하지 않는다는 단점이 있다.
           최근 인터넷 뱅킹등과 같이 전송로상에 전송되는 웹컨텐츠 역시 보호되어져야 하는 경우
           가 많다. SSL/TLS는 사용자인증과 웹서버 데이터와 컨텐츠를 암호화하는 수단이다. SSL
           을 지원하기 위해서 Apache는 Mod_SSL 모듈을 가지고 있고, 이 모듈은 SSL v2, v3 그리고
           새로운 TLS을 사용하는 강력한 암호화를 제공한다. 현재 이 모듈은 강력한 128bit암호화
           와 RSA, Diffie-Hellman암호화를 제공한다.
   2) 동작원리: 최초 핸드쉐이크 후에 SSL은 비밀키를 생성하고 이 대칭키 암호화가 데이터 암호화
               를 위해 사용된다. 공개키(비대칭키)는 단말의 신원 인증과 대칭키 교환에 사용된다.
               메시지 무결성은 MAC(Massage Authentication Code)에 의해 제공되고 신뢰된 접속을
               가능하게 한다.
   3) SSL 프로토콜이 제공하는 주요기능
    ㄱ. 사설접속과 데이터 암호화
    ㄴ. 서버에 통신하는 단말 인증
    ㄷ. 신뢰된 접속

4. 아파치의 운영관리
(1) 로그관리
   1) 설명: Apache 로그파일들은 기본적으로 /usr/local/apache/logs디렉토리에 저장된다. 기본 설
           치시에는 access_log와 error_log 2개의 로그파일이 생성된다.
   2) 로그의 형태: 아파치관련 로그는 httpd.conf의 LogFormat이라는 곳에서 정의되어 CustomLog라
                  는 항목을 통해 기록된다.
   3) 로그의 종류
    ㄱ. access_log: 웹서버 접근에 관련된 로그를 기록한다.
       - httpd.conf와의 관련항목
        LogFormat "%h %l %u %t \"%r\" %>s %b" common
         => access_log는 8개의 필드로 구성되어 있다. 8개의 필드를 common으로 정의한다.
           %h : 클라이언트의 IP주소
           %l : 유일한 개인 ID(클라이언트의 ident값)
           %u : 사용자 이름(사용자 인증을 거친 경우 사용자이름)
           %t : 날짜
           %r : Method(GET, PUT, POST 등)
           %>s : URI(Uniform Resource Identifier) - 서버상태
           %b : 전송된 바이트 수
        CustomLog /usr/local/apache/logs/access_log common
          => access_log를 common형태로 저장한다.
       - 로그 예
        203.xxx.xx.xxx - - [31/Dec/2002:18:03:29 +0900] "GET /~posein/ HTTP/1.1" 401 479
        203.xxx.xx.xxx - posein [31/Dec/2002:18:03:32 +0900] "GET /~posein/ HTTP/1.1" 200 94
       - 로그검사시 점검사항
        1. 유효하지 않는 로그인 시도
        2. 제한된 필드에 대한 접속 시도
        3. 존재하지 않는 파일에 대한 접속 시도
        4. 허락되지 않는 PUT(업로드) 시도
        5. 단기간 동안의 동일한 IP주소로 부터의 대량 접속 시도(서비스거부)
        6. 웹서버 예기치 못한 종료와 시작
    ㄴ. error_log: 웹서버의 진단 정보 및 요청 처리과정에서 발생되는 각종 에러에 대한 기록한다.
       - httpd.conf와의 관련항목
        ErrorLog /usr/local/apache/logs/error_log
         => 에러로그를 기록할 위치를 지정한다.
        LogLevel warn
         => 어느정도 수준일 때 로그를 기록할 것인지를 지정한다. 일반적인 유닉스시스템의 syslog
           와 마찬가지로 debug, info, notice, warn, error, crit, alert!, emerg중 하나를 선택할
           수 있다. debug가 심각성이 가장 낮은 수준의 로깅이며, emerg는 심각성이 가장 높은 수
           준의 로깅을 의미한다. "LogLevel"을 debug로 지정할 경우 대단히 사소한 내용도 기록되
           므로 로그의 량이 대단히 늘어나므로 적정한 수준에서 기록되도록 한다.
(2) 보안패치
   1) 설명: 앞서 살펴본 웹서버 관리자에 의한 환경설정상의 문제점으로 인한 공격 가능성과 더불어
           웹서버 자체 또는 웹서버에서 사용하는 어플리케이션 프로그램의 버그로 인한 공격도
           심각하다. 특히, 요즘 극성을 부리고 있는 인터넷 웜의 경우 각 서버에 공통적인 취약점
           을 찾아서 공격하므로 웹서버에 대한 보안 패치는 수시로 이루어져야 한다.
   2) 방법
    ㄱ. 버전별로 취약점의 확인
       http://www.apacheweek.com/security/
    ㄴ. 웹서버의 보안 취약점을 확인할 수 있는 도구의 사용
       Nessus, Whisker등을 이용하여 점검하고 조치한다.
    ㄷ. Apache 웹서버 관련 취약점에 대한 패치를 아래의 사이트에서 받아서 설치한다.
       http://www.apache.org/dist/httpd/patches/
(3) 설정파일 및 데이터백업
   초기 서버 설정 파일들과 이후의 기본적인 설정파일들은 일반에 공개되거나 다른 변화가 일어나기
  전에 백업해서 보관되어야 한다. 또한 시스템 설정이 변경될 때마다 이력관리가 필요하고 다수의
  수정이 있을 경우에는 반드시 백업을 해야 한다. 설정파일뿐만아니라 웹데이터에 대한 백업도 정기
  적으로 이루어져야 한다.

apache thread를 늘리기 위해선 configure 하기 전에 옵션 값을 조정해 놓아야 한다.

apache 1.x 와 2.x는 다른 방식이며, 여기에서는 apache 2.x에 대해서 설명한다.

 

아파치 2.0은 용도에따라서 프로세스 모델을 정의해주어야 됩니다. (유닉스 계열은 컴파일시

--with-mpm={perchild|prefork|worker} 기본값은 아파치 1.3과 같은 prefork 모델입니다.

 

prefork 방식

아파치 1.3 은 포크 가능한 자식 프로세스는 기본값은 256개

apache_1.3.x/src/include/httpd.h 파일에서

#define HARD_SERVER_LIMIT 256

요것을 서버 스펙에 따라서 적당히 늘려줍니다.

 

아파치 2.0 은 역시 포크 가능한 자식 프로세스는 기본값은 256개

httpd2.x/server/mpm/prefork/prefork.c 를 열으셔서

#define DEFAULT_SERVER_LIMIT 256

역시 적당히 늘려줍니다.

 

worker 방식

기본으로 16개의 차일드 프로세스와 그안에 64개의 쓰레드를 생성가능하므로
16*64 = 1024 개의 쓰레드를 생성 할수있습니다.

httpd-2.x/server/mpm/worker/worker.c

기본적으로 생성가능한 차일드 프로세스수 조절
#define DEFAULT_SERVER_LIMIT 16
각 프로세스내에 생성 가능한 쓰레드 수 조절
#define DEFAULT_THREAD_LIMIT 64


perchild 방식

기본으로 8개의 차일드 프로세스와 그안에 64개의 쓰레드를 생성가능하므로
8*64 = 512 개의 쓰레드를 생성 할수있습니다.

httpd-2.0.35/server/mpm/perchild/perchild.c

기본적으로 생성가능한 차일드 프로세스수 조절
#define DEFAULT_SERVER_LIMIT 8
각 프로세스내에 생성 가능한 쓰레드 수 조절
#define DEFAULT_THREAD_LIMIT 64


각자의 서버 스펙에 맞추어서 적절히 조절하시면 됩니다.

요즘 ID, PW를 입력하고 그 정보를 활용하는 모든 웹사이트는 보안서버를 구축하여야 한다.

그래서 우리회사도 무려 5개의 사이트에 적용을 해야하기에 테스트 하기로 했다.

 

스펙)

Cent OS 4.5

Apahce 2.2.4

php 5.2.2

Openssl 0.9.8e

  

인증서 생성하기

1. 개인키 생성

# openssl genrsa -des3 -out SSLtest.key 1024

 Generating RSA private key, 1024 bit long modulus
.............++++++
...++++++
e is 65537 (0x10001)
Enter pass phrase for SSLtest.key: ******
Verifying - Enter pass phrase for SSLtest.key: ******

- 여기 패스워드는 꼭 기억해 두어라!! 나중에 apache를 시작할때 쓰인다.

 

2. CSR 생성

# openssl req -new -key SSLtest.key -out SSLtest.csr

 Enter pass phrase for ssl.key: ******
...
Country Name (2 letter code) [KR]:kr
State or Province Name (full name) [Berkshire]:Seoul
Locality Name (eg, city) [Newbury]:Seodaemungu
Organization Name (eg, company) [My Company Ltd]:dunet
Organizational Unit Name (eg, section) []:
system management
Common Name (eg, your name or your server's hostname) []:www.dunet.co.kr
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ******
An optional company name []: crosscert

 

3. CRS 확인

# openssl req -noout -text -in SSLtest.csr

 Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=kr, ST=Seoul, L=Seodaemungu, O=dunet,
        OU=system management, CN=www.dunet.co.kr
...

 이 crs를 www.crosscert.com나 다른 인증사이트에 입력을하여 TEST인증서를 받을수 있다. 테스트 인증서를 받으면 이메일로 키 값이 날라오는데 그 값을 SSLtest.crt로 저장한다.

 

자. 이제 인증서를 얻었으니 Apache 2.2.4 & OpenSSL을 설치하여 보자.

 

APACHE && Open SSL 설치

1. OpenSSL install

# ./config --prefix=/usr/local/openssl

# make

# make install

(prefix옵션을 주지 않으면 /usr/local/ssl에 인스톨 된다.)

 

2. apache 2.2.4

아파치2.X 부터는 mod_ssl를 자체 내장하고 있기 때문에 따로 설치 해 줄 필요가 없다.

(apache 1.3.X버전은 각각 버전에 맞는 mod_ssl버전을 설치 해 주어야 한다.)

하지만 여기에서 문제가 발생했다. 분명 여러가지 문서에서 하라는대로 옵션을 주었지만, make에서 모두 오류가 나 버린다.

 

./configure --prefix=/usr/local/apache2 --enable-modules=so --enable-rewrite --enable-ssl

 

./configure --prefix=/usr/local/apache2 --enable-mods-shared=most --enable-modules=so --enable-ssl=shared --enable-rewrite

 

./configure --prefix=/usr/local/apache2 --enable-rule=SHARED_CORE --enable-module=so --enable-ssl --enable-module=rewrite --enable-so

./configure --prefix=/usr/local/apache \
--enable-modules=all --enable-mods-shared=most \
--with-mpm=worker --enable-proxy --enable-proxy_http \
--enable-proxy_connect --enable-cache --enable-mem-cache \
--enable-disk-cache --enable-ssl --with-ssl

위에 두가지 방법으로는 나에게는 오류만 뜰 뿐, make가 이루어지지 않기에 맨 마지막으로  옵션으로 겨우겨우 성공.(하루를 고스란히 바쳤다.)

 

# /usr/local/apache2/bin/httpd -l

Compiled in modules:

  core.c

     .

     .

     .

  mod_setenvif.c
  mod_ssl.c
     .

     .

 

mod_ssl.c가 보인다면 설치에 성공을 한 것이다.

 

3. httpd.conf 설정

<Directory />
    Options FollowSymLinks
    AllowOverride None
    #Order deny,allow         -주석처리
    #Deny from all             -주석처리
</Directory>

 

Include conf/extra/httpd-userdir.conf   -주석 해제

Include conf/extra/httpd-ssl.conf        -주석 헤제

 

4. httpd-ssl.conf 설정

<VirtualHost xxx.xxx.xxx.xxx:443>

DocumentRoot "홈페이지 루트 디렉토리"

ServerName 서버도메인:443

SSLCertificateFile /인증서디렉토리/인증서.crt

SSLCertificateKeyFile /인증서디렉토리/인증서키.key

 

위 항목을 찾아서 알맞게 수정해주자.

 

# /usr/local/apache2/bin/apachectl start

Apache/2.2.4 mod_ssl/2.2.4 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server hsk.dunet.co.kr:443 (RSA)
Enter pass phrase: *****(키 생성시 만든 비밀번호를 입력하라!)

OK: Pass Phrase Dialog successful.

 

2.2.4버전에서는 apacheclt startssl을 할 필요가 없이, start만 하면 된다.

 

물론 잊지 말아야 할 것은, https 포트인 443번을 방화벽에서 열어 주어야 한 다는 것이다.

centos 5
apache 2.2.6
tomcat 6.0.14
php 4.4.7
jdk 1.6
mysql 5.1.22 rc
 
스펙은 대충 저러하다. 전부 최신 버전이지만 php만 4점대 버전인것은... 회사에서 요구한거라.
뭐 php 버전은 그다지 중요하지 않으니 상관이 없다.

가장 먼저 각 configure 옵션이다.

* mysql
./configure --prefix=/usr/local/mysql \
--with-unix-socket-path=/usr/local/mysql/tmp \
--with-charset=euckr \
--localstatedir=/usr/local/mysql/data

* apache
./configure --prefix=/usr/local/apache --enable-MODULE=shared --enable-so \
--enable-rewrite --with-mpm=worker
※ 추 후 모듈 올릴 것을 대비하여 DSO방식으로 올리고 mpm를 worker로 사용하였다.

* freetds (mssql과 연동하기 위한 데몬)
./configure --prefix=/usr/local/freetds --with-tdsver=8.0 \
--enable-msdblib --enable-dbmfix --with-gnu-ld \
--enable-shared --enable-static

* php
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs \
--with-config-file-path=/usr/local/apache/conf \
--with-mysql=/usr/local/mysql \
--with-mssql=/usr/local/freetds --with-sybase=/usr/local/freetds \
--with-mod-charset --with-language=korean --with-charset=euc_kr \
--disable-debug --with-xml --enable-magic-quotes --with-gettext --enable-ftp \
--enable-sockets --with-gnu-ld --enable-track-vars \
--enable-module=so

* java
자바의 경우는 그냥 chmod 700으로 주고 실행을 시키면 자동으로 설치가 된다.
/usr/java/jdk1.6.0_03에 설치가 되며 /etc/profile에 환경변수를 넣어주자.

JAVA_HOME=/usr/java/jdk1.6.0_03
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib
export PATH

환경변수 입력수 source /etc/profile 해주는 센스 정도는 챙기자.

* tomcat
압축을 풀고 난뒤에 /usr/local/tomcat 으로 옮기면 설치 완료. 역시나 간단간단.
사실 설치시 중요한건 php설치시 mysql과 mssql을 집어넣는 것 정도이다.
apache와 tomcat을 연동하려면 설치 후에 작업을 해주어야 한다.

[연동 시작]
위와 같이 설치가 끝나면 이제 apache와 tomcat을 연동시켜 보자.
apache와 tomcat을 연동시키기 위해서는 특별한 모듈이하나 필요하다.

http://tomcat.apache.org/download-connectors.cgi

에서 다운을 받는다. 내가 사용한 버전은 jakarta-tomcat-connectors-jk2-src-current.tar.gz
참고로 JK2 Connector 는 2004.11월 이후 개발이 중지되었다. 그리고 보안을 위해 JK1.2.23이상을 사용
하는것이 좋다.(최신버전 1.2.25)

tar xzvf tomcat-connectors-1.2.25-src.tar.gz
cd tomcat-connectors-1.2.25-src/native
./configure --with-apxs=/usr/local/apache/bin/apxs
make
cp apache-2.0/mod_jk.so /usr/local/apache/modules/

httpd.conf 설정

# JK Connection
LoadModule jk_module modules/mod_jk.so
JkWorkerProperty worker.list=ajp13
JkWorkerProperty worker.ajp13.type=ajp13
JkWorkerProperty worker.ajp13.host=localhost
JkWorkerProperty worker.ajp13.port=8009
JkLogFile "logs/mod_jk.log"
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkMount /*.jsp ajp13
JkMount /*.XXX ajp13

*.XXX는 JSP 파일 확장자를 추가하는 부분으로 web.xml를 수정하는 것이다. 굳이 할 필요는 없다.

<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.XXX</url-pattern>
</servlet-mapping>

자 이것으로 apache와 tomcat 연동은 끝이났다.

이제 mssql 연동
/etc/ld.so.conf에
/usr/local/freetds/lib 추가 후 ldconfig를 실행해서 라이브러리를 올려주자.

# vi /usr/local/freetds/etc/freetds.conf
[MyServer70]
        host = 서버아이피
        port = 1433
        tds version = 8.0

만 추가해주면 끝.


!! 추가상황 발생

apache 2.2.6
tomcat 6.0.14

상황은 www.uzoogom.com을 virtual host로 잡았는데 하위 디렉토리의 jsp를 제대로 읽어들이지 못한다.

이전에 말한 apache+tomcat중 2번째 방법으로 연동하였을때,
# JK Connection
LoadModule jk_module modules/mod_jk.so
JkWorkerProperty worker.list=ajp13
JkWorkerProperty worker.ajp13.type=ajp13
JkWorkerProperty worker.ajp13.host=localhost
JkWorkerProperty worker.ajp13.port=8009
JkLogFile "logs/mod_jk.log"
JkLogLevel info
JkMount /*.jsp ajp13

이렇게만 하면 www.uzoogom.com/index.jsp까지는 먹힐지언정
www.uzoogom.com/home/a.jsp같은 경우에는 jsp가 제대로 인식이 안되라.

먼저 httpd.conf에
# JK Connection
LoadModule jk_module modules/mod_jk.so
JkWorkerProperty worker.list=ajp13
JkWorkerProperty worker.ajp13.type=ajp13
JkWorkerProperty worker.ajp13.host=localhost
JkWorkerProperty worker.ajp13.port=8009
JkLogFile "logs/mod_jk.log"
JkLogLevel info

까지만 집어 넣는다.
그리고 httpd-vhosts.conf파일을 열어 virtual host설정부분을 수정한다.
<VirtualHost 211.***.***.***:80>
    ServerAdmin network@dunet.co.kr
    DocumentRoot /usr/local/apache/htdocs/uzoogom
    ServerName www.uzoogom.com
    ErrorLog logs/uzoogom-error_log
    CustomLog logs/uzoogom-access_log common
    JkMount /*.jsp ajp13
    JkMount /abc/*.jsp ajp13
    JkMount /abc/efg/*.jsp ajp13
</VirtualHost>

JKMount부분을 여기에 집어넣는 것이 정답이었다. 여기에서는 /abc/하위 디릭토리의 *.jsp 파일과 /abc/efg/*.jsp의 파일을 읽어들이게 만들었다.

급해서 정규식이 먹히는지는 확인 해보지 않았다.
이걸 적구 테스트 하니 정규식도 잘 먹힌다.

저 3줄때문에 몇 시간을 삽질했는지.....

64bit 리눅스에 apache 컴파일시 오류가 난다.
이유는 간단하다. 64bit 라이브러리와 32bit 라이브러리를 착각하는 경우랄까...
보통은 /usr/lib 32bit용 라이브러리를 먼저 찾아서 컴파일 하려 하기 때문일 것이다.

오류)
/usr/lib/libdb-4.3.so: could not read symbols: File in wrong format
/usr/lib/libexpat.so: could not read symbols: File in wrong format

해결법)
# mv /usr/lib/libexpat.so /usr/lib/libexpat.so~
# mv /usr/lib/libdb-4.3.so /usr/lib/libdb-4.3.so~
# ln -s /lib64/libexpat.so.0.5.0 /usr/lib/libexpat.so  
# ln -s /lib64/libdb-4.3.so /usr/lib/libdb-4.3.so

간단하게 컴파일러가 찾는 곳에다 링크를 해버리면 된다. 하하하하.. 이 얼마나 단순무식명쾌한 짓인가!

./configure 시에 --enable-lib64 --libdir=/usr/lib64 옵션을 줘서 해결해보자(난 이게 편하던데..)

HPUX 64bit apache2 + php5 + oracle DSO방식으로 연동하기

 

오오! 수정 이 후에는 php4 버전도 DSO 모듈로 올라간다ㅜ_ㅜ 만세 

 

먼저 open source를 사용하기 위해선 사전 작업을 해 둬야 한다.

 

작업환경

HP-UX B.11.23 U ia64

Apache 2.2.9

Php 5.2.6

Oracle 9i 64bit

 

 

기본셋팅

 

1) 소스 다운로드 : http://hpux.connect.org.uk/hppd/auto/dependencies.html

 

* HP-UX에서 GCC을 이용한 Apache Php를 연동을 위해서는 반드시 먼저 설치되어야 함!

패키지명

버전

Autoconf

2.59

Automake

1.9.6

Bash

3.1.16

Bison

2.1

Expat

2.2.0

Flex

2.5.4a

Fontconfig

2.3.2

Gawk

3.1.5

Gcc

4.1.0

Gettext

0.14.5

Glib

1.2.10

Gzip

1.3.5

libiconv

1.10

Libtool

1.5.22

Libxml2

2.6.23

M4

1.4.4

Make

3.80

Ncurses

5.5

Perl

5.8.7

Popt

1.7

rsync

2.6.8

Tcltk

8.4.12

Texinfo

4.8

Xpm

3.4

zlib

1.2.3

 

2) 설치방법

- SWINSTALL을 이용한 설치

swinstall –s 절대경로명/파일명

ex) #> swinstall –s /다운로드경로/gcc-3.4.3-sd-11.23.Depot

 

 

APM 설치

 

1) apache configure

./configure --prefix=/usr/local/apache2 --enable-modules=all --enable-so

apache의 경우 기본 perl경로를 /usr/bin에서 찾으니 HPUX는 /opt/perl/bin에 있다. 정상적으로 수정해야

php와 연동이 가능하다.

 

# vi /usr/local/apache2/bin/apxs

1번째라인 수정

#!/usr/bin/perl -w  -> #!/opt/perl/bin/perl -w

 

이것으로 apache는 완료

 

2) php configure

apache는 별 무리 없이 올라가지만, php는 약간의 작업을 해 줘야한다.

oracle 64bit로 설치되어 있지만, php는 컴파일시 32bit의 오라클 라이브러리를 요구하기 때문이다.

 

# vi configure(php5버전에서는 따로 안 해주어도 되는 듯하다!)

(vi 편집기에서 입력) %s/OCI8_DIR\/lib/OCI8_DIR\/lib32/g

 

이후 컴파일을 한다.

 

<<PHP 4버전일 경우>>

# CFLAGS=-pthread LDFLAGS="-lrt -lcl" ./configure --enable-libgcc \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-config-file-path=/usr/local/apache/conf \
--with-oci8=/oracle/ora920/app/oracle/product/9.2.0 \
--with-iconv-dir=/usr/local \
--enable-shared \
--enable-magic-quotes \
--enable-sigchild \
--enable-ftp \
--without-mysql \
--enable-sockets

 

 

<<PHP 5버전일 경우>>

# CFLAGS=-pthread LDFLAGS="-lrt -lcl" ./configure --prefix=/usr/local/php2 \

--with-apxs2=/usr/local/apache2/bin/apxs \

--with-config-file-path=/usr/local/apache2/conf \

--with-oci8=/oracle/ora920/app/oracle/product/9.2.0 \

--enable-shared \

--enable-magic-quotes \

--enable-sigchild \

--without-mysql \
--enable-ftp \

--enable-sockets

 

컴파일 완료 후, 한가지 더 작업을 해줘야 make, make install시 문제가 발생하지 않는다.

(그냥 make 하면 so 모듈을 생성하지 못한다.)

 

# vi libtool(컴파일 완료 후 생성된다.)

deplibs_check_method="어쩌구 저쩌구" 항목을 deplibs_check_method="pass_all"로 수정한다.

 

이 후, make && make install 하면 완료된다.

apache 모듈중 mod_mime 란 모듈에 취약점이 아주 예전에 발견되었다고 한다.

mod_mime는 apache에 내장된(주로 많이 쓰이는) 확장자를 어떠한 이름이든 그 확장자로 인식을 하게 하는 것이다.
쉽게 말해서 .php 같은경우에 .php.uzoogom 이란 파일을 .uzoogom이란 파일의 확장자로 인식하는게 아니라 .php라는 확장자로 인식하여 php로 처리한다. 참 편리한 기능이다.
근데 문제가 되는 것이 무엇이냐면, 기본적으로 xxx.php라는 악성코드 php파일을 만들어서 게시판에 올려서 절대경로로 그 파일을 php로 실행시켜 apache 실행권한을 취득할 수 도 있다는 것... (잼있겠는데)

여튼 이러한 문제점을 미연에 방지하고자 하는 것이 오늘의 목표이다.
가장 쉽게 apache 설정에서 .php만 php로 인식하게 하는 것이다.

httpd.conf파일에 아래와 같이 설정해준다.

아래부분은 주석처리

# AddType application/x-httpd-php .php .php3 .inc .htm .html
# AddType application/x-httpd-php-source .phps

요 부분을 입력
# CGI부분도 해주면 좋다~

<FilesMatch "\.cgi$">
    SetHandler cgi-script
</FilesMatch>

# php 이외에 php3, inc, html, htm 파일도 php 처럼 처리하자
<FilesMatch "\.(php|php3|inc|htm|html)$">
    SetHandler application/x-httpd-php
</FilesMatch>

<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

끝. 참 쉽죠잉.
우주곰:지구곰이 아닙니다.
지구곰이 아닙니다.
Categories (190)
Information (5)
About uzoogom (5)
My Advanced Linux (73)
Learning Linux (96)
OperatingSystem (5)
Databases (4)
Tips! (1)
OpenSource (1)
«   2018/01   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
  1. 2012/12 (2)
  2. 2012/04 (3)
  3. 2012/03 (6)
  4. 2012/02 (6)
  5. 2012/01 (2)