SAML 서비스 제공 업체가되는 방법


80

우리 회사는 현재 Java 웹 애플리케이션을 개발하고 있습니다. 일부 고객은 내부 SAML 서버 (ID 제공자?)를 가지고 있으며 이들과 통합하도록 요청했습니다. 그래서 최근에 나는 그것에 대해 읽고 OpenAM을 가지고 놀았습니다. 약 3 일이 지나면 전반적으로 이해하게되지만 여전히 내 지식에 약간의 차이가 있습니다. 내 희망은 누군가 나를 위해 이것을 해결할 수 있다는 것입니다.

여기에 사용자가 로그인하는 워크 플로를 상상하는 방법이 있습니다.

고객 SAML 서버를 https://their.samlserver.com 으로 정의하겠습니다 . 따라서 사용자는 보호되는 리소스를 위해 웹 애플리케이션을 찾습니다. URL이 http://my.app.com/something .

따라서 내가 맞다면 my.app.com 은 SAML이 서비스 제공 업체 로 정의한 것 입니다. 애플리케이션은이 사용자가 로그인해야한다는 것을 인식합니다. 그런 다음 이와 같은 페이지를 사용자에게 표시합니다.

<script>JQuery Script to auto submit this form on ready</script>
<form method="post" action="https://their.samlserver.com/Post/Servlet">
    <input type="hidden" name="SAMLRequest" value="someBase64Data" />
    <input type="submit" value="Submit" />
</form>

그리고 그것은 이것의 인코딩 된 버전 someBase64Data이어야합니다 base64...

<samlp:AuthnRequest
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
  ID="identifier_1"
  Version="2.0"
  IssueInstant="2004-12-05T09:21:59Z"
  AssertionConsumerServiceIndex="0">
 <saml:Issuer>http://my.app.com</saml:Issuer>
 <samlp:NameIDPolicy
   AllowCreate="true"
   Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>

그래서 내 첫 몇 가지 질문.

ID 값 은 무엇입니까 ?

그리고 왜 본인을 발행자 로 선언 할 수 있습니까?

아이덴티티 공급자가 나에 대해 알고 있습니까? 아마도 이것이 내가보고있는 신뢰의 원 일지도 몰라 OpenAM 원일 것 입니다. 그리고 그것이 나에 대해 안다면, 어떻게 나에 대해 알고 무엇을 알아야합니까?

따라서 사용자가 해당 페이지를 전달하면 IDP https://their.samlserver.com에서 제공하는 페이지로 이동 합니다. 그들은 해당 페이지에서 인증하고 IDP는 인증을 확인하고 사용자를 찾는 것이 마술입니다. 인증이 성공하면 IDP는 여기<samlp:Response>정의 된 .

몇 가지 질문이 더 있습니다.

첫째, 어떻게 <samlp:Response> 웹 애플리케이션으로 돌아가서 확인할 수있는 방법은 무엇입니까?

성공 여부를 확인하기 위해 그 응답에서 무엇을 찾아야합니까? 실패는 어떻게 생겼습니까?

현재 이메일 주소 (LDAP)를 사용하여 사용자를 식별하므로 응답에서이를 가져와 지금과 같은 방식으로 사용할 것입니다. 그 응답에서 내가 염두에 두어야 할 다른 것이 있습니까?

이제 해당 응답의 유효성을 확인 했으므로 현재처럼 사용자에게 세션을 부여 할 수 있습니다. 하지만 로그 아웃을 원할 때이를위한 워크 플로가 있습니까? 사용자가 탈퇴했음을 IDP에 알려야합니까?

그리고 마지막으로, 제 독서에 던져진 몇 가지 주제가 있는데,이 워크 플로에 어떻게 적용되는지 잘 모르겠습니다. 그것들은 신뢰의 원 , 토큰아티팩트 입니다.

모두에게 도움을 주셔서 감사합니다. 나는 지난 며칠 동안 많은 정보를 발견했고, 조금 더 플레이 한 후에 그것들을 모을 수있을 것입니다. 그러나 아직 간단한 "게시물이 있습니다"워크 플로 문서를 아직 찾지 못했습니다. 이것이 어떻게 작동하는지 내가 잘못했기 때문일 수 있습니다. 그다지 인기가 없기 때문일 수도 있습니다. 하지만 저는 사용자 인증만큼 중요한 일에서 중요한 단계를 놓치지 않도록 워크 플로가 있는지 확인하고 싶었습니다.


3
지금 바로 동일한 문제를 겪고 있습니다 (Ping ID와 상호 작용하는 경량 연합 SAML v2 서비스 공급자를 만드는 방법을 조사 중입니다). 그것이 당신을 위해 어떻게 작동했는지 언급 해 주시겠습니까? 결국 Fedlet을 사용하거나 자신의 코드를 작성 했습니까? 감사!
theglauber

1
나는 다소 비슷한 환경을 가지고 있습니다. Tomcat에서 실행되는 Java 기반 웹 애플리케이션이 있습니다. 이제 SAML을 사용하여 SSO를 수행해야합니다. 이론적 지식 외에는 이러한 기술에 대해 전혀 모릅니다. 아무도 처음부터 구성하는 데 도움을 줄 수 있습니까?
Jerry

답변:


46

특정 질문에 대한 답변 :

1.) "ID"값은 무엇입니까?

  • SAML 요청에 대한 고유 식별자 여야합니다. SAML 2.0 사양에는 이것이 수행되는 방법이 실제로 구현에 따라 다르지만 다음과 같은 권장 사항이 있습니다.

