ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CentOS 7] Apache 웹 서버 " 2 "
    Linux/CentOS 2017. 10. 26. 00:37

    6. Apache 모듈 사용


    Apache 웹 서버는 다양한 기능을 제공하는 모듈을 통해 그 기능을 더욱 풍성하게 사용할 수 있다. 이러한 모듈은 서버 관리자의 필요에 따라 언제든지 Apache에 동적으로 포함되거나 제거될 수 있다. 


    6.1 mod_proxy 사용

    mod_proxy는 Apache 서버에서 포워드 프록시[각주:1], 리버스 프록시[각주:2], 그리고 부하 분산 기능을 위해 사용하는 모듈이다. 이 모듈은 내장 모듈이며, httpd 패키지를 설치하면 사용할 수 있다. 여기서 리버스 클라이언트의 요청을 다른 애플리케이션 서버나 다른 웹 서버로 전달할 수 있는 기능을 의미한다.

    a. 설정

    먼저 Apache 서버에서 리버스 프록시 기능 구현을 위해 이 모듈을 사용하기 위한 설정을 해보자. 여기에서 master 노드를 리버스 프록시로 설정하고 node1을 프록시 서버의 요청을 받는 웹 서버로 설정한다. Apache 웹 서버는 다양한 기능을 제공하는 모듈을 통해 그 기능을 더욱 풍성하게 사용할 수 있다. 이러한 모듈은 서버 관리자의 필요에 따라 언제든지 Apache에 동적으로 포함되거나 제거될 수 있다.


    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    1. Master 서버에서(리버스 프록시)
    # mod_proxy가 제공하는 모듈이 정의된 파일을 확인한다. 사용하지 않는 모듈의 경우 #을 추가하면 된다.
    [root@master ~]# vi /etc/httpd/conf.modules.d/00-proxy.conf
    LoadModule proxy_module modules/mod_proxy.so
    ...
    LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
    LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
     
    [root@master ~]# vi /etc/httpd/conf.d/proxy.conf
    <IfModule mod_proxy.c>
    # 이 프록시를 포워드가 아닌 리버스와 게이트웨이 기능을 위해 사용할 경우 off로 설정한다. 
    # 포워드 프록시는 클라이언트의 웹 서비스 요청을 받아서 서버에게 직접 전달하는 기능을 한다.
            ProxyRequests Off    
            <Proxy *>
                    Require all granted    # 모든 네트워크의 접속을 허용하는 접근 제어 지시어다.
            </Proxy>
    # ProxyPass는 원격지의 서버를 로컬의 서버로 일치시키기 위해 사용된다. 여기서 '/'는 주 도메인, 
    # www.chul.com을 의미하며 이 주 도메인에 대한 요청이 들어오면 node1.chul.com으로 본내다는 의미다.
                    ProxyPass / http://node1.chul.com/
    # ProxyPassReverse는 웹 서버가 클라이언트의 요청에 응답할 때 그 헤더의 Location, Content-Locaion, URL을 조정하기 위해 사용하고
    # 즉, 클라이언트가 우회해서 이 리버스 프록시된 웹사이트로 접속하는 것을 방지하기 위해 사용되는데, 위는 응답 헤더의 정보에서 
    # node1.chul.com은 모두 '/' 즉 루트 도메인인 www.chul.com으로 변경하라는 의미다.
            ProxyPassReverse / http://node1.chul.com/
    </IfModule>
     
    # 위 변경 사항들이 적용되도록 Apache 웹 서버를 다시 시작한다. 
    [root@master ~]# systemctl restart httpd
    # 프록시될 node1.chul.com의 IP 주소가 현재 DNS에 등록됐는지 명령어로 확인한다. DNS서버를 사용하지 않는 경우 /etc/hosts를 이용하자.
    [root@master ~]# dig node1.chul.com @127.0.0.1
    ;; QUESTION SECTION:
    ;node1.chul.com.                        IN      A
    ;; ANSWER SECTION:
    node1.chul.com.         86400   IN      A       192.168.80.6
     
     
    2. Node1에서 (웹 서버)
    [root@node1 ~]# yum install -y httpd
    [root@node1 ~]# cat /var/www/html/index.html
    <html>
    <head><title>www.chul.com</title></head>
    <body>
    <div style="width: 100%; font-size: 80px; font-weight: bold; text-align: center;">
            Welcome to our node1.chul.com based on Apache
    </div></body></html>
    [root@node1 ~]# systemctl restart httpd
    cs


    b. 테스트

    이제 브라우저에서 주 도메인 www.chul.cod으로 접속 요청을 하면 이 클라이언트의 요청을 node1.chul.com으로 보내는 리버스 프록시 기능을 테스트한다. 


    c. 부하 분산 테스트

    이번에는 mod_proxy를 사용해 사용자의 요청을 균등하게 배분하는 웹 서버의 부하 분산기능을 테스트한다.

    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
    32
    33
    1. Master 서버에서
    [root@master ~]# vi /etc/httpd/conf.d/proxy.conf
    <IfModule mod_proxy.c>
            ProxyRequests Off
            <Proxy *>
                    Require all granted
            </Proxy>
    # '/'로 요청이 들어오면 분산 기능을 담당하는 balancer로 보내는데, 이름을 지정하고 요청을 분산시키는 방법을 Client 요청 수에 따라 한다고 설정
            ProxyPass / balancer://mycluster lbmethod=byrequests
            <proxy balancer://mycluster>    # 위에서 정의한 balancer의 이름을 생성하고
    # 그 멤버로서 node1 과 node2를 추가한다. 여기서 loadfactor는 요청을 분산시킬 때 그 분산 비율을 결정하는 숫자로서 1~100까지 사용 가능한데,
    # 둘 다 1이므로 사용자의 요청을 50% 대 50%로 분산시키라는 의미가 된다.
                    BalancerMember http://node1.chul.com/ loadfactor=1
                    BalancerMember http://node2.chul.com/ loadfactor=1
            </proxy>
    </IfModule>
     
    [root@master ~]# systemctl restart httpd
     
    [root@master ~]# dig node2.chul.com @127.0.0.1
    node2.chul.com.         86400   IN      A       192.168.80.7
     
    2. node2 에서
    [root@node2 ~]# yum install -y httpd
    [root@node2 ~]# cat /var/www/html/index.html
    <html>
    <head><title>www.chul.com</title></head>
    <body>
    <div style="width: 100%; font-size: 80px; font-weight: bold; text-align: center;">
            Welcome to our node2.chul.com based on Apache
    </div></body></html>
     
    [root@node2 ~]# systemctl restart httpd
    cs


    d. 테스트

    브라우저에서 첫 번째 주 도메인인 www.chul.com으로 접속하면 node1으로 연결 요청이 된다.

    두 번째 연결 요청을 하면 node2로 요청이 전달될 것이다. 이를 통해 사용자의 요청이 균등하게 두 개의 프록시된 웹사이트로 전달되고 있음을 확인할 수 있다.


    6.2 mod_ratelimit 사용

    mode_ratelimit 모듈은 클라이언트에게 데이터를 제공하는 속도를 제한하기 위해 사용된다. 특히 다운로드 디렉토리를 제공할 때 유용하게 사용된다.

    a. 설정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # ratelimit 모듈은 처음에 비활성화돼 있는데, 이를 사용하려면 명령어 vim으로 72번 라인에서 '#'을 제거해 활성화시킨다.
    [root@master ~]# vi /etc/httpd/conf.modules.d/00-base.conf
    72 LoadModule ratelimit_module modules/mod_ratelimit.so
     
    # ratelimit 모듈이 사용할 설정 파일을 명령어 vim으로 생성 
    [root@master ~]# vi /etc/httpd/conf.d/ratelimit.conf
    <IfModule mod_ratelimit.c>
            <Location /download>    # 이 모듈이 적용될 디렉토리를 정의
                    SetOutputFilter RATE_LIMIT    
                    SetEnv rate-limit 500    # 속도를 지정하는데 초당 500KB로 제한
            </Location>
    </IfModule>
     
    # 다운로드를 제공할 디렉토리를 생성
    [root@master html]# mkdir /var/www/html/download
     
    # 임의의 파일을 복사해 다운로드할 수 있도록 허용한다.
    [root@master html]# ls -lF /var/www/html/download
    -rw-r--r--1 root root 663748608 Aug  1 10:47 CentOS-7-x86_64-Minimal.iso
     
    # 변경 사항이 적용되도록 Apache 서버를 재시작한다.
    [root@master html]# systemctl restart httpd
    cs

    b. Ratelimit 모듈 테스트

    다운로드 디렉토리에 파일을 복사한 뒤에 클라이언트 시스템에서 다운로드를 시도하면 다운로드 속도가 500KB 이하에서 이뤄지고 있음을 확인할 수 있다. 


    6.6.3 mod_limitipconn 사용

    한 IP 주소당 접속할 수 있는 동시 접속자 수를 제한하기 위해 사용하는 모듈이다. 이 모듈은 기본 모듈로 Apache 패키지에 포함되지 않고 별도의 패키지를 설치해서 사용해야 한다. 
    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
    32
    # yum으로 이 모듈 패키지를 설치한다.
    [root@master download]# yum install -y mod_limitipconn
     
    # 모듈 패키지를 설치하면 자동 활성화돼 사용하도록 설정돼 있는지 파일을 확인한다.
    [root@master download]# cat /etc/httpd/conf.modules.d/10-limitipconn.conf  | grep -v '#' | grep -v '^$'
    <IfModule mod_status.c>
        ExtendedStatus On
        LoadModule limitipconn_module modules/mod_limitipconn.so
    </IfModule>
     
    # Apache 서버의 모듈로 사용되고 있는 모듈 목록 중에서 이 모듈이 포함돼 있는지 확인한다.
    [root@master download]# httpd -M | grep limit
    limitipconn_module (shared)
     
    # limitipconn 모듈을 적용하기 위해 설정 파일을 생성
    [root@master download]# vi /etc/httpd/conf.d/limitipconn.conf
    MaxConnPerIP 0    # 기본 설정은 제한이 없도록 설정, 모든 디렉토리에 적용할 경우 숫자 0을 제한하기 원하는 숫자로 변경할 수 있다.
    <Location /donwload>    # 동시 접속 IP 제한 기능을 적용할 디렉토리를 정의
            MaxConnPerIP 4    # 최대로 접속 가능한 IP 주소 숫자를 지정
            NoIPLimit text/*    # MIME의 유형인 경우 위의 제한을 적용하지 않는다.
    </Location>
     
    <Location /download2>    # 두 번째 모듈을 적용할 디렉토리 정의
            MaxConnPerIP 3    # 최대로 접속 가능한 IP 주소 숫자를 지정
            OnlyIPLimit application/x-tar    # MIME의 유형이 tar 파일인 경우 위의 내용을 적용하라는 의미.
    </Location>
     
    # 적용될 디렉토리를 생성
    [root@master download]# mkdir /var/www/html/download2/
     
    # 변경 사항들이 적용되도록 
    [root@master download]# systemctl restart httpd
    cs


    b. 테스트

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    # Apache가 제공하는 벤치마킹 툴 명령어 ab에서 텍스트 파일ㅇ린 index.html에 대해 10명의 동시접속자(c)가 총 10개의 요청(n)을 보낼 경우
    [root@master download]# ab -n 10 -c 10 http://www.chul.com/download/index.html
    This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    Benchmarking www.chul.com (be patient).....done
    Server Software:        Apache
    Server Hostname:        www.chul.com
    Server Port:            80
    Document Path:          /download/index.html
    Document Length:        866 bytes
    Concurrency Level:      10
    Time taken for tests:   0.002 seconds
    Complete requests:      10
    Failed requests:        0    # 실패가 없이 모두 성공적으로 전송되고 있다
    Write errors:           0
    Total transferred:      11130 bytes
    HTML transferred:       8660 bytes
    Requests per second:    5099.44 [#/sec] (mean)
    Time per request:       1.961 [ms] (mean)
    Time per request:       0.196 [ms] (mean, across all concurrent requests)
    Transfer rate:          5542.65 [Kbytes/sec] received
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.1      0       0
    Processing:     1    1   0.2      1       1
    Waiting:        0    1   0.3      1       1
    Total:          1    1   0.2      1       1
    Percentage of the requests served within a certain time (ms)
      50%      1
      66%      1
      75%      1
      80%      1
      90%      1
      95%      1
      98%      1
      99%      1
     100%      1 (longest request)
    [root@master download]# file /var/www/html/download/index.html
    /var/www/html/download/index.html: HTML document, ASCII text
     
    [root@master download]# ab -n 10 -c 10 http://www.chul.com/download2/test.tar
    This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    Benchmarking www.chul.com (be patient).....done
    Server Software:        Apache
    Server Hostname:        www.chul.com
    Server Port:            80
    Document Path:          /download2/test.tar
    Document Length:        299 bytes
    Concurrency Level:      10
    Time taken for tests:   1.528 seconds
    Complete requests:      10    # 10명의 사용자가 10개의 요청을 했을 시에 (MaxConnPerIP 3 )
    Failed requests:        3    # 성공한 요청 갯수
       (Connect: 0, Receive: 0, Length: 3, Exceptions: 0)
    Write errors:           0
    Non-2xx responses:      7    # 실패한 요청 갯수
    Total transferred:      1991274464 bytes
    HTML transferred:       1991272493 bytes
    Requests per second:    6.54 [#/sec] (mean)
    Time per request:       1527.906 [ms] (mean)
    Time per request:       152.791 [ms] (mean, across all concurrent requests)
    Transfer rate:          1272724.87 [Kbytes/sec] received
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    1   0.5      1       1
    Processing:    15  476 723.1     34    1528
    Waiting:        4   22  12.0     23      44
    Total:         17  477 723.1     35    1528
    Percentage of the requests served within a certain time (ms)
      50%     35
      66%     45
      75%   1524
      80%   1524
      90%   1528
      95%   1528
      98%   1528
      99%   1528
     100%   1528 (longest request)
    cs




    7. Apache 보안 설정


    Apache 웹 서버는 오랜 역사만큼 많은 취약점이 발견됐고, 또한 많은 공격에도 노출돼 왔다. 이러한 취약점을 제거하고, 다양한 공격에도 불구하고 중단 없이 서비스를 지속적으로 제공하기 위해서 Apache 서버의 여러 보안 관련 설정과 내용에 대한 이해가 있어야 한다. 설정 파일과 모듈을 이용해 Apache 웹 서버의 보안을 강화하고 또한 안전하게 운영하기 위한 몇 가지 방법을 설명해보겠다.


    7.1 Apache 버전 정보 감추기

    Apache 웹 서버의 버전 정보는 잘못된 디렉토리 요청 시 노출된다. 이런 정보는 공격자에 의해서 그 버전의 취약점을 찾아 공격하는 여러 툴에 노출될 위험성이 있으므로, 기본적으로 제공하지 않는 것이 웹 서버 보안 강화에 도움이 된다.

    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
    32
    # curl 명령어로 Apache 웹 서버의 헤더 정보를 보면 아래와 같이 서버 버전 정보가 노출되어 있다.
    [root@master ~]# curl -D- -o /dev/null http://192.168.80.5
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0HTTP/1.1 200 OK
    Date: Fri, 15 Sep 2017 14:32:35 GMT
    Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16
    Last-Modified: Mon, 11 Sep 2017 13:38:13 GMT
    ETag: "c1-558ea09ca425f"
    Accept-Ranges: bytes
    Content-Length: 193
    Content-Type: text/html; charset=UTF-8
     
     
    [root@master ~]# vi /etc/httpd/conf/httpd.conf
    # 아래 지시어는 에러 메시지 노출 시 Footer 라인에 보여주는 메시지로 활성화(on) 돼 있으면 Apache 서버의 버전 정보가 노출된다.
    ServerSignature off
    # 아래 지시어는 클라이언트에게 보내는 응답 헤더에 들어갈 서버의 정보를 지정한다.
    ServerTokens Prod 
    [root@master ~]# systemctl restart httpd
     
    [root@master ~]# curl -D- -o /dev/null http://192.168.80.5
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0HTTP/1.1 200 OK
    Date: Fri, 15 Sep 2017 14:33:52 GMT
    Server: Apache
    Last-Modified: Mon, 11 Sep 2017 13:38:13 GMT
    ETag: "c1-558ea09ca425f"
    Accept-Ranges: bytes
    Content-Length: 193
    Content-Type: text/html; charset=UTF-8
    cs

    ServerTokens의 옵션

    - ServerTokens Prod : Server: Apache

    - ServerTokens Major: Server: Apache/2

    - ServerTokens Minor: Server: Apache/2.4

    - ServerTokens Min: Server: Apache/2.4.6

    - ServerTokens OS: Server: Apache/2.4.6 (Unix)

    - ServerTokens Full or 미지정: Server: Apache/2.4.6 (Unix) PHP/5.3.5


    7.2 DDos 공격 방어와 성능 향상 설정

    Apache 웹 서버를 DDos 공격으로부터 보호하고 그 성능을 향상시키기 위한 몇 가지 설정을 설명한다.

    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
    [root@master ~]# vi /etc/httpd/conf/httpd.conf
    1 MaxRequestWorkers 256
    2 MaxKeepAliveRequests 500
    3 KeepAliveTimeout 5
    4 TimeOut 60
    5 LimitRequestBody 833608
    6 LimitRequestFieldsize 100
    7 LimitRequestFields 40
    8 LimitRequestline 8190
    9 RLimitMEM 20480000
    10 RLimitCPU 30
    ---
    1. Apache 2.3.13 버전 이전의 지시어 MaxClients와 동일한데, 이는 서버 동시 접속가능한 사용자의 숫자를 제한하기 위해 사용되며 
    기본값은 256이다. 사용자 범위가 초과할 경우 ListenBackLog에 설정된 숫자만큼 큐에서 기다리다가 자식 프로세스가 연결이 이뤄진다.
    2. KeepAlive의 값이 On일 경우 사용되며, 한 프로세스가 한 사용자의 요청을 지정한 숫자만큼 처리하기 위해 사용한다. 프로세스가 
    이 숫자를 초과하면 프로세스는 죽고 다시 새로운 프로세스가 그 사용자의 요청을 처리하기 시작한다. 숫자가 0이면 그 요청에 제한이
    없다는 뜻인데, 작은 값보다 큰 값이 서버의 성능 향상에 더 도움이 된다.
    3. KeepAlive가 On으로 설정된 경우 그 시간을 얼마동안 유지할지 결정하는 지시어로서 이 시간 동안 클라이언트로부터 요청이 없을 경우
    종료된다. 기본 값은 5초다. 참고로 KeepAlive는 Apache 서버의 한 프로세스가 한 사용자의 지속적인 요청 작업을 계속 처리할지 결정한다.
    4. 일정한 시간 동안 클라이언트와 데이터 교환이 전혀 없을 경우 서버가 그 접속을 해제하기 위해 사용하는 지시어다.
    5. 웹 서버를 이용한 업로드와 다운로드 용량을 8M로 제한하는 설정인데, 이는 대용량 파일의 업로드와 다운로드를 이용한 서비스 거부 공격,
    즉 Dos를 차단하기 위해 사용한다. 숫자 0인 경우 제한이 없다는 의미이고 최댓값은 2G다.
    6. 클라이언트 HTTP 요청 메시지에서 헤더의 크기를 제한하기 위해 사용한다.
    7. HTTP 요청 메시지에서 헤더 필드의 개수를 제한하기 위해 사용하는데, 기본 값은은 100개다. DDos공격이 발생한다면 숫자를 낮추는 것을 추천
    8. HTTP 요청 라인의 크기를 8190바이트로 제한하는데, 이 요청 라인에는 HTTP 메소드, URL, 프로토콜 버전 정보가 포함돼 있다. 
    Dos와 같은 사용자의 비정상적인 요청을 회피하기 위해 사용될 수 있다.
    9. httpd 자식 프로세스에 의해 시작된 프로세스가 사용할 수 있는 메모리의 크기를 제한하기 위해 사용되는 지시어로 단위는 바이트다. 
    숫자 대신 max로 설정된 경우 운영체제가 허용하는 최대 크기를 사용하게 된다.
    10. httpd 자식 프로세스에 의해 시작된 프로세스가 CPU를 30초 이상 사용하지 못하게 제한하는 설정이다. 숫자 대신 max로 설정 된 경우
    운영체제가 허용하는 최대 시간을 사용할 수 있다.
    cs


    7.3 mod_evasive 사용

    mode_evasive는 공격자가 Apache 서버를 향해 Dos나 DDos 공격, 또는 무차별 대입 공격(Brute Force Attack)을 할 때 이를 회피하기 위한 방법을 제공하는 Apache 모듈이다. 또한 네트워크 관리 및 탐지 툴로도 사용될 수 있으며, 이메일을 통해 리포트를 관리자에게 보낼 수도 있다.

    a. mod_evasive 설정

    mod_evasive는 다른 모듈과 다르게 기본적으로 설치되지 않으며, 사용할 경우 별도로 설치해줘야 한다.

    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
    32
    # yum을 사용해 패키지를 설치한다.
    [root@master ~]# yum install mod_evasive -y
     
    # 설정 파일을 열어서
    [root@master ~]# vi /etc/httpd/conf.d/mod_evasive.conf
    LoadModule evasive20_module modules/mod_evasive24.so
    <IfModule mod_evasive24.c>
    # 정한 시간 내에 같은 페이지에 대해서 요청할 수 있는 최대 숫자이며, 이 숫자를 초과할 경우 IP 주소가 차단 목록에 추가된다. 
        DOSPageCount        5 
    # 정한 시간 내에 같은 IP 주소로부터 웹사이트의 어떤 자원에 대해 요청할 수 있는 최대 숫자를 의미하며, 
    # 이 숫자를 초과할 경우 그 IP 주소가 차단 목록에 추가된다. 
        DOSSiteCount        50 
    # 페이지 카운트를 정의하는 시간으로서 기본으로 1초가 사용된다.
        DOSPageInterval     1 
    # 사이트 카운트를 정의하는 시간으로서 기본으로 1초가 사용된다.
        DOSSiteInterval     1 
    # 클라이언트 IP주소가 차단된 경우 그 접근을 금지할 시간을 정하는데, 단위는 초가 사용된다. 
    # 시간 내에 다시 요청이 올 경우 403(Forbidden)이라는 메시지를 보내게 되고, 이 시간(10초)은 다시 초기화 된다.
        DOSBlockingPeriod   10 
    # 차단 목록에 IP 주소가 추가될 때마다 메일을 보낼 관리자의 주소를 지정한다.
        DOSEmailNotify      admin@jeong.com 
    # mod_evasive가 로그를 저장할 디렉토리를 정의한다.
        DOSLogDir           "/var/log/mod_evasive" 
    # 이 모듈이 적용되지 않을 IP 주소 또는 네트워크 범위를 지정할 수 있다.
        DOSWhitelist   127.0.0.1 
    </IfModule>
     
    # 명령어 mkdir를 사용해 위에서 정의한 디렉토리를 생성
    [root@master ~]# mkdir /var/log/mod_evasive
    # 사용자 Apache가 이 디렉토리에 접근 가능하도록 그 소유권을 변경하고, 변경 사항이 적용되도록 웹 서버를 다시 시작한다.
    [root@master ~]# chown apache.apache /var/log/mod_evasive/
    [root@master ~]# systemctl restart httpd
    cs


    b. mod_evasive 테스트

    테스트를 위해 클라이언트 node에서 Perl 스크립트를 실행해 Dos 공격을 하고, 서버인 master에서 로그를 확인하겠다.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    1. Node1에서 (공격자)
    # 테스트를 위해 패키지를 설치한다.
    [root@node1 ~]# yum install -y epel-release
    [root@node1 ~]# yum install mod_evasive -y
     
    # 테스트용 파일을 열어서 공격할 웨 서버 IP주소와 포트 번호를 지정한다.
    [root@node1 ~]# vi /usr/share/doc/mod_evasive-1.10.1/test.pl
    #!/usr/bin/perl
    # test.pl: small script to test mod_dosevasive's effectiveness
    use IO::Socket;
    use strict;
    for(0..100) {
      my($response);
      my($SOCKET) = new IO::Socket::INET( Proto   => "tcp",
                                          PeerAddr=> "192.168.80.5:80");
      if (! defined $SOCKET) { die $!; }
      #print $SOCKET "GET /?$_ HTTP/1.0\n\n"; -> 기본값이지만 정상적으로 실행되지 않아 아래 라인으로 변경 후 정상동작 됨
      print $SOCKET "GET /?$_ HTTP/1.0\r\nHost:127.0.0.1\r\n\r\n"
     
      $response = <$SOCKET>;
      print $response;
      close($SOCKET);
    }
     
    # perl을 이용해서 스크립트를 실행하면 처음에는 OK라는 메시지가 보이지만 x번째 패킷부터 금지(403)가 됐다는 메시지를 확인 가능
    [root@node1 ~]# perl /usr/share/doc/mod_evasive-1.10.1/test.pl
    HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    ...
    HTTP/1.1 403 Forbidden
    HTTP/1.1 403 Forbidden
    HTTP/1.1 403 Forbidden
    ...

     
    2. Master에서 (웹 서버)
    # 로그를 살펴보면 접속이 차단된 IP주소 목록이 있고 
    [root@master ~]# tail -f /var/log/mod_evasive/dos-192.168.80.6
    5139
    # 로그 messages 파일에서 보면 접속이 금지된 192.168.80.6의 요청이 거부됐다는 메시지를 확인할 수 있다.
    [root@master ~]# tail -f /var/log/messages
    Sep 15 15:49:11 master mod_evasive[5139]: Blacklisting address 192.168.80.6: possible DoS attack.
    cs


    7.4 mod_security 사용

    mode_security는 악의적인 공격자로부터 웹사이트를 보호하기 위해 사용되는 오픈소스 웹 애플리케이션 방화벽 프로그램이다. ModSecurity는 Apache, Nginx, IIS에 정규식을 이용한 룰셋(RuleSet)를 제공해 공격자의 악의적인 요청을 필터링하고 그 요청을 차단함으로써 웹사이트를 안전하게 보호하기 위해 사용되는 모듈이다. ModSecurity가 제공하는 대표적인 기능은 다음과 같다.

    - 정규식에 기초한 필터링 기능 제공

    - URL 인코딩 검증

    - 감사 기능 제공

    - 웹사이트에 대한 실시간 보안 모니터링과 공격 탐지

    - 완전한 HTTP 트래픽에 대한 로그 기능 제공

    - SQL 인잭션과 Dos를 비롯한 다양한 공격으로부터의 방어

    - 취약한 애플리케이션의 중단 없이 패치가 가능한 가상 패치 기능 제공

    a. 설치와 기본 설정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # yum으로 두 개의 패키지를 설치한다.
    [root@master ~]# yum install mod_security httpd-devel -y
     
    # vim으로 ModSecurity가 사용하는 설정 파일을 열어서
    [root@master ~]# vi /etc/httpd/conf.d/mod_security.conf
        # ModSecurity Core Rules Set configuration
    1        IncludeOptional modsecurity.d/*.conf
             IncludeOptional modsecurity.d/activated_rules/*.conf
     
        # Default recommended configuration
    2    SecRuleEngine On 
    3    SecRequestBodyAccess On    
        SecRule REQUEST_HEADERS:Content-Type "text/xml" \
             "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML"
     
    1. modsecurity.d 디렉토리에 저장된 설정 파일과 룰셋 파일을 포함시키고, 여기서 디렉토리는 실제 /etc/httpd/modsecurity.d/를 의미하며 
    이 모듈에서 사용하기 원하는 모든 디렉토리나 파일을 이곳에 생성하면 ModSecurity 모듈이 이 정보를 읽어 들여 사용하게 된다.
    2. ModSecurity 기능을 활성화할지 결정하는데, 탐지만하고 차단하지 않는 경우 DetectionOnly를 On 대신에 사용하고 비활성화할 경우 off를 사용
    3. 클라이언트의 Request 값에서 Body 부분의 검사를 위해 접근 시도를 허용할지 결정
    cs


    b. 룰 작성

    두 번째 과정은 이 모듈 설치 이후 필요한 룰셋을 정의하는 것이다. 이 과정에서 각 웹사이트의 상황에 필요한 룰셋을 정확하게 정의해줘야 한다. 이렇게 수동으로 설정 파일에 룰셋을 생성해 사용하는 경우는 많지 않으며, 대부분 이미 정의된 룰셋을 설치해 그 내용을 각 환경에 맞게 수정해 사용한다. 테스트를 위해 수동으로 룰셋을 생성하고, 이미 생성된 룰셋을 사용하는 방법은 뒤에서 설명한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # vim으로 임의의 룰셋 파일을 생성한다.
    [root@master ~]# vi /etc/httpd/modsecurity.d/activated_rules/ruleset-01.conf
    1     SecDefaultAction "phase:2,deny,log,status:406"
    2     SecRule REQUEST_URI "etc/passwd" "id:'300001'"
    3     SecRule REQUEST_URI "etc/shadow" "id:'300002'"
    4     SecRule REQUEST_URI "\.\./" "id:'300003'"
    5     SecRule ARGS "<[Ss][Cc][Rr][Ii][Pp][Tt]" "id:'300004'"
    6    SecRule ARGS "[Ss][Ee][Ll][Ee][Cc][Tt][[:space:]]+[Ff][Rr][Oo][Mm]" "id:'300005'"
     
    # 구문 검사 후에 생성된 룰셋이 적용되도록 웹 서버를 재시작 한다.
    [root@master ~]# httpd -t
    Syntax OK
    [root@master ~]# systemctl restart httpd
     
    1. 룰셋에 적용되는 기본 동작을 정의한다. 각 요소를 설명하면 다음과 같다. 
    Phase 2 : 생성되는 룰이나 체인이 기본적으로 속하게 되는 처리 단계인데 이 단계는 1~5단계까지 있으며 각 단계의 의미는 아래와 같다.
    deny,log : 아래 생성된 룰에 일치되는 상황이 발생하면 그 요청을 차단하고 내용을 로그에 기록한다. 통과시킬 경우 deny 대신 pass를 사용
    status:406 : 차단된 요청에 대해 'Not Accptable'이라는 HTTP의 406 상태 코드를 보여준다.
    # phase:1 (Request header), phase:2 (Request body), phase:3 (Response header), phase:4 (Response body), phase:5 (logging)
    2. 위에서 정의한 동작이 발생할 룰을 생성한다. 여기서 URI에서 /etc/passwd 파일을 요청하는 경우의 룰 번호로서 ID 30001를 할당한다.
    3. 이 룰은 URI에서 /etc/shadow 파일을 요청하는 경우 ID로 300002로 할당한다.
    4. URI 요청에서 상위 디렉토리로의 이동을 의미하는 ../가 포함되는 경우에 ID 번호로 300003을 할당한다.
    5. 아규먼트에 <SCRIPT 또는 <script가 포함되는 경우에 대해 ID 300004를 할당한다.
    6. 아규먼트에 SQL 구문 SELECT FROM 또는 select from이 포함된 경우 ID 300005를 할당한다.
    cs


    c. 테스트

    앞에서 정의한 룰셋이 잘 작동되는지 테스트를 한다. 도메인과 함께 /etc/passwd 파일을 URI에서 요청할 때 406 상태 에러 메시지를 확인한 경우다.


    URI에서 /etc/shadow 파일을 요청한 경우 406 상태 에러 메시지를 확인한 경우다.


    D. 로그 확인

    룰셋 정의에서 룰에 일치된 경우 로그를 기록한다고 했는데, 알에서 테스트한 내용이 로그에 어떻게 기록되는지 확인하자.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    [root@master ~]# vim /var/log/httpd/error_log
    # /etc/passwd 파일에 대한 ModSecurity 룰에 일치된 클라이언트의 접속이 406 코드 번호와 함께 거부됐고
    [Fri Sep 15 16:59:58.586036 2017] [:error] [pid 5876] [client 192.168.80.1] ModSecurity: Access denied with code 406 (phase 2). 
    Pattern match "etc/passwd" at REQUEST_URI. [file "/etc/httpd/modsecurity.d/activated_rules/ruleset-01.conf"] [line "2"
    [id "300001"] [hostname "www.chul.com"] [uri "/"] [unique_id "WbwHDrgjfeDb69jrumfk8gAAAAQ"]
    # /etc/shadow 파일에 대한 ModSecurity 룰에 일치된 클라이언트의 접속 또한 406 코드 에러와 함께 거부됐다는 로그를 확인할 수 있다.
    [Fri Sep 15 17:00:32.223766 2017] [:error] [pid 5874] [client 192.168.80.1] ModSecurity: Access denied with code 406 (phase 2). 
    Pattern match "etc/shadow" at REQUEST_URI. [file "/etc/httpd/modsecurity.d/activated_rules/ruleset-01.conf"] [line "3"
    [id "300002"] [hostname "www.chul.com"] [uri "/"] [unique_id "WbwHMO4BfXM37YRs-Kw-ywAAAAI"]
     
    # 이번에는 mod_security 모듈이 사용하는 감사 파일을 열어서
    [root@master ~]# vi /var/log/httpd/modsec_audit.log
    [15/Sep/2017:17:08:02 +0000] WbwI8pDPLoEwqdJzRqr3sgAAAAE 192.168.80.1 63714 192.168.80.5 80
    --166e1737-B--
    GET /?../../etc/passwd HTTP/1.1
    Host: www.chul.com
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate
    Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4,hi;q=0.2
    Cookie: __utma=230001870.248753134.1505356866.1505356866.1505356866.1
    __utmz=230001870.1505356866.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmv=230001870.|1=Theme=CleanPeppermintRainbow=1
    --166e1737-F--
    HTTP/1.1 406 Not Acceptable
    Content-Length: 251
    Keep-Alive: timeout=5, max=499
    Connection: Keep-Alive
    Content-Type: text/html; charset=iso-8859-1
    --166e1737-E--
    --166e1737-H--
    # 에러 로그 파일과 동일하게 패턴이 일치된 클라이언트의 접속이 거부됐다는 메시지를 확인할 수 
    Message: Access denied with code 406 (phase 2). Pattern match "etc/passwd" at REQUEST_URI. 
    [file "/etc/httpd/modsecurity.d/activated_rules/ruleset-01.conf"] [line "2"] [id "300001"
    Action: Intercepted (phase 2)    # 그 액션이 phase 2, 즉 Request body에서 발생됐음을 알 수 있다.
    Stopwatch: 1505495282187978 356 (- - -)
    Stopwatch2: 1505495282187978 356; combined=9, p1=2, p2=5, p3=0, p4=0, p5=2, sr=0, sw=0, l=0, gc=0
    Response-Body-Transformed: Dechunked
    Producer: ModSecurity for Apache/2.7.3 (http://www.modsecurity.org/).
    Server: Apache
    Engine-Mode: "ENABLED"
    cs


    e. 룰셋 설치

    앞에서 수동으로 룰을 생성했는데, 이렇게 모든 룰을 생성한다는 것은 매우 번거롭고 어려운 작업이다. 자동으로 이러한 룰을 사용하기 위해 ModSecurity 홈페이지를 방문하면 두 가지 버전, 즉 사용과 무료 버전 룰을 생성해서 제공하는데 여기에선 무료 버전을 다운로드받아 설치하겠다. 이 무료 버전은 OWASP(www.owasp.org)에서 제작해 배포하고 있다.

    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
    32
    33
    34
    # 명령어 yum을 사용해 패키지를 설치하는데, 이 패키지는 OWASP 핵심 룰셋(Core Rule Set)의 이름을 의미한다.
    [root@master ~]# yum -y install mod_security_crs
     
    # 이 패키지는 OWASP에 의해 생성 및 배포되고 있으므로 웹사이트를 방문해 설치된 버전이 최신 버전인지 확인해본다.
    [root@master ~]# rpm -qa | grep mod_security_crs
    mod_security_crs-2.2.9-1.el7.noarch
     
    # 설치된 패키지는 다양한 종류의 설정 파일을 통해 많은 룰을 제공하고 있다. 그런데 이 룰들은 모두 링크가 걸려 있는데
    [root@master ~]# ls /etc/httpd/modsecurity.d/activated_rules/
    modsecurity_35_bad_robots.data               modsecurity_crs_41_sql_injection_attacks.conf
    modsecurity_35_scanners.data                 modsecurity_crs_41_xss_attacks.conf
    modsecurity_40_generic_attacks.data          modsecurity_crs_42_tight_security.conf
    modsecurity_50_outbound.data                 modsecurity_crs_45_trojans.conf
    modsecurity_50_outbound_malware.data         modsecurity_crs_47_common_exceptions.conf
    modsecurity_crs_20_protocol_violations.conf  modsecurity_crs_48_local_exceptions.conf.example
    modsecurity_crs_21_protocol_anomalies.conf   modsecurity_crs_49_inbound_blocking.conf
    modsecurity_crs_23_request_limits.conf       modsecurity_crs_50_outbound.conf
    modsecurity_crs_30_http_policy.conf          modsecurity_crs_59_outbound_blocking.conf
    modsecurity_crs_35_bad_robots.conf           modsecurity_crs_60_correlation.conf
    modsecurity_crs_40_generic_attacks.conf      ruleset-01.conf
     
    # 본래의 파일들은 모두 이 디렉토리에 저장돼 있다.
    [root@master ~]# ls /usr/lib/modsecurity.d/base_rules/
    modsecurity_35_bad_robots.data               modsecurity_crs_41_sql_injection_attacks.conf
    modsecurity_35_scanners.data                 modsecurity_crs_41_xss_attacks.conf
    modsecurity_40_generic_attacks.data          modsecurity_crs_42_tight_security.conf
    modsecurity_50_outbound.data                 modsecurity_crs_45_trojans.conf
    modsecurity_50_outbound_malware.data         modsecurity_crs_47_common_exceptions.conf
    modsecurity_crs_20_protocol_violations.conf  modsecurity_crs_48_local_exceptions.conf.example
    modsecurity_crs_21_protocol_anomalies.conf   modsecurity_crs_49_inbound_blocking.conf
    modsecurity_crs_23_request_limits.conf       modsecurity_crs_50_outbound.conf
    modsecurity_crs_30_http_policy.conf          modsecurity_crs_59_outbound_blocking.conf
    modsecurity_crs_35_bad_robots.conf           modsecurity_crs_60_correlation.conf
    modsecurity_crs_40_generic_attacks.conf
    cs


    f. ModSecurity 제외

    현재 웹 서버가 가상 호스트를 제공하는 경우 가상 호스트에서 이 ModSecurity 모듈을 사용하지 않기 위한 방법이다.

    1
    2
    3
    4
    5
    # 가상 호스트 설정 파일을 열어 ModSecurity 모듈을 지정하고
    [root@master ~]# vi /etc/httpd/conf.d/vhost.conf
    <IfModule mod_security.c>
            SecRuleEngine Off    # 이 모듈을 비활성화한 다음 Apache 웹 서버를 다시 시작한다.
    </IfModule>
    cs




    8 WordPress 설치


    WordPress는 사용자들에게 가장 인기 있는 오픈소스 CMS(Content Management System) 프로그램 중 하나며, PHP와 MySQL/MariaDB 기반에서 운영된다. WordPress는 2015년까지 6천만 개 이상의 웹사이트에 적용될 정도로 인기가 많은데, 그 제작자인 Matt Mullenweg와 Mike Little에 의해 2003년 처음 GPLv2 라인선스하에서 배포가 시작됐다. WordPress가 제공하는 블로그 기능을 통해 다양한 기능의 웹사이트를 생성할 수 있다. Apache 서버 기반에서 CMS 프로그램 WordPress 설치 방법을 이번 절에서 차례대로 설명한다. 


    8.1 데이터베이스 설치

    a. PHP와 MariaDB 설치

    WordPress는 PHP와 MariaDB 또는 MySQL 같은 데이터베이스가 필요하다. 그래서 설치전에 이러한 프로그램들을 설치하고 서비스를 시작해줘야 한다. 

    1
    2
    3
    4
    5
    6
    7
    8
    # yum을 사용해 php 관련 패키지를 설치한다.
    [root@master ~]# yum install -y php php-mbstring php-pear
     
    # yum을 사용해 mariadb 서버 패키지를 설치한다.
    [root@master ~]# yum install -y mariadb-server
     
    # MariaDB 서버를 시작한다.
    [root@master ~]# systemctl start mariadb
    cs


    b. MariaDB 설정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # root로 MariaDB 서버에 접속한다.
    [root@master ~]# mysql -u root -p
    Enter password:
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 12
    Server version: 5.5.56-MariaDB MariaDB Server
    Copyright (c) 20002017, Oracle, MariaDB Corporation Ab and others.
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
     
    # WordPress가 사용할 데이터베이스를 SQL로 생성한다.
    MariaDB [(none)]> create database wordpress;
    Query OK, 1 row affected (0.00 sec)
     
    # 데이터베이스에 접속 가능한 사용자 wordpress와 그 패스워드를 정의하고 모든 권한을 부여한 뒤에 빠져 나온다.
    MariaDB [(none)]> grant all privileges on wordpress.* to 'wordpress'@'localhost' identified by 'wordpress';
    Query OK, 0 rows affected (0.00 sec)
     
    MariaDB [(none)]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
     
    MariaDB [(none)]> exit
    Bye
    cs


    8.2 WordPress 설치

    PHP와 MariaDB의 설치 및 설정이 모두 끝났으므로 WordPress를 설치하고 그 설정을 해야 한다. 이후에 나머지 설정은 모두 브라우저에서 마치게 된다.

    a. 서버 설정

    앞의 데이터베이스 설정에서 생성한 정보를 이곳에 입력해줘야 한다.

    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
    # yum으로 패키지를 설치
    [root@master ~]# yum install wordpress -y
     
    # WordPress의 설정 파일을 열어서
    [root@master ~]# vi /etc/wordpress/wp-config.php
    /** The name of the database for WordPress */
    #define('DB_NAME', 'database_name_here');
    define('DB_NAME''wordpress');    # Mariadb에서 생성한 데이터베이스 이름을 입력
     
    /** MySQL database username */
    #define('DB_USER', 'username_here'); 
    define('DB_USER''wordpress');    # 데이터베이스에 권한이 있는 사용자의 이름을 입력
     
    /** MySQL database password */
    #define('DB_PASSWORD', 'password_here');
    define('DB_PASSWORD''wordpress'); # 인증에 필요한 사용자의 패스워드를 입력
     
    # Apache 웹 서버가 인식할 설정 파일을 열어서
    [root@master ~]# vi /etc/httpd/conf.d/wordpress.conf
    # WordPress 패키지를 설치하면 기본적으로 모든 파일이 /usr/share/wordpress에 저장된다. 그리고 기본적으로 Alias가 /wordpress로
    # 돼 있어서 브라우저에서 www.chul.com/wordpress로 접근하면 위 디렉토리에 저장된 데이터에 접근하게 된다. 주 도메인 www.chul.com에
    # WordPress를 설치하려면 /usr/share/wordpress의 모든 파일을 /var/www/html로 복사하거나 설정 파일에서 Document Root의 경로 수정이 필요
    Alias /wordpress /usr/share/wordpress
    Require all granted    # 모든 네트워크의 접근을 허용하기 위한 한줄을 추가한다.
     
    [root@master ~]# systemctl restart httpd
    cs


    b. 웹에서 설정

    1. 브라우저로 접속하기 : 브라우저에서 주 도메인 또는 IP 주소와 wordpress 디렉토리를 이용해 접속한 후 기본 정보를 입력한다. 사이트 이름, 관리자 이름과 패스워드, 그리고 이메일 주소를 입력한 다음에 아래의 Install 버튼을 클릭한다.


    2. 성공 화면



    3. 초기 화면 접속

    WordPress에 접속한 후에 웹사이트 최적화에 대한 자세한 정보는 WordPress 공식 웹사이트 또는 인터넷 문서를 참고 해야한다. 테스트를 위해 바이너리 RPM 파일을 사용했는데, 최신 버전의 WordPress를 설치하기 원하면 공식 웹사이트에서 소스파일을 다운로드해서 설치해보길 추천한다.




    9. Piwik - GUI 이용 웹사이트 분석


    웹사이트에 대한 클라이언트의 활동과 기록을 GUI를 이용해 체계적으로 분석하기 위한 프로그램으로서 Piwik를 소개한다. Piwik는 오픈소스 웹사이트 분석 프로그램으로서 사용자의 방문지 위치와 방문자가 사용한 브라우저의 종류, 그리고 사용한 운영체제의 종류 및 방문자가 머문 시간, 또한 그들이 어떠헌 활동을 웹사이트에서 했는지 리포트로 관리자에게 제출할 수 있다. 이를 통해 관리자는 웹사이트에 대한 자세한 분석을 통해 효 과적인 방문자 관리를 할 수 있다. 


    9.1 Piwik 설치

    Piwki를 사용하려면 먼저 데이터베이스와 PHP가 작동되고 있어야 한다. 

    a. 데이터베이스 설정

    Piwik를 사용하기 위한 첫 번째 과정은 데이터베이스를 생성하는 것이다. 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [root@master ~]# mysql -u root -p
    Enter password:
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 2
    Server version: 5.5.56-MariaDB MariaDB Server
    Copyright (c) 20002017, Oracle, MariaDB Corporation Ab and others.
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
     
    # MariaDB를 설치하고 사용자 root로 접속한 후에 SQL을 이용해 Piwik를 위한 데이터베이스를 생성
    MariaDB [(none)]> create database piwik;
    Query OK, 1 row affected (0.00 sec)
     
    # 사용자 및 패스워드를 생성하고 데이터베이스에 대한 모든 권한을 이 사용자에게 부여한 후 데이터베이스에서 빠져나온다.
    MariaDB [(none)]> grant all privileges on piwik.* to piwik@'localhost' identified by 'woghks0652';
    Query OK, 0 rows affected (0.00 sec)
     
    MariaDB [(none)]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
     
    MariaDB [(none)]> exit
    Bye
    cs


    b. Piwik 설치

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # Piwik를 설치하기 전에 실행에 필요한 프로그램을 명령어로 설치한다.
    [root@master ~]# yum install php-pdo php-gd php-xml -y
     
    # PHP가 사용할 최대 메모리를 기존 128M에서 512M로 변경한다.
    [root@master ~]# vi /etc/php.ini
    #memory_limit = 128M
    405 memory_limit = 512M
     
    # wget을 사용해 최신 버전의 Piwik 프로그램을 웹 서버 디렉토리에 다운로드한다.
    [root@master ~]# wget http://piwik.org/latest.zip -P /var/www/html/
     
    # 압축된 패키지를 해제한다.
    [root@master ~]# unzip /var/www/html/latest.zip -d /var/www/html/
     
    # chown을 이용해 tmp,config 디렉토리 소유권을 apache로 변경한다.
    [root@master html]# chown -R apache.apache /var/www/html/piwik/tmp/
    [root@master html]# chown -R apache.apache /var/www/html/piwik/config
    [root@master html]# chmod +w /var/www/html/piwik/piwik.js [root@master html]# chown apache.apache /var/www/html/piwik/piwik.js


    9.2 브라우저에서 Piwik 설정

    a. 환영 인사


    b. 시스템 체크

    piwik 설치에 필요한 시스템이 제대로 설치되거나 준비됐는지 검사하는 과정이다. 에러 메시지를 발견할 경우 그것을 먼저 해결하고 넘어가자.


    c. 데이터베이스 설치


    d. 테이블 생성

    업그레이드 문제가 발생하는 경우 테이블 piwik_user_language가 생성됐는지 확인하는 것이 중요하다.


    e.슈퍼유저 생성

    관리자는 기존 시스템에 등록된 사용자가 아니어도 상관없으니, 임의의 사용자를 여기서 생성하고 그 패스워드를 생성할 수 있다.


    f. 웹사이트 설정


    g. 추적 코드 복사

    추적 코드를 제공하는데, 이 코드를 분석하기 원하는 모든 페이지에 삽입하면 Piwik가 이 코드로부터 정보를 가져와서 전체 대시보드에서 관리자에게 제공한다. 이 코드는 자바스크립트이며, 각 html 페이지의 /head 태그 이전에 사용돼야 한다.


    h. 설치 완료


    i. 업그레이드

    설치 완료된 후에 데이터베이스 업그레이드 과정이 나타날 수 있다. 자동 업그레이드를 진행하는데, 업그레이드를 해도 동일한 에러 메시지가 수회 나타나는 경우 모든 데이터베이스와 소스 디렉토리를 삭제하고 다시 진행하기 바란다.


    j. 관리자 로그인

    성공적으로 설치를 완료했다면 관리자 로그인 화면이 나타난다.


    k. 대시보드 접속

    대시보드에 접속하고 여기서 Piwik가 제공하는 다양한 정보를 확인할 수 있다. 사용자들은 방문 기록과 활동 기록을 실시간으로 확인할 수 있다.


    1. 클라이언트가 example.com 에 연결하려고 하면 사용자 PC 가 직접 연결하는게 아니라 포워드 프록시 서버가 요청을 받아서 example.com 에 연결하여 그 결과를 클라이언트에 전달(forward) 해 준다. 포워드 프록시는 대개 캐슁 기능이 있으므로 자주 사용되는 컨텐츠라면 월등한 성능 향상을 가져올 수 있으며 정해진 사이트만 연결하게 설정하는 등 웹 사용 환경을 제한할수 있으므로 기업 환경등에서 많이 사용한다. [본문으로]
    2. 클라이언트가 example.com 웹 서비스에 데이타를 요청하면 Reverse Proxy는 이 요청을 받아서 내부 서버에서 데이타를 받은후에 이 데이타를 클라이언트에 전달하게 된다. 내부 서버가 직접 서비스를 제공해도 되지만 이렇게 구성하는 이유는 보안때문이다. 보통 기업의 네트워크 환경은 DMZ 라고 하는 내부 네트워크와 외부 네트워크 사이에 위치하는 구간이 존재하며 이 구간에는 메일 서버, 웹 서버, FTP 서버등 외부 서비스를 제공하는 서버가 위치하게 된다. 이때문에 리버스 프락시 서버를 두고 실제 서비스 서버는 내부망에 위치시키고 프락시 서버만 내부에 있는 서비스 서버와 통신해서 결과를 클라이언트에게 제공하는 방식으로 서비스를 하게 된다. [본문으로]

    'Linux > CentOS' 카테고리의 다른 글

    [CentOS 7] NFS 서버  (0) 2017.12.02
    [CentOS 7] Nagios 서버  (0) 2017.10.31
    네트워크  (0) 2017.09.12
    [CentOS 7] Apache 웹 서버 " 1 "  (0) 2017.09.11
    [CentOS 7] Firewalld 방화벽  (5) 2017.08.23

    댓글

작은거인's Blog / Designed by TISTORY