NGINX와 Azure Active Directory를 활용한 안전한 API 액세스

NGINX | 2022년 10월 06일

API는 애플리케이션 연결에서 핵심적인 역할을 하지만 공격에 취약하기도 합니다. 과거의 모놀리식 애플리케이션에서는 보호해야 할 진입점이 하나뿐이었습니다. 반면 마이크로서비스 아키텍처에서는 하나의 애플리케이션이 API로 연결된 여러 마이크로서비스로 구성되는 경우가 많으며, 각 API에는 수백 개의 엔드포인트가 있을 수 있습니다. 이로 인해 API의 잠재적 공격 표면이 크게 확대되며, 새로운 API가 추가될 때마다 보안 경계에 새로운 진입점이 생깁니다.

API를 보호하는 전략은 다양합니다. 그중 가장 기본적인 전략은 액세스 제어입니다. 간단히 말해, 사용자의 신원을 확인하고(인증 또는 AuthN) 사용자가 특정 리소스에 액세스할 수 있는지 확인해야 합니다(권한 부여 또는 AuthZ). OpenID Connect(OIDC) 구현은 API에 가장 널리 사용되는 액세스 제어 방식 중 하나입니다. API Connectivity Manager를 사용하면 몇 분 만에 이를 설정하고 실행할 수 있습니다. API Connectivity Manager는 F5 NGINX Management Suite의 일부입니다.

이 튜토리얼에서는 API Connectivity Manager와 Azure Active Directory(Azure AD)를 사용하여 JSON 웹 토큰(JWT) 검증을 설정하고 OIDC 워크플로의 권한 부여 단계를 수행하는 방법을 알아봅니다.

OpenID Connect란 무엇인가요?

OpenID Connect(OIDC)는 OAuth 2.0 프로토콜을 기반으로 구축된 ID 프로토콜입니다. OIDC를 사용하면 클라이언트가 최종 사용자 또는 기기의 ID를 확인할 수 있습니다. 이는 인증과 권한 부여를 모두 포함하는 액세스 제어의 한 부분입니다:

  • 인증은 사용자 또는 기기가 자신이 주장하는 대상이 맞는지 확인합니다
  • 권한 부여는 인증된 사용자 또는 기기가 액세스할 수 있는 대상을 결정합니다

OIDC는 다양한 방식으로 구현할 수 있으며, 이 튜토리얼에서는 그중 Azure AD를 사용합니다. 또는 F5 BIG-IP Access Policy Manager (APM), Okta, Auth0, Ping Identity 등의 다른 OIDC 솔루션을 API Connectivity Manager와 함께 사용할 수도 있습니다.

시작하기 위해 필요한 사항

다음 사전 요구 사항이 준비되어 있는지 확인하세요:

API Connectivity Manager에 액세스해야 하는 경우 NGINX Management Suite 30일 무료 평가판을 신청할 수 있습니다.

Azure AD 애플리케이션 만들기

브라우저를 열고 Azure Portal에 로그인합니다.

왼쪽 메뉴에서 앱 등록을 클릭합니다.

Azure AD 포털 홈 페이지

그림 1: Azure AD 포털 홈 페이지

Click on the 새 등록 버튼을 클릭합니다.

Azure AD 앱 등록

그림 2: Azure AD 앱 등록

새 애플리케이션을 만들려면 이름, 리디렉션 URI를 입력하고 등록 버튼을 클릭합니다. 이 데모에서는 Postman을 활용하므로 Postman OIDC 리디렉션 URI를 사용합니다.

새 Azure AD 앱 만들기

그림 3: 새 Azure AD 앱 만들기

이제 앱이 생성되었으므로 API에 대한 액세스 권한을 제공할 OAuth 범위를 만들어야 합니다. 왼쪽 메뉴에서 API 노출 링크를 클릭합니다.

API 노출

그림 4: API 공개

Click 범위 추가를 클릭합니다.

범위 추가

그림 5: 범위 추가

기본 애플리케이션 ID URI를 그대로 사용하거나 직접 만든 후 저장하고 계속 버튼을 클릭합니다. 애플리케이션 ID URI를 직접 만들려면 원하는 도메인을 Azure AD에 등록해야 합니다.

애플리케이션 ID URL

그림 6: 애플리케이션 ID URL

이 데모에서는 Microsoft 예제를 기반으로 범위를 설정합니다. 다음 정보로 양식을 작성한 후 범위 추가 버튼을 클릭합니다.

