다음을 통해 공유


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

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

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

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

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

backgroundCacheRefreshEnabled이(가) true로 설정되면 AD FS는 백그라운드 스레드에서 캐시 업데이트를 실행할 수 있도록 합니다. 캐시에서 데이터를 가져오는 빈도는 cacheRefreshIntervalSecs을(를) 설정하여 시간 값으로 사용자 지정할 수 있습니다. backgroundCacheRefreshEnabled이(가) true로 설정된 경우 기본값은 300초로 설정됩니다. 설정된 값 기간이 지나면, 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 매개 변수를 지정하고 "아티팩트" 값을 전달합니다. 선택적 -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;Integrated Security=True;Initial Catalog=AdfsArtifactStore" />

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

  1. 변경 내용이 적용되도록 AD FS 서비스를 다시 시작합니다.

참고 항목

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

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

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

  • OAuth 및 SAML

    OAuth 및 SAML 아티팩트 요청의 경우, 노드는 구성 파일에 있는 아티팩트 DB에 아티팩트를 생성합니다. 구성 파일에 아티팩트 데이터베이스 연결이 없는 경우, 일반 아티팩트 DB를 사용합니다. 아티팩트를 가져오는 다음 요청이 다른 노드로 이동하면, 다른 노드는 아티팩트 DB에서 아티팩트를 가져오기 위해 첫 번째 노드에 rest API를 생성합니다. 노드마다 아티팩트 데이터베이스가 다를 수 있으며 노드가 해당 내용을 알지 못하기 때문에 이 작업이 필요합니다. 첫 번째 노드가 중단되면 아티팩트 확인이 실패합니다. 이 설계로 인해 다양한 데이터 센터에서 아티팩트 DB를 복제할 필요가 없습니다. 데이터 센터 전체가 다운된 경우, 아티팩트를 생성한 노드가 중단될 가능성이 높으며 아티팩트를 더 이상 해결할 수 없음을 의미합니다.

  • 엑스트라넷 잠금

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

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

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

    <useractivityfarmrole masterFQDN=[FQDN of the selected primary] isMaster="true"/>

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

    <useractivityfarmrole masterFQDN=[FQDN of the selected primary] isMaster="false"/>

    참고 항목

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

    • 토큰 재생 검색

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