접근 통제 설정

웹 서버는 자체적인 접근 관리 기능을 탑재하고 있으며 요청하는 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>
CODE

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>
CODE

위 예제는 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>
CODE


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;
}
CODE


접근 차단 규칙에 걸릴 경우 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>
CODE

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;
}
CODE

Require all denied(apache) 나 deny all(nginx) 를 사용할 경우 HTTP 403 Forbidden 응답이 가게 되며 공격자는 추가 공격을 실행할 수 있습니다.

그러나 HTTP 404 Not Found 응답을 받으면 컨텐츠가 없다고 생각할 것이므로 보안상 더 적절한 설정입니다.