중요 파일 접근 차단
접근 통제 설정
웹 서버는 자체적인 접근 관리 기능을 탑재하고 있으며 요청하는 URL 이나 IP, 컨텐츠의 유형에 따라서 다르게 동작하도록 설정할 수 있습니다.
아파치 httpd 2.2 의 경우 접근 제어가 필요한 경우 Order Allow, Deny 키워드를 사용하여 관리할 수 있습니다. 예로 다음은 관리자 서비스 영역인 /manager URL 로 접속 요청이 있을 경우 IP로 접근 통제하는 예제입니다.
<Location /status> Order deny,allow Deny from all Allow from 127.0.0.1 192.168.0.0/24 </Location>
Order 키워드는 지시자의 순서(Deny, Allow)에 따라 접근 통제를 처리하며 위 예제에서는 Deny 를 먼저 평가하므로 Deny from all 키워드에 따라 모든 접근을 차단하고 127.0.0.1, 192.168.0.0/24 서브넷에서의 연결만 허용합니다.
<Location /status> Order allow, deny Allow from all Deny From bad_ip1, bad_ip2 </Location>
위 예제는 Allow를 먼저 평가하므로 Allow from all 에 따라 모든 IP 를 허용하고 Deny from 에 의해 bad_ip1, bad_ip2 만 차단하게 됩니다.
http 2.2 에서 Order 키워드를 사용하여 접근 제어를 설정하는 경우 키워드 순서를 혼동해서 실수를 하는 경우가 많았습니다.
apache httpd
그래서 httpd 2.4 에서는 새로운 접근 통제 키워드인 Require 를 도입했습니다.
이제 복잡한 Order 대신 다음과 같이 Require 를 사용하면 해당 호스트만 접근이 허용되며 아래 예제에서는 host 키워드에 정해진 IP 만 접속할 수 있습니다.
<Location /status> Require host 127.0.0.1 192.168.0.0/24 </Location>
nginx
nginx 는 satisfy 키워드로 접근 통제를 설정할 수 있으며 생략할 경우 모두의 접근를 허용하는 satisfy all 이 됩니다.
특정 규칙에 의해 접근 차단을 할 경우 satisfy any 키워드를 설정하고 allow 와 deny 에 IP 규칙을 적어주면 됩니다.
아래의 nginx 접근 차단 규칙은 위에서 설명한 httpd 과 동일한 의미를 가집니다.
location /status { satisfy any; allow 127.0.0.1 192.168.0.0/24; deny all; }
접근 차단 규칙에 걸릴 경우 HTTP 의 403 Forbidden 응답 코드를 받게 되며 브라우저의 접근이 차단되므로 내부 관리자 서비스등 중요하고 외부에 공개할 필요가 없는 서비스는 웹 서버의 접근 통제를 사용하여 보호할 수 있습니다.
중요 파일 접근 차단
웹 서버의 컨텐츠 디렉터리에는 URL Re-writing 을 처리하는 .htaccess 나 워드프레스의 DB 연결 정보와 사이트 정보를 갖고 있는 wp-config.php, 또 git이나 subversion의 형상 관리 메타 정보(.git, .svn)이나 웹 애플리케이션 구동에 필요한 각종 설정 파일(.inc, .ini, .cfg, .conf)등의 중요 정보가 있을 수 있습니다.
공격자는 이런 파일을 내려 받아서 서버의 구성이나 DBMS 계정 정보, 웹 애플리케이션 소스와 변경 내역등 중요 정보를 파악하고 이를 사용하여 2차 침입을 시도할 수 있습니다.
이를 막기 위해 웹 서버의 확장자 및 디렉터리 패턴의 일치 여부를 확인하는 기능을 사용하여 중요 파일을 보호할 수 있습니다.
apache httpd
아파치 httpd 서버는 아래와 같이 중요 파일을 보호할 수 있습니다.
<DirectoryMatch .*\.(git|svn)/.*> Redirect 404 / </DirectoryMatch> <FilesMatch "^(htaccess|wp-config)"> Redirect 404 / </FilesMatch> <FilesMatch "\.(inc|ini|conf|cfg)$"> Redirect 404 / </FilesMatch> ## property <FilesMatch "\.(xml|properties)$"> Redirect 404 / </FilesMatch> ## laravel .env* <FilesMatch "^(.env)"> Redirect 404 / </FilesMatch>
nginx
nginx 는 다음과 같이 localtion 에 보호할 리소스 패턴을 지정하고 404 응답을 주도록 설정하면 됩니다.
location ~ /\.(ht|git|svn) { return 404; } location ~ /wp-conf* { return 404; } location ~ /.*\.(inc|ini|conf|cfg)$ { return 404; } ## property location ~ /.*\.(xml|properties)$ { return 404; } ## laravel .env* location ~ /\.(env)* { return 404; }
Require all denied(apache) 나 deny all(nginx) 를 사용할 경우 HTTP 403 Forbidden 응답이 가게 되며 공격자는 추가 공격을 실행할 수 있습니다.
그러나 HTTP 404 Not Found 응답을 받으면 컨텐츠가 없다고 생각할 것이므로 보안상 더 적절한 설정입니다.