데모: Keycloak 또는 Google SSO로 인증

이 페이지는 플랫폼 관리자용으로 작성되었습니다.

데모 또는 테스트 목적으로만 Keycloak 또는 Google 싱글 사인온(SSO)으로 인증을 시도할 수 있습니다.

Keycloak로 인증

Keycloak은 오픈소스 소프트웨어 Identity and Access Management 제품이며 빠른 데모를 위해 OIDC 제공업체로 설정할 수 있습니다.

시작하기 전에

Keycloak을 설치하고 사용 설정하려면 연결 해제 모드에서 실행되는 Anthos 배포에서 액세스할 수 있는 인그레스 주소가 있는 Kubernetes 클러스터가 필요합니다. 이 페이지에서는 연결 해제 모드 실행되는 Anthos 관리자 클러스터가 예시로 사용됩니다.

또한 연결 해제 모드에서 실행되는 Anthos 관리 센터의 커스텀 도메인 이름을 만들어야 합니다. 관리 센터에 액세스할 도메인 이름 구성을 참조하세요.

  1. 다음과 같이 관리 센터 도메인 이름을 변수로 내보냅니다.

    export ANTHOS_MANAGEMENT_CENTER=anthos.example.com
    
  2. 다음과 같이 비공개 레지스트리를 변수로 내보냅니다.

    export PRIVATE_REGISTRY=10.200.0.2/library
    

Keycloak 이미지 다운로드 및 비공개 레지스트리에 푸시

  1. dockerhub에서 Keycloak 이미지를 다운로드합니다.

    actl images save \
      --output keycloak-image \
      jboss/keycloak:12.0.2
    
  2. Keycloak 이미지를 비공개 레지스트리에 푸시합니다.

    actl images push \
      --images keycloak-image \
      --private-registry=${PRIVATE_REGISTRY}
    

Keycloak 배포

