![[GCP] 방화벽 규칙 생성 및 태그 적용하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvJRNg%2FbtsBqsArGjV%2FmqeaJ3tqR8vksv8dynN9JK%2Fimg.png)
🧐 개요

개인 및 팀 단위의 프로젝트 내에서 구글 클라우드 플랫폼(약칭 GCP) 서비스들을 이용하고 있던 차에 이런 메일들을 심심치 않게 받아 왔습니다. 요약해서 이야기하자면 ‘귀하의 인스턴스(구글 가상머신)가 암호화폐 체굴에 사용되었으며, 이것은 우리의 정책 위반이니 잘 처신해라’ 라는 내용입니다. 그런데 당연하지만, 컴퓨터 분야를 이제 막 시작한 취준생이 암호화폐 체굴을 할 수 있을 리가 없죠. 외부 IP로부터 도스(DoS) 공격을 당해 인스턴스가 해킹 및 크래킹을 당해서 해당 상황이 발생하는 것입니다. 즉 뭔가 보안 요소에 문제가 있는 것이죠.

VM 인스턴스의 목록을 보니, 크래킹으로 인해 암호화폐 체굴에 사용되던 namenode 인스턴스가 다운되어 있습니다. 이런 빅 데이터 솔루션들의 클러스터 구성을 진행할 때, '/etc/hosts'에 통신할 모든 서버의 ip를 기재하고 있으므로 하나의 인스턴스가 해킹 당하면 모든 인스턴스가 차례로 해킹 당하는 결과가 생깁니다.
이번 포스트에서는 GCP 환경의 방화벽 규칙을 지정 및 수정하여 특정 ip(ipv4)에서만 인스턴스에 접속이 가능하도록 설정하는 방법을 설명드리겠습니다.
📝 시작하기에 앞서
포스트 이해를 위해 선행되어야 할 학습
- SSH 통신의 개념을 설명하고 있습니다.
- Google Cloud Platform(이하 GCP) 환경을 설명하고 있습니다.
👨🏫 방화벽 규칙 이해하기
방화벽 규칙의 서순
방화벽 규칙은 통신 분야에서 일종의 ‘성벽’ 같은 역할을 수행합니다. 종류로는 특정 ip들을 필터링하여 접속을 허용해주는 allow 모드가 있고, 반대로 접속을 차단시키는 deny 모드가 있습니다.
방화벽 규칙을 제정할 때, ‘우선 순위’를 지정하여 방화벽 규칙들이 적용되는 순서를 조정할 수 있습니다. 방화벽 규칙의 우선 순위는 0번부터 시작하며, 낮은 숫자부터 순차적으로 동작합니다. 주의해야 할 점은, ‘방화벽 규칙은 우선 순위에 의해 상쇄되지 않는다’는 점입니다. 예를 들어 특정 ip에 대하여, 우선 순위가 높은 규칙이 해당 포트의 접속을 허용시켜 주어도 우선 순위가 낮은 규칙이 접속을 차단시키면 결론적으로 접속이 차단됩니다.
아래의 예시를 통해 조금 더 자세히 살펴보도록 하겠습니다.

외부 ip 00.00.00.00 번에서 접속을 시도하려고 합니다. 현재 모든 방화벽들은 ‘조건 일치 시 접속 허용(allow)’ 방화벽들입니다. 00.00.00.00 번은 모든 방화벽의 조건에 일치하여 최종적으로 접속이 허용되었습니다.

외부 ip 00.00.00.00 번에서 접속을 시도하려고 합니다. 현재 가장 우선순위가 높은 방화벽은 ‘조건 일치 시 접속 차단(deny)’ 방화벽입니다. 00.00.00.00 번은 첫 방화벽의 조건에 일치하므로 접속이 차단되었습니다.

외부 ip 00.00.00.00 번에서 접속을 시도하려고 합니다. 현재 낮은 우선순위의 방화벽 3개중 2개는 ‘조건 일치 시 접속 허용(allow)’ 방화벽이지만, 나머지 하나는 ‘조건 일치 시 접속 차단(deny)’ 방화벽입니다. 00.00.00.00 번은 모든 방화벽의 조건에 일치하므로 최종적으로 접속이 차단되었습니다.
결론적으로, ‘모든 포트의 접속을 막고 일부분만 허용시킨다’는 설정은 방화벽 규칙의 중복을 통해서는 구현할 수 없습니다. 해당 기능을 실질적으로 구현하기 위해서는 ‘모든 방화벽 설정을 제거하고, 특정 ip 대역 내에서의 접속 허용(allow) 방화벽을 새롭게 구성’하는 방향으로 작업을 수행해야 합니다.
🛠️ 방화벽 규칙 수정하기
방화벽 규칙 삭제하기: SSH 및 RDP 전역 통신 허용
GCP 방화벽에는 기본 설정으로 아래 2개의 방화벽 규칙이 디폴트로 사전 생성되어 있습니다.
- default-allow-rdp: 계정 내 모든 인스턴스에 **ip 전역(0.0.0.0/0)**에서의 3389번 포트 접근 허용
- default-allow-ssh: 계정 내 모든 인스턴스에 **ip 전역(0.0.0.0/0)**에서의 22번 포트 접근 허용
이 방화벽 규칙들로 인해 외부에서 해당 계정에서 실행되는 인스턴스들로 DoS 공격을 시도할 수 있게 되었습니다. 즉 앞으로 보안 이슈들이 생길 가능성을 배제하기 위해 해당 규칙들을 삭제해야 합니다.

좌측 메뉴바 → VPC 네트워크 → 방화벽
방화벽 설정에 진입하시면 기본적으로 생성되어 있는 방화벽 규칙들 중 앞에서 언급한 2개의 규칙이 보일 것입니다.

