AD FS 2019로 HTTP 보안 응답 헤더 사용자 지정
ADFS(Active Directory Federation Services) 2019에는 ADFS에서 보내는 HTTP 보안 응답 헤더를 사용자 지정하는 기능이 추가되었습니다. 이러한 도구는 관리자가 일반적인 보안 취약점으로부터 보호하고 브라우저 기반 보호 메커니즘의 최신 발전된 기능을 활용할 수 있도록 도와줍니다. 이 기능은 두 개의 새로운 cmdlet이 도입되어 제공됩니다: Get-AdfsResponseHeaders
및 Set-AdfsResponseHeaders
.
참고 항목
cmdlet을 사용하여 HTTP 보안 응답 헤더(CORS 헤더 제외)를 사용자 지정하는 기능: Get-AdfsResponseHeaders
및 Set-AdfsResponseHeaders
는 AD FS 2016으로 백포트되었습니다. KB4493473 및 KB4507459를 설치하여 AD FS 2016에 이 기능을 추가할 수 있습니다.
이 문서에서는 일반적으로 사용되는 보안 응답 헤더를 설명하여 AD FS 2019에서 보내는 헤더를 사용자 지정하는 방법을 보여 줍니다.
참고 항목
이 문서에서는 AD FS 2019를 설치했다고 가정합니다.
시나리오
다음 시나리오는 관리자가 보안 헤더를 사용자 지정해야 할 수 있는 필요성을 보여줍니다.
- 관리자는 해킹될 수 있는 공용 와이파이 액세스 포인트에서 HTTP를 사용하여 웹앱에 액세스할 수 있는 사용자를 보호하기 위해 HTTP 엄격한 전송 보안(HSTS)를 사용하도록 설정했습니다. HSTS는 모든 연결을 HTTPS 암호화를 통해 강제로 연결합니다. 하위 도메인에 HSTS를 사용하도록 설정하여 보안을 더욱 강화하고자 합니다.
- 관리자가 웹 페이지의 클릭재킹을 방지하기 위해 X-Frame-Options 응답 헤더를 구성했습니다. X-Frame-Options는 iFrame에서 웹 페이지를 렌더링하지 못하게 합니다. 그러나 출처(도메인)가 다른 애플리케이션의 데이터를 표시해야 하는 새로운 비즈니스 요구 사항으로 인해 헤더 값을 사용자 지정해야 합니다(iFrame에서).
- 관리자는 브라우저에서 크로스 스크립팅 공격을 감지하면 페이지를 정리하고 차단하기 위해 X-XSS-Protection를 활성화했습니다. X-XSS-Protection은 크로스 스크립팅 공격을 방지합니다. 그러나 페이지가 정리된 후 로드될 수 있도록 헤더를 사용자 지정해야 합니다.
- 관리자는 CORS(교차 원본 리소스 공유)를 사용하도록 설정해야 하며, 단일 페이지 애플리케이션이 다른 도메인의 웹 API에 액세스할 수 있도록 ADFS에서 원본(도메인)을 설정해야 합니다.
- 관리자가 콘텐츠 보안 정책(CSP) 헤더를 활성화하여 교차 도메인 요청을 허용하지 않음으로써 교차 사이트 스크립팅 및 데이터 삽입 공격을 방지했습니다. 그러나 새로운 비즈니스 요구 사항으로 인해 웹 페이지에서 모든 출처의 이미지를 로드할 수 있도록 헤더를 사용자 지정하고 신뢰할 수 있는 제공업체로 미디어를 제한해야 합니다.
HTTP 보안 응답 헤더
AD FS는 웹 브라우저로 전송되는 발신 HTTP 응답에 응답 헤더를 포함합니다. 다음 스크린샷과 같이 Get-AdfsResponseHeaders
cmdlet을 사용하여 헤더를 나열할 수 있습니다.
스크린샷의 ResponseHeaders 속성은 모든 HTTP 응답에 ADFS가 포함하는 보안 헤더를 식별합니다. ADFS는 ResponseHeadersEnabled가 True
(기본값)으로 설정된 경우에만 응답 헤더를 보냅니다. 이 값을 False
로 설정하면 ADFS가 HTTP 응답에 보안 헤더를 포함하지 않도록 할 수 있습니다. 그러나 이 설정은 권장되지 않습니다. 다음 명령을 사용하여 ResponseHeaders를 False
으로 설정할 수 있습니다:
Set-AdfsResponseHeaders -EnableResponseHeaders $false
HTTP 엄격한 전송 보안(HSTS)
HTTP 엄격한 전송 보안(HSTS)은 웹 보안 정책 메커니즘으로, HTTP와 HTTPS 엔드포인트가 모두 있는 서비스에 대한 프로토콜 다운그레이드 공격과 쿠키 하이재킹을 완화하는 데 도움이 됩니다. 이를 통해 웹 서버는 웹 브라우저 또는 기타 호환 사용자 에이전트가 HTTP 프로토콜을 통하지 않고 HTTPS를 통해서만 상호 작용해야 한다고 선언할 수 있습니다.
웹 인증 트래픽에 대한 모든 AD FS 엔드포인트는 HTTPS를 통해서만 열립니다. 결과적으로 AD FS는 HTTP 엄격한 전송 보안 정책 메커니즘이 제공하는 위협을 효과적으로 완화합니다. 기본적으로 HTTP에는 리스너가 없으므로 HTTP로 다운그레이드할 수 없습니다. 헤더는 다음 매개변수를 설정하여 사용자 지정할 수 있습니다:
- 최대 연령=<만료 시간>. 만료 시간(초)은 HTTPS를 통해서만 사이트에 액세스할 수 있는 기간을 지정합니다. 기본값 및 권장값은 31536000초(1년)입니다.
- includeSubDomains. 이 매개 변수는 선택 사항입니다. 지정하면 모든 하위 도메인에도 HSTS 규칙이 적용됩니다.
HSTS 사용자 지정
기본적으로 헤더는 활성화되어 있고 max-age
은 1년으로 설정되어 있지만 관리자는 max-age
(최대 연령 값을 낮추는 것은 권장하지 않음)를 수정하거나 Set-AdfsResponseHeaders cmdlet을 통해 하위 도메인에 HSTS를 사용하도록 설정할 수 있습니다.
Set-AdfsResponseHeaders -SetHeaderName "Strict-Transport-Security" -SetHeaderValue "max-age=<seconds>; includeSubDomains"
예시:
Set-AdfsResponseHeaders -SetHeaderName "Strict-Transport-Security" -SetHeaderValue "max-age=31536000; includeSubDomains"
기본적으로 헤더는 ResponseHeaders 속성에 포함되지만 관리자는 Set-AdfsResponseHeaders
cmdlet을 통해 헤더를 제거할 수 있습니다.
Set-AdfsResponseHeaders -RemoveHeaders "Strict-Transport-Security"
X-프레임-옵션
기본적으로 AD FS는 대화형 로그인을 수행할 때 외부 애플리케이션이 iFrame을 사용하는 것을 허용하지 않습니다. 이 구성은 특정 스타일의 피싱 공격을 방지합니다. 사전에 설정된 세션 수준 보안으로 인해 iFrame을 통해 비대화형 로그인을 수행할 수 있습니다.
그러나 드물지만 특정 애플리케이션을 신뢰하는 경우 iFrame 지원 대화형 AD FS 로그인 페이지가 필요할 수 있습니다. X-Frame-Options
헤더는 이 용도로 사용됩니다.
이 HTTP 보안 응답 헤더는 브라우저가 <프레임>/<iframe>에서 페이지를 렌더링할 수 있는지 여부를 브라우저와 통신하는 데 사용됩니다. 헤더는 다음 값 중 하나로 설정할 수 있습니다.
- 거부. 프레임 안의 페이지가 표시되지 않습니다. 이 구성은 기본 및 권장 설정입니다.
- sameorigin. 페이지의 원본이 웹 페이지의 원본과 동일한 경우에만 프레임에 페이지가 표시됩니다. 이 옵션은 모든 원본이 같은 출처에 있는 경우가 아니면 유용하지 않습니다.
- 허용-<지정된 출처>에서. 원본(예:
https://www.".com
이 헤더의 특정 원본과 일치하는 경우에만 페이지가 프레임에 표시됩니다. 일부 브라우저에서는 이 옵션을 지원하지 않을 수 있습니다.
X-프레임 옵션 사용자 지정
기본적으로 헤더는 거부로 설정되어 있지만 관리자는 Set-AdfsResponseHeaders
cmdlet을 통해 값을 수정할 수 있습니다.
Set-AdfsResponseHeaders -SetHeaderName "X-Frame-Options" -SetHeaderValue "<deny/sameorigin/allow-from<specified origin>>"
예시:
Set-AdfsResponseHeaders -SetHeaderName "X-Frame-Options" -SetHeaderValue "allow-from https://www.example.com"
기본적으로 헤더는 ResponseHeaders 속성에 포함되지만 관리자는 Set-AdfsResponseHeaders
cmdlet을 통해 헤더를 제거할 수 있습니다.
Set-AdfsResponseHeaders -RemoveHeaders "X-Frame-Options"
X-XSS-Protection
이 HTTP 보안 응답 헤더는 브라우저에서 크로스 사이트 스크립팅(XSS) 공격을 감지할 때 웹 페이지 로딩을 중지하는 데 사용됩니다. 이 접근 방식을 XSS 필터링이라고 합니다. 헤더는 다음 값 중 하나로 설정할 수 있습니다.
- 0은 XSS 필터링을 비활성화합니다. 권장되지 않음.
- 1은 XSS 필터링을 활성화합니다. XSS 공격이 감지되면 브라우저는 페이지를 정리합니다.
- 1; mode=block은 XSS 필터링을 활성화합니다. XSS 공격이 감지되면 브라우저는 페이지의 렌더링을 방지합니다. 이 설정은 기본 설정이며 권장 설정입니다.
X-XSS-Protection 사용자 지정
기본적으로 헤더는 1; mode=block;으로 설정됩니다. 그러나 관리자는 Set-AdfsResponseHeaders
cmdlet을 통해 값을 수정할 수 있습니다.
Set-AdfsResponseHeaders -SetHeaderName "X-XSS-Protection" -SetHeaderValue "<0/1/1; mode=block/1; report=<reporting-uri>>"
예시:
Set-AdfsResponseHeaders -SetHeaderName "X-XSS-Protection" -SetHeaderValue "1"
기본적으로 헤더는 ResponseHeaders 속성에 포함되지만 관리자는 Set-AdfsResponseHeaders
cmdlet을 통해 헤더를 제거할 수 있습니다.
Set-AdfsResponseHeaders -RemoveHeaders "X-XSS-Protection"
CORS(Cross Origin 리소스 공유) 헤더
웹 브라우저 보안은 웹 페이지가 스크립트 내에서 시작된 교차 출처 요청을 하지 못하도록 합니다. 그러나 다른 출처(도메인)에 있는 리소스에 액세스하고 싶을 수도 있습니다. CORS(원본 간 리소스 공유)는 서버에서 동일 원본 정책을 완화할 수 있게 하는 W3C 표준입니다. 서버는 CORS를 사용하여 일부 교차 출처 요청은 명시적으로 허용하고 다른 요청은 거부할 수 있습니다.
CORS 요청을 더 잘 이해하기 위해 다음 시나리오에서는 단일 페이지 애플리케이션(SPA)이 다른 도메인의 웹 API를 호출해야 하는 경우를 살펴봅니다. 또한 SPA 및 API가 모두 AD FS 2019에 구성되어 있고 AD FS에 CORS가 사용하도록 설정되어 있다고 가정합니다. AD FS는 HTTP 요청에서 CORS 헤더를 식별하고, 헤더 값의 유효성을 검사하고, 응답에 적절한 CORS 헤더를 포함할 수 있습니다. AD FS 2019에서 CORS를 활성화하고 구성하는 방법에 대한 자세한 내용은 CORS 사용자 지정 섹션을 참조하세요. 다음 샘플 흐름은 시나리오를 안내합니다.
사용자는 클라이언트 브라우저를 통해 SPA에 액세스하고 인증을 위해 ADFS 인증 엔드포인트로 리디렉션됩니다. SPA는 암시적 허용 흐름에 대해 구성되었으므로 요청은 인증에 성공한 후 브라우저에 액세스 + ID 토큰을 반환합니다.
사용자 인증이 완료되면 SPA에 포함된 프런트엔드 자바스크립트가 웹 API에 대한 액세스를 요청합니다. 요청은 다음 헤더를 사용하여 AD FS로 리디렉션됩니다.
- 옵션 - 대상 리소스에 대한 통신 옵션을 설명합니다.
- 원본 - 웹 API의 원본을 포함합니다.
- Access-Control-Request-Method - 실제 요청이 이루어질 때 사용할 HTTP 방법(예: DELETE)을 식별합니다.
- Access-Control-Request-Headers - 실제 요청이 생성될 때 사용할 HTTP 헤더를 식별합니다.
참고 항목
CORS 요청은 표준 HTTP 요청과 유사합니다. 그러나 원본 헤더가 있으면 수신 요청이 CORS와 관련이 있다는 신호입니다.
ADFS는 헤더에 포함된 웹 API 원본이 ADFS에 구성된 신뢰할 수 있는 원본에 나열되어 있는지 확인합니다. 신뢰할 수 있는 원본을 수정하는 방법에 대한 자세한 내용은 CORS 사용자 지정을 참조하세요. 그러면 AD FS가 다음 헤더로 응답합니다:
- Access-Control-Allow-Origin - 원본 헤더의 값과 동일합니다.
- Access-Control-Allow-Method - 값은 액세스 제어 요청 방법 헤더의 값과 동일합니다.
- Access-Control-Allow-Headers - 값은 액세스 제어 요청 헤더의 값과 동일합니다.
브라우저는 다음 헤더를 포함하여 실제 요청을 전송합니다:
- HTTP 메서드(예: DELETE)를 사용합니다.
- 원본 - 웹 API의 원본을 포함합니다.
- Access-Control-Allow-Headers 응답 헤더에 포함된 모든 헤더입니다.
확인이 완료되면 ADFS는 웹 API 도메인(원본)을 Access-Control-Allow-Origin 응답 헤더에 포함시켜 요청을 승인합니다.
Access-Control-Allow-Origin 헤더를 포함하면 브라우저에서 요청된 API를 호출할 수 있습니다.
CORS 사용자 지정
기본적으로 CORS 기능은 사용하도록 설정되어 있지 않지만 관리자는 Set-AdfsResponseHeaders
cmdlet을 통해 이 기능을 사용하도록 설정할 수 있습니다.
Set-AdfsResponseHeaders -EnableCORS $true
이 기능을 활성화한 후 관리자는 동일한 cmdlet을 사용하여 신뢰할 수 있는 원본의 목록을 열거할 수 있습니다. 예를 들어, 다음 명령은 원본 https://example1.com
과 https://example1.com
의 CORS 요청을 허용합니다.
Set-AdfsResponseHeaders -CORSTrustedOrigins https://example1.com,https://example2.com
참고 항목
관리자는 신뢰할 수 있는 원본 목록에 “*”를 포함하여 모든 출처의 CORS 요청을 허용할 수 있지만, 이 방법은 보안 취약성으로 인해 권장되지 않으며 원하는 경우 경고 메시지가 표시됩니다.
콘텐츠 보안 정책(CSP)
이 HTTP 보안 응답 헤더는 브라우저가 의도치 않게 악성 콘텐츠를 실행하는 것을 방지하여 크로스 사이트 스크립팅, 클릭재킹 및 기타 데이터 인젝션 공격을 방지하는 데 사용됩니다. CSP(콘텐츠 보안 정책)를 지원하지 않는 브라우저는 CSP 응답 헤더를 무시합니다.
CSP 사용자 지정
CSP 헤더의 사용자 지정에는 브라우저가 웹 페이지에 대해 로드할 수 있는 리소스를 정의하는 보안 정책을 수정하는 작업이 포함됩니다. 기본 보안 정책은 다음과 같습니다.
Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:;
default-src 지시어는 각 지시어를 명시적으로 나열하지 않고 -src 지시어를 수정하는 데 사용됩니다. 예를 들어 다음 예제에서 정책 1은 정책 2와 동일합니다.
정책 1
Set-AdfsResponseHeaders -SetHeaderName "Content-Security-Policy" -SetHeaderValue "default-src 'self'"
정책 2
Set-AdfsResponseHeaders -SetHeaderName "Content-Security-Policy" -SetHeaderValue "script-src 'self'; img-src 'self'; font-src 'self';
frame-src 'self'; manifest-src 'self'; media-src 'self';"
지시어가 명시적으로 나열된 경우 지정된 값이 default-src에 지정된 값을 재정의합니다. 다음 예제에서 img-src는 값을 '*'(모든 원본에서 이미지를 로드할 수 있음)로 사용하는 반면 다른 -src 지시어는 값을 'self'(웹 페이지와 동일한 원본으로 제한)로 사용합니다.
Set-AdfsResponseHeaders -SetHeaderName "Content-Security-Policy" -SetHeaderValue "default-src 'self'; img-src *"
기본-src 정책에 대해 다음 소스를 정의할 수 있습니다:
- 'self' - 이 소스를 지정하면 콘텐츠의 원본이 웹 페이지의 원본으로 로드되도록 제한합니다.
- 'unsafe-inline' - 정책에서 이 소스를 지정하면 인라인 자바스크립트 및 CSS를 사용할 수 있습니다.
- 'unsafe-eval' - 정책에서 이 소스를 지정하면 eval과 같은 JavaScript 메커니즘에 텍스트를 사용할 수 있습니다.
- 'none' - 이 소스를 지정하면 로드할 원본의 콘텐츠가 제한됩니다.
- data: - 데이터 지정 콘텐츠 제작자는 URI를 사용하여 문서에 작은 파일을 인라인으로 삽입할 수 있습니다. 사용하지 않는 것이 좋습니다.
참고 항목
AD FS는 인증 프로세스에서 JavaScript를 사용하므로 기본 정책에 'unsafe-inline' 및 'unsafe-eval' 소스를 포함하여 JavaScript를 사용하도록 설정합니다.
Custom headers
이전에 나열된 보안 응답 헤더(HSTS, CSP, X-Frame-Options, X-XSS-Protection 및 CORS) 외에도 AD FS 2019를 사용하면 새로운 헤더를 설정할 수 있습니다.
예를 들어, 새 헤더 “TestHeader”와 값으로 “TestHeaderValue”를 설정할 수 있습니다.
Set-AdfsResponseHeaders -SetHeaderName "TestHeader" -SetHeaderValue "TestHeaderValue"
설정이 완료되면 다음 피들러 스니펫과 같이 새 헤더가 AD FS 응답으로 전송됩니다:
웹 브라우저 호환성
다음 표와 링크를 사용하여 각 보안 응답 헤더와 호환되는 웹 브라우저를 확인하세요.
HTTP 보안 응답 헤더 | 브라우저 호환성 |
---|---|
HTTP 엄격한 전송 보안(HSTS) | HSTS 브라우저 호환성 |
X-프레임-옵션 | X-Frame-Options 브라우저 호환성 |
X-XSS-Protection | X-XSS-Protection 브라우저 호환성 |
CORS(원본 간 리소스 공유) | CORS 브라우저 호환성 |
콘텐츠 보안 정책(CSP) | CSP 브라우저 호환성 |