DNS 구성을 업데이트하고 Keycloak을 배포하기 위해 인증서를 생성합니다.

  1. Keycloak에 대해 IP를 노출하기 위해 Keycloak 서비스를 만듭니다.

    kubectl create -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: keycloak
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: keycloak-svc
      namespace: keycloak
      labels:
        app: keycloak
    spec:
      ports:
      - name: http
        port: 80
        targetPort: 8080
      - name: https
        port: 443
        targetPort: 8443
      selector:
        app: keycloak
      type: LoadBalancer
    EOF
    
  2. LoadBalancer에서 IP가 할당된 후, 다음과 같이 IP를 변수로 내보냅니다.

    export KEYCLOAK_SVC_IP=$(kubectl get services -n keycloak \
        -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
    
  3. DNS 도메인 구성에 "A 레코드"를 추가하고 이를 ${KEYCLOAK_SVC_IP}로 설정합니다.

    export KEYCLOAK_SVC=keycloak.example.com
    
  4. Keycloak이 TLS에 사용할 자체 서명 인증서를 생성합니다.

    openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -subj \
        "/CN=${KEYCLOAK_SVC}" \
        -addext "subjectAltName = DNS:localhost,DNS:${KEYCLOAK_SVC},IP:${KEYCLOAK_SVC_IP}" \
        -out "tls.crt" -keyout "tls.key"
    
  5. 인증서 및 비공개 키를 클러스터에 업로드합니다.

    kubectl create secret tls tls-config -n keycloak --cert=tls.crt \
        --key=tls.key
    
  6. 다음 명령어를 실행하여 Keycloak을 배포합니다.

    kubectl create -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: keycloak
      namespace: keycloak
      labels:
        app: keycloak
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: keycloak
      template:
        metadata:
          labels:
            app: keycloak
        spec:
          volumes:
          - name: tls-config-volume
            secret:
              secretName: tls-config
              items:
              - key: tls.crt
                path: tls.crt
              - key: tls.key
                path: tls.key
          containers:
          - name: keycloak
            # Set the image as original path but the actual image will be pulled from the registry mirror,
            # which was configured by 'actl push' command.
            image: jboss/keycloak:12.0.2
            # Keycloak uses certificates stored in /etc/x509/https to set up TLS.
            # https://github.com/keycloak/keycloak-containers/blob/master/server/README.md#setting-up-tlsssl
            volumeMounts:
            - name: tls-config-volume
              mountPath: "/etc/x509/https"
            env:
            - name: KEYCLOAK_USER
              value: "admin"
            - name: KEYCLOAK_PASSWORD
              value: "admin"
            - name: PROXY_ADDRESS_FORWARDING
              value: "true"
            ports:
            - name: http
              containerPort: 8080
            - name: https
              containerPort: 8443
            readinessProbe:
              httpGet:
                path: /auth/realms/master
                port: 8080
    EOF
    

Keycloak 사용자 및 클라이언트 설정

관리자 워크스테이션에서 Keycloak 콘솔을 열고 keycloak.yaml 파일에서 KEYCLOAK_USERKEYCLOAK_PASSWORD으로 로그인합니다. 기본적으로 이러한 값은 KEYCLOAK_USER=adminKEYCLOAK_PASSWORD=admin입니다. 필요한 경우 브라우저에서 자체 서명된 인증서를 수락합니다. Chrome에서 신뢰할 수 없는 인증서에 대한 경고가 표시되면 대화상자에 thisisunsafe를 입력합니다.

echo "Keycloak console: https://${KEYCLOAK_SVC}"

렐름 만들기

  1. 왼쪽 위에서 마스터 위로 마우스를 가져가고 렐름 추가를 클릭합니다.
  2. 새 렐름의 이름으로 anthos를 입력하고 만들기를 클릭합니다.
  3. 토큰이 너무 일찍 만료되지 않도록 방지하기 위해 렐름 설정 > 토큰에서 액세스 토큰 수명1 Hour로 변경하고 저장을 클릭합니다.

사용자 생성하기

  1. 왼쪽 탐색 메뉴에서 사용자를 클릭한 후 사용자 추가를 클릭합니다.
  2. 사용자에 대한 다음 설정을 구성한 후 저장을 클릭합니다.
    1. 사용자 이름: anthos-platform-admin
    2. 이메일: anthos-platform-admin@example.com
    3. 사용자 사용 설정: ON
    4. 이메일 확인: ON
  3. 사용자 인증 정보 탭에서 비밀번호비밀번호 확인 필드를 입력합니다. 비밀번호 설정을 클릭하고 프롬프트에 따라 확인합니다.

클라이언트 만들기

  1. 왼쪽 탐색 메뉴에서 클라이언트를 클릭한 후 만들기를 클릭합니다.
  2. 클라이언트에 대한 다음 설정을 구성한 후 저장을 클릭합니다. ANTHOS_MANAGEMENT_CENTER는 관리 센터에 사용하는 커스텀 도메인 이름입니다.
    1. 클라이언트 ID: anthos
    2. 클라이언트 프로토콜: openid-connect
    3. 루트 URL: https://ANTHOS_MANAGEMENT_CENTER
  3. 새로 생성된 클라이언트의 관리 페이지로 이동합니다.
  4. 클라이언트 관리 페이지의 설정 탭에서 다음 단계를 수행합니다.
    1. 액세스 유형confidential로 설정합니다.
    2. 다음 URI를 유효한 리디렉션 URI에 추가합니다.
      • http://localhost:9879/callback
      • https://ANTHOS_MANAGEMENT_CENTER/_gcp_anthos_oidc_callback
    3. 저장을 클릭합니다.
  5. 클라이언트 관리 페이지의 사용자 인증 정보 탭에서 클라이언트 ID 및 보안 비밀을 클라이언트 인증자로 선택합니다.
  6. 보안 비밀을 기록해 둡니다.
    1. 왼쪽 탐색 메뉴에서 그룹을 클릭한 다음 신규를 클릭합니다.
    2. 그룹 이름 anthos-platform-admin-group을 입력합니다.
    3. 왼쪽에 있는 사용자 탭으로 돌아가고 모든 사용자 보기를 클릭합니다.
    4. 바로 전에 만든 사용자(anthos-platform-admin)를 클릭하고 그룹 탭을 클릭합니다.
    5. 사용 가능한 그룹에서 만든 그룹인 anthos-platform-admin-group을 선택하고 가입을 클릭합니다.
    6. anthos 클라이언트 관리 페이지로 돌아갑니다.
    7. 매퍼 탭을 클릭한 다음 만들기를 클릭합니다.
      1. 이 매퍼의 이름 anthos-platform-admin-group-mapper를 입력합니다.
      2. 매퍼 유형 드롭다운 목록에서 그룹 멤버십을 선택합니다.
      3. Token Claim Name은 인증 토큰에 표시되는 속성 값입니다. 연결 해제된 모드에서 실행되는 Anthos의 기본값은 '그룹'이므로 이 필드에 groups를 사용할 수 있습니다. Token Claim Name 이름이 groups이 아니면 OIDC 구성의 GroupsClaim 필드를 이 값으로 수정해야 합니다.
      4. 전체 그룹 경로가 사용 중지되었는지 확인합니다.
      5. ID 토큰에 추가, 액세스 토큰에 추가, userinfo에 추가가 모두 사용 설정되었는지 확인합니다.
      6. 저장을 클릭합니다.

OIDC 인증 사용 설정

다음 단계에서 사용할 OIDC 제공업체 URL을 가져옵니다.

  1. 다음 명령어를 실행합니다.

    export ISSUER_URL=https://${KEYCLOAK_SVC}/auth/realms/anthos
    echo "Issuer URL: ${ISSUER_URL}"
    
  2. 이전의 tls.crt를 사용하여 Base64로 인코딩된 인증서를 생성합니다.

    export BASE64_CERT=$(openssl base64 -A -in tls.crt)
    echo "Use the following string as the base64-encoded certificate for the OIDC provider: ${BASE64_CERT}"
    
  1. 관리 센터 Console에서 ID 및 액세스 메뉴를 엽니다.
  2. ID 탭에서 Anthos Identity Service(OIDC) 설정을 클릭합니다.
  3. 다음 필드를 완료하여 Keycloak의 프로필을 만든 후 제출을 클릭합니다.

    1. 프로필 이름: keycloak
    2. OIDC 제공업체 URL: OIDC 인증 사용 설정 섹션의 발급기관 URL입니다.
    3. OIDC 클라이언트 ID: anthos
    4. OIDC 클라이언트 보안 비밀번호: 클라이언트 만들기 섹션의 클라이언트 보안 비밀번호입니다.
    5. 사용자 이름 클레임: email
    6. 사용자 이름 프리픽스: keycloak-
    7. 그룹 클레임: 그룹 멤버십 설정 섹션의 그룹 클레임입니다. 이 필드를 비워 둘 경우 값은 groups입니다.
    8. 그룹 프리픽스: keycloak-
    9. 범위: email openid
    10. 추가 매개변수: access_type=offline
    11. 인증 기관 데이터: OIDC 인증 사용 설정 섹션의 base64 인코딩 인증서 사용
  4. 클러스터에 프로필 적용을 클릭하고 관리자 클러스터 탭을 클릭합니다.

  5. 프로필에 대해 바로 전에 만든 'keycloak' 프로필을 선택합니다.

  6. 도메인 이름ANTHOS_MANAGEMENT_CENTER를 입력합니다.

  7. 초기 플랫폼 관리자의 경우 항상 사용자 이름 앞에 사용자 프리픽스를 추가합니다. 예를 들어 anthos-platform-admin@example.com을 추가하는 경우 keycloak-anthos-platform-admin@example.com을 입력합니다.

  8. 제출을 클릭하고 여러 시스템 구성요소가 다시 구성되도록 1분 정도 기다립니다.

  9. 시크릿 창에서 https://ANTHOS_MANAGEMENT_CENTER로 이동합니다. anthos-platform-admin으로 로그인할 수 있는 Keycloak 로그인 페이지로 리디렉션됩니다(영구 비밀번호를 설정한 후).

YAML 파일을 적용하는 대안적인 접근 방법

  1. 도메인의 IDP 제공업체를 설정합니다. DomainConfig가 이미 도메인에 대해 생성된 경우 객체를 패치하여 이 명령어로 도메인에 사용할 인증 메서드 이름을 설정합니다.

    kubectl patch domainconfig anthos.example.com --type=json -p='[{"op": "replace", "path":
    "/spec/authMethodName", "value":"keycloak"}]'
    

    도메인에 DomainConfig가 생성되지 않았으면 다음 명령어를 사용하여 만듭니다.

    kubectl create -f - <<EOF
    apiVersion: managementcenter.anthos.cloud.google.com/v1
    kind: DomainConfig
    metadata:
      name: anthos.example.com
    spec:
      authMethodName: keycloak
    EOF
    
  2. 다음 콘텐츠로 clientconfig-patch.yaml을 만듭니다.

    # Use this to set the OIDC configuration of Keycloak:
    # kubectl patch ClientConfig default -n kube-public --type=merge --patch $(cat clientconfig-patch.yaml)
    spec:
      authentication:
      # The name of the OIDC configuration to create.
      - name: keycloak
        oidc:
          # ID for the client application that makes authentication requests to the OpenID provider.
          clientID: anthos
          # ID for the client application that makes authentication requests to the OpenID provider.
          clientSecret: YOUR_CLIENT_SECRET
          # The URI to redirect users going through the OAuth flow using cloud console.
          # This is not supported by Anthos running in disconnected mode.
          cloudConsoleRedirectURI: http://cloud.console.not.enabled
          # Additional key-value parameters (comma-separated) to send to the OpenID provider.
          extraParams: access_type=offline
          # URL where authorization requests are sent to your OpenID.
          issuerURI: YOUR_ISSUER_URI
          # The redirect URL that kubectl uses for authorization.
          kubectlRedirectURI: http://localhost:9879/callback
          # Additional scopes to send to the OpenID provider.
          scopes: openid email
          # JWT claim to use as the username. You can choose other claims, such as email or name,
          # depending on the OpenID provider. However, claims other than email are prefixed
          # with the issuer URL to prevent naming clashes.
          userClaim: email
          # A base64-encoded PEM-encoded certificate for the OIDC provider. To create the string,
          # encode the certificate, including headers, into base64. Include the resulting string
          # in certificateAuthorityData as a single line.
          certificateAuthorityData: YOUR_CERTIFICATE
    
  3. Keycloak 설정을 사용하여 clientconfig-patch.yaml을 수정합니다.

    sed -i "s|YOUR_ISSUER_URI|${ISSUER_URL}|g" clientconfig-patch.yaml
    sed -i "s|YOUR_CERTIFICATE|${BASE64_CERT}|g" clientconfig-patch.yaml
    
  4. YOUR_CLIENT_SECRET을 Keycloak의 사용자 인증 정보 탭에서 가져온 클라이언트 보안 비밀번호로 바꿉니다.

  5. 다음 명령어를 실행하여 OIDC를 구성합니다.

    kubectl patch ClientConfig default -n kube-public --type=merge \
        --patch "$(cat clientconfig-patch.yaml)"
    
  6. 여러 시스템 구성요소가 다시 구성되도록 1분 정도 기다립니다.

  7. 승인 역할 구성의 안내에 따라 초기 플랫폼 관리자 계정을 설정합니다.

  8. 시크릿 창에서 https://ANTHOS_MANAGEMENT_CENTER로 이동합니다. anthos-platform-admin으로 로그인할 수 있는 Keycloak 로그인 페이지로 리디렉션됩니다(영구 비밀번호를 설정한 후).

