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이라는 기능을 제공한다. 응답헤더에서 특정 값을 지우고자 한다면 아래와 같은 기능을 필요로 한다.

  1. http response를 생성할 때,
  2. 특정 해더가 들어있다면,
  3. 그 헤더를 지우자(혹은 수정하자)

각 부분은 어떻게 작성할까.

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)에서 바로 날리려면 이렇게도 날릴 수 있다.

http://daplus.net/asp-net-mvc-asp-net-mvc-%EA%B8%B0%EB%B3%B8-http-%ED%97%A4%EB%8D%94%EB%A5%BC-%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/

참조

[1] https://support.f5.com/csp/article/K14342