Big-IP에서 특정 HTTP 응답 헤더 삭제하기
요약
HTTP 응답을 줄 때 의도하지 않은 서버 정보가 노출되어 서버 보안의 위협이 될 수 있다. 각 웹서버 단에서 작업하지 않고 로드밸런서(Big-IP ASM)에서 해당 정보를 지우려면 어떻게 해야할까?
TL;DR
다음 iRule을 생성하여 Virtual Server에 추가한다. (예를 들어 http response 중 Server를 삭제)
when HTTP_RESPONSE_RELEASE {if { [HTTP::header exists "Server"] } {HTTP::header remove Server}}
시작
누가하는게 좋을까? 로드밸런서? 웹서버?
HTTP 응답 헤더에 불필요한 정보가 들어간다면 웹 서버단에서 처음부터 해당 헤더를 생성하지 않거나, 들어가더라도 빼는게 처리 속도, 데이터량 면에서 훨씬 좋겠다. 관리적 측면에서는 로드밸런서에서 있는 쪽이 유리하겠다. 로드밸런서에 있다면,
- 개별 서버 작업을 하지 않아도 됨
- 놓친 서버가 있더라도 로드밸런서를 지나가면서 헤더 제거 가능
- 새로운 서버를 구축해서 신규 로드밸런서를 구성할 때, 기존 룰들을 동일하게 할당 가능
Big-IP ASM iRule을 이용한 응답 헤더 조작
Big-IP ASM은 L7 로드밸런서이다. L7, 즉 애플리케이션 레벨의 조작이 가능하며 그 수단의 하나로 irule이라는 기능을 제공한다. 응답헤더에서 특정 값을 지우고자 한다면 아래와 같은 기능을 필요로 한다.
- http response를 생성할 때,
- 특정 해더가 들어있다면,
- 그 헤더를 지우자(혹은 수정하자)
각 부분은 어떻게 작성할까.
1. http response를 생성할 때,
http response를 생성할 때의 이벤트를 트리거 시키려면 아래 두가지를 사용할 수 있다.
- http_response : big-ip asm이 서버 리스폰스를 처리하기 전에 http_response_release : big-ip asm이 서버 리스폰스를 처리한 후에
즉, 서버--(1)-->BIg-IP--(2)-->클라이언트로 간다면 http_response는 (1) 시점에서 트리거되고 http_response_release는 (2) 시점에서 트리거된다.
우리가 하고 싶은 것은 최종적으로 클라이언트에게 가는 http response의 헤더에서 특정 값을 삭제하는 것이므로 http_Response_release를 사용한다.
when HTTP_RESPONSE_release {//필요한 동작 처리}
2. 특정 해더가 들어있다면
특정 헤더가 있는지 여부는 if문으로 간단하게 잡을 수 있다. 만약에 response헤더에 Server라는 헤더가 있는지 잡고 싶다면 아래와 같이 작성하면 된다.
when HTTP_RESPONSE_RELEASE {if { [HTTP::header exists "Server"] } {}}
3. 그 헤더를 지우자(혹은 수정하자)
이제 헤더에서 특정 값을 지우면 된다. 문법도 소이지함.
when HTTP_RESPONSE_RELEASE {if { [HTTP::header exists "Server"] } {HTTP::header remove Server}}
4. 확장해보자
웹 취약점 점검 도구를 돌려보면 서버 정보로 표현되는 부분들이 대표적으로 다음과 같다
- Server
- X-AspNetMvc-Version
- X-AspNet-Version
- X-Powered-By
3.의 예제에서 if문의 값만 쭉쭉 확장하면 된다.
when HTTP_RESPONSE_RELEASE {if { [HTTP::header exists "Server"] } {HTTP::header remove Server}if { [HTTP::header exists "X-AspNetMvc-Version"] } {HTTP::header remove Server}if { [HTTP::header exists "X-AspNet-Version"] } {HTTP::header remove Server}if { [HTTP::header exists "X-Powered-By"] } {HTTP::header remove Server}}
끝
irule을 이용해서 쭉쭉 확장하며 지우지. remove말고 insert를 이용해서 더 넣기도 가능하니 리스폰스 헤더에 대한 cud 모두 가능.
덤
서버단에서 바로 날리려먼 어떻게?
닷넷
닷넷(IIS)에서 바로 날리려면 이렇게도 날릴 수 있다.