20. OI Active Directory Federation Services

예상 소요 시간: 18시간

작동 가능 구성요소 소유자: OIC

OIDC 연결을 구성하는 방법

OIDC 연결은 원하는 상태 구성 (DSC)에 의해 관리됩니다. 수동으로 만들 수도 있지만 DSC가 선호되는 방법입니다.

  1. Marvin 사용자로 CONFIG1 VM에 로그인합니다.

  2. VSCode 또는 원하는 편집기를 사용하여 c:\config\config.ps1을 엽니다.

  3. -ADFS1를 검색하여 ADFS 서버의 구성 노드를 찾습니다.

    # Example ADFS server noe in config.ps1
    NodeName           = "$Site1Code-ADFS1"
    HyperVHost         = 'AA-OC-BM01'
    Role               = 'adfs'
    IPv4Addr           = '172.21.0.23'
    

    AdfsAppGrp이라는 배열에는 OIDC 연결의 해시 테이블이 포함됩니다. Example-OIDC의 전체 해시 테이블을 복사하여 기존 Example-OIDC 해시 테이블 뒤에 붙여넣습니다. 예:

    @{
                         Name        = 'Example-OIDC'
                         AdfsSrvApp  = @{
            
    }
    @{
                         Name        = 'Example-OIDC'
                         AdfsSrvApp  = @{
            
    }
    
  4. NameRedirectURI 매개변수를 새 OIDC 연결과 연결된 값으로 업데이트합니다. config.ps1 파일을 저장합니다.

  5. 관리자 권한으로 PowerShell 창을 열고 ADFS1 서버 구성을 업데이트합니다. [사이트] 를 사이트 코드로 바꿉니다.

    $Cred = Get-Credential -Message "Enter Admin Credentials for ADFS1"
    c:\dsc\Update-RemoteHost.ps1 -ComputerName [Site]-ADFS1 -Credential $Cred -NoThirdParty
    
  6. ADFS1 VM에 로그인하고 AD FS 관리 MMC를 연 다음 애플리케이션 그룹을 클릭하여 OIDC 구성을 검증합니다.

  7. ADFS1 VM에 로그인한 상태에서 C:\config을 열고 <Your Connector Name> Srv App.txt이라는 파일을 찾습니다. 이 파일에서 찾은 IdentifierClientSecret 값을 저장하여 나중에 애플리케이션에서 사용합니다. 식별자와 보안 비밀 값이 기록되면 이 파일을 삭제합니다.

GDC 인프라 콘솔의 OIDC 구성

  1. GDC 배포를 위한 OIDC 커넥터 정보를 수집합니다.

    1. 리디렉션 URI: https://ais-core.<GDC_name>.<DNS_domain>/finish-login(예: https://ais-core.example.domain.local/finish-login)
    2. GDC 서비스 콘솔 URL: https://infra-console.<GDC_name>.<DNS_domain>(예: https://infra-console.example.domain.local)
  2. 이전 단계에 따라 OIDC 연결을 만듭니다.

  3. GDC 셀의 Anthos Identity Service (AIS)가 구성되면 GDC 콘솔의 URL로 OIDC 구성을 테스트합니다.

    1. OIC 워크스테이션에 로그인합니다.
    2. Chrome을 열고 인프라 콘솔 URL(예: https://infra-console.example.domain.local)로 이동합니다.
    3. 메시지가 표시되면 사용자 이름과 비밀번호를 입력합니다. 사용자 인증 정보가 유효하면 인프라 콘솔 GUI로 리디렉션됩니다.

    이 ADFS 서버에서 관리하는 각 GDC 셀에 대해 필요에 따라 이 단계를 반복합니다.

ADFS용 GDC DNS 구성

  1. 시스템 컨트롤러 또는 부트스트래퍼에 로그인합니다.

  2. 루트 관리자 클러스터의 kubeconfig를 내보냅니다.

    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
    
  3. 전달 영역을 사용하여 OCIT_DOMAIN를 구성합니다. OCIT_DOMAIN을 OCIT 도메인 이름으로 바꾸고 엔드포인트를 OC DNS IP 주소로 바꿉니다.

    kubectl apply -f - <<EOF
    apiVersion: network.private.gdc.goog/v1alpha1
    kind: DNSZone
    metadata:
      namespace: dns-system
      name: ocit-domain
    spec:
      domainName: OCIT_DOMAIN
      forwardingConfig:
        # Set to OC DNS IPs (the AD domain controllers)
        endpoints:
          - 192.0.2.0
          - 192.0.2.1
        replicateToTenantOrg: true
    EOF
    

    출력은 다음 예와 같이 표시됩니다.

    dnszone.network.private.gdc.goog/ocit-domain created
    
  4. 변경사항이 적용되지 않으면 배포를 다시 시작합니다.

    kubectl rollout restart deployment -n dns-system gpc-coredns-forwarder
    

    이 DNS 변경사항은 GDC의 모든 클러스터에 전파됩니다.

  5. 루트 관리자 kubeconfig를 사용하여 OCIT 도메인 확인이 의도한 대로 작동하는지 확인합니다.

    NAMESERVER=$(kubectl -n dns-system get service gpc-coredns-forwarder-udp | \
      awk '/[0-9]\./ {print $4}')
    dig +short @${NAMESERVER} fs.OCIT_DOMAIN
    
  6. 조직 관리자 클러스터의 kubeconfig를 내보냅니다.

    export KUBECONFIG=/root/release/org-admin/org-admin-kubeconfig
    
  7. 조직 관리자 kubeconfig를 적용하고 OCIT 도메인 확인이 의도한 대로 작동하는지 확인합니다.

    NAMESERVER=$(kubectl -n dns-system get service gpc-coredns-infra-forwarder | \
      awk '/[0-9]\./ {print $4}')
    dig +short @${NAMESERVER} fs.OCIT_DOMAIN
    

콘솔의 GDC AIS 구성

  1. ADFS1에 로그인한 다음 AD FS 관리 MMC를 엽니다.

  2. 서비스 > 인증서를 클릭합니다.

  3. 서비스 통신 인증서를 더블클릭합니다.

  4. 인증 경로 탭을 클릭합니다.

  5. '루트'로 표시된 최상위 인증서를 선택합니다.

  6. 인증서 보기를 클릭합니다.

  7. 세부정보 탭을 선택한 다음 파일로 복사를 클릭합니다.

    1. Base-64 (.CER) 형식으로 저장
  8. ADFS 루트 CA를 시스템 컨트롤러 또는 부트스트래퍼에 adfs.cer로 복사합니다.

  9. 시스템 컨트롤러 또는 부트스트래퍼에 로그인한 다음 ADFS 루트 CA를 base64 인코딩으로 셸 변수에 내보냅니다. 다음 명령어는 헤더를 포함한 인증서를 줄 바꿈 문자 없이 단일 행으로 base64로 인코딩합니다.

        export BASE64_CERT=$(base64 adfs.cer | tr -d "\n\r")
    
  10. 루트 관리자 클러스터 kubeconfig를 내보냅니다.

    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
    
  11. iac 저장소로 이동하여 전역 조직의 디렉터리 구조를 추가합니다.

    cd iac; mkdir -p infrastructure/global/orgs/root/
    
  12. 조직의 ioauthmethod.yaml 파일을 추가합니다.

    cat > infrastructure/global/orgs/root/ioauthmethod.yaml << EOF
    apiVersion: iam.global.private.gdc.goog/v1alpha1
    kind: IOAuthMethod
    metadata:
      name: adfs-oidc
      namespace: gpc-system
    spec:
      oidc:
        certificateAuthorityData: ADFS_CERT_BASE64
        clientID: ADFS_CLIENT_ID
        clientSecret: ADFS_CLIENT_SECRET
        groupPrefix: gdch-infra-operator-
        groupsClaim: groups
        issuerURI: https://fs.OCIT_DOMAIN/adfs
        scopes: openid email offline_access
        userClaim: email
        userPrefix: gdch-infra-operator-
        cloudConsoleRedirectURI: http://cloud.console.not.enabled
        kubectlRedirectURI: http://localhost:9879/callback
    EOF
    

    다음 변수를 바꿉니다.

    변수정의
    ADFS_CERT_BASE64

    이전 단계에서 만든 $BASE64_CERT 값입니다.

    ADFS가 자체 서명하는 데 사용하는 이 base64로 인코딩된 PEM으로 인코딩된 인증서는 GKE Identity Service가 내부 ADFS 인스턴스와 보안 연결을 설정하는 데 필요합니다.

    ADFS_CLIENT_ID ADFS에 있는 조직 클라이언트의 OpenID Connect ID입니다.
    ADFS_CLIENT_SECRET ADFS에 등록된 조직 클라이언트의 OpenID Connect 보안 비밀번호입니다.
    OCIT_DOMAIN OCIT 도메인 이름입니다. 자세한 내용은 ADFS용 GDC DNS 구성을 참고하세요.
  13. kustomization.yaml 파일을 전역 iac 폴더에 추가합니다.

    cat > infrastructure/global/orgs/root/kustomization.yaml << EOF
    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    metadata:
      name: ioauthmethod-kustomization
    resources:
    - ioauthmethod.yaml
    EOF
    
  14. 조직 YAML 파일과 kustomize 파일을 스테이징하고 커밋합니다.

    git add "infrastructure/global"
    git add "infrastructure/zonal"
    git commit
    
  15. GitLab에 업데이트를 푸시합니다.

    git -c http.sslVerify=false push
    
  16. 코드 검토 및 병합을 기다립니다.

  17. 새로 추가된 IdP가 ClientConfig에 있는지 확인합니다.

      kubectl get ClientConfig default -n kube-public -o yaml
    

ADFS 다중 인증 설정

요구사항

  1. YubiKey는 5.16 강화 및 정책 적용 섹션에 따라 사용자에게 프로비저닝되었습니다.
  2. AD FS의 이전 단계가 모두 예상대로 작동하는 것으로 확인되었습니다. 즉, 사용자가 AD FS를 사용하여 사용자 이름과 비밀번호 인증으로 GDC 엔드포인트에 액세스할 수 있습니다.

안내

다음 단계에 따라 ADFS 다단계 인증을 설정합니다.

ADFS 인증서 인증을 전역적으로 사용 설정

ADFS1 호스트에서 다음 단계를 실행합니다.

  1. -sa 계정(예: username-sa)을 사용하여 ADFS1 호스트에 RDP로 연결합니다.
  2. Administrator로 PowerShell 창을 실행합니다.
  3. 환경에서 CertificateAuthentication이 이미 사용 설정되어 있는지 확인합니다.

    # Checking current Global Authentication Policy for
    # PrimaryIntranetAuthenticationProvider
    Get-AdfsGlobalAuthenticationPolicy | Select-Object `
        -Property PrimaryIntranetAuthenticationProvider
    
    # Example output, note it is missing CertificateAuthentication
    PrimaryIntranetAuthenticationProvider  : {FormsAuthentication,
        WindowsAuthentication, MicrosoftPassportAuthentication}
    
  4. PrimaryIntranetAuthenticationProvider를 설정하여 CertificateAuthentication을 포함합니다. 또한 OC IT에서 사용하지 않는 인증 방법인 MicrosoftPassportAuthentication을 삭제합니다.

    # Setting the Global Authentication Policy for
    # PrimaryIntranetAuthenticationProvider to include CertificateAuthentication
    Set-AdfsGlobalAuthenticationPolicy -PrimaryIntranetAuthenticationProvider `
        @('FormsAuthentication', 'WindowsAuthentication', 'CertificateAuthentication')
    
    # Validating the update to Global Authentication Policy for
    # PrimaryIntranetAuthenticationProvider
    Get-AdfsGlobalAuthenticationPolicy | Select-Object `
        -Property PrimaryIntranetAuthenticationProvider
    
    # Desired output
    PrimaryIntranetAuthenticationProvider  : {CertificateAuthentication,
        FormsAuthentication, WindowsAuthentication}
    
ADFS 인증서 인증 테스트

OC IT 워크스테이션에서 다음 단계를 완료합니다.

  1. 권한이 없는 계정으로 OC IT 워크스테이션에 로그인합니다.
  2. Chrome 브라우저를 열고 평소와 같이 infra-console.CELL_NAME.DOMAIN에 액세스합니다(예: https://infra-console.example.domain.local).
  3. 로그인 버튼 아래에 표시되는 인증서를 사용하여 로그인 옵션을 클릭합니다.

    OC-IT 이미지

  4. 대화상자 창에서 권한이 없는 사용자 인증서를 선택하고 확인을 클릭합니다.

    OC-IT 이미지

  5. 메시지가 표시되면 YubiKey PIN을 입력하고 확인을 클릭합니다.

    OC-IT 이미지

  6. ADFS 인증이 올바르게 작동하면 사용자 이름과 비밀번호를 입력한 것처럼 인프라 콘솔 GUI가 표시됩니다.

  7. 로그아웃 버튼을 사용하여 인프라 콘솔에서 로그아웃한 다음 모든 Chrome 창을 닫습니다. 이 작업을 수행하면 캐시된 사용자 인증 정보가 삭제되고 각 GDC 엔드포인트를 테스트할 수 있습니다.

    OC-IT 이미지

  8. 각 GDC 엔드포인트에 대해 이 섹션의 단계를 반복합니다. 매번 로그아웃하고 Chrome을 닫아 AD FS 인증 프롬프트가 표시되도록 합니다.

    • Console.gdchservices (gdchservices org)
    • GitLab
    • ServiceNow
    • 다른 조직

ADFS MFA 인증을 전역적으로 엄격하게 적용

ADFS1 호스트에서 다음 단계를 실행합니다.

  1. alexb-sa와 같은 -sa 계정으로 ADFS1 호스트에 RDP를 실행합니다.
  2. 관리자 권한으로 PowerShell 창을 실행합니다.
  3. PrimaryIntranetAuthenticationProvider를 설정하여 CertificateAuthentication만 포함합니다.

    # Setting the Global Authentication Policy for
    # PrimaryIntranetAuthenticationProvider to include CertificateAuthentication
    Set-AdfsGlobalAuthenticationPolicy -PrimaryIntranetAuthenticationProvider `
      @('CertificateAuthentication')
    
    # Validating the update to Global Authentication Policy for
    # PrimaryIntranetAuthenticationProvider
    Get-AdfsGlobalAuthenticationPolicy | Select-Object `
    -Property PrimaryIntranetAuthenticationProvider
    
    # Desired output
    PrimaryIntranetAuthenticationProvider  : {CertificateAuthentication}
    

각 GDC 엔드포인트 재테스트

OC IT 워크스테이션에서 다음 단계를 실행합니다.

  1. 권한이 없는 계정으로 OC IT 워크스테이션에 로그인합니다.
  2. Chrome 브라우저를 열고 평소와 같이 infra-console.CELL_NAME.DOMAIN에 액세스합니다(예: https://infra-console.example.domain.local).
  3. AD FS 포털에서 즉시 인증서 또는 YubiKey를 요청합니다. 사용자 이름 또는 비밀번호 입력란이 더 이상 표시되지 않아야 합니다.

    OC-IT 이미지

  4. 인증서를 선택한 후 이전 테스트와 동일한 YubiKey PIN을 입력합니다.

    OC-IT 이미지

설정이 완료되었습니다.