Kong Manager의 보안을 강화하고 RBAC(Role-Based Access Control) 및 인증을 구성하는 종합 가이드
1. Kong Manager의 기본 인증 동작
Kubernetes에서 Kong을 배포하면, Kong Manager
와 Admin API
가 기본적으로 배포됩니다. 그러나 기본 설정에서는 RBAC이 비활성화되어 있어 누구나 Kong Manager 및 Admin API에 접근할 수 있습니다. 이를 방지하고, 안전한 인증 및 접근 제어를 적용하기 위해 RBAC 활성화 + 인증 토큰 적용 + Kubernetes 내 보안 설정을 단계별로 진행해야 합니다.
2. Kong RBAC 활성화 및 설정
RBAC를 활성화하려면, Kong Gateway
의 설정(ConfigMap 또는 환경변수)을 수정해야 합니다.
Kubernetes에서 Kong RBAC 활성화
RBAC 활성화를 위해 values.yaml
또는 환경변수 설정을 적용해야 합니다.
Helm을 사용하는 경우
env:
enforce_rbac: "on" # RBAC 활성화
admin_gui_auth: basic-auth # Kong Manager 인증 활성화 (선택 사항)
admin_gui_session_conf: '{"cookie_name":"admin_session","secret":"super-secret-key","storage":"kong"}' # Kong Manager 세션 설정
설정 후 Helm Upgrade
helm upgrade --install kong kong/kong -f values.yaml --namespace kong
kubectl을 사용하는 경우 (ConfigMap 직접 수정)
kubectl edit configmap kong-config -n kong
다음 값을 추가
data:
KONG_ENFORCE_RBAC: "on"
KONG_ADMIN_GUI_AUTH: "basic-auth"
KONG_ADMIN_GUI_SESSION_CONF: '{"cookie_name":"admin_session","secret":"super-secret-key","storage":"kong"}'
수정 후 Pod 재시작
kubectl rollout restart deployment kong -n kong
3. RBAC 사용자 및 토큰 생성
① RBAC 사용자 생성
RBAC 사용자를 생성하고, 관리자(admin) 권한을 부여해야 합니다.
kubectl exec -it $(kubectl get pod -l app.kubernetes.io/name=kong -n kong -o jsonpath="{.items[0].metadata.name}") -n kong -- \
curl -i -X POST http://localhost:8001/rbac/users \
--data name=admin --data user_token=my_secure_token
name=admin
→ 관리자 사용자 생성user_token=my_secure_token
→ 수동으로 지정한 토큰 (임의의 보안 키로 설정 가능)
② 발급된 사용자 확인
kubectl exec -it $(kubectl get pod -l app.kubernetes.io/name=kong -n kong -o jsonpath="{.items[0].metadata.name}") -n kong -- \
curl -i http://localhost:8001/rbac/users/admin
위 명령을 실행하면 생성된 RBAC 사용자 정보가 출력됩니다.
4. RBAC 역할(Role) 및 권한(Permission) 설정
① 역할(Role) 생성
kubectl exec -it $(kubectl get pod -l app.kubernetes.io/name=kong -n kong -o jsonpath="{.items[0].metadata.name}") -n kong -- \
curl -i -X POST http://localhost:8001/rbac/roles --data name=admin_role
② 역할에 권한 부여
kubectl exec -it $(kubectl get pod -l app.kubernetes.io/name=kong -n kong -- \
curl -i -X POST http://localhost:8001/rbac/roles/admin_role/endpoints \
--data method=GET --data workspace=default --data endpoint=/services
이렇게 하면 admin_role
은 /services
엔드포인트에 GET 요청을 보낼 수 있는 권한을 가지게 됩니다.
③ 사용자를 역할에 할당
kubectl exec -it $(kubectl get pod -l app.kubernetes.io/name=kong -n kong -o jsonpath="{.items[0].metadata.name}") -n kong -- \
curl -i -X POST http://localhost:8001/rbac/users/admin/roles \
--data roles=admin_role
위 설정이 완료되면 admin
사용자가 admin_role
의 권한을 가지게 됩니다.
5. Kong Manager 접근 시 인증 적용
① Kong-Admin-Token을 이용한 인증
이제 Admin API 요청 시, Kong-Admin-Token
을 추가하여 요청을 보내야 합니다.
kubectl exec -it $(kubectl get pod -l app.kubernetes.io/name=kong -n kong -o jsonpath="{.items[0].metadata.name}") -n kong -- \
curl -i -X GET http://localhost:8001/services \
--header "Kong-Admin-Token: my_secure_token"
my_secure_token
→ 위에서 설정한 RBAC 사용자 토큰
Kong Manager에 직접 접근하려면 브라우저에서 아래 URL을 입력하고, Kong-Admin-Token
값을 요청 헤더에 포함해야 합니다.
http://<KONG-MANAGER-URL>/
② Kong Manager 기본 인증 활성화 (Basic Auth)
기본 인증을 적용하여 Kong Manager에 ID/비밀번호 기반 인증을 추가할 수도 있습니다. RBAC 외에도, basic-auth
플러그인을 활성화하면 Kong Manager 접근 시 ID/PW 인증을 추가할 수 있습니다.
kubectl exec -it $(kubectl get pod -l app.kubernetes.io/name=kong -n kong -o jsonpath="{.items[0].metadata.name}") -n kong -- \
curl -i -X POST http://localhost:8001/admin-auth/users \
--data "username=admin" --data "password=StrongPassword123!"
이후, Kong Manager 로그인 시 admin / StrongPassword123! 계정을 입력하여 접근할 수 있습니다.
6. Kubernetes Ingress를 통한 Kong Manager 접근 제한
Kong Manager가 Kubernetes에서 외부에 공개되어 있다면, Ingress 또는 NetworkPolicy를 통해 접근을 제한하는 것이 중요합니다.
① Ingress에서 Kong Manager 접근 제한
Kubernetes에서 Ingress를 통해 Kong Manager 접근을 보호하려면, IP Whitelist를 적용할 수 있습니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kong-manager-ingress
namespace: kong
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.100/32"
spec:
rules:
- host: kong-manager.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kong-manager
port:
number: 8002
nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.100/32"
→ 특정 IP에서만 접근 가능하도록 설정.
② Kubernetes NetworkPolicy로 Admin API 보호
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: kong-admin-api-restrict
namespace: kong
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: kong
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 192.168.1.100/32
ports:
- protocol: TCP
port: 8001
이렇게 하면 특정 IP에서만 Kong Admin API(8001번 포트)에 접근할 수 있습니다.
- RBAC 활성화 (
enforce_rbac=on
) - RBAC 사용자 및 토큰 발급
- Kong Manager 인증 적용 (
basic-auth
또는session-auth
) - Ingress 및 NetworkPolicy로 접근 제한
- Kong-Admin-Token을 이용하여 인증 확인
이 가이드를 따라 설정하면 Kong Manager 및 Admin API에 대한 보안이 강화되며, Kubernetes 환경에서도 안전하게 운영할 수 있습니다. 아래 가이드는 Helm으로 설치된 Kong(Kong Gateway + Kong Manager) 환경에서 인증(RBAC)과 기본 인증을 활성화하고, Ingress/네트워크 레벨에서 접근 통제를 설정하는 방법입니다. 특히 No DB(DBless) 모드로 구성되어 있을 때 RBAC 설정이 어떻게 동작하는지에 대한 배경과 예시 커맨드도 포함합니다.
주의: No DB 모드에서 RBAC 정보를 생성하면, Pod 재시작 시 해당 정보가 사라질 수 있습니다.
지속적으로 RBAC 설정을 유지하려면 Helm의 values.yaml에 RBAC 설정을 선언하거나, decK 같은 툴을 통해 구성 관리를 해야 합니다.
1. No DB 모드에서의 Kong Manager 인증 개념
- No DB(DBless) 모드: Postgres/Cassandra 같은 외부 DB 없이, Kong이 구동 시점에 로드되는 YAML 설정 또는 환경변수 기반으로 동작합니다.
- RBAC: Role-Based Access Control. 관리자를 포함해 Kong Manager 및 Admin API에 접근할 수 있는 사용자를 정의하고, 필요한 역할(Role)과 권한(Permission)을 부여해 안전하게 접근을 제어합니다.
- Kong Manager 인증: RBAC를 활성화하면 HTTP 헤더(
Kong-Admin-Token
) 또는 Basic Auth 등으로 Kong Manager에 접근할 수 있습니다.
주의: No DB 모드에서 Pod(또는 Deployment)가 재시작되면, 런타임에 생성한 RBAC 사용자·역할·토큰 정보가 유지되지 않을 수 있습니다.
따라서 Helm values.yaml이나 decK 등을 통해 RBAC 구성을 선언적(Declarative)으로 관리해야 합니다.
2. Helm Chart 설정: RBAC 활성화
2.1 values.yaml
내 RBAC 관련 설정
Helm을 이용해 Kong을 설치했다면, 아래와 같이 values.yaml
에 RBAC와 Kong Manager 인증 설정을 추가할 수 있습니다.
env:
database: "off" # No DB 모드
admin_gui_auth: "basic-auth" # Kong Manager를 Basic Auth로 보호
enforce_rbac: "on" # RBAC 활성화
admin_gui_session_conf: '{"cookie_name":"admin_session","secret":"super-secret-key","storage":"kong"}'
database: off
→ DBless(No DB) 모드로 동작enforce_rbac: on
→ RBAC 활성화admin_gui_auth: basic-auth
→ Kong Manager 접속 시 Basic Auth를 요구하도록 설정
(원한다면admin_gui_auth: "basic"
또는key-auth
등 다른 인증 방식도 가능)admin_gui_session_conf
→ Kong Manager에서 세션 기반의 유지관리를 위해 필요한 설정
2.2 Helm 명령을 통한 설치/업데이트
helm upgrade --install kong kong/kong \
--namespace kong \
-f values.yaml
- 이미 설치되어 있다면
upgrade
로 갱신 - 새로 설치한다면
install
로 동작
설치가 완료되면 Kong이 RBAC를 적용한 상태로 구동되지만, 실제 RBAC 사용자/권한/토큰 생성은 추가 작업이 필요합니다.
3. RBAC 사용자·권한(Role)·토큰 생성
RBAC를 활성화했으니 이제 Kong Admin API를 통해 사용자(User)와 역할(Role), 권한(Permission), 그리고 관리 토큰을 생성해야 합니다.
중요
- 아래 명령 예시는 Kong Pod 내부에서
curl localhost:8001
하는 방식입니다.- No DB 모드에서 Pod가 재시작되면 설정이 휘발될 수 있으므로 참고하세요.
3.1 Kong Pod에 접속
Kong이 배포된 Namespace가 kong
이라 가정합니다.
KONG_POD=$(kubectl get pod -n kong -l app.kubernetes.io/name=kong \
-o jsonpath='{.items[0].metadata.name}')
kubectl exec -it $KONG_POD -n kong -- sh
이제 Kong Pod 내부에서 명령을 수행하게 됩니다.
3.2 관리자 사용자(Admin User) 생성
curl -i -X POST http://localhost:8001/rbac/users \
--data name=admin \
--data user_token=my_secure_token
name=admin
: 관리자 계정 이름user_token=my_secure_token
: 인증 시 사용할 토큰 값(원하는 임의의 값으로 지정 가능)
3.3 역할(Role) 생성
curl -i -X POST http://localhost:8001/rbac/roles \
--data name=admin_role
name=admin_role
라는 역할 생성
3.4 역할에 권한 부여
아래 예시는 admin_role
에게 모든 워크스페이스의 /services
엔드포인트를 GET할 수 있는 권한을 부여합니다.
curl -i -X POST http://localhost:8001/rbac/roles/admin_role/endpoints \
--data method=GET \
--data workspace=default \
--data endpoint=/services
method=GET
: HTTP GET 요청에 대한 권한만 부여workspace=default
: default 워크스페이스 대상으로 부여endpoint=/services
: 해당 경로에서의 권한
3.5 사용자에게 역할 할당
curl -i -X POST http://localhost:8001/rbac/users/admin/roles \
--data roles=admin_role
admin
사용자에게admin_role
부여
이제 admin
사용자(토큰 my_secure_token
)이 /services
엔드포인트에 대한 GET 권한을 얻게 됩니다.
4. Kong Manager 접근 인증 방법 (Kong-Admin-Token/BASIC)
4.1 Kong-Admin-Token 사용
RBAC 활성화 후에는 Admin API 호출 시 반드시 Kong-Admin-Token
헤더를 포함해야 합니다.
예: Admin API에서 /services
정보를 조회
curl -i -X GET http://<KONG-ADMIN-API-HOST>:8001/services \
--header "Kong-Admin-Token: my_secure_token"
my_secure_token
은 앞서--data user_token=my_secure_token
으로 생성했던 값
Kong Manager 웹 UI 접근 시
- 브라우저에서 Kong Manager URL(
http://<KONG-MANAGER-HOST>:8002/
)에 접속 시, HTTP 헤더(Kong-Admin-Token
)가 없으면 접근 거부될 수 있습니다. - 기본적으로
admin_gui_auth=basic-auth
를 켰다면, 웹 UI가 Basic Auth 로그인 창을 띄우거나, 토큰 헤더 전송을 요구할 수 있습니다.
4.2 Basic Auth (admin_gui_auth=basic-auth)
Helm 설정에서 admin_gui_auth: basic-auth
를 설정했다면, ID/PW 기반으로 Kong Manager에 로그인할 수 있습니다.
관리자 계정 생성 (Basic Auth)
curl -i -X POST http://localhost:8001/admin-auth/users \
--data "username=admin" \
--data "password=StrongPassword123!"
username=admin
,password=StrongPassword123!
등의 조합으로 관리자 계정 생성- 웹 UI(Kong Manager)에 접속 시,
admin / StrongPassword123!
로 로그인 가능
참고: RBAC를 함께 켜둔 상태라면, Basic Auth 로그인 시에도 해당 사용자에게 알맞은 역할(Role)과 권한(Permission)이 존재해야 정상적으로 Manager에 접근 가능해집니다.
5. No DB 모드에서 RBAC 설정의 지속성 관리
5.1 설정 휘발 문제
No DB 모드에서는 런타임에 생성한 사용자·권한 등의 정보가 Pod 재시작 시 사라질 수 있습니다.
이를 방지하려면 아래 방법 중 하나를 사용해야 합니다.
- Helm values.yaml에
rbac.resources
형태로 미리 선언 - decK를 이용해 RBAC 계정·권한을 YAML로 관리 후, Kong 시작 후 자동
deck sync
- Init Container나 별도 스크립트로 Kong Pod 기동 시점에 API 호출하여 RBAC 생성
5.2 Helm Chart를 통한 Declarative RBAC 예시
일부 Kong Helm Chart에는 DBless 구성을 위해 RBAC 사용자/역할을 values.yaml에 선언하는 기능을 제공합니다. (공식 Chart 버전에 따라 다름)
예: (개념적 예시)
rbac:
enabled: true
resources:
- name: "admin"
token: "my_secure_token"
roles:
- name: "admin_role"
comment: "Administrator Role"
endpoints:
- method: "GET"
endpoint: "/services"
workspace: "default"
실제 사용 중인 Chart에서 지원 여부를 확인해야 합니다.
지원하지 않는 경우 decK나 다른 방식으로 대체할 수 있습니다.
6. Ingress & NetworkPolicy로 접근 제한
6.1 Ingress를 통한 외부 접근 통제
Kong Manager 또는 Admin API가 외부로 노출되어 있다면, Ingress Controller나 로드밸런서 설정을 통해 IP 화이트리스트를 적용할 수 있습니다.
NGINX Ingress 예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kong-manager-ingress
namespace: kong
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.100/32"
spec:
rules:
- host: kong-manager.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kong-kong-manager
port:
number: 8002
nginx.ingress.kubernetes.io/whitelist-source-range
: 특정 IP 대역만 접근 허용
6.2 NetworkPolicy로 Admin API 보호
쿠버네티스의 NetworkPolicy를 사용하여 Admin API(예: 8001 포트)에 대한 접근을 제한할 수 있습니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: kong-admin-api-restrict
namespace: kong
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: kong
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 192.168.1.100/32
ports:
- protocol: TCP
port: 8001
podSelector
:kong
레이블이 붙은 Pod(Kong)만 대상ipBlock
:192.168.1.100/32
IP에서만 8001번 포트 접근 가능
7. 정리
- RBAC 활성화:
KONG_ENFORCE_RBAC=on
설정 확인 - 인증 방식 선택:
admin_gui_auth
(Basic Auth, key-auth, session 등) - RBAC 사용자·역할·토큰: Admin API(또는 선언적 YAML)를 통해 적절한 권한 부여
- No DB 모드의 지속성: Pod 재시작 시 RBAC 정보 유실 방지 대책(decK, Helm values, 스크립트 등)
- Ingress/NetworkPolicy: 외부에 노출된 Kong Manager, Admin API에 대해 IP 접근 제한
- 보안 모니터링: Kong Admin API 접근 로그 및 Kong Manager 로그인 이벤트를 모니터링
위 단계를 순차적으로 적용하면, No DB(DBless) 모드 환경에서도 Kong Manager와 Admin API에 대한 인증 및 권한 제어(RBAC)를 안정적으로 구성할 수 있습니다.
- Helm으로 간편하게 환경 변수를 설정하여 RBAC를 켜고,
- 사용자(User) / 역할(Role) / 권한(Permission)을 명시해 필요한 범위만 접근 가능하도록 제어하며,
- NetworkPolicy 및 Ingress 설정으로 네트워크 레벨에서 접근을 제한해 추가적인 보안 강도를 높일 수 있습니다.
운영 환경에서 Pod 재시작 시점 또는 업데이트가 잦다면, 반드시 RBAC 설정의 지속성(Declarative Management)에 주의하여 구성해 두는 것을 권장합니다. 이렇게 하면 Kubernetes 환경에서 Kong을 안전하게 운영하고, Kong Manager도 안심하고 사용할 수 있게 됩니다.
댓글