리눅스 아파치 403 오류의 3가지 고려사항
리눅스 서버에서 아파치(Apache) 웹서버를 설치하여 사용하다보면 자주 등장하는 것이 403 Forbidden(Apache 403 Forbidden error) 에러다.
403 Forbidden 에러는 해당 파일이나 디렉터리에 접근 권한이 없는 경우 것으로 보안과 관련된 오류다.
디렉터리나 파일 권한, 그리고, 웹서버의 설정을 봐도 왜 403 에러가 나는 지 쉽게 알 수 없는 경우가 있다.
403 Forbidden error는 원인이 여러가지이고 찾기가 쉽지 않아 매번 한참 해메다가 겨우 해결하곤 한다. 그 해결 방법을 정리해 본다.
1. httpd.conf 의 권한 설정
실수인지 어쩐지는 모르지만 아래와 같이 <Directory> 설정 지시 부분에 "Deny from all"이란 내용이 있는 경우가 있다. 당연히 모든 접근을 제한한다는 것이니 403 Forbidden 이 발생하겠지.
.
.
.
Order deny, allow
Deny from all
</Directory>
아래와 같이 "Allow from all"로 표시하면 모든 접근이 정상적으로 이뤄질 것이며,
.
.
.
Order allow, deny
Allow from all
</Directory>
특정한 IP 만 접근을 제한한다면 아래와 같이 특정한 IP를 deny 시키면 된다.
.
.
.
Order deny,allow
deny from 125.165.169.111 114.124.12.
allow from all
</Directory>
2. 디렉터리 퍼미션(Directory Permission)
httpd.conf 의 설정에 문제가 없다면, 디렉터리 퍼미션을 확인해 보자. 웹브라우저로 홈페이지를 본다는 것은 웹서버가 실행되는 계정(nobody 또는 apache 등)으로 해당 디렉터리를 읽는 것이다.즉, 웹서버가 실행되는 계정으로 해당 디렉터리에 접근이 되지 않으면 당연히 403 Forbidden 이 발생하겠지.
or
# chmod 711 /home/...
# ls -al /home/...
drwx--x--x 21 abcd abcd 4096 Mar 24 10:44 /home/...
디렉터리를 위와 같이 했는데도 같은 문제가 있다면 하위 디렉터리 및 파일들을 살펴보자. 웹루트 디렉터리를 위와 같이 설정하듯이 하위 디렉터리나 파일도 웹서버가 실행되는 계정으로 읽을 수 있어야 문제가 발생하지 않는다.
참고로 특정디렉터리의 하위 모든 파일 및 디렉터리의 권한을 변경하는 방법은...
# find /home/... -type d -exec chmod 711 {} \;
* 모든 파일의 권한을 644로 변경
# find /home/... -type f -exec chmod 644 {} \;
이것은 간편하긴 하나, 검색할 디렉터리(/home/...)를 잘못 지정하면 낭패를 볼 수 있으므로 주의해야 한다. "/" 에서 실행했다가는... ^^;;
3. SELinux와 아파치 HTTP의 디렉토리 접근 설정
SELinux는 리눅스의 보안을 담당하는 프로그램이다. 최근에 나온 리눅스에는 대부분 SELinux가 구동되고 있다고 생각해도 된다. 이전에는 단순히 chmod를 통한 owner+group+others의 권한 만 제한하면 되었지만 SELinux는 그 이상의 접근 제어를 하게 되므로 잘 모르면 당황하게 된다.
잘 모르면 SELinux 설정에서 SELINUX=disabled 하여 구동을 중지할 수 있지만 그만큼 보안에 취약해지므로 권장하지는 않는다.
Shell에서 'ls -Z'를 해 보면 아래와 같이 파일이나 디렉터리의 보안 환경을 볼 수 있다.
drwx--x--x abcd abcd user_u:object_r:user_home_dir_t abcd
drwx--x--x efgh efgh user_u:object_r:httpd_sys_content_t efgh
보안 환경에서 세번째 요소가 중요한 부분이다. HTTP 웹서버는 httpd_sys_content_t 타입 만 파일과 디렉토리 읽는 것을 허용한다. 위에서 보면 'abcd'는 user_home_dir_t로 되어 있기 때문에 웹서버에서 접근을 하면 403 Forbidden을 표시하고, 'efgh'는 httpd_sys_content_t로 되어 있기 때문에 접근이 가능하다.
이를 변경하는 방법은...
# chcon -t httpd_sys_content_t /home/...
* chmod와 같이 하위 파일이나 디렉터리를 모두 변경할 경우
# chcon -R -h -t httpd_sys_content_t /home/...
-R : 하위 모든 파일과 디렉터리의 보안사항을 변경한다.
-h : 심볼릭링크를 따르지 않도록 한다.
위와 같이 했는데도 문제가 지속되면 쪼금 어렵다는 것~^
- Apache 302 error 원인과 해결방법