AD FS를 사용하여 SQL 미세 조정 및 대기 시간 문제 해결

AD FS 2016 업데이트에서는 데이터베이스 간 대기 시간을 줄이기 위해 다음과 같은 개선 사항을 도입했습니다. AD FS 2019에 대한 예정된 업데이트에는 이러한 개선 사항이 포함됩니다.

백그라운드 스레드의 메모리 내 캐시 업데이트

이전 AoA(Always On 가용성) 배포에서는 마스터 노드가 별도의 데이터 센터에 있을 수 있으므로 모든 "읽기" 작업에 대한 대기 시간이 존재했습니다. 서로 다른 두 데이터 센터 간의 호출로 인해 대기 시간이 발생했습니다.

AD FS에 대한 최신 업데이트에서는 AD FS 구성 캐시를 새로 고치는 백그라운드 스레드를 추가하고 새로 고침 기간을 설정하는 설정을 통해 대기 시간 감소를 목표로 합니다. 데이터베이스 캐시 업데이트가 백그라운드 스레드로 이동되므로 요청 스레드에서 데이터베이스 조회에 소요되는 시간이 크게 줄어듭니다.

backgroundCacheRefreshEnabled true로 설정되면 AD FS는 백그라운드 스레드가 캐시 업데이트를 실행할 수 있도록 합니다. 캐시에서 데이터를 가져오는 빈도는 설정 cacheRefreshIntervalSecs하여 시간 값으로 사용자 지정할 수 있습니다. true로 설정된 경우 기본값은 300초 backgroundCacheRefreshEnabled 로 설정됩니다. 설정된 값 기간이 지나면 AD FS가 캐시 새로 고침을 시작하고 업데이트가 진행 중인 동안 이전 캐시 데이터가 계속 사용됩니다.

AD FS가 애플리케이션에 대한 요청을 받으면 AD FS는 SQL에서 애플리케이션을 검색하고 캐시에 추가합니다. 값에서 cacheRefreshIntervalSecs 캐시의 애플리케이션은 백그라운드 스레드를 사용하여 새로 고쳐집니다. 항목이 캐시에 있는 동안 들어오는 요청은 백그라운드 새로 고침이 진행되는 동안 캐시를 사용합니다. 항목이 5 * cacheRefreshIntervalSecs에 액세스하지 않으면 캐시에서 삭제됩니다. 구성 가능한 값에 도달하면 캐시에서 가장 오래된 항목을 삭제할 수도 maxRelyingPartyEntries 있습니다.

참고 항목

AD FS가 SQL로부터 데이터베이스에서 변경이 발생했음을 나타내는 알림을 받으면 캐시의 데이터가 값 외부에서 cacheRefreshIntervalSecs 새로 고쳐집니다. 이 알림은 캐시를 새로 고치도록 트리거합니다.

캐시 새로 고침 설정에 대한 권장 사항

캐시 새로 고침의 기본값은 5분입니다. SQL 변경이 발생할 경우 캐시 데이터가 새로 고쳐지므로 AD FS에서 불필요한 데이터 새로 고침을 줄이려면 1시간으로 설정하는 것이 좋습니다.

AD FS는 SQL 변경에 대한 콜백을 등록하고 변경 시 AD FS가 알림을 받습니다. 이 메서드를 통해 AD FS는 SQL에서 발생하는 즉시 새로운 변경 사항을 각각 받습니다.

네트워크 결함으로 인해 AD FS에서 SQL 알림이 누락된 경우 AD FS는 캐시 새로 고침 값으로 지정된 간격으로 새로 고칩니다. AD FS와 SQL 간에 연결 문제가 의심되는 경우 캐시 새로 고침 값을 1시간 미만으로 설정하는 것이 좋습니다.

구성 지침

구성 파일은 여러 캐시 항목을 지원합니다. 아래에 나열된 다음 항목은 모두 조직의 요구 사항에 따라 구성할 수 있습니다.

다음 예제에서는 백그라운드 캐시 새로 고침을 사용하도록 설정하고 캐시 새로 고침 기간을 1800초 또는 30분으로 설정합니다. 이 작업은 각 AD FS 노드에서 수행해야 하며 나중에 AD FS 서비스를 다시 시작해야 합니다. 변경 내용은 다른 노드에 영향을 주지 않으며 모든 노드에서 변경하기 전에 첫 번째 노드를 테스트합니다.

  1. AD FS 구성 파일(기본 위치 C:\Windows\ADFS\Microsoft.IdentityServer.ServiceHost.exe.config)으로 이동하고 "Microsoft.IdentityServer.Service" 섹션 아래에 아래 항목을 추가합니다.
  • backgroundCacheRefreshEnabled - 백그라운드 캐시 기능을 사용할 수 있는지 지정합니다. "true/false" 값입니다.
  • cacheRefreshIntervalSecs - AD FS가 캐시를 새로 고치는 값(초)입니다. SQL이 변경되면 AD FS가 캐시를 새로 고칩니다. AD FS는 SQL 알림을 받고 캐시를 새로 고칩니다.

