Як стати постачальником послуг SAML


80

В даний час моя компанія розробляє веб-додаток Java. Кілька наших клієнтів мають внутрішні сервери SAML (постачальники ідентифікаторів?) І попросили нас інтегрувати з ними. Тож нещодавно я читав це і бавився з 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>

Тож мої перші пара запитань.

Яким має бути значення ідентифікатора ?

І чому я можу заявити про себе як про емітента ?

Чи знає про мене постачальник документів? Можливо, це те коло довіри, яке я бачив у OpenAM . І якщо воно знає про мене, як воно знає про мене і що йому потрібно знати?

Тож після того, як користувач перенаправляє цю сторінку, вони потрапляють на сторінку, надану ВПО https://their.samlserver.com . Вони аутентифікуються на цій сторінці, і ВПО робить магію перевірити автентифікацію та шукати користувача. Після успішної автентифікації IDP надсилає назад <samlp:Response>визначений тут .

Ще кілька запитань.

По-перше, як відбувається <samlp:Response>повернення до моєї веб-програми, щоб я міг її перевірити?

І що я повинен шукати у цій відповіді, щоб підтвердити, що вона була успішною? Як виглядає невдача?

В даний час ми використовуємо адресу електронної пошти (LDAP) для ідентифікації користувачів, тому, ймовірно, ми візьмемо це з відповіді та використаємо те саме, що і зараз. Щось інше, про що я повинен пам’ятати у відповіді?

Тож тепер, коли ми перевірили відповідь на відповідність, ми можемо надати користувачеві сеанс, як і зараз. Але коли вони хочуть вийти, чи існує для цього робочий процес? Чи потрібно повідомляти ВПО про те, що користувач пішов?

І нарешті, є кілька тем, які були кинуті в моєму читанні, і я не впевнений, як вони вписуються в цей робочий процес. Це коло довіри , жетони та артефакти .

Дякуємо за будь-яку допомогу всім. Протягом останніх кількох днів я знайшов багато інформації, і цілком можливо, що я міг би зібрати їх разом, ще трохи погравши. Але я ще не знайшов прямої статті про робочий процес "Ось пост". Можливо, це тому, що я помиляюся, як це працює. Можливо, це тому, що це не так популярно. Але я дуже хотів переконатися, що отримав робочий процес, щоб не пропустити важливий крок у чомусь такому важливому, як аутентифікація користувачів.


3
Зараз я переживаю ту ж проблему (розглядаю, як створити легкий федеративний постачальник послуг SAML v2, взаємодіючи з ідентифікацією Ping). Ви не коментуєте, як це у вас склалося? Ви в кінцевому підсумку використовували федлет або писали власний код? Дякую!
theglauber

1
У мене дещо схоже середовище. У мене є веб-програма, заснована на Java, яка працює на tomcat, тепер мені потрібно робити SSO за допомогою SAML. Я не маю уявлення про ці технології, крім теоретичних знань. Хто-небудь може допомогти мені в налаштуванні з нуля?
Джеррі

Відповіді:


46

У відповідь на ваші конкретні запитання:

1.) Яким має бути значення "ID"?

  • Це має бути унікальний ідентифікатор запиту SAML. Специфікація SAML 2.0 зазначає, що це дійсно залежить від реалізації, але робить такі рекомендації:

Механізм, за допомогою якого сутність системи SAML забезпечує унікальність ідентифікатора, залишається за реалізацією. У випадку, коли використовується випадковий або псевдовипадковий прийом, ймовірність двох випадково обраних ідентифікаторів ідентичними ПОВИННА бути меншою або рівною 2 ^ -128 і ПОВИННА бути меншою або рівною 2 ^ -160 у довжину. Ця вимога МОЖЕ бути виконана шляхом кодування випадково вибраного значення довжиною від 128 до 160 біт.

2.) Звідки ІД про вас знає?

  • Ваш ІП повинен бути зареєстрований в IdP. Для цього специфікація SAML визначає формат для "Метаданих SAML", який повідомляє IdP, де знаходяться ваші приймачі SAML, що є вашими сертифікатами, атрибутами, якими ви обмінюєтеся тощо. OpenAM, ймовірно, диктує деякі мінімальні вимоги до налаштування надійного SP. Це залежить від кожного продукту.

