2016-06-22 2 views
1

여러 ID 제공자로 구성된 앱에서 Spring SAML을 구현 중입니다. 내 IdP 메타 데이터 구성에 이있는 이 여러 개 있고 각 IdP에 별칭이 있습니다. 앱에서 SAMLContextProvider을 비슷한 방법으로 연장하여 사용할 제공자를 this으로 선택합니다.SAMLCredential.getRemoteEntityID()를 신뢰할 수 있습니까?

IdP가 인증을 전송하면 내 응용 프로그램이 어떤 IdP를 제공했는지 (다른 공급자는 다른 보안 권한을 가짐) 알고 있어야합니다. 나는 docs 제안으로하고 어떤 사용자 IdP가 요청을했는지 확인하기 위해 사용자 지정 SAMLUserDetailsServiceSAMLCredential.getRemoteEntityID()을 사용합니다.

제 질문은 공급자를 식별하기 위해 remoteEntityID에 의존 할 수 있습니까? 한 IdP 공급자가 다른 엔터티 ID 또는 다른 공급자와 동일한 "위조 된"엔터티를 포함하도록 메타 데이터를 업데이트하면 어떻게됩니까? 우리가 정의한 동료 별칭을 사용하는 것이 더 좋지 않겠습니까?

저는 SAML을 처음 사용하기 때문에 기본 개념에 대한 이해가 잘못되었을 가능성이 있습니다.이 구성으로 보안 구멍을 열지 않았는지 확인하고 싶습니다.

답변

0

이것은 좋은 질문입니다. 나는 답을 모르기 때문에 그것을 시도했다.

필자는 테스트 환경에서 ADFS의 서비스 공급자 및 ID 공급자가 구성된 MS ADFS 및 SpringSAML 프로젝트의 인스턴스를 가지고 있습니다. 내 사용자 정의에서 SAMLUserDetailsService 나는 어떤 IDP 요청이 왔는지 결정하기 위해 SAMLCredential.getRemoteEntityID()을 사용합니다.

성공적인 로그인을 수행 한 다음 ADFS EntityID의 이름을 변경하고 다시 로그인을 시도했습니다. 이로 인해 로그에 AuthNResponse, SUCCESS, 127.0.0.1 메시지가 표시되었지만 브라우저에 오류가 발생했습니다. UserDetailService에서 사용할 수있는 디버그를 통해 다시 실행했는데 UserDetailService에 도착하기 전에 요청이 어딘가에서 실패하고있는 것으로 나타났습니다. 그러나 로그에 오류 메시지가 표시되지 않습니다.

질문에 답하기 위해 (그리고 아마도 다른 사람이 더 명확하게 대답 할 수 있도록), SpringSAML은 오류가 발생한다는 점에서이 시나리오를 적절하게 처리합니다. 그것은 로그에 오류 메시지가 없다는 것을 의미하지는 않습니다. 일어날 수있는 다소 이상한 시나리오이거나 버그 일 뿐이므로 이것이라고 생각합니다.

다른 ID 제공 업체의 엔티티 ID를 위조하는 한 SAML 요청에 서명되어 있기 때문에 메시지를 위조하고 IDP를 시도하는 모든 사용자는 개인 키에 액세스해야합니다.

마지막으로 별칭은 요청에 포함되지 않으므로 IDP를 구분하는 데 사용할 수 없습니다.

+0

테스트에 좋은 아이디어입니다. 그리고 오류를 알면 좋았습니다. 'HTTPMetadataProvider'를 사용하여 IdP 메타 데이터를로드합니까? –

+0

나는 여전히 (아마도 매우 드문 경우)이 시나리오에서 여전히 요청을 위조하는 것이 가능할 수도 있다고 생각한다. 우리는 여러 개의 IdP (서로에 대해 적대적 일 수 있습니다)를 신뢰한다고 가정하면, 자신의 메타 데이터를 변경하여 다른 공급자의 entityID를 만들려고 시도하면 ('HTTPMetadataProvider'에 의해 내 측면에서 다시로드 됨) 여러 메타 데이터 항목이 동일한 entityID (아마도 가능하지 않을 수도 있습니다). IdP 둘 중 하나의 요청은 우리가 그들을 신뢰하기 때문에 서명되고 수락됩니다. 확실히 알 수있는 유일한 방법은 그것을 밖으로 시도하는 것입니다! –

+0

내게 정의 된 ID (즉, 별칭)에서 결정을 내림으로써 쉽게 위험을 감수 할 수있을 때 제공자가 정의한 ID (즉, entityID)를 기반으로 권한 결정을 내리는 것이 안전하지 않은 것처럼 보입니다. –

관련 문제