본문 바로가기
Linux/Web Server

URL이 아닌 ip주소로 사이트가 열리는 것을 막고 싶다면...

by aegypius 2020. 2. 16.
728x90
반응형

IP주소로 홈페이지에 접속하는 것을 차단해보자.

  내가 리눅스로 웹서버를 구축할 때 가장 먼저 셋팅하는 것들 중의 하나가 바로 ip주소로 웹사이트가 열리는 것을 차단하는 것이다.  ip주소로 사이트가 열린다는 것 자체가 보안상의 문제라고 생각하지는 않지만, 서버에 단 하나의 ip만 할당한 채로 다수의 홈페이지를 구동시키고 있다면 ip로 접근했을 때에 특정 홈페이지만 계속 노출될 수 있다. 실제로 ip주소로 사이트가 열리는 서버도 종종 보인다. (ex: 신천지 - 2020.02.25 수정)

  ip주소로 사이트에 접속하려는 시도는 항상 존재한다. 웹브라우저의 주소입력란에 URL이 아닌 IP를 입력하여 접근하는 방식이다. 대수롭지 않게 넘기긴 하는데 초당 3~4회씩, 10분 안팎의 접근 시도(매크로)는 불필요한 로그를 너무 많이 만들어 놓는다. 이게 하루에 수차례 발생하면 신경이 쓰이기 시작한다. 접속자의 로그를 보면 os는 윈도우xp, 7, 10 등이 대부분이고(ios나 ubuntu도 가끔 보이지만 이 환경에서 스크립트 놀이(?)를 즐기는 것은 아닌 듯 하다) 웹브라우저는 chrome, firefox, edge 등이다. user agent는 마음만 먹으면 바꿀 수 있는 것들이기에 이런 접속을 시도하는 자들의 환경은 그냥 참고만(=무시) 한다.

  최근 php의 버전을 업데이트 한  이후로 그누보드로 만든 사이트(와 만들고 있는 사이트)에서 공통적으로 오류가 발생하기 시작했다. 로그파일은 순식간에 너무 커져서 몇몇은 하루에 200~500MB의 error log를 만들어낸다. 역시 php를 상위버전으로 업데이트 한 것이 원인이었다. 그누보드의 소스를 조금 수정하면 해결될 문제이기에 해결책을 제시했더니 오히려 php를 5.6버전으로 낮춰달라고 한다. -_-;  OTL..이런된장

  이참에 모든 로그를 살펴보기로 했다. apache의 error 로그에서 아래와 같은 내용이 눈에 띈다.

  서버에서 운영중인 모든 사이트들은 apache(의 virtual host)로 운영하며 /home/의 각 계정별 하위 디렉토리에 자리잡고 있다. 도메인이 아닌 ip로의 접근에 대해서만 별도의 디렉토리(/var/www/html/ipaccess/)로 지정해 뒀기에 ip로의 접근 시도는 이곳에 로그를 남긴다. 위에 보이는 index.php, wp-login.php, elrekt.php를 포함한 100여가지의 (있지도 않은) 파일에 access 시도가 있었다. 실제로 저 디렉토리에는 touch로 만든 index.html과 missing.html 달랑 두 개 있다. 단순한 ip로의 접속시도 뿐만 아니라 http://ip주소/아무페이지로의 접근시도에 대비해서 만들었던 (HTTP 404 ERROR) missing.html의 내용을 조금더 재미(?)있게 수정하거나 랜섬웨어 바이러스에 감염되는 웹페이지를 찾아서 '반사~'시키는 방법도 생각해 볼 수 있겠다. 분명 어떤 의도를 갖고 ip주소로 접근하려 했겠지만 그렇게까지 대응할 필요는 없을 것이다. 나는 그리 까칠한 사람은 아니기에...일요일 아침. 올 겨울 처음으로 눈다운 눈을 보니 기분이 업되었다.

  httpd.conf의 끝자락 언저리에 HTTP 500, 404, 402 등의 처리에 대한 옵션이 있다. HTTP 404 ERROR는 존재하지 않는 페이지에 접근할 때에 보여주는 메시지이므로 적절하게 안내하면 될 것이다. 물론 ip로 접근해서 발생하는 err 404에 대해서는 아무것도 안보여 주는 편이 깔끔할 수도 있다. 오류메시지 조차 보여주지 말고 오전 내내 내리던 눈처럼 하얀 화면만 보여주자. (접속자의 웹브라우저 스킨이 하얗기를 기대해본다...)

  ip주소로의 접근에 대한 웹서버의 설정은 아래와 같이 해놨다. ServerName에 실제 ip를 적어 놓으면 된다. 별도의 파일을 따로 만드는 것이 좋겠다. 딱히 파일명이 안떠오르면 서버의 ip주소로 파일이름을 지어주는 것도 괜찮은 생각이다.

<VirtualHost *:80>
   ServerName 123.456.789.012
   DocumentRoot /var/www/html/ipaccess
</VirtualHost>

  그리고 404 ERROR에 대한 처리는 httpd.conf에서 아래와 같이 처리해 주면 간단하다.