참고 항목

구성 파일의 모든 항목은 대/소문자를 구분합니다. <cache cacheRefreshIntervalSecs="1800" > backgroundCacheRefreshEnabled="true" />

지원되는 추가 구성 가능한 값:

  • maxRelyingPartyEntries - AD FS가 메모리에 유지할 신뢰 당사자 항목의 최대 수입니다. 이 값은 oAuth 애플리케이션 권한 캐시에서도 사용됩니다. RP보다 더 많은 애플리케이션 권한이 있고 모두 메모리에 저장되는 경우 이 값은 애플리케이션 사용 권한의 수여야 합니다. 기본값은 1000입니다.
  • maxIdentityProviderEntries - AD FS가 메모리에 유지할 클레임 공급자 항목의 최대 수입니다. 기본값은 200입니다.
  • maxClientEntries - AD FS가 메모리에 유지할 OAuth 클라이언트 항목의 최대 수입니다. 기본값은 500입니다.
  • maxClaimDescriptorEntries - AD FS가 메모리에 유지할 클레임 설명자 항목의 최대 수입니다. 기본값은 500입니다.
  • maxNullEntries - 음수 캐시로 사용됩니다. AD FS가 데이터베이스에서 항목을 찾고 찾을 수 없으면 AD FS는 음수 캐시에 추가됩니다. 이는 해당 캐시의 최대 크기입니다. 각 개체 유형에 대해 음수 캐시가 있으며 모든 개체에 대한 단일 캐시가 아닙니다. 기본값은 50,0000입니다.

데이터 센터에서 여러 아티팩트 DB 지원

여러 데이터 센터의 이전 구성의 경우 AD FS는 단일 아티팩트 데이터베이스만 지원하여 검색 호출 중에 센터 간 데이터 센터 대기 시간을 발생시켜 줍니다.

데이터 센터 간 대기 시간을 줄이기 위해 AD FS 관리자는 이제 여러 아티팩트 DB 인스턴스를 배포한 다음 AD FS 노드의 구성 파일을 수정하여 다른 아티팩트 DB 인스턴스를 가리킬 수 있습니다. 아티팩트 데이터베이스 연결 문자열 노드별 아티팩트 DB를 허용하는 구성 파일에 제공할 수 있습니다. 연결 문자열 구성 파일 내에 없는 경우 노드는 구성 DB에 있는 아티팩트 데이터베이스를 사용하기 위해 이전 디자인으로 대체됩니다. 하이브리드 환경도 이 구성에서 지원됩니다.

요구 사항

여러 아티팩트 데이터베이스 지원을 설정하기 전에 이 기능을 통해 다중 노드 호출이 발생하므로 모든 노드에서 업데이트를 실행하고 이진 파일을 업데이트합니다.

  1. 아티팩트 DB를 만드는 배포 스크립트 생성: 여러 아티팩트 DB 인스턴스를 배포하려면 관리자가 아티팩트 DB에 대한 SQL 배포 스크립트를 생성해야 합니다. 이 업데이트의 일부로 기존 Export-AdfsDeploymentSQLScriptcmdlet은 필요에 따라 SQL 배포 스크립트를 생성할 AD FS 데이터베이스를 지정하는 매개 변수를 사용하도록 업데이트되었습니다.

예를 들어 아티팩트 DB에 대한 배포 스크립트를 생성하려면 매개 변수를 -DatabaseType 지정하고 "Artifact" 값을 전달합니다. 선택적 -DatabaseType 매개 변수는 AD FS 데이터베이스 형식을 지정하며 모두(기본값), 아티팩트 또는 구성으로 설정할 수 있습니다. 매개 변수가 지정되지 -DatabaseType 않은 경우 스크립트는 아티팩트와 구성 스크립트를 모두 구성합니다.

PS C:\> Export-AdfsDeploymentSQLScript -DestinationFolder <script folder where scripts will be created> -ServiceAccountName <domain\serviceaccount> -DatabaseType "Artifact"

생성된 스크립트는 SQL 컴퓨터에서 실행하여 필요한 데이터베이스를 만들고 AD FS 서비스 계정인 SQL SA 권한을 해당 데이터베이스에 부여해야 합니다.

  1. 배포 스크립트를 사용하여 아티팩트 DB를 만듭니다. 새로 생성된 CreateDB.sql 및 SetPermissions.sql 배포 스크립트를 SQL Server 컴퓨터에 복사하고 실행하여 로컬 아티팩트 DB를 만듭니다.

  2. 아티팩트 DB 연결을 추가하도록 구성 파일을 수정합니다. AD FS 노드의 구성 파일로 이동하고 "Microsoft.IdentityServer.Service" 섹션 아래에서 새로 구성된 ArtifactDB에 진입점을 추가합니다.

참고 항목

