OpenID Connect 및 NGINX Ingress Controller를 통한 쉽고 강력한 싱글 사인온 SSO
OIDC는 최신 앱을 위한 인증 및 싱글 사인온(SSO) 솔루션을 제공하는 OAuth 2.0 프레임워크 위에 구축된 ID 계층입니다. 당사의 OIDC 정책은 사용자가 여러 애플리케이션 및 Kubernetes 서비스로 안전하게 인증할 수 있도록 하는 본격적인 SSO 솔루션입니다. 중요한 것은 앱이 외부 ID 공급자(IdP)를 사용하여 사용자를 인증할 수 있고 앱이 사용자 이름이나 암호를 처리할 필요가 없다는 점입니다.
이 기능은 JWT(JSON Web Token) 인증 과 같은 다른 NGINX Ingress Controller 권한 부여 및 인증 기능을 보완 하여 NGINX Ingress 리소스로 쉽게 구성할 수 있는 강력한 SSO 옵션을 제공합니다. 즉, 사용자 인증 및 권한 부여를 위한 검증된 솔루션으로 앱을 보호할 수 있으며 개발자는 앱에서 이러한 기능을 구현할 필요가 없습니다. Ingress Controller에서 보안 및 트래픽 제어를 시행하면 연결 초기 단계에서 권한이 없는 사용자와 인증되지 않은 사용자를 차단하여 Kubernetes 환경에서 리소스에 대한 불필요한 부담을 줄입니다.
OIDC 정책 정의
OIDC 정책을 정의하고 적용하면 NGINX Plus Ingress Controller는 OIDC 신뢰 당사자로 작동하여 Ingress를 제공하는 Kubernetes 서비스에 대한 인증된 세션을 시작하고 검증합니다. 사전 구성된 IdP로 OIDC 인증 코드 흐름 을 지원합니다.
참고: OIDC 정책은 NGINX Plus에만 적용됩니다.
다음은 OIDC Policy
개체의 샘플 구성입니다.
apiVersion: k8s.nginx.org/v1alpha1
kind: Policy
metadata:
name: ingress-oidc-policy
spec:
oidc:
clientID: nginx-ingress
clientSecret: oidc-secret
authEndpoint: https://idp.example.com/openid-connect/auth
tokenEndpoint: https://idp.example.com/openid-connect/token
jwksURI: https://idp.example.com/openid-connect/certs
OIDC 세션을 설정할 때 정책의 개체가 사용되는 방법은 다음과 같습니다.
- 클라이언트는 보호된 리소스를 요청하고 NGINX Plus Ingress Controller는 인증을 위해 authEndpoint로 지정된 IdP로 리디렉션합니다.
- 인증에 성공하면 IdP가 일회용 코드를 발행하고 클라이언트를 NGINX Plus Ingress Controller에서 호스팅하는 특수 URI(tokenEndPoint)로 리디렉션합니다. 이 URI는 클라이언트가 세션 기간 동안 사용할 수 있는 JWT에 대한 일회용 코드를 교환합니다. .
- NGINX Plus Ingress Controller는 JWT를 저장하고 JWT에 대한 불투명 참조를 포함하는 세션 쿠키를 클라이언트에 보냅니다.
- 클라이언트가 후속 요청을 하고 세션 쿠키를 제공하면 NGINX Plus Ingress Controller는 JWT를 검색하고 jwksURI URI에 저장된 인증서에 대해 유효성을 검사합니다. JWT가 유효하고 만료되지 않은 경우 NGINX Ingress Controller는 요청을 적절한 백엔드 Kubernetes Pod로 프록시합니다.
NGINX Plus Ingress Controller OIDC 정책은 기본 openid 범위 외에 표준 OIDC 범위를 지원합니다. 범위에는 액세스 제어 기준으로 사용될 수 있는 이름 및 이메일 주소와 같은 사용자 ID 속성이 포함됩니다. 클라이언트와 IdP 모두에서 이러한 범위가 NGINX Plus Ingress Controller와 공유되도록 허용하는 경우 해당 값은 IdP의 응답에서 JWT 클레임으로 인코딩됩니다.
OIDC 정책이 성공적으로 적용되면 다른 수신 Load Balancing 구성에서 재사용할 수 있으므로 앱 및 Kubernetes Service에 인증 및 권한 부여를 훨씬 쉽게 추가할 수 있습니다. 예를 들어 VirtualServer 개체에서 OIDC 정책을 참조하고 JWT 클레임을 HTTP 헤더로 업스트림 애플리케이션에 전달하여 수신 트래픽을 수정할 수 있습니다.
apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
name: webapp
spec:
host: webapp.example.com
tls:
secret: tls-secret
redirect:
enable: true
upstreams:
- name: webapp
service: webapp-svc
port: 80
routes:
- path: /
policies:
- name: oidc-policy
action:
proxy:
upstream: webapp
resquestHeaders:
pass: true
set:
- name: My-Header
value: ${jwt_claim_profile}