3.) Куди йде відповідь і що перевірити?

  • Відповідь буде спрямовано на вашу URL-адресу Assertion Consumer Service (ACS), яку зазвичай визначають у метаданих SAML, які ви обмінюєте зі свого ІП із IdP для початкового налаштування. Коли ви отримуєте відповідь SAML, вам потрібно перевірити багато речей - але найголовніше, що код стану SAML повинен бути "успішним", ідентифікатори inResponseTo повинні відповідати надісланим запитам, і ви повинні перевірити цифровий підпис у твердженні. Для цього вам потрібно буде довірити сертифікат публічної перевірки IdP, і ви, мабуть, також захочете перевірити відкликання.

4.) Що можна сказати про вихід?

  • SAML 2.0 також визначає профіль для Single LogOut (SLO). Це призведе не лише до виходу з SP, але також до IdP та потенційно будь-якого іншого SP, з яким ви встановили сеанс. Він має подібний потік запитів / відповідей, як Єдиний вхід (SSO), і, отже, подібні речі для налаштування та перевірки (коди стану, підписи тощо).

Тож коротше - це може бути досить складно реалізувати з нуля. Краще використовувати перевірені та справжні бібліотеки та / або продукти, як пропонує Ян. Компанії, подібні до нього, інвестували сотні годин часу розробника для впровадження відповідно до специфікацій та перевірки сумісності з іншими постачальниками.


2
Чому в запиті saml повинен бути ідентифікатор. Я цього не розумію.
Ashwin

1
Це потрібно як частина основних специфікацій SAML 2.0. Див. Docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf . AuthnRequest має тип AuthnRequestType (розділ 3.4.1), який є розширенням RequestAbstractType (розділ 3.2.1), який має обов’язковий атрибут ID. Однією з ключових переваг ідентифікатора у запиті є те, що Response може потім посилатися на нього, щоб SP міг зіставити їх разом, щоб запобігти повторному відтворенню.
Скотт Т.

Ви говорите, що ідентифікатор дано для запобігання атаці відтворення. Якщо я використовую з'єднання ssl / https між Постачальником послуг та IDProvider, чи можна запобігти повторній атаці.
Ашвін

1
SSL / HTTPS між SP та IdP є дещо безглуздим для запобігання атаці повторного відтворення, оскільки зазвичай використовуються прив'язки "переднього каналу" (браузера).
Скотт Т.

@Ashwin - Ідентифікатор є, так що коли ви отримуєте відповідь назад, він має той самий ідентифікатор, і ви можете знати, що відповідь, яку ви отримуєте, стосується вашого запиту, що стосується запобігання повторному відтворенню, я розумію, що є багато міток часу як у запитах, так і у відповідях у SAML та ідентифікаторах є життєздатними, а також авторизацією протягом обмежених періодів часу.
Дядько Ірох,

3

Якщо ви просто намагаєтеся встановити одну програму Java як постачальника послуг, вам слід розглянути можливість використання Fedlet від Oracle (як окремого) або ForgeRock (в комплекті з OpenAM). У ForgeRock Fedlet є деякі проблеми при взаємодії з Shibboleth 2.2.1 як постачальника ідентифікаційних даних, але я вважаю, що це є дещо простішим у налаштуванні та більш інформативним.

У кожному є чіткі інструкції, що містяться в README, щоб допомогти вам розгорнути. Після налаштування Fedlet та зв’язку з IDP на сторінці успіху відображається весь код, необхідний для інтеграції об’єднаного єдиного входу у вашу програму. Він виконує фонову роботу з надсилання та отримання запитів та відповідей Authn.

Відповідь Скотта досить добре відповідає на ваші запитання, але я думаю, що спроба самостійно написати код, який генерує SAML, - це винахід колеса. Fedlet був розроблений з урахуванням цього випадку використання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.