범위 이름: Employees.Read.All
동의할 수 있는 사용자: 관리자 및 사용자
관리자 동의 표시 이름: 직원 레코드에 대한 읽기 전용 액세스
관리자 동의 설명: 모든 직원 데이터에 대한 읽기 전용 액세스를 허용합니다.
사용자 동의 표시 이름: 내 직원 레코드에 대한 읽기 전용 액세스
사용자 동의 설명: 내 직원 데이터에 대한 읽기 전용 액세스를 허용합니다.

범위 추가

그림 7: 범위 추가

다음으로 클라이언트 애플리케이션에 권한을 부여해야 합니다. 이를 위해 클라이언트 ID를 확인합니다. 왼쪽 메뉴에서 개요 링크를 클릭하고 애플리케이션(클라이언트) ID를 복사합니다.

애플리케이션 클라이언트 ID

그림 8: 애플리케이션 클라이언트 ID

Click on the API 노출 링크를 다시 클릭한 다음, 클라이언트 애플리케이션 추가 버튼을 클릭합니다.

클라이언트 애플리케이션 추가

그림 9: 클라이언트 애플리케이션 추가

애플리케이션 클라이언트 ID를 클라이언트 ID 필드에 붙여넣고 애플리케이션 ID URI 옆의 확인란을 선택합니다. 그런 다음 애플리케이션 추가 버튼을 클릭합니다.

클라이언트 애플리케이션 추가

그림 10: 클라이언트 애플리케이션 추가

다음으로, 이 데모에서는 권한 부여 코드 흐름을 통해 권한 부여 코드를 활용하므로 Postman에 클라이언트 암호가 필요합니다. 왼쪽 메뉴에서 인증서 및 암호 링크를 클릭한 다음, 새 클라이언트 암호 버튼을 클릭합니다.

새 클라이언트 암호

그림 11: 새 클라이언트 암호

비밀에 이름을 지정하고 만료 시간은 기본값으로 두세요.

시크릿 이름

그림 12: 비밀 이름

다음으로, 클라이언트 암호를 복사하여 나중에 사용할 수 있도록 암호 보관소에 저장합니다.

클라이언트 시크릿

그림 13: 클라이언트 시크릿

API Connectivity Manager에서 JWT 어설션 구성

이제 Azure AD 애플리케이션 구성을 완료했으므로 API Connectivity Manager에서 API 게이트웨이 클러스터를 설정하여 정의한 서비스에 JSON Web Token Assertion을 수행할 수 있습니다. 이 단계에서는 Azure AD 테넌트의 JSON Web Key(JWK) 세트 URI를 확인해야 합니다.

JWKS URI는 Azure AD 테넌트의 잘 알려진 엔드포인트에서 확인할 수 있습니다.
https://login.microsoftonline.com/<tenant-id>/v2.0/.well-known/openid-configuration

이 페이지에는 jwks_uri 키가 포함된 JSON 페이로드가 표시됩니다. 해당 키의 값을 복사해야 합니다.

Azure AD 테넌트의 잘 알려진 엔드포인트

그림 14: Azure AD 테넌트 Well-Known 엔드포인트

이제 JWKS URI를 확보했으므로 API Connectivity Manager 콘솔을 열고 서비스 프록시 구성으로 이동합니다. 정책 추가를 클릭하여 JSON Web Token Assertion 정책을 추가합니다.

게이트웨이 서비스 프록시 정책

그림 15: 게이트웨이 서비스 프록시 정책

그런 다음 Azure AD 테넌트의 JKWS URI를 URI 위치 필드에 붙여넣고 추가 버튼을 클릭합니다.

JSON 웹 토큰 어설션 정책

그림 16: JSON Web Token 어설션 정책

이 정책을 API 게이트웨이 클러스터에 배포하려면 저장 및 게시 버튼을 클릭하세요.

서비스 게이트웨이 정책

그림 17: 서비스 게이트웨이 정책

이것으로 완료되었습니다! 이제 API Connectivity Manager 인스턴스가 구성된 서비스 게이트웨이에서 JWT 어설션을 수행하도록 설정되었습니다.

Postman으로 테스트하기

이제 설정을 테스트하여 예상대로 작동하는지 확인할 차례입니다. 시작하려면 Azure AD 애플리케이션에서 몇 가지 정보를 가져와야 합니다:

  • 애플리케이션 클라이언트 암호(앞서 저장한 값)
  • OAuth 범위
  • OAuth 권한 부여 엔드포인트
  • OAuth 토큰 엔드포인트