Keycloak 삭제

Keycloak 데모 사용을 완료했으면 Keycloak 설치를 삭제합니다.

kubectl delete ns keycloak

Google SSO로 인증

Google SSO는 Anthos 비공개 모드에서 사용할 수 없습니다. Google SSO를 사용하려면 클러스터와 브라우저가 Google의 SSO 서버에 연결할 수 있어야 합니다. Google의 SSO 서버는 사용자 클러스터에 연결할 필요가 없습니다.

  1. Google Cloud 콘솔에 로그인하고 적합한 프로젝트를 선택합니다.
  2. 'API 및 서비스 > OAuth 동의 화면' 섹션에 액세스합니다.
  3. 새 OAuth 동의 화면을 만듭니다. 이 정보가 사용자에게 표시됩니다.
    1. 애플리케이션 홈페이지를 관리 URL로 설정합니다.
  4. API 및 서비스 > 사용자 인증 정보 섹션에서 다음을 수행합니다.
    1. 사용자 인증 정보 만들기를 클릭합니다.
    2. OAuth 클라이언트 ID를 만듭니다.
    3. 애플리케이션 유형을 웹 애플리케이션으로 설정합니다.
    4. 관련 이름을 선택합니다.
    5. 자바스크립트 원본의 경우 https://anthos.example.com을 설정합니다. 여기서 https://anthos.example.com은 관리 센터의 도메인 이름입니다.
    6. 승인된 리디렉션 URI의 경우 다음을 설정합니다.
      • https://anthos.example.com/_gcp_anthos_oidc_callback
      • http://localhost:9879/callback
  5. 클라이언트 ID 및 클라이언트 보안 비밀을 AdminUI 구성에 복사합니다.
  6. OIDC 공급자 URL을 https://accounts.google.com으로 설정합니다.
  7. Username Claimemail로, Scopesopenid email로 설정합니다.
  8. 추가 매개변수를 prompt=consent,access_type=offline으로 설정합니다. 그렇지 않으면 Kubernetes API 서버로 로그인할 수 없습니다.
  9. 플랫폼 관리자 권한을 부여할 사용자 이메일의 초기 목록(쉼표로 구분)을 추가합니다.
  10. Save를 클릭합니다.

Google SSO

다음 단계