해당 규칙들을 체크한 후 ‘삭제’를 눌러주시면 됩니다.
삭제 버튼을 누르고 나면 해당 방화벽 규칙들이 제거됩니다.
방화벽 규칙 만들기: 모든 인스턴스에 적용하기
이제 새로운 방화벽 규칙을 생성하여 특정 ip 대역에서의 접속을 허용시켜야 합니다. 아무런 방화벽 규칙이 없는 상태에서는 ssh 통신을 통해 인스턴스에 접속할 수 없으므로 방화벽 규칙을 만들어 주겠습니다.

방화벽 대시보드 상단에 위치한 ‘방화벽 규칙 만들기’를 통해 방화벽 규칙을 새로 재정할 수 있습니다.

방화벽 규칙의 이름은 원하는 이름으로 지정하시면 됩니다(저는 다용도로 사용할 목적이나 주로 ssh 통신 숑으로 사용할 예정이므로 allow-ssh로 만들었습니다). 외부에서의 인스턴스 ‘접속’을 ‘허용’할 목적임으로 트래픽 방향은 ‘수신’으로, 일치 시 작업 여부는 ‘허용’으로 만들어주세요.

지금 제정하는 방화벽 규칙은 ‘해당 GCP 콘솔에 있는 모든 인스턴스에 적용할’ 목적이므로 대상은 ‘네트워크의 모든 인스턴스’로 지정해줍시다(태그를 통해 특정 인스턴스에게멘 방화벽 규칙을 적용할 수도 있습니다, 해당 내용은 아래에서 자세히 설명 드리겠습니다). 소스 IPv4 범위에는 접속을 허용할 외부 ip 주소를 입력하시면 됩니다. 저는 집에 배치된 공유기 라우터의 외부 ip를 입력하였습니다. 프로토콜 혹은 포트는 지정하여 특정 포트로의 접속만을 허용시킬 수도 있지만 지금은 ‘모두 허용’으로 만들겠습니다.
설정이 완료되었으면 ‘만들기’를 눌러주시면 됩니다.

인그레스(in-allow) 방화벽 규칙이 새로 생성된 것을 확인하실 수 있습니다.
방화벽 규칙이 제대로 적용 되었는지 확인해 보도록 하겠습니다. 저는 집에 위치한 공유기의 외부 ip 주소를 입력하였으므로, 해당 공유기에 결선된 데스크톱에서 접속을 시도해 보았습니다.

성공적으로 인스턴스에 접속된 것을 확인하실 수 있습니다!
방화벽 규칙 만들기: 태그(tag)를 통해 특정 인스턴스에 적용하기
방금 생성한 방화벽 규칙은 ‘네트워크의 모든 인스턴스’를 대상으로 적용했다는 점을 확인하셨을 것입니다. 하지만 GCP 환경에서는 태그라는 것을 사용해 일부 인스턴스에만 방화벽 규칙을 개별적으로 설정해 줄 수 있습니다.
우선 인스턴스에 태그를 붙여 보도록 하겠습니다.

좌측 메뉴바 → Compute Engine → VM 인스턴스
대시보드에서 ‘VM 인스턴스’ 항목으로 들어가신 다음, 태그를 붙일 인스턴스를 클릭합니다. 저는 mysql 인스턴스에 대하여 ‘전역 통신을 허용하는 방화벽’을 구성하는 실습을 해 보도록 하겠습니다.

‘수정’ 메뉴를 누르셔서 내부 인스턴스 설정을 변경하실 수 있습니다.

방화벽 구성 바로 아래 부분에 ‘네트워크 태그’라는 항목이 있습니다. 해당 부분에 이미 ‘http-server’, ‘https-server’라는 이름의 태그들이 생성되어 있군요. 해당 태그들 옆에 앞으로 사용할 이름의 태그를 입력해주시면 됩니다. 저는 임의로 ‘mysql’이라는 태그를 붙였습니다.
설정이 완료되었으면 ‘저장’ 버튼을 눌러 변경 사항을 저장하실 수 있습니다.
이제 해당 태그를 붙인 인스턴스에만 적용되는 방화벽 규칙을 새로 만들어 보겠습니다.

좌측 메뉴바 → VPC 네트워크 → 방화벽
방화벽 대시보드에 진입하신 후 새로 ‘방화벽 규칙 만들기’ 메뉴로 진입합니다.

방화벽 설정 중간의 ‘대상’에 ‘네트워크의 모든 인스턴스’ 대신 ‘지정된 대상 태그’를 선택해 줍니다. 이렇게 하면 대상으로 할 태그를 입력하실 수 있습니다. 하단의 ‘대상 태그’ 부분에 해당 방화벽 규칙을 적용할 인스턴스들의 태그를 입력해줍시다*. 저는 방금 전 생성한 ‘mysql’ 이라는 태그를 입력하였습니다.

새롭게 생성한 방화벽 규칙을 확인하실 수 있습니다. 이제 mysql 태그가 붙은 인스턴스들은 ip 전역에서 통신이 가능합니다!
💬 마치며
방화벽은 외부 ip로부터의 접속을 허용 또는 차단하여 보안 수준을 높일 수 있는 매우 강력한 도구입니다. 일반적으로 클라우드 서비스에서 제공되는 외부 ip는 그 대역이 제한적임으로 DoS 공격의 타겟이 되는 경우가 많은데, 이러한 방화벽 규칙들을 적제 적소에 설정 및 배치하시는 것만으로도 매우 강력한 보안 시스템을 구축하실 수 있습니다.
발자취를 로그처럼 남기고자 하는 초보 개발자의 블로그