vCenter 및 ADFS 연동 후, MFA 적용시 403에러 발생
● 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 구성을 실시한다.
- 단계 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 앞단에 Nginx Proxy를 놓을 때, Proxy Setting Value
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/;
}
}