Istio를 사용하는 멀티 클라우드 앱

앱 ID 및 액세스 어댑터를 사용하여 단일 위치에서 중앙 집중식으로 모든 ID를 관리할 수 있습니다.

앱 ID 및 액세스 어댑터가 현재 지원되지 않습니다.

엔터프라이즈에서 여러 제공자의 클라우드나 온프레미스 및 오프프레미스 솔루션을 조합하여 사용하므로 이기종 배치 모델을 통해 기존 인프라를 유지하고 공급업체 잠금을 방지합니다. 어댑터는 OIDC 호환 ID 제공자(예: App ID과(와) 함께 작동하도록 구성할 수 있습니다. 서비스를 사용하면 어댑터가 프론트엔드 및 백엔드 애플리케이션을 포함한 모든 환경에서 인증 및 권한 부여 정책을 제어할 수 있습니다. 이 모두는 코드를 변경하거나 애플리케이션을 재배치하지 않고 수행할 수 있습니다.

멀티 클라우드 아키텍처

멀티 클라우드 컴퓨팅 환경에서는 여러 클라우드 및/또는 사설 컴퓨팅 환경을 단일 네트워크 아키텍처로 결합합니다. 여러 환경에 워크로드를 분배하면 복원성과 유연성이 향상되고 비용 효율성이 높아질 수 있습니다. 이점을 얻으려면 Kubernetes와 같은 오케스트레이션 계층과 컨테이너 기반 애플리케이션을 사용하는 것이 일반적입니다.

앱 ID 및 액세스 어댑터 아키텍처
배포 - 앱 ID 및 액세스 어댑터로

Istio 및 어댑터 이해

Istio는 Kubernetes와 통합할 수 있는 기존 분산 애플리케이션에 투명하게 계층화되는 오픈 소스 서비스 메시입니다. 배치의 복잡도를 줄이기 위해 Istio에서는 서비스 메시 전체에 대한 동작 인사이트와 운영 제어를 제공합니다. App ID를 Istio와 결합하면 사용자 정의 애플리케이션 코드 변경이 필요하지 않은 멀티 클라우드 아키텍처의 확장 가능한 통합 ID 솔루션이 됩니다. 자세한 내용은 무엇 Istio 에서 확인하세요.

Istio에서는 Envoy 프록시 사이드카를 사용하여 서비스 메시의 모든 서비스에 대한 인바운드 및 아웃바운드 트래픽을 모두 중재합니다. Istio에서는 프록시를 사용하여 정책 의사결정을 적용하기 위해 Mixer라는 Istio 컴포넌트에 전송되는 텔레메트리라고도 하는 트래픽에 관한 정보를 추출합니다. 앱 ID 및 액세스 어댑터에서는 서비스 메시 전체에서 ID 및 액세스 관리를 제어하기 위해 사용자 정의 정책과 비교하여 텔레메트리(속성)를 분석하여 Mixer 기능을 확장합니다. 액세스 관리 정책은 특정 Kubernetes 서비스에 링크되며 특정 서비스 엔드포인트에 맞게 미세하게 조정할 수 있습니다. 정책 및 원격 분석에 대한 자세한 내용은 Istio 문서를 참조하세요.

Istio 제한사항으로 인해 앱 ID 및 액세스 어댑터에서는 현재 사용자 세션 정보를 내부에 저장하며 복제본 또는 장애 복구 구성에서 정보를 유지하지 않습니다. 어댑터를 사용할 때 제한사항이 해결될 때까지 워크로드를 단일 복제본으로 제한하십시오.

프론트 엔드 앱 보호

브라우저 기반 애플리케이션을 사용하는 경우 OIDC(Open ID Connect) / OAuth 2.0 authorization_grant 플로우를 사용하여 사용자를 인증할 수 있습니다. 인증되지 않은 사용자를 발견하면 인증 페이지로 경로가 자동으로 재지정됩니다. 인증이 완료되면 어댑터가 요청을 가로채는 내재적 /oidc/callback 엔드포인트로 브라우저의 경로가 재지정됩니다. 이 때 어댑터에서 ID 제공자로부터 토큰을 얻어 원래 요청된 URL로 사용자의 경로를 다시 재지정합니다.

세션 토큰 등의 사용자 세션 정보를 보려면 Authorization 헤더를 확인할 수 있습니다.

Authorization: Bearer <accessToken> <IDToken>

인증된 사용자를 로그아웃할 수도 있습니다. 인증된 사용자가 다음 예제에 표시된 대로 oidc/logout이 추가된 상태로 보호된 엔드포인트에 액세스하면 로그아웃됩니다.

https://myhost/path/oidc/logout

필요한 경우 새로 고치기 토큰을 사용하면 사용자가 재인증하지 않고 새로운 액세스 및 ID 토큰을 자동으로 얻을 수 있습니다. 구성된 ID 제공자가 새로 고치기 토큰을 리턴하면 세션에서 해당 토큰을 유지하며 ID 토큰이 만기될 때 새 토큰을 검색하는 데 사용합니다.

백엔드 앱 보호

어댑터는 OAuth 2.0 JWT 베어러 플로우와 함께 사용하여 JWT 베어러 토큰의 유효성을 검사하여 서비스 API를 보호할 수 있습니다. Bearer 권한 플로우에서는 올바른 액세스 토큰과 선택적 ID 토큰이 있는 Authorization 헤더가 요청에 포함될 것으로 예상합니다. 예상 헤더 구조는 Authorization=Bearer {access_token} [{id_token}]입니다. 인증되지 않은 클라이언트에 권한 부여를 얻는 데 필요한 범위 목록과 함께 HTTP 401 응답 상태가 리턴됩니다. 토큰이 올바르지 않거나 만료된 경우 API 전략에서 Www-Authenticate=Bearer scope="{scope}" error="{error}"라는 선택적 오류 컴포넌트와 HTTP 401 응답을 리턴합니다.

토큰과 토큰 사용 방법에 관한 자세한 정보는 토큰 이해를 참조하십시오.

시작하기 전에

시작하기 전에 다음과 같은 사전 설치 소프트웨어가 설치되었는지 확인하십시오.

어댑터 설치

차트를 설치하려면 클러스터에서 Helm을 초기화하고 사용할 옵션을 정의한 다음 설치 명령을 실행하십시오.

  1. IBM Cloud Kubernetes 서비스에 대해 작업 중인 경우 로그인한 다음 클러스터의 컨텍스트를 설정하십시오.

  2. Istio 정책 적용을 사용하도록 설정했는지 확인합니다. 그렇지 않은 경우 설정하십시오.

  3. 저장소를 추가하십시오.

    helm repo add appidentityandaccessAdapter https://raw.githubusercontent.com/ibm-cloud-security/app-identity-and-access-Adapter/master/helm/appidentityandaccessAdapter
    
  4. 차트를 설치하십시오.

    helm install --name appidentityandaccessAdapter appidentityandaccessAdapter/appidentityandaccessAdapter
    

    image.tag 플래그를 설정하여 설치 중에 이미지 태그를 지정할 수 있습니다. 예를 들어, --set image.tag=0.5.0입니다. 차트도 로컬로 설치할 수 있습니다. 이 작업을 수행하려면 설치 명령을 실행하기 전에 git clone git@github.com:ibm-cloud-security/app-identity-and-access-Adapter.git을 실행하여 저장소를 복제하십시오.

권한 부여 및 인증 정책 적용

인증 및 권한 부여 정책은 요청에서 리소스 액세스에 액세스하기 위해 충족해야 하는 조건 세트입니다. 특정 플로우를 사용해야 하는 경우를 간략하게 설명하는 ID 제공자의 서비스 구성과 정책을 정의하여 서비스 메시의 모든 리소스에 대한 액세스를 제어할 수 있습니다. CRD 예시를 보려면 샘플 디렉토리를 확인하세요.

정책을 작성하려면 다음을 수행하십시오.

  1. 구성을 정의하십시오.
  2. 엔드포인트를 등록하십시오.

구성 정의

보호하는 애플리케이션(프론트 엔드 또는 백엔드)에 따라 다음 옵션 중 하나를 사용하여 정책 구성을 작성하십시오.

  • 프론트 엔드 애플리케이션의 경우: 사용자 인증이 필요한 브라우저 기반 애플리케이션은 OIDC / OAuth 2.0 인증 플로우를 사용하도록 구성할 수 있습니다. ID 제공자를 사용하여 인증 플로우를 용이하게 하는 데 사용하는 클라이언트를 포함하는 OidcConfig CRD를 정의하려면 다음 예를 안내서로 사용하십시오.

    apiVersion: "security.cloud.ibm.com/v1"
    kind: OidcConfig
    metadata:
       name:      oidc-provider-config
       namespace: sample-namespace
    spec:
       discoveryUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/.well-known/openid-configuration
       clientId:     <clientID>
       clientSecret: <randomlyGeneratedClientSecret>
       clientSecretRef:
             name: <nameOfKubeSecret>
             key: <keyInKubeSecret>
    
    YAML 구성 파일 구성 요소 설명
    필드 유형 필수 설명
    discoveryUrl 문자열 OIDC/OAuth 2.0 구성 정보의 JSON 문서를 제공하는 잘 알려진 엔드포인트입니다.
    clientId 문자열 인증에 사용하는 클라이언트의 ID입니다.
    clientSecret 문자열
    • 아니오
    클라이언트를 인증하는 데 사용하는 일반 텍스트 시크릿입니다. 제공하지 않으면 clientSecretRef가 있어야 합니다.
    clientSecretRef 오브젝트 아니오 클라이언트를 인증하는 데 사용하는 참조 시크릿입니다. 참조는 clientSecret 대신 사용할 수 있습니다.
    clientSecretRef.name 문자열 clientSecret를 포함하는 Kubernetes 시크릿의 이름입니다.
    clientSecretRef.key 문자열 clientSecret를 보유하는 Kubernetes 시크릿의 필드입니다.
  • 백엔드 애플리케이션용: OAuth 2.0 무기명 토큰 사양은 JSON 웹 토큰(JWT)을 사용하여 API를 보호하는 패턴을 정의합니다. 다음 구성을 예제로 사용하여 토큰 서명의 유효성을 검증하는 데 사용하는 공개 키 리소스를 포함하는 JwtConfig CRD를 정의하십시오.

    apiVersion: "security.cloud.ibm.com/v1"
    kind: JwtConfig
    metadata:
       name:      jwt-config
       namespace: sample-app
    spec:
       jwksUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/publickeys
    

애플리케이션 엔드포인트 등록

Policy CRD에 애플리케이션 엔드포인트를 등록하여 수신 요청의 유효성을 검증하고 인증 규칙을 적용하십시오. 각 Policy는 오브젝트가 있는 Kubernetes 네임스페이스에 독점적으로 적용되며 보호할 서비스, 경로 및 메소드를 지정할 수 있습니다.

apiVersion: "security.cloud.ibm.com/v1"
kind: Policy
metadata:
  name:      samplepolicy
  namespace: sample-app
spec:
  targets:
    -
      serviceName: <svcSampleApp>
      paths:
        - exact: /web/home
          method: ALL
          policies:
            - policyType: oidc
              config: <oidcProviderConfig>
              rules:
                - claim: scope
                  match: ALL
                  source: access_token
                  values:
                    - appid_default
                    - openid
                - claim: amr
                  match: ANY
                  source: id_token
                  values:
                    - cloud_directory
                    - google

        - exact: /web/user
          method: GET
          policies:
            - policyType: oidc
              config: <oidcProviderConfig>
              redirectUri: https://github.com/ibm-cloud-security/app-identity-and-access-Adapter
        - prefix: /
          method: ALL
          policies:
            -
              policyType: jwt
              config: <jwtConfig>
서비스 개체 구성 요소 이해
서비스 오브젝트 유형 필수 설명
serviceName string 보호할 정책 네임스페이스에 있는 Kubernetes 서비스의 이름입니다.
paths array[Path Object] 보호할 엔드포인트를 정의하는 경로 오브젝트의 목록입니다. 지정되지 않은 경우 모든 경로를 보호합니다.
경로 객체 구성 요소 이해
경로 오브젝트 유형 필수 설명
exact or prefix string 정책을 적용할 경로입니다. 옵션에는 exactprefix이(가) 포함됩니다. exact은(는) 마지막에 /를 표시하여 제공된 엔드포인트와 정확하게 일치합니다. prefix은(는) 제공하는 라우트 접두부로 시작되는 엔드포인트와 일치합니다.
method enum 아니오 보호된 HTTP 메소드입니다. 올바른 옵션은 ALL, GET, PUT, POST, DELETE, PATCH임 - 기본값은 ALL입니다.
policies array[Policy] 아니오 적용할 OIDC/JWT 정책입니다.
정책 개체 구성 요소 이해
정책 오브젝트 유형 필수 설명
policyType enum OIDC 정책의 유형입니다. 옵션에는 jwt 또는 oidc가 포함됩니다.
config string 사용할 제공자 구성의 이름입니다.
redirectUri string 아니오 성공적으로 인증한 다음 사용자의 경로를 재지정할 URL입니다. 기본값은 원래 요청 URL입니다.
rules array[Rule] 아니오 토큰 유효성 검증에 사용할 규칙 세트입니다.
정책 개체 구성 요소 이해
규칙 오브젝트 유형 필수 설명
claim string 유효성 검증할 청구입니다.
match enum 아니오 청구 유효성 검증에 필요한 기준입니다. 옵션에는 ALL, ANY 또는 NOT이 포함됩니다. 기본값은 ALL로 설정됩니다.
source enum 아니오 규칙을 적용할 토큰입니다. 옵션에는 access_token 또는 id_token가 포함됩니다. 기본값은 access_token으로 설정됩니다.
values array[string] 유효성 검증에 필요한 값 세트입니다.

어댑터 삭제

어댑터 및 연관된 모든 CRD을 제거하려면 Helm 차트 및 연관된 서명과 암호화 키를 삭제해야 합니다.

helm delete --purge appidentityandaccessAdapter
kubectl delete secret appidentityandaccessAdapter-keys -n istio-system

로깅 구성

기본적으로 로그는 외부 로깅 시스템과 쉽게 통합될 수 있도록 JSON으로 스타일이 지정되며 info 가시성 레벨에서 제공됩니다. 로깅 구성을 업데이트하려면 Helm 차트를 사용할 수 있습니다. 지원되는 로깅 레벨에는 Zap 코어에 표시된 대로 [-1, 7] 범위가 포함됩니다. 레벨에 대한 자세한 내용은 Zap 핵심 문서를 참조하세요.

어댑터

어댑터 로그를 보려면 kubectl을 사용하거나 Kubernetes 콘솔의 appidentityandaccessAdapter 팟(Pod)에서 팟(Pod)에 액세스할 수 있습니다.

alias Adapter_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=appidentityandaccessAdapter -o jsonpath='{.items[0].metadata.name}')"
Adapter_logs | jq

Mixer

어댑터가 요청을 받지 못하는 것으로 보이면 Mixer 로그를 확인하여 어댑터에 제대로 연결되었는지 확인하십시오.

alias mixer_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=telemetry -o jsonpath='{.items[0].metadata.name}') -c mixer"
mixer_logs | jq