apache 웹 서버 보안 강화하기 : 8가지 필수 설정

Apache 기본 보안 설정

Apache는 가장 널리 사용되는 웹 서버 중 하나입니다.
그러나 Apache를 설치하고 사용하기만 한다면 보안상의 취약점이 있을 수 있습니다.
이 포스팅에서는 Apache의 기본 보안 설정에 대해 알아보겠습니다.

1. 서버 정보 숨기기

웹 페이지의 헤더와 404 에러페이지에서 서버에서 사용하고 있는 OS 버전/ OS 정보가 노출되었다면, 공격자에게 힌트를 주게 됩니다.
이런 서버 정보를 숨기기 위해서는 ServerTokens 설정을 수정해야 합니다.

ServerTokens 설정은 HTTP response의 HTTP Header에 노출되는 서버 정보를 얼마나 보여줄 것인가를 설정할 수 있습니다.
설정 값은 Full, OS, Minimal, Minor, Major, Prod 이 있습니다.

  • Full : Apache/2.4.18 (Ubuntu) / PHP …
  • OS : Apache/2.4.18 (Ubuntu)
  • Min : Apache/2.4.18
  • Minor : Apache/2.4
  • Major : Apache/2
  • Prod : Apache

ServerTokens 설정은 OS별로 다음과 같은 파일에서 수정할 수 있습니다.

  • 우분투 : /etc/apache2/conf-available/security.conf
  • CentOS : /etc/httpd/conf/httpd.conf

설정 파일 내 ServerTokens 를 Prod로 수정하고 아파치를 재시작하면, 서버 정보가 최소한으로 노출됩니다.

2. 디렉토리 인덱싱 차단
디렉토리 인덱싱 차단은 이전 포스팅에서도 한번 언급했던 것입니다. (이전 포스팅 보기)
디렉토리 인덱싱은 웹 서버에 있는 파일과 폴더의 목록을 보여주는 기능으로 이 기능이 활성화되어 있다면, 공격자는 웹 서버의 구조와 파일을 쉽게 파악할 수 있습니다.
따라서 디렉토리 인덱싱을 차단하는 것이 좋습니다.

디렉토리 인덱싱을 차단하기 위해서는 /etc/apache2/apache2.conf 파일에서 Options 부분에 있는 Indexes 를 제거해야 합니다.

예를 들어, 다음과 같이 웹 루트 디렉토리의 Options에 Indexes가 있다면,

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

다음과 같이 Indexes를 지워줍니다.

<Directory /var/www/>
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

이렇게 하고 아파치를 재시작하면, 디렉토리 인덱싱을 시도할 시 403 에러를 출력합니다.

3. 심볼릭 링크 차단

심볼릭 링크는 한 파일이나 디렉토리를 다른 파일이나 디렉토리로 가리키는 것입니다.
심볼릭 링크가 웹 루트 위에 있는 파일이나 디렉토리를 가리킨다면, 웹 사용자는 웹 루트에서 벗어난 곳에 접근할 수 있게 됩니다.

예를 들어, 웹 루트에 루트로 연결되는 심볼릭 링크가 있다면,

$ ls -l /var/www/
total 0
lrwxrwxrwx 1 root root 1 Mar 28 14:00 root -> /

웹 사용자는 웹 루트에서 root라는 디렉터리로 이동할 시, 해당 서버의 / (루트) 디렉터리를 열람할 수 있게 됩니다.

심볼릭 링크를 차단하기 위해서는 /etc/apache2/apache2.conf 파일에서 FollowSymLinks 옵션을 지워줘야 합니다.

예를 들어, 다음과 같이 웹 루트 디렉터리의 Options에 FollowSymLinks가 있다면,

<Directory /var/www/>
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

다음과 같이 FollowSymLinks를 지워줍니다.

<Directory /var/www/>
    Options None
    AllowOverride None
    Require all granted
</Directory>

이렇게 하고 아파치를 재시작하면, 심볼릭 링크로 서버 루트 위의 파일이나 디렉터리를 열람할 수 없게 됩니다.

4. 웹 서버 프로세스 권한 제한

웹 서버 프로세스는 웹 서버가 실행되는 프로그램입니다.
웹 서버 프로세스가 root 권한으로 실행될 경우, 웹 어플리케이션 취약점 등으로 root 권한을 취득하게 될 수 있습니다.
그러므로 웹 서버 프로세스의 권한을 제한하는 것이 필요합니다.

웹 서버 프로세스의 권한을 제한하기 위해서는 다음과 같은 단계를 거쳐야 합니다.

웹 서버 데몬을 실행할 사용자를 만들어 줍니다.
해당 사용자는 쉘 권한이 필요 없으므로, 불필요한 쉘 권한을 주지 않기 위해 -s 옵션을 사용합니다.

$useradd -s /sbin/nologin 사용자명

이렇게 생성된 사용자는 SSH로 접속할 수 없고, FTP 접속만 가능해집니다.

/etc/apache2/apache2.conf 파일에서 User와 Group을 위에서 만든 사용자와 그룹으로 설정합니다.

User 사용자명
Group 그룹명

아파치를 재시작합니다.

5. HTTP Method 제한

HTTP Method는 클라이언트가 서버에 요청하는 방식입니다.
HTTP Method에는 여러가지 종류가 존재합니다.

예를 들어,

  • GET : 리소스를 조회하는 메소드
  • POST : 리소스를 생성하는 메소드
  • PUT : 리소스를 수정하는 메소드
  • DELETE : 리소스를 삭제하는 메소드
  • HEAD : 리소스의 헤더만 조회하는 메소드
  • OPTIONS : 리소스가 지원하는 메소드를 확인하는 메소드
이 중 불필요한 Method는 웹 서버에서 사용할 수 없게 제한을 두는 것이 좋습니다.

HTTP Method를 제한하기 위해서는 /etc/apache2/apache2.conf 파일에서 Limit와 LimitExcept 옵션을 사용합니다. 
Limit 옵션은 해당 메소드에 대한 설정이고 LimitExcept는 해당 메소드를 제외한 메소드에 대한 설정입니다.

예를 들어, GET과 POST 메소드만 허용하고 나머지 메소드는 거부하고 싶다면 다음과 같이 설정합니다.

<LimitExcept GET POST>
    Order deny,allow
    Deny from all
</LimitExcept>

이렇게 하고 아파치를 재시작하면, GET과 POST 메소드만 정상적으로 응답하고 나머지 메소드는 차단합니다.

6. 에러페이지 설정

웹 서버에서 존재하지 않는 파일이나 권한이 없는 디렉터리를 요청할 때, 뜨는 404 에러와 403 에러 페이지입니다.
이런 에러 페이지에는 웹 서버의 버전이나 OS 정보 등이 노출될 수 있습니다.
이런 정보는 공격자에게 힌트가 될 수 있으므로, 에러 페이지를 커스텀하거나 숨기는 것이 좋습니다.

에러 페이지를 설정하기 위해서는 /etc/apache2/conf-available/security.conf 파일에서 ErrorDocument 옵션을 사용합니다.
ErrorDocument 옵션은 에러 코드와 그에 해당하는 페이지를 지정할 수 있습니다.

예를 들어, 404 에러와 403 에러에 대해 간단한 메시지를 출력하고 싶다면 다음과 같이 설정합니다.

ErrorDocument 404 "Not Found"
ErrorDocument 403 "Forbidden"

이렇게 하고 아파치를 재시작하면, 404 에러와 403 에러 페이지가 커스텀된 것을 확인할 수 있습니다.

7. SSL 프로토콜 및 알고리즘 설정

해당 내용은 이전에 자세히 포스팅 한 것이 있기때문에 링크로 대체합니다. (이전 포스팅 확인하기)

8. http 접속 시 https 리다이렉트

http(HyperText Transfer Protocol)는 웹 서버와 클라이언트 간의 통신 규약입니다.
http는 텍스트 기반의 프로토콜이므로, 통신 내용이 평문으로 노출됩니다.
이런 통신 내용에는 중요한 정보가 포함될 수 있으므로, 보안상의 문제가 발생할 수 있습니다.

http 대신 https(HyperText Transfer Protocol Secure)를 사용하면 통신 내용을 암호화할 수 있습니다.
https는 http와 달리 SSL 인증서가 필요한데, https를 사용하면 중간자 공격이나 데이터 변조 등을 방지할 수 있습니다1.

http 접속 시 https로 리다이렉트하려면 /etc/apache2/sites-available/000-default.conf 파일에서 RewriteEngine과 RewriteRule 옵션을 사용합니다.
RewriteEngine 옵션은 URL 재작성 기능을 활성화하는 것이고, RewriteRule 옵션은 URL 재작성 규칙을 지정하는 것입니다.

예를 들어, 다음과 같이 설정하면 http 접속 시 https로 리다이렉트합니다.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond 옵션은 URL 재작성 조건을 지정하는 것입니다.
위의 예제에서는 HTTPS가 off일 때만 URL 재작성 규칙을 적용하도록 하였습니다.

RewriteRule 옵션은 URL 재작성 규칙을 지정하는 것입니다.
위의 예제에서는 모든 요청(^.*$)에 대해 https://%{HTTP_HOST}%{REQUEST_URI} 로 리다이렉트하도록 하였습니다.
[L,R=301]은 마지막 규칙(L)이며, 301 Moved Permanently 응답 코드(R=301)를 반환하도록 하였습니다.

이렇게 하고 아파치를 재시작하면, http 접속 시 https로 리다이렉트됩니다.

결론

Apache는 가장 널리 사용되는 웹 서버 중 하나입니다.
그러나 Apache를 보안적으로 안전하게 사용하기 위해서는 몇 가지 설정을 해줘야 합니다.
이 포스팅에서는 Apache의 기본 보안 설정에 대해 알아보았습니다.

Apache의 기본 보안 설정은 다음과 같습니다.

  • 서버 정보 숨기기 : ServerTokens 옵션을 Prod로 설정하여 서버 정보를 최소화합니다.
  • 디렉토리 인덱싱 차단 : Options 옵션에서 Indexes를 제거하여 디렉토리 인덱싱을 방지합니다.
  • 심볼릭 링크 차단 : Options 옵션에서 FollowSymLinks를 제거하여 심볼릭 링크를 통한 접근을 차단합니다.
  • 웹 서버 프로세스 권한 제한 : User와 Group 옵션을 쉘 권한이 없는 사용자와 그룹으로 설정하여 웹 서버 프로세스의 권한을 제한합니다.
  • HTTP Method 제한 : LimitExcept 옵션을 사용하여 GET과 POST 메소드만 허용하고 나머지 메소드는 거부합니다.
  • 에러페이지 설정 : ErrorDocument 옵션을 사용하여 404 에러와 403 에러 페이지를 커스텀하거나 숨깁니다.
  • SSL 프로토콜 및 알고리즘 설정 : SSLProtocol과 SSLCipherSuite 옵션을 사용하여 SSL 프로토콜과 알고리즘을 설정합니다. Let’s Encrypt를 사용하여 무료 SSL 인증서를 발급받고 설치합니다.
  • http 접속 시 https 리다이렉트 : RewriteEngine과 RewriteRule 옵션을 사용하여 http 접속 시 https로 리다이렉트합니다.
이렇게 하면 Apache의 보안성을 향상시킬 수 있습니다.
이 포스팅은 기본적인 내용만 다룬 것이기 때문에 Apache의 보안 설정에 관심이 있다면, 더 많은 자료를 찾아보시기 바랍니다.

이상으로 포스팅을 마무리하겠습니다. 감사합니다.

글 쓰는 Jiniwar


댓글

이 블로그의 인기 게시물

crontab 설정방법과 로그 확인하는 법

Microsoft Defender 방화벽 설정 또는 해제하는 방법

한국 군비지출 세계 9위