OAuth 범위를 가져오려면 Azure 포털을 열고 앱 등록 페이지로 돌아갑니다. 그런 다음 왼쪽 메뉴에서 API 노출 링크를 클릭하고 범위의 복사 아이콘을 클릭합니다. 잠시 후 사용할 수 있도록 이 값을 저장해 두세요.

API 범위

그림 18: API 범위

OAuth 권한 부여 및 토큰 엔드포인트를 확인하려면 왼쪽 메뉴에서 개요 링크를 클릭한 다음 엔드포인트 버튼을 클릭합니다. 그런 다음 권한 부여 및 토큰 엔드포인트 URI를 복사합니다.

Azure AD 애플리케이션 엔드포인트

그림 19: Azure AD 애플리케이션 엔드포인트

Azure AD 애플리케이션 엔드포인트 URL

그림 20: Azure AD 애플리케이션 엔드포인트 URL

Postman을 열고 Environments 메뉴를 클릭합니다. 그런 다음 Create Environment 링크를 클릭합니다.

Postman 환경 생성

그림 21: Postman 환경 생성

환경 이름을 지정하고 이전 단계에서 저장한 값으로 6개의 변수를 추가한 후, 해당 값을 초기 값 열과 현재 값 열에 입력하고 저장 버튼을 클릭합니다.

  • client_id: Azure AD 애플리케이션의 클라이언트 ID
  • client_secret: Azure AD 애플리케이션의 클라이언트 암호
  • auth_url: Azure AD 테넌트의 OAuth 인증 URL
  • token_url: Azure AD 테넌트의 OAuth 토큰 URL
  • tenant_id: Azure AD 디렉터리(테넌트) ID
  • scope: 애플리케이션 ID URL이 포함된 Azure AD 애플리케이션의 API 범위

Postman 환경 변수

그림 22: Postman 환경 변수

Postman에서 새 탭을 열고 다음 단계를 따르세요:

  • 오른쪽 상단에서 환경을 ACM(으)로 변경합니다
  • 주소 표시줄에 API URL을 입력하세요
  • Click the인증 탭을 클릭합니다
  • Change the 유형을 OAuth 2.0으로 변경
  • 인증 구성에서 아래로 스크롤한 후 다음 변수를 설정합니다:
  • 인증 URL: {{auth_url}}
  • 액세스 토큰 URL: {{token_url}}
  • 클라이언트 ID: {{client_id}}
  • 클라이언트 시크릿: {{client_secret}}
  • Click the 새 액세스 토큰 받기 버튼을 클릭하세요

Postman 요청

그림 23: Postman 요청

Postman 인증 구성

그림 24: Postman 인증 구성

브라우저 창이 열리고 Azure AD 자격 증명으로 로그인하라는 메시지가 표시됩니다. 인증에 성공하면 Postman으로 다시 리디렉션되고 다음 창이 나타납니다. Use Token 버튼을 클릭합니다.

Postman 토큰 사용

그림 25: Postman 토큰 사용

이제 OAuth 액세스 토큰을 받았으므로 API를 호출할 수 있습니다. 저장 버튼을 클릭한 다음 보내기 버튼을 클릭합니다.

모든 항목이 올바르게 구성되었다면 200 OK 응답이 표시됩니다.

Postman 요청 성공

그림 26: Postman 요청 성공

결론

이제 API Connectivity Manager가 Azure AD OAuth 액세스 토큰을 사용하여 API를 보호하도록 구성되었습니다. 다음 단계는 OAuth 범위를 추가하고 API Connectivity Manager의 API 게이트웨이 클러스터가 해당 범위를 보호된 API에 전달하도록 구성하는 것입니다. 하지만 이 내용은 다음 게시물에서 다루겠습니다!

지금 시작하세요

Start a NGINX Management Suite 30일 무료 체험판을 시작해 보세요. 여기에는 API Connectivity Manager와(과) Instance Manager가 포함됩니다.

이 게시물의 원문은 codygreen.com에 처음 게재되었습니다. 저자의 허락을 받아 편집 후 이곳에 다시 게재합니다.


공유
태그: F5 NGINX, Tech

관련 블로그 게시물

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
NGINX | 2023. 11. 30.

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric

이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
NGINX | 2023. 03. 23.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법

앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
NGINX | 2021. 09. 27.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션

개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX | 2021. 07. 06.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법

NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX | 2021. 06. 30.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리

NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
NGINX | 2015. 03. 25.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유

Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.