사용자 도구

사이트 도구


사이드바

blog:firewall-rules

방화벽 규칙

빠른 결론: 재미삼아 만들어본 도쿠위키1) 주요 보안기능에 VPN 접속을 요구하는 방화벽 규칙에 차단되는 수많은 요청을 보고 오싹해짐.

클라우드플레어에는 이름과 모양은 서로 다르지만 비슷한 역항을 하는 제품이 여럿 있습니다. 모양이 서로 다르고 또 동작하는 레이어가 서로 다른 제품을 모두 '앱'이라는 같은 수준의 카테고리에 분류하다 보니 종종 헛갈리기도 하고 또 새로 나온 기능을 기존의 다른 기능으로 갈음할 수 있기도 합니다. 가령 유료 서브스크립션에 있는 '존 락다운'은 이와 일치하는 시나리오를 적용해야 할 상황이라면 굉장히 편리하게 사용할 수 있습니다. 그런데 결국 이 기능은 방화벽을 추상화한 기능에 가까워서 방화벽 설정으로 거의 같은 - 아마도 같은 - 효과를 냅니다.

시나리오

지난번 액세스 JWT 밸리데이션 때도 소개한 적이 있지만 이 위키에는 공개된 영역과 공개되지 않은 영역이 있습니다. 이 영역은 웹 주소의 슬래시 문자('/')로 구분할 수 있습니다. 하지만 도쿠위키는 로그인, 어드민, 패스워드 변경 같은 몇몇 보안 상 중요한 기능을 하는 페이지 주소는 일반 페이지 주소 뒤에 쿼리스트링을 붙인 모양으로 되어 있습니다. 때문에 액세스를 통해 지정된 경로에 접근할 때 추가 보안을 적용하는 방식으로는 이 중요한 기능을 충분히 보호할 수 없었습니다.

존 락다운

클라우드플레어 유료 서브스크립션에는 '존 락다운'이란 기능이 있습니다. 소개를 살펴보니 웹 주소 목록과 아이피 목록을 제공하면 웹 주소에 접근할 때 지정된 아이피로부터만 접근을 허용하고 나머지 접근을 차단하는 기능이었는데 제 시나리오와 어느정도 일치했고 심지어는 액세스를 대신할 여지도 있어보였습니다. 액세스는 이론상 보안이 필요한 경로에 추가 보안수단을 제공해주지만 토큰을 확인하는데 지난번에 작성한 멍청한 코드가 돌고 있는 점이 신경쓰였습니다. 그래서 그 코드를 제거하고도 보안 수준을 유지할 수 있지 않을까 싶었고 또 위에 이야기한 도쿠위키의 보안 기능에 접근을 보호할 수 있을 거라고 생각했습니다.

방화벽 규칙

클라우드플레어에는 방화벽 기능이 있는데 사용자가 규칙을 추가할 수도 있습니다. 서브스크립션 수준에 따라 이 규칙 수가 달라지는데 무료 사용자도 5개까지 규칙을 입력할 수 있습니다. 그런데 여기서도 IP만 필터링하는 규칙은 방화벽 규칙과는 별도로 입력할 수 있어 아이피 차단은 차단대로 제한 없이 입력해 사용하고 이보다 다양한 조건을 사용하는 규칙은 방화벽 규칙에 입력하는 식으로 사용 제한을 완화할 수 있습니다.

위에 존 락다운 기능 대신 방화벽 규칙을 입력해 도쿠위키의 주요 보안기능에 아이피 제한을 설정해보기로 했습니다. 제 사용 시나리오는 위키는 저 혼자 사용하고 저는 항상 로그인 되어 있습니다. 로그인에는 아이디, 패스워드, 원타임패스워드를 요구하고 로그인 되어 있으면 도쿠위키의 어드민에 접근할 수 있습니다. 이와는 별도로 특정 경로에 접근하려고 하면 도쿠위키의 ACL 설정과 관계 없이 액세스 인증을 통과해야 합니다. 여기서 보안 상 중요하다고 생각하는 로그인, 프로필 페이지(패스워드를 변경할 수 있으므로), 원타임패스워드 설정 페이지, 어드민 페이지는 특정 VPN을 통과한 아이피로만 접근할 수 있도록 설정해보기로 했습니다.

설정

