본문 바로가기

개발하자

GCP의 GKE에서 IP in kubernetes에 의한 접근 제한

반응형

GCP의 GKE에서 IP in kubernetes에 의한 접근 제한

나는 구글 클라우드 파트폼의 컨테이너 엔진(GKE)과 로드 밸런서(GLB) 위에 쿠버네티스(k8s)를 실행하고 있다. 나는 IP 화이트리스트에 대한 k8s 입력에서의 접근을 제한하고 싶다.

이것이 내가 k8s나 GLB에서 직접 할 수 있는 일인가, 아니면 나를 위해 그것을 해주는 프록시를 통해 일들을 실행해야 하는가?




소스 IP의 ningx-ingress를 화이트리스트로 지정하는 방법은 아래 주석을 사용하는 것입니다.

ingress.kubernetes.io/whitelist-source-range

하지만 안타깝게도 구글 클라우드 로드 밸런서는 AFAIK를 지원하지 않는다.

nginx 인그레스 컨트롤러를 사용하는 경우 사용할 수 있습니다.

주석의 값은 쉼표로 구분된 CIDR 범위일 수 있습니다.

좀 더.

화이트리스트 소스 IP에 대한 Google Cloud Load Balancer 지원에 대한 진행 상황을 확인하십시오.




GKE에 생성된 인그레스로 연결되는 글로벌 로드 밸런서에는 GCP의 방화벽 규칙을 적용할 수 없습니다. 특정 IP 주소(예: VPN을 통해 연결하는 사용자, 이 경우 VPN 게이트웨이의 IP 주소)에 대한 액세스만 제한하려면 GCP, 특히 GKE에 즉시 사용할 수 있는 솔루션이 없습니다.

구조에 Nginx 및 Http 헤더 "x-forward-for"

GKE를 사용하는 경우 마이크로서비스 아키텍처가 있고 API Gateway를 사용하는 경우 Nginx가 API Gateway일 가능성이 있습니다. 다음 IP를 가진 요청만 허용하도록 nginx를 구성하기만 하면 됩니다

→ 클라이언트의 공용 IP

→ 글로벌 정적 IP가 수신에 할당됨

nginxconf

location /my_service {
  rewrite_by_lua_file validate_ip.lua;
  proxy_pass http://my_service
}

validate_ip.lua

local cjson = require "cjson"

local status=""

local headers=ngx.req.get_headers()

local source_ips=headers["x-forwarded-for"]

if source_ips ~= "111.222.333.444, 555.666.777.888" then
  status="NOT_ALLOWED"
end

if status ~= "" then
  ngx.status = ngx.HTTP_UNAUTHORIZED
  ngx.header.content_type = "application/json; charset=utf-8"
  ngx.say(cjson.encode({ status = "ERROR",message=status.."YOUR_MESSAGE" }))
  return ngx.exit(ngx.HTTP_UNAUTHORIZED)
end

자세한 사항은




요즘은 여기서 지정한 대로 사용할 수 있습니다:

외부 IP를 서비스에 전달하는지 확인해야 합니다

그리고 NGINX 인그레스를 사용하는 경우 인그레스 컨트롤러 서비스를 설정해야 합니다.




CORS를 사용할 수 있으며 프론트엔드의 IP만 마이크로서비스에 도달하도록 허용할 수 있습니다.




Cloud Armor, Add a Policy를 사용하고 Allow/Deny Rules를 생성한 다음 대상에 k8s LB를 부착하면 됩니다.

enter image description here

enter image description here




이 작업을 수행하는 방법을 알아보다가 귀사의 서비스가 유형이라고 가정할 때, 이제는 다음 필드를 정의에 추가하기만 하면 됩니다.

loadBalancerSourceRanges:
    - x.x.x.x/32

소스 cidr을 필요한 만큼 추가할 수 있습니다. 궁금한 경우 해당 소스에서 트래픽을 허용하는 방화벽 규칙으로 변환하면 서비스가 사용 중인 네트워크에서 규칙을 찾을 수 있습니다.


반응형