DS1NMA Blog

● ADFS 구축

  - 단계 1. ADFS 서버를 구성한다.
-
단계 2. VMWare vCenter ID공급자를 구성된 ADFS로 설정하고 성공한다.  
-
단계 3. https://learn.microsoft.com/ko-kr/windows-server/identity/ad-fs/operations/configure-ad-fs-and-azure-mfa 링크에  설명된 내용에 따라 ADFS MFA 구성을 실시한다.

 

AD FS 및 Microsoft Entra 다단계 인증 구성

AD FS를 사용하여 Microsoft Entra 다단계 인증을 인증 공급자로 구성하는 방법에 대해 자세히 알아보세요.

learn.microsoft.com

- 단계 4. VMWare vCenter에 로그인 페이지에서 ID를 입력한다.
- 
단계 5. ADFS 로그인 페이지로 리다이렉션 된다.
- 
단계 6. ADFS 로그인 페이지에서 ID를 입력하고, MFA 인증코드를 호출하게 되면,
- 
단계 7. 403 에러가 표시된다. (Exception calling SAS)

 

(클라이언트 표시)
Activity ID: c4fa6ce5-693d-45a4-1000-0040000000d6

Relying party: vCenter-DEP-2FA - API
Error details: Exception calling SAS.
Node name: d436b22c-f2a2-4ea9-a70e-6d17cc5608ad
Error time: Tue, 24 Sep 2024 12:10:21 GMT
Cookie: enabled
User agent string: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0
 
(서버 이벤트로그 표시)
페더레이션 수동 요청 중에 오류가 발생했습니다.

 
추가 데이터
 
프로토콜 이름:
OAuthAuthorizationProtocol
 
신뢰 당사자:
0d81cad4-5275-45aa-9f68-2146d619488d
 
예외 세부 정보:
System.Exception: Exception calling SAS. ---> System.Net.WebException: 원격 서버에서 (403) 사용할 수 없음 오류를 반환했습니다.
   위치: System.Net.HttpWebRequest.GetResponse()
   위치: Microsoft.IdentityServer.Aad.Sas.HttpClientHelper.PostXml[TRequest,TResponse](String url, String authenticationMethod, TRequest request, Action`2 httpRequestModifier)
   위치: Microsoft.IdentityServer.Aad.Sas.RealSasProvider.GetAvailableAuthenticationMethods(GetAvailableAuthenticationMethodsRequest request)
   위치: Microsoft.IdentityServer.Adapter.AzureMfa.PrimaryAuthenticationAdapter.ProcessUsernameOathCodePin(IAuthenticationContext authContext, IProofData proofData, Claim[]& outgoingClaims)
   --- 내부 예외 스택 추적의 끝 ---
   위치: Microsoft.IdentityServer.Adapter.AzureMfa.PrimaryAuthenticationAdapter.ProcessUsernameOathCodePin(IAuthenticationContext authContext, IProofData proofData, Claim[]& outgoingClaims)
   위치: Microsoft.IdentityServer.Adapter.AzureMfa.PrimaryAuthenticationAdapter.TryEndAuthentication(IAuthenticationContext authContext, IProofData proofData, HttpListenerRequest request, Claim[]& outgoingClaims)
   위치: Microsoft.IdentityServer.Web.Authentication.External.ExternalAuthenticationHandlerBase.TryEndAuthentication(IAuthenticationContext authContext, IProofData proofData, HttpListenerRequest request, Claim[]& adapterClaims)
   위치: Microsoft.IdentityServer.Web.Authentication.Azure.AzurePrimaryAuthenticationHandler.Process(ProtocolContext context)
   위치: Microsoft.IdentityServer.Web.Authentication.AuthenticationOptionsHandler.Process(ProtocolContext context)
   위치: Microsoft.IdentityServer.Web.PassiveProtocolListener.OnGetContext(WrappedHttpListenerContext context)
 
System.Net.WebException: 원격 서버에서 (403) 사용할 수 없음 오류를 반환했습니다.
   위치: System.Net.HttpWebRequest.GetResponse()
   위치: Microsoft.IdentityServer.Aad.Sas.HttpClientHelper.PostXml[TRequest,TResponse](String url, String authenticationMethod, TRequest request, Action`2 httpRequestModifier)
   위치: Microsoft.IdentityServer.Aad.Sas.RealSasProvider.GetAvailableAuthenticationMethods(GetAvailableAuthenticationMethodsRequest request)
   위치: Microsoft.IdentityServer.Adapter.AzureMfa.PrimaryAuthenticationAdapter.ProcessUsernameOathCodePin(IAuthenticationContext authContext, IProofData proofData, Claim[]& outgoingClaims)

 

원인 : Microsoft 제공 가이드에 보면, 레지스트리에 SasUrl, StsUrl, ResourceUri 를 특정한 값으로 입력하라고 언급하였으나, 해당 값으로 적용시 동작하지 않음. 

MS가 하란대로 하면 절대 안된다!!!

 

해결방법 : 레지스트리 값 변경

컴퓨터\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ADFS

 

SasUrl : https://adnotifications.windowsazure.com/StrongAuthenticationService.svc/Connector

StsUrl : https://login.microsoftonline.com

ResourceUri : https://adnotifications.windowsazure.com/StrongAuthenticationService.svc/Connector

 

이렇게 해서 해결 완료!

 

결론..

"MS... 이자식들이.. SISISISISISISISI;;;;BALBALBALBALBALBAL;;;;;;;;;;;"

vCenter Server를 Public에 오픈하면서 SSL 인증서를 걸어야 했는데,

Let's encrypt 적용을 위해 Nginx Proxy를 걸었는데, 접속이 안된다.

다음의 설정을 적용해야 동작한다.

server { 
   listen 443 ssl http2; 
   server_name my_internet_vcenter_fqdn; 
   ssl_certificate /etc/letsencrypt/live/my_letsencrypt_domain/fullchain.pem; 
   ssl_certificate_key /etc/letsencrypt/live/my_letsencrypt_domain/privkey.pem; 
   include /etc/letsencrypt/options-ssl-nginx.conf; 

   location / { 
      proxy_set_header Host "your_vCenter_fqdn"; 
      proxy_set_header Origin "your_vCenter_fqdn";
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_ssl_verify off; 
      proxy_pass https://your_vCenter_fqdn; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
      proxy_buffering off; 
      client_max_body_size 0; 
      proxy_read_timeout 36000s; 
      proxy_redirect https://your_vCenter_fqdn/ https://my_internet_vcenter_fqdn/; 
   } 

   location /websso/SAML2 { 
      sub_filter "your_vCenter_fqdn" "my_internet_vcenter_fqdn"; 
      proxy_set_header Host your_vCenter_fqdn; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_ssl_verify off; 
      proxy_pass https://your_vCenter_fqdn; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
      proxy_buffering off; 
      client_max_body_size 0; 
      proxy_read_timeout 36000s; 
      proxy_ssl_session_reuse on; 
      proxy_redirect https://your_vCenter_fqdn/ https://my_internet_vcenter_fqdn/; 
   } 
}