SAML 시스템 엔티티가 식별자가 고유한지 확인하는 메커니즘은 구현에 맡겨집니다. 무작위 또는 의사 랜덤 기술이 사용되는 경우, 무작위로 선택된 두 식별자가 동일 할 확률은 2 ^ -128보다 작거나 같아야하며 길이는 2 ^ -160보다 작거나 같아야합니다 (SHOULD). 이 요구 사항은 128 비트에서 160 비트 길이 사이에서 임의로 선택된 값을 인코딩하여 충족 될 수 있습니다.

2.) IdP는 귀하에 대해 어떻게 알고 있습니까?

  • SP를 IdP에 등록해야합니다. 이를 위해 SAML 사양은 "SAML 메타 데이터"형식을 정의하여 SAML 수신자가 어디에 있는지, 인증서가 무엇인지, 교환하는 속성 등을 IdP에 알려줍니다. OpenAM은 신뢰할 수있는 SP를 구성하기위한 몇 가지 최소 요구 사항을 지정할 수 있습니다. 이는 제품마다 다릅니다.

3.) 응답은 어디에 있으며 무엇을 확인해야합니까?

  • 응답은 일반적으로 초기 설정을 위해 SP에서 IdP와 교환하는 SAML 메타 데이터에 정의 된 Assertion Consumer Service (ACS) URL로 이동합니다. SAML 응답을 받으면 많은 사항을 확인해야하지만 가장 중요한 것은 SAML 상태 코드가 "성공"이어야하고 inResponseTo ID가 요청에서 보낸 ID와 일치해야하며 어설 션에서 디지털 서명의 유효성을 검사해야한다는 것입니다. 이를 위해 IdP의 공개 확인 인증서를 신뢰해야하며 해지 확인도 수행 할 수 있습니다.

4.) 로그 아웃은 어떻습니까?

  • SAML 2.0은 또한 SLO (Single LogOut)에 대한 프로필을 정의합니다. 이렇게하면 SP뿐만 아니라 IdP 및 세션을 설정 한 다른 모든 SP에서도 로그 아웃됩니다. SSO (Single Sign-On)와 유사한 요청 / 응답 흐름이 있으므로 설정 및 확인해야 할 사항 (상태 코드, 서명 등)이 비슷합니다.

간단히 말해서 이것은 처음부터 구현하기가 매우 복잡 할 수 있습니다. Ian이 제안한 것처럼 검증 된 실제 라이브러리 및 / 또는 제품을 사용하는 것이 가장 좋습니다. 그의 같은 회사는 사양에 따라 구현하고 다른 공급 업체와의 상호 운용성을 테스트하는 데 수백 시간의 개발자 시간을 투자했습니다.


2
saml 요청에 ID가 있어야하는 이유. 이해가 안 돼요.
애쉬 윈

1
SAML 2.0 핵심 사양의 일부로 필요합니다. docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf를 참조하십시오 . AuthnRequest는 필수 ID 속성이있는 RequestAbstractType (섹션 3.2.1)의 확장 인 AuthnRequestType (섹션 3.4.1) 유형입니다. 요청의 ID에 대한 주요 이점 중 하나는 응답이이를 참조 할 수 있으므로 SP가 재생을 방지하기 위해 두 ID를 함께 매핑 할 수 있다는 것입니다.
Scott T.

리플레이 공격을 막기 위해 아이디가 주어 졌다고합니다. Service Provider와 IDProvider간에 SSL / https 연결을 사용하는 경우 재생 공격을 방지 할 수 있습니다.
애쉬 윈

1
SP와 IdP 간의 SSL / HTTPS는 일반적으로 "프론트 채널"(브라우저) 바인딩이 사용되기 때문에 재생 공격을 방지하기 위해 다소 의미가 없습니다.
Scott T.

@Ashwin-ID가 있으므로 응답을 받으면 동일한 ID를 가지며 수신하는 응답이 요청과 관련되어 있음을 알 수 있습니다. 재생을 방지하는 한 내 이해는 SAML 및 ID의 요청 및 응답에있는 많은 타임 스탬프는 제한된 기간 동안의 승인과 함께 만 실행 가능합니다.
Uncle Iroh 2015-04-29

3

단일 Java 애플리케이션을 서비스 공급자로 설정하려는 경우 Oracle (독립 실행 형) 또는 ForgeRock ( OpenAM 과 함께 번들로 제공 ) 에서 Fedlet을 사용하는 것을 고려해야 합니다. ForgeRock Fedlet은 아이덴티티 공급자로서 Shibboleth 2.2.1과 상호 작용하는 데 몇 가지 문제가 있지만 구성하기가 다소 간단하고 더 많은 정보를 제공합니다.

각각은 배포에 도움이되는 README에 명시적인 지침이 포함되어 있습니다. Fedlet이 구성되고 IDP와 통신하면 성공 페이지에 연합 SSO를 애플리케이션에 통합하는 데 필요한 모든 코드가 표시됩니다. AuthnRequest 및 응답을 보내고받는 백그라운드 작업을 수행합니다.

Scott의 대답은 당신이 가진 질문에 아주 잘 반응하지만 SAML을 생성하는 코드를 직접 작성하려는 시도는 바퀴를 재발 명하고 있다고 생각합니다. Fedlet은 정확히이 사용 사례를 염두에두고 설계되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.