ErrorDocument 404 /missing.html

  이제 ip주소로 접속하게 되면 ipaccess/의 index.html이 열릴 것이고, ip주소 뒤에 아무런 페이지를 붙여서 접속을 시도하게 되면 ipaccess/의 missing.html이 열린다. missing.html 말고 다른 이름을 사용하는 것은 어떨까?  이는 httpd.conf에서 설정할 수 있다.

 


  https://ip주소로 접속을 시도하는 경우도 있다. 이와 같은 접근 시도는 SSL을 적용한 보안서버라면 서버에서 호스팅 중인 임의의 https 사이트가 인증서가 적용되지 않은 채로 열릴 수 있다. 이런 경우라면 포트 443의 ip주소로의 접근도 막아야 한다.

<VirtualHost *:443>
   ServerName 123.456.789.012
   DocumentRoot /var/www/html/ipaccess
</VirtualHost>

  여기서는 특정 도메인에 인증서를 적용하고 http를 https로 리디렉션 하는 일련의 설정까지는 필요없다. 단지 ip주소로 접근하는 것(??)에 대해서 http || https 모두 동일한 디렉토리로 보내면 그만이다. 403 redirect error을 의도적으로 발생시키는 방법도 있겠다. (IP로 접근한다면 이를 Redirect하여 의도적으로 HTTP 403 ERROR-Forbidden-를 발생시키는 것인데, 이는 단지 예를 들은 것 뿐이며 얼마든지 원하는 다른 방법으로 처리할 수 있을 것이다.) DocumentRoot나 각종 log의 설정은 http와 동일하게 설정해도 좋다. 가급적이면 별도의 로그파일을 설정하고 주기적으로 점검해서 차단해야 할 ip는 과감하게 차단하자. 위와 같이 설정한 후에 운영중인 https 사이트의 일부(혹은 전부)가 열리지 않는다면 웹서버에서 위의 설정이 가장 마지막에 실행되게 해야 한다.


apache의 _default_ 지시어로 동일한 결과를 도출할 수 있다. 물론 환경 < 한 개의 ip주소를 이용해서 Name based 가상호스트를 운영한다거나, 여러 개의 ip주소로 IP based 로 운영 혹은 Name based와 IP based를 적절히 혼합해서 운영(이정도면 웹호스팅 업체를 차리자....-_-;) > 에 따라서 설정을 달리 할 수 있겠지만, 한 개의 IP주소를 사용해서 이름기반(Name-Based) 호스팅 방식으로 운영 한다면 별다른 추가설정 없이 _default_ 구문을 사용하는 것만으로도 동일한 결과를 볼 수 있다. _default_는 정의되지 않은 호스트 이름(호스트 이름이 IP주소인것도 포함)을 포괄적으로(wild card(*)와 비슷) 설정하기 때문이다. _default_지시어와 호스트 이름(Server Name)에 ip를 넣는 것과의 우선 순위를 굳이 따지자면...서로 동등하다. 다만 _default_나 wild card가 더 포괄적이다. 웹서버의 설정은 보통 최종 설정에 따라서 설정값이 정해지지만 웹서버의 설정 중에서도 <VirtualHost>는 먼저 정의된 하나만 유효하게 되므로 _default_를 사용할 계획이라면 가상호스트의 설정 중에서 가장 먼저 실행되게 설정하고, ip주소로의 접근만을 막기위한 설정은 가상호스트의 설정 중에서 가장 마지막에 실행되게끔 교통정리(?)를 해야 원하는 결과를 얻을 수 있다. 이러한 이유로 두 개의 설정을 동시에 사용하는 것은 의미가 없어진다.(마지막의 설정은 실행되지 않기 때문이다) -  마지막은 무조건 무시(?)당하는 것은 아니고.....코딩할 때에 case 명령에서 argument(를 VirtualHost name이라고 간주하면)와 일치한다면 break;에 의해서 블럭을 빠져나오기 때문에 나머지는 실행되지 않는....대충 이런 개념이라고 생각하자 - 따라서 두 설정 모두를 다른 <VirtualHost> 보다 선두에 정의해 놓으면.....서버에서 운영중인 일부 사이트들이 열리지 않는 끔찍~한 경험을 할 수 있다.

마지막에 링크를 걸어둔 요상한 공격이 발생하면 도둑 도메인(? 그저 나의 웹서버 설정의 헛점을 노리는 외부 도메인일 뿐이다)을 하나하나 찾아서 별도로 설정해 줄 수 있겠지만 그런 시간 낭비를 막아주는 손쉬운 방법 또한  _default_ 이다. 방화벽에서 도둑 도메인(?)만을 필터링 하는 방법도 있지만.....편한대로 설정하자. 그리고 제대로 방어가 되고 있는지 꼭 확인해보자..... 

설정하는 방법은 너무도 단순하고 명료하며, 아래의 링크에서 조금 자세히 정리했다.

2021.05.25 - [Linux/SSL(보안서버)] - Network-based Origin Confusion Attacks

 

Network-based Origin Confusion Attacks

가상호스트 혼동 공격?! [ssl:error] [pid 4046] AH02032: Hostname xxx(domain) provided via SNI and hostname xxx(domain) provided via HTTP are different [ssl:error] [pid 4046] AH02032: Host..

aegypius.tistory.com

 

728x90
반응형

댓글