artifactStore 및 connectionString은 대/소문자를 구분하는 값입니다. 올바르게 구성되었는지 확인합니다. <artifactStore connectionString="Data Source=.\SQLInstance; 통합 보안=True; Initial Catalog=AdfsArtifactStore" />

SQL 연결과 일치하는 데이터 원본 값을 사용합니다.

  1. 변경 내용을 적용하려면 AD FS 서비스를 다시 시작합니다.

참고 항목

아티팩트 데이터베이스 간에 SQL 복제본(replica) 또는 동기화를 사용하지 않는 것이 좋습니다. 데이터 센터당 하나의 아티팩트 데이터베이스를 설정하는 것이 좋습니다.

데이터 센터 간 장애 조치(failover) 및 데이터베이스 복구

마스터 아티팩트 데이터베이스와 동일한 데이터 센터에 장애 조치(failover) 아티팩트 데이터베이스를 만드는 것이 좋습니다. 장애 조치(failover)가 발생하면 대기 시간이 증가하지 않습니다. 데이터 센터의 장애 조치(failover) 아티팩트 데이터베이스는 권장되지 않습니다. 다음은 여러 아티팩트 데이터베이스를 사용하여 OAuth, SAML, ESL 및 토큰 재생 검색 함수를 호출하는 방법을 자세히 설명합니다.

  • OAuth 및 SAML

    OAuth 및 SAML 아티팩트 요청의 경우 노드는 구성 파일에 있는 아티팩트 DB에 아티팩트가 생성됩니다. 구성 파일에 아티팩트 데이터베이스 연결이 없는 경우 공통 아티팩트 DB를 사용합니다. 아티팩트를 가져오는 다음 요청이 다른 노드로 이동하면 다른 노드는 아티팩트 DB에서 아티팩트를 페치하기 위해 1번째 노드에 rest API를 만듭니다. 다른 노드에 다른 아티팩트 데이터베이스가 있을 수 있고 노드가 이에 대해 알지 못하기 때문에 이 작업이 필요합니다. 첫 번째 노드가 다운되면 아티팩트 확인이 실패합니다. 이 디자인으로 인해 여러 데이터 센터에서 아티팩트 DB를 복제본(replica) 필요가 없습니다. 하나의 전체 데이터 센터가 다운된 경우 아티팩트도 만든 노드가 다운될 가능성이 높으므로 아티팩트도 더 이상 확인할 수 없습니다.

  • 엑스트라넷 잠금

    구성 파일에서 참조되는 아티팩트 데이터베이스는 엑스트라넷 잠금 데이터에 사용됩니다. 그러나 ESL 기능의 경우 AD FS는 아티팩트 DB에 데이터를 쓰는 마스터를 선택합니다. 모든 노드는 마스터 노드에 REST API를 호출하여 각 사용자에 대한 최신 정보를 가져와서 설정합니다. 여러 아티팩트 데이터베이스를 사용하는 경우 관리자는 각 아티팩트 DB 또는 데이터 센터에 대한 마스터 노드를 선택해야 합니다.

    하나의 노드를 ESL 마스터로 선택하려면 AD FS 노드의 구성 파일로 이동하고 "Microsoft.IdentityServer.Service" 섹션에서 다음을 추가합니다.

    마스터에서 다음 항목을 추가합니다. 세 키는 모두 대/소문자를 구분합니다.

    <useractivityfarmrole masterFQDN=[선택한 주 복제본의 FQDN]은Master="true"/>

    다른 노드에서 다음 항목을 추가합니다.

    <useractivityfarmrole masterFQDN=[선택한 주 복제본의 FQDN]은Master="false"/>

    참고 항목

    여러 아티팩트 데이터베이스가 데이터를 동기화하지 않으므로 아티팩트 DB 간에 ESL 값이 동기화되지 않습니다. 사용자가 요청에 대해 다른 데이터 센터에 충돌할 수 있으므로 ExtranetLockoutThreshold는 아티팩트 DB 수, ExtranetLockoutThreshold * 아티팩트 DB 수에 따라 달라집니다.

    • 토큰 재생 검색

      토큰 재생 검색 데이터는 항상 중앙 아티팩트 데이터베이스에서 호출됩니다. AD FS는 클레임 공급자 트러스트에서 토큰을 저장하여 동일한 토큰을 재생할 수 없도록 합니다. 공격자가 동일한 토큰을 재생하려고 하면 AD FS는 토큰이 아티팩트 DB에 있는지 확인합니다. 토큰이 있으면 요청이 거부됩니다. 중앙 아티팩트 데이터베이스는 보안을 위해 사용됩니다. 아티팩트 DB 데이터가 복제본(replica) 아니므로 공격자는 요청을 다른 데이터 센터로 보내고 토큰을 재생할 수 있습니다. ArtifactDB의 추가 읽기 전용 복사본을 만들면 중앙 아티팩트 데이터베이스만 사용되므로 이 시나리오에서 데이터 센터 간 대기 시간이 방지되지는 않습니다.