아파치 웹 서버는 파일 및 웹사이트를 호스팅하는 데 가장 인기 있는 널리 사용되는 웹 서버 중 하나입니다. 호스팅 요구 사항을 충족시키기 위해 설치하고 구성하기 쉽습니다. 그러나 기본 설정은 사이트의 필요한 보호를 제공하기에 안전하지 않습니다.
이 안내서에서는 웹 서버의 보안을 강화하기 위해 적용할 수 있는 몇 가지 아파치 서버 강화 팁과 트릭을 살펴보겠습니다.
1. 아파치 버전 및 OS 정보 숨기는 방법
기본적으로 아파치 웹 서버는 웹 사이트의 잘못된 URL을 찾을 경우 버전을 표시합니다. 아래는 사이트에서 페이지를 찾을 수 없음을 나타내는 오류 페이지의 예입니다. 마지막 줄은 아파치 버전, 호스트 OS, IP 주소 및 수신 대기 중인 포트를 나타냅니다.

웹 서버 정보를 표시하는 것은 해커에게 좋은 정보가 될 수 있으므로 이는 결코 좋은 생각이 아닙니다. 보안 층을 추가하고 해커가 더 어렵게 접근하도록하기 위해 웹 서버 정보를 숨기는 것이 좋습니다.
이를 위해 데비안 기반 배포판의 기본 아파치 구성 파일을 엽니다.
$ sudo vim /etc/apache2/apache2.conf
기반 시스템 RHEL, Fedora, CentOS, Rocky, 그리고 AlmaLinux와 같은
$ sudo vim /etc/httpd/conf/httpd.conf
시스템에 대해. 파일 끝에 다음 라인을 추가하십시오.
ServerTokens Prod ServerSignature Off
변경 사항을 저장하고 Apache 웹 서버를 다시 시작하십시오.
$ sudo systemctl restart apache2 [On Debian, Ubuntu and Mint] $ sudo systemctl restart httpd [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
이제 사이트를 다시로드하면 이번에는 웹 서버 정보가 표시되지 않습니다.

2. Apache에서 디렉터리 목록 비활성화
기본적으로, Apache는 디렉터리 목록을 허용하며, 방문자는 문서 루트 디렉터리에 있는 파일이나 디렉터리를 볼 수 있습니다.
이를 시연하기 위해 test라는 디렉터리를 만들겠습니다.
$ sudo mkdir -p /var/www/html/test
다음으로, 디렉터리로 이동하여 몇 개의 파일을 만듭니다.
$ cd /var/www/html/test $ sudo touch app.py main.py
이제 URL http://localhost/test
에 액세스하면 디렉터리 목록을 볼 수 있습니다.

디렉터리 목록을 비활성화하려면 Apache의 주 구성 파일로 이동하고 ‘ 디렉터리 ‘ 속성을 검색하십시오. ‘ 옵션 ‘ 매개변수를 '-Indexes'
로 설정하십시오.
<Directory /opt/apache/htdocs> Options -Indexes </Directory>
Apache를 다시로드하면 이번에는 URL을 방문할 때 디렉터리가 더 이상 표시되지 않습니다.

3. 정기적으로 Apache 업데이트
소프트웨어가 항상 최신 상태가 되도록 유지하는 것이 좋습니다. 최신 애플리케이션에는 버그 수정과 보안 패치가 포함되어 있어 오래된 소프트웨어 버전에 존재하는 근본적인 취약점을 해결할 수 있습니다.
따라서 애플리케이션을 정기적으로 업그레이드하는 것이 좋습니다.
$ sudo apt update && sudo apt upgrade [On Debian, Ubuntu and Mint] $ sudo dnf upgrade [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]

4. 아파치에서 HTTPS 암호화 사용
아파치는 기본적으로 도청에 취약한 약하고 보안이 되지 않은 프로토콜인 HTTP 프로토콜을 사용합니다. 사이트의 보안을 강화하고 Google SEO 순위를 향상하려면 SSL 인증서를 사용하여 사이트를 암호화하는 것을 고려해 보세요.
이렇게 하면 기본 HTTP 프로토콜이 HTTPS로 전환되어 서버와 주고받는 통신을 가로채고 해독하기가 훨씬 어려워집니다.
Linux에서 아파치 웹 서버를 Let’s Encrypt SSL로 보호하는 방법을 확인해 보세요.
5. 아파치에 대해 HTTP 엄격한 전송 보안(HSTS) 활성화
웹 사이트를 TLS/SSL 인증서로 암호화하는 것 외에도, HSTS 웹 보안 메커니즘을 HTTPS 위에 구현하는 것을 고려하십시오.
HTTP Strict Transport Security (HSTS)는 중간자 공격 및 쿠키 탈취로부터 웹 사이트를 보호하는 정책 메커니즘입니다. 공격자가 HTTPS 프로토콜을 안전하지 않은 HTTP 프로토콜로 다운그레이드하는 경우에 발생합니다.
HSTS는 웹 서버가 웹 브라우저가 HTTPS를 통해서만 상호 작용해야 하며 HTTP 프로토콜을 통해서는 절대로 상호 작용하지 않아야 함을 엄격히 선언할 수 있게 합니다.
HSTS를 활성화하려면 웹 사이트가 HTTPS로 실행되고 유효한 TLS/SSL 인증서를 갖고 있는지 확인하십시오.
그런 다음, 아파치에 헤더 모듈을 활성화하십시오:
$ sudo a2enmod headers
그런 다음 변경 사항을 적용하려면 아파치를 다시로드하십시오.
$ sudo systemctl restart apache2
그런 다음, 도메인의 가상 호스트 구성 파일에 액세스하십시오.
$ sudo vim /etc/apache2/sites-available/mydomain.conf
다음으로, 다음 라인을 <VirtualHost *:443>
블록 내에 추가하십시오:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
이렇게 보입니다.
<VirtualHost *:443> # ..... # .... Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" </VirtualHost>
max-age 매개변수는 웹 브라우저가 다음 일 년 동안 (31536000 = 1 년) HTTPS를 사용하여 사이트에만 액세스하도록 지시합니다.
마지막으로, 아파치를 다시 시작하여 HSTS 정책이 적용되도록 합니다.
$ sudo systemctl restart apache2
6. 아파치에서 HTTP/2 활성화
2015년에 새로운 HTTP 프로토콜 버전인 HTTP/2가 출시되었으며, HTTP/1.1의 제작자들이 예상하지 못한 여러 문제를 해결하려고 합니다.
HTTP/1.1은 여전히 널리 사용되고 있지만, 브라우저에서 여러 요청을 처리하기 위해 여러 TCP 연결을 사용함에 따른 성능 문제와 관련이 있으며, 이는 클라이언트 측의 높은 자원 소모로 이어져 네트워크 성능 저하로 이어집니다.
애플리케이션이 복잡도와 기능이 증가함에 따라, HTTP/2는 HTTP/1.1의 단점을 해결하기 위해 만들어졌습니다. 이 단점에는 긴 HTTP 헤더, 느린 웹 페이지 로딩 속도 및 일반적인 성능 저하가 포함됩니다.
HTTP/2는 이전 버전보다 더 많은 보호와 개인 정보 보호를 제공합니다. 더 중요한 것은 데이터의 다중화된 스트림을 사용하여 향상된 성능입니다. HTTP/2를 사용하면 하나의 TCP 연결만으로도 여러 데이터 스트림을 전송할 때도 효율적인 대역폭 이용이 가능합니다.
아파치 웹 서버에서
확인해보세요. 7. 아파치에서 민감한 디렉터리 액세스 제한
사용자 데이터, 로그 및 구성 파일과 같은 민감한 정보가 포함될 수 있는 디렉터리에 대한 액세스를 제한하는 다른 보안 조치를 취할 수 있습니다.
<VirtualHost *:80> ServerName example.com DocumentRoot /var/www/html # Other virtual host settings <Directory /var/www/html/sensitive_directory> Require all denied </Directory> </VirtualHost>
위의 설정에서 Require all denied
는 /sensitive_directory에 있는 파일에 액세스하려는 모든 사용자의 액세스를 거부합니다.
변경 사항을 저장하고 파일을 종료합니다. 그런 다음 변경 사항이 적용되도록 아파치를 다시 시작하세요.
아파치에서 ServerSignature 지시문을 비활성화합니다.아파치 구성 파일의 ServerSignature 지시문은 서버에서 생성된 문서에 푸터를 추가하여 웹 서버 구성(버전 및 실행 중인 OS 등)에 대한 정보를 표시합니다. 악의적인 사용자에게 웹 서버에 대한 중요한 세부 정보를 노출시키면 공격 가능성이 크게 증가할 수 있습니다.
이러한 정보 노출을 방지하려면 아파치 구성 파일에서이 지시문을 비활성화해야 합니다.
ServerSignature Off
변경 사항을 저장하고 다시 한 번 아파치를 재시작하여 변경 사항이 적용되도록합니다.아파치
$ sudo systemctl restart apache2
9. ‘ServerTokens’ 지시문을 ‘Prod’로 설정합니다.
‘ServerTokens‘ 지시문은 Apache 버전(주 버전 및 부 버전), OS 및 실행 중인 웹 서버 유형을 포함하여 서버가 보내는 정보를 제어합니다.
공개해야 할 최소한의 정보는 웹 서버가 아파치임을 나타내는 것입니다. 그 외의 정보는 서버를 잠재적인 공격에 노출시킬 뿐입니다. 따라서 아파치 구성 파일에서 ‘ServerTokens’ 지시문을 ‘prod’로 설정하는 것이 좋습니다.prod
ServerTokens Off
변경 사항을 저장하고 항상 아파치를 다시 시작해야합니다.
10. Fail2ban으로 아파치 보안 강화
Fail2ban은 Linux 시스템을 DoS 및 브루트 포스 공격을 포함한 외부 위협으로부터 보호하는 오픈 소스 침입 방지 응용 프로그램입니다. 이는 시스템 로그를 지속적으로 모니터링하여 공격 행위를 모방하는 패턴과 일치하는 호스트를 차단함으로써 작동합니다.
Fail2ban은 실패한 로그인 시도를 지속적으로 모니터링하고 잘못된 IP를 일시적으로 차단함으로써 DoS 공격으로부터 Apache를 보호하도록 구성할 수 있습니다.
다음을 사용하여 Fail2ban을 Linux에 설치하는 방법을 확인하십시오:
11. 불필요한 모듈 비활성화
Apache 모듈은 웹 서버 기능을 확장하기 위해 로드되는 프로그램입니다. 모듈에 의해 확장되는 기능에는 기본 인증, 콘텐츠 캐싱, 암호화, 보안 등이 포함됩니다.
현재 사용 중이 아닌 모든 모듈을 비활성화하여 공격의 피해자가 되지 않도록 하는 것이 항상 권장됩니다.
활성화된 모든 모듈을 확인하려면 다음 명령을 실행하십시오
$ apache2ctl -M

특정 모듈이 활성화되어 있는지 확인하려면 예를 들어, 리라이트 모듈의 경우 다음 명령을 실행하십시오.
$ apache2ctl -M | grep rewrite

모듈을 비활성화하려면 다음 명령을 실행하십시오:
$ sudo a2dismod rewrite

12. mod_security 및 mod_evasive 모듈을 사용하여 Apache 보안하기
mod_security 및 mod_evasive 모듈을 활성화하여 Apache를 브루트 포스 공격이나 DDoS 공격으로부터 보호할 수 있습니다.
- mod_security 모듈은 웹 애플리케이션 방화벽(WAF)처럼 작동하며 사이트로의 의심스럽고 원치 않는 트래픽을 차단합니다.
- mod_evasive 모듈은 서버를 브루트 포스 및 서비스 거부 공격(DoS)으로부터 보호합니다.
mod_security와 mod_evasive 모듈을 사용하여 Apache를 보호하는 방법을 읽어보세요.
13. Apache에서 원치 않는 서비스 제한
Apache를 더욱 안전하게 유지하기 위해 현재 필요하지 않은 심볼릭 링크 및 CGI 실행과 같은 특정 서비스를 비활성화하는 것을 고려하세요. 기본적으로 Apache는 심볼릭 링크를 따르며, 이 기능과 -Includes
기능 및 CGI를 한 줄에 비활성화할 수 있습니다.
이를 위해 ‘Options’ 지시문에 '-ExecCGI -FollowSymLinks -Includes'
줄을 추가하십시오.’Directory‘ 섹션에서입니다.
<Directory /your/website/directory> Options -ExecCGI -FollowSymLinks -Includes </Directory>
이것은 디렉토리 수준에서도 달성할 수 있습니다. 예를 들어, 여기서는 “/var/www/html/mydomain1” 디렉토리에 대해 Includes 및 CGI 파일 실행을 비활성화합니다.
<Directory "/var/www/html/mydomain1"> Options -Includes -ExecCGI </Directory>
변경 사항을 저장하고 Apache를 다시 시작하십시오.
14. Apache에서 파일 업로드 크기 제한
웹 서버를 보호하는 또 다른 방법은 클라이언트에서 웹 서버로 전송되는 HTTP 요청 본문의 총 크기를 제한하는 것입니다. 서버, 디렉토리, 파일 또는 위치의 문맥에서 설정할 수 있습니다.
예를 들어, 특정 디렉토리, 예를 들어 /var/www/domain.com/wp-uploads 디렉토리에 파일 업로드를 허용하고 업로드된 파일의 크기를 4M = 4194304바이트로 제한하려면 다음 지시문을 Apache 구성 파일 또는 .htaccess 파일에 추가하십시오.
<Directory "/var/www/domain.com/wp-uploads"> LimitRequestBody 4194304 </Directory>
다음과 같이 변경 내용을 저장하고 Apache를 다시 시작하십시오.
서버, 디렉토리별, 파일별 또는 위치별로 설정할 수 있습니다. 이 지시문은 때로는 서비스 거부(DoS) 공격의 한 형태가 될 수 있는 비정상적인 클라이언트 요청 동작을 방지합니다.
15. Apache에서 로깅 활성화
로깅은 클라이언트 요청 및 웹 서버 성능과 관련된 기타 정보에 대한 모든 세부 정보를 제공합니다. 이는 문제가 발생한 경우 유용한 정보를 제공합니다. 특히 가상 호스트 파일에서 Apache 로그를 활성화하면 웹 서버에 문제가 발생한 경우 해당 문제를 정확하게 파악할 수 있습니다.
로그 기능을 활성화하려면 두 개의 주요 로깅 지시문을 제공하는 mod_log_config 모듈을 포함해야 합니다.
- ErrorLog – 오류 로그 파일의 경로를 지정합니다.
- CustomLog – 로그 파일을 생성하고 형식을 지정합니다.
이러한 속성을 가상 호스트 섹션의 가상 호스트 파일에서 사용하여 로깅을 활성화할 수 있습니다.
<VirtualHost 172.16.25.125:443> ServerName example.com DocumentRoot /var/www/html/example/ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
데비안 시스템의 {APACHE_LOG_DIR}
지시문은 /var/log/apache2 경로로 정의됩니다.
16. Apache를 별도의 사용자 및 그룹으로 실행
Apache를 별도의 사용자 및 그룹으로 실행하는 것은 일반적인 보안 관행입니다. 이렇게 함으로써 웹 서버 프로세스를 다른 시스템 프로세스와 격리시키고 웹 서버가 침해당했을 때 잠재적인 피해를 최소화할 수 있습니다.
먼저, Apache를 위한 새로운 사용자와 그룹을 만들어야 합니다.
$ sudo groupadd apachegroup $ sudo useradd -g apachegroup apacheuser
다음으로, Apache 구성 파일을 편집하여 새로운 사용자와 그룹을 지정해야 합니다.
User apacheuser Group apachegroup
Apache가 실행되는 사용자와 그룹을 변경하고 있으므로 웹 디렉토리와 파일의 소유권을 업데이트하여 Apache가 그것들을 여전히 읽을 수 있도록 해야 할 수도 있습니다.
$ sudo chown -R apacheuser:apachegroup /var/www/html
이러한 변경 사항을 적용하려면 Apache를 다시 시작하십시오.
$ sudo systemctl restart httpd # For RHEL/CentOS $ sudo systemctl restart apache2 # For Debian/Ubuntu
17. DDoS 공격 및 강화 방법 보호
웹사이트를 완전히 DDoS 공격으로부터 보호할 수는 없다는 것은 사실입니다. 그러나 다음은 그것을 완화하고 관리하는 데 도움이 되는 몇 가지 지침입니다.
- TimeOut – 이 지시문은 서버가 특정 이벤트가 완료될 때까지 기다릴 시간을 지정합니다. 기본값은 300초입니다. DDoS 공격을 받기 쉬운 사이트의 경우 이 값을 낮게 유지하는 것이 좋습니다. 그러나 적절한 설정은 대부분 웹사이트가 받는 요청의 성격에 따라 달라집니다. 참고: 낮은 타임아웃은 일부 CGI 스크립트에서 문제를 일으킬 수 있습니다.
- MaxClients – 이 지시문은 동시에 제공될 수 있는 연결 수의 제한을 설정합니다. 이 제한을 넘는 새로운 연결은 대기열에 추가됩니다. 이는 Prefork와 Worker MPMs에서 모두 사용할 수 있습니다. 기본값은 256입니다.
- KeepAliveTimeout – 이 지시문은 연결을 닫기 전에 서버가 다음 요청을 기다릴 시간을 지정합니다. 기본값은 5초입니다.
- LimitRequestFields – 이 지시문은 클라이언트가 허용하는 HTTP 요청 헤더 필드의 수를 제한합니다. 기본값은 100입니다. DDoS 공격이 과도한 HTTP 요청 헤더로 발생하는 경우,이 값을 줄이는 것이 권장됩니다.
- LimitRequestFieldSize – 이 지시문은 HTTP 요청 헤더의 크기 제한을 설정합니다.
18. 정기적인 취약점 스캔 수행
웹 서버를 보호하는 또 다른 방법은 정기적인 취약점 스캔 테스트를 수행하는 것입니다. 이는 해커가 민감한 파일에 액세스하거나 악성 코드를 삽입하는 데 악용될 수 있는 잠재적인 보안 구멍을 식별하는 데 도움이 됩니다.
취약점 스캔 도구는 또한 보안 설정을 지적하고 규정 준수 감사에 도움이 됩니다. 인기있는 취약점 스캔 도구로는 Acutenix, Nessus, Nexpose, Sucuri 등이 있습니다.
결론
이것은 웹 서버에 추가적인 보호층을 제공하고 침입을 방지하기 위해 구현할 수 있는 Apache 강화 팁 중 일부입니다.