httpd 설정은 httpd.conf 한 파일에 있지 않다. Include · IncludeOptional 로 여러 디렉터리를 끌어오기 때문에 같은 지시어가 두 곳 이상에 있는 일이 흔하다. 보안 점검에서 "Options Indexes 가 두 군데 있다" 같은 지적을 받으면 먼저 어느 파일에서 왔는지를 찾아야 한다. 이 문서는 설정의 출처를 찾는 방법과 디렉터리 목록 노출을 끄는 방법을 다룬다.
RHEL 계열의 기본 경로는 다음과 같다.
| 경로 | 내용 |
|---|---|
/etc/httpd/conf/httpd.conf |
주 설정 파일 |
/etc/httpd/conf.d/*.conf |
패키지와 가상호스트가 넣는 설정 |
/etc/httpd/conf.modules.d/*.conf |
모듈 적재 설정 |
Debian · Ubuntu 계열은 /etc/apache2/apache2.conf 와 conf-enabled · sites-enabled · mods-enabled 의 심볼릭 링크 구조를 쓴다.
가장 확실한 방법은 설정 트리 전체를 뒤지는 것이다.
grep -Rni "Options Indexes" /etc/httpd
출력에 파일 경로와 줄 번호가 함께 나오므로 중복 정의를 바로 알 수 있다.
httpd 가 실제로 어떤 파일을 읽었는지, 가상호스트가 어느 파일에서 정의됐는지는 다음으로 확인한다.
httpd -S
httpd -t -D DUMP_INCLUDES
httpd -S 는 가상호스트마다 정의된 파일과 줄 번호를 찍어 준다. 컴파일된 기본값과 모듈 적재 상태는 다음으로 본다.
httpd -V
httpd -M
Options 는 좁은 범위가 넓은 범위를 덮는다. 우선순위는 대체로 <Directory> → <DirectoryMatch> → <Files> → <Location> 순으로 뒤에 오는 것이 이기고, 같은 종류끼리는 경로가 더 구체적인 쪽이 이긴다. .htaccess 는 AllowOverride 가 허용한 범위에서 마지막에 적용된다.
Options 값 앞에 + 나 - 를 붙이면 상위에서 물려받은 목록에 더하거나 뺀다. 접두사 없이 적으면 물려받은 목록을 통째로 갈아엎는다. 이 차이 때문에 "분명 껐는데 다시 켜진" 상황이 생긴다.
# 상속을 무시하고 목록을 새로 정한다
Options FollowSymLinks
# 상속받은 목록에서 Indexes 만 뺀다
Options -Indexes
Options Indexes 가 켜져 있고 해당 디렉터리에 DirectoryIndex 대상(index.html 등)이 없으면 httpd 가 파일 목록을 그려 준다. 파일 이름과 구조가 그대로 드러나므로 보안 점검에서 거의 항상 지적된다.
<Directory "/var/www/html">
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
mod_autoindex 자체를 빼는 방법도 있다. 이러면 어디에서 Indexes 를 켜 두었든 목록이 나오지 않는다.
grep -Rn "autoindex" /etc/httpd/conf.modules.d/
해당 LoadModule 줄을 주석 처리한 뒤 문법을 확인하고 재적재한다.
httpd -t
systemctl reload httpd
curl -sI https://example.com/somedir/ | head -n 1
403 Forbidden 이면 목록 노출이 막힌 것이다. 목록 HTML 이 돌아오면 아직 어딘가에서 Indexes 가 켜져 있다.
conf.d 파일 등) 손으로 고치면 업그레이드 때 되돌아간다. 별도 파일을 만들어 뒤에 읽히게 하거나 벤더 지원 범위를 먼저 확인한다.reload 대신 restart 가 필요한 경우가 있다. 모듈 적재를 바꿨다면 restart 한다.