방화벽 규칙 추가는 예쁜 인터페이스를 사용하면 됩니다. 조건과 이 조건이 맞을 경우 취할 행동으로 구성됩니다. 조건은 여러 조건을 묶어 AND나 OR 연산자로 판단할 수 있습니다. 다만 인터페이스를 통해 만들 수 있는 규칙은 상대적으로 단순한 형태입니다. 규칙에 반복되는 부분이 있다면 지금의 인터페이스를 통해서 만들 수 없습니다. 하지만 규칙을 수동으로 입력할 수도 있어 인터페이스를 무시하고 직접 규칙을 넣을 수도 있습니다. 현재 요청한 주소가 도쿠위키의 주요 보안기능을 요청하는 주소일 때 특정 VPN을 통과한 아이피가 아닐 경우 차단하는 규칙을 사용했습니다. 아래쪽의 아이피 대역은 같은 형식으로 여러 개를 입력할 수 있습니다.

(
    (http.request.uri contains "do=login")
    or (http.request.uri contains "do=twofactor_profile")
    or (http.request.uri contains "do=profile")
    or (http.request.uri contains "do=resendpwd")
    or (http.request.uri contains "do=admin")
) 
and 
(
    not ip.src in 
    {
        0.0.0.0/24
        0.0.0.0/24
    }
)

예상

사실 지난번 토큰 밸리데이션도 그렇고 액세스 사용도 그렇고 도쿠위키에 멀쩡한 ACL이 있는 이상 과도한 행동이라고 생각합니다. 사실은 새 계정 생성 기능만 꺼놓고 ACL만 잘 설정하면 최소한의 보안수준을 쉽게 달성할 수 있습니다. 웹서버에 접근할 때 항상 약속한 아이피 대역을 통해서만 요청해야 하고 미리 지정한 인증서를 통한 요청만 받아들이며 특정 경로에 접근할 때는 별도 인증을 통과한 다음 여기서 만들어진 토큰을 다시 아까와는 다른 인증서로 사인해서 주고받는 조치는 그냥 어지간한 웹사이트에서 비슷한 조치를 한다는 말을 들어본 적도 없습니다. 그냥 재미삼아 해보는 거죠. 이번에도 재미삼아 설정한 거고 눈에 띄는 효과는 이전과 똑같이 없으리라고 예상했습니다.

결과

실상은 굉장히 달랐습니다. 처음에는 설정을 잘못해서 모든 요청을 차단하고 있다고 생각했는데 그렇지 않았습니다. 위에 작성한 방화벽 규칙은 생각보다 훨씬 많은 요청을 차단하고 있었습니다. 로그를 보니 모든 페이지마다 로그인 요청을 붙여서 접근을 시도하고 있었습니다. 온갖 나라의 아이피로부터요. 세계적으로 많은 사람들이 사용하는 워드프레스에 이런 공격이 있다는 이야기를 들은 적이 있습니다. 그렇잖아도 클라우드플레어 유료 서브스크립션에서 제공하는 방화벽 규칙 중에는 워드프레스 전용 규칙도 있다는 이야기를 읽었습니다. 하지만 쓰는 사람을 별로 못 본 도쿠위키 같은 도구에도 이런 자동화된 공격 가능성을 반복해서 확인하는 시도가 이렇게나 많을 거라고는 생각하지 못했습니다. 만약 설정을 고치느라 몇 분 동안 보안설정이 꺼진다면 이 시도들이 로그인에 성공해 다음 행동을 할 가능성이 있어 보였습니다. 예상하는 다음 행동은 프로필 페이지에 들어가 패스워드를 변경하거나 새 계정을 추가하는 것들입니다.

또 기존에 도쿠위키 로그인에 아이디, 패스워드 외에 원타임패스워드를 요구하게 설정해놨었는데 이거 좀 과도한 거 아닐까 하고 여러번 생각했습니다. 그냥 떼낼까 한참 고민하다가 지금은 로그인 요구 횟수를 줄이고 원타임패스워드는 그냥 방치해놨습니다. 이 기능이 저 자신을 고통스럽게 만들 뿐 실제 의미는 없을 거라고 생각했거든요. 그런데 로그인 페이지가 저런식으로 계속해서 확인받고 있었다면 로그인에 아이디, 패스워드 외에 제삼의 문자열을 요구하는데 의미가 있었겠다는 생각이 들었습니다. 이제 확신을 가지고 원타임패스워드를 그대로 놔두기로 했습니다.

결론

유료 서브스크립션의 존 락다운 기능 소개를 보고 재미삼아 추가해본 방화벽 규칙은 생각보다 오싹한 광경을 보여줬고 유료 서브스크립션의 '전용 방화벽 규칙'이 실제로 필요할지 모른다고 생각하기 시작했습니다.

1)
이 사이트에서 사용하는 위키 도구.
blog/firewall-rules.txt · 마지막으로 수정됨: 2019-12-14 13:07 저자 neoocean