Sso Là Gì

1. SAML là gì?

Nếu bạn đã từng nghe OAuthhay OAuth2thì SAMLchính là một chuẩn khác để giải quyết bài toán tương tự với OAuthOAuth2.

Bạn đang xem: Sso là gì

Bài toán mà các chuẩn trên giải quyết tên là SSO (Single Sign On).

SSOnảy sinh từ vấn đề khi các nhà cung cấp dịch vụ muốn người dùng có thể sử dụng các dịch vụ khác nhau mà chỉ cần đăng nhập vào một chỗ duy nhất, giúp cho việc sử dụng được thuận tiện cũng như giúp cho người dùng quản lý các username và password được giảm đi tối thiểu, thì đòi hỏi cần có một cách nào đó có thể xác thực và ủy quyền thông tin người dùng mà không cần bắt họ tạo tài khoản khác nhau trên những dịch vụ khác nhau.

Chú ý: SAMLtự động giải quyết cả 2 vấn đề xác thực (authentication)ủy quyền (authorization)nhưng OAuthOAuth2chỉ tự động giải quyết được vấn đề uỷ quyền(link tham khảo tại đây).

SAML(Security Assertion Markup Language) là một "chuẩn mở" cho phép nhà cung cấp thực thể (Identity Provider - IdP) xác thực người dùng và ủy quyền cho người dùng sử dụng một dịch vụ nào đó của nhà cung cấp dịch vụ(Service Provider - SP) mà không bắt buộc người dùng phải tạo tài khoản đăng nhập vào dịch vụ đó.

Định nghĩa như trên đọc sẽ khó hiểu, nhưng nếu bạn biết nút "Đăng nhập bằng Facebook" ở một số website thì mục đích của cái nút đó chính là mục đích của SAML.

2. Cách hoạt động của SAML.

*

Ở hình trên thì: SPlà nhà cung cấp dịch vụ (là ứng dụng có nút "Đăng nhập bằng Facebook" ấy), IdPlà nhà cung cấp các thực thể (tài khoản người dùng - IdPở đây là Facebook đấy).

Bước 1: User sẽ click vào nút "Đăng nhập bằng tài khoản của cái gì đó" từ browser, request này sẽ được gửi tới SP.Bước 2: Phía SPsẽ tạo ra một SAML Requestđể gửi tới IdP, SAML Requestnày sẽ được chính SPký điện tử (sign) bằng chữ ký của SP (chữ ký của SP ở đây chính là khóa bí mật của SP).Bước 3: Phía IdPkhi nhận được SAML Requesttừ SPsẽ phải xác thựcchữ ký có đúng là của SPhay không bằng cách dùng khóa công khai của SPđể xác thực:

Khóa công khai của SPnày IdPlấy từ đâu?

Trước khi thực hiện giao dịch, SPIdPphải bằng cách nào đó trao đổi được khóa công khaivới nhau trước (không phải khóa bí mậtnhé). Thông thường, mỗi bên SPIdPsẽ có một public url chứa metadata, metadatanày chứa các thông tin công khai như làkhóa công khai, ID thực thểvà URL để điều hướng khi có request đến. Phía IdPsẽ biết được metadata url của SPđể từ đó lấy ra khóa công khai của SPđể xác thực chữ ký của SP. Trong trường hợp hệ thống của Idpđã có sẵn và không lấy public key của SPthông qua metadata urlđược thì SPphải gửi khóa công khai của mìnhcho Idpcài đặt trước khi thực hiện giao dịch.

Bước 4: Vẫn đang ở IdP, sau khi xác thực được chữ ký của SPrồi, IdPsẽ làm những thứ sau:Lấy ra thông tin người dùng đang sử dụng browser (nếu người dùng đang đăng nhập vào IdP, còn nếu người dùng đang không đăng nhập thì bắt người dùng đăng nhập trước) để redirect (http post) về cho SPsử dụng (kết quả trả về này mình gọi là SAML Response). Trước khi gửi về cho SPthì IdPsẽ ký điện tử (sign)vào SAML Responsebằng khóa bí mật của IdP.Không những IdP ký vào SAML ResponseIdPcũng sẽ mã hóa các kết quả dữ liệu (SAML Assertions) có trong SAML Response bằng khóa công khai của SP.Bước 5: Khi SPnhận được SAML Response, nó sẽ thực hiện những việc sau:Dùng khóa công khai của IdPđể xác thựcxem có đúng là kết quả được gửi từ IdPhay không (đây chính là phần xác thựcOAuthOAuth2không có). Khóa công khai của IdPcũng giống như nói ở trên, có thể lấy thông qua metadata url của IdPhoặc có thể được trao đổi trước.Nếu xác thực đúng chữ ký, SPsẽ tiếp tục dùng khóa công khai của chính mìnhđể giải mãi SAML Assertionsđã được mã hóa từ phía IdP.Lấy các thông tin dữ liệu người dùng trong SAML Assertionsđể đăng nhập người dùng vào hệ thống của chính mình, và trả về cho người dùng thông báo thành công (hay điều hướng người dùng tới các tài nguyên mong muốn).

Phía trên mình đã trình bày lý thuyết phần hoạt động của SAML, dưới đây là phần thực hành sử dụng SPlà server Rails và IdPOkta.

Xem thêm: Cách Sửa Lỗi Đăng Nhập Lol Không Nhận Phản Hồi Từ Máy Chủ Khi Đăng Nhập Lol

3. Cấu hình SAML trong Rails sử dụng IdP là Okta.

Trong trường hợp này: Ứng dụng Rails của bạn chính là SP, và ứng dụng bạn tạo trên Okta chính là Idp.

3.1. Cấu hình trong Rails.

Source code trong rails:

# /config/routes.rb scope module: :mrs, controller: "saml_sessions" do get :new, path: "saml/sign_in", as: :new_mr_sso_session post :create, path: "saml/auth", as: :mr_sso_session get :metadata, path: "saml/metadata", as: :metadata_mr_sso_session end# /controllers/mrs/saml_sessions_controller.rbclass Mrs::SamlSessionsController

Cơ bản source code trong rails chỉ có như trên thôi. Phần cài đặt của SAMLnằm trong method saml_settings:

Url của metadata của IdPchính là url nằm trong câu lệnh idp_metadata_parser.parse_remote(...).settings.issuerchính là SP identity, là tên của thưc thể SP, thường nó sẽ được gán cho giá trị làurl của metadata của SP. Sau khi cài đặt xong bạn truy cập vào đường link http://localhost/mrs/saml/metadatathì nó sẽ tự động render ra dữ liệu metadatacho bạn.assertion_cosumer_service_urllà url để IdPtrả kết quả lại cho SP. Khi SP nhận kết quả từ IdP, nó sẽ so sánh url có trong SAML Responsevới url này để xác thực xem có đúng kết quả được trả về đúng địa chỉ không, nếu không đúng sẽ báo lỗi.settings.certificatelà khóa công khai của SP, SPphải khai báo nó ở đây để xác thực chữ ký của IdP.Với method metadataở trên thì khi bạn truy cập vào http://localhost/mrs/saml/metadata, mọi thông tin cần thiết khai báo trong saml_settingssẽ được public ra internet (những thông tin bí mật sẽ không được công khai).settings.private_keylà khóa bí mật của SP, SPphải khai báo nó ở đây để ký vào vào SAML request muốn gửi tới cho IdP.authn_requests_signedlà có muốn vào SAML request gửi tới IdPhay không? Ở bên phía IdPcó thể không cần xác thực chữ ký của SPcho dù bên SPcó ký hay không.want_assertions_signedlà có yêu cầu SAML Assertionsđược IdPký không? Bên phía IdPcó thể không cần ký vào SAML Assertionscho dù bên SPcó yêu cầu hay không. Sẽ không có lỗi gì được báo dù bên SPyêu cầu IdPký nhưng IdPkhông ký.

Bạn để ý trong hàm createkhông lấy userbằng email được gửi về từ okta (IdP) mà ta muốn IdPgửi về một thuộc tính khác (LastNametrong đoạn code trên).

Để tạo certificatevà private_keyở trên, bạn chạy câu lệnh dưới đây trong terminal:

openssl req -new -x509 -days 365 -nodes -sha256 -out key.crt -keyout p_key.pemNó sẽ tạo ra cho bạn một cặp khóa public keykey.crtvà private keyp_key.pem. Khóa sẽ có hạn là 365ngày như mình chỉ định trong câu lệnh trên.

3.2. Tạo ứng dụng IdP trên okta.

Đầu tiên bạn cần làm là thay đổi giao diện trên okta từ Developer Consolethành Classic UIthì mới tạo được app:

*

Chọn tab Applicationsvà chọn Add Application:

*

Khi tạo App thì chọn Platform là WebSAML 2.0:

*

Trong phần setting của App bạn chọn như sau:

*

Single sign on URL: làassertion_cosumer_service_urltrong cấu hình rails (xem giải thích ở phần trên).

Audience URI (SP Entity ID): làissuertrong cấu hình rails.

Trong phần Attribute Statements (Optional), bạn điền Namelà LastNamevà Valuelà user.lastName, đây chính là tên và giá trị mà bạn mong muốn IdPsẽ trả về cho SPngoài giá trị mặc định là email(xem method createtrong Rails ở phần trên).

Chú ý là giá trị của Valuephải luôn là user.{field}, và chỉ lấy được các thuộc tính fieldcó sẵn của usertrong okta.

Click vào Show Advanced Settingsvà thiết lập như sau:

*

Để cài đặt được phần này bạn phải hiểu được phần Cách hoạt động của SAMLmình giải thích ở đầu. Một số cấu hình cần chú ý là:

Response: Bạn có muốn IdP ký điện tửvào response trả về cho SPkhông?

Assertion Signature: Bạn có muốn IdP ký điện tửvào SAML assertions nằm trong SAML responsekhông?

Assertion Encryption: Bạn có muốn IdPmã hóa SAML assertionstrả về cho SPkhông?

Encryption Certificate: Nếu bạn muốn IdPmã hóa SAML Assertionthì bạn phải chỉ định SP public key ở phía IdP. Đây chính là file public keykey.cercủa SPbạn tạo ở trên, bạn upload file này lên okta.

Sau khi kết thúc cài đặt settings, bạn cần phải gán app vừa tạo cho một tài khoản thì mới request được từ SPcủa bạn tới IdP. Click vào tab Assignmentsrồi chọn Assign to People:

*

Ở tab Sign On, bạn sẽ thấy các thông tin cần thiết của IdPđể cấu hình trong SPcủa bạn:

*

Nếu bạn muốn các thông tin riêng biệt của IdPthì click vào View Setup Instructions, còn nếu bạn chỉ muốn metadata url của IdPđể SPcủa bạn có thể tự động lấy thông tin (như mình làm trong phần saml_settings trong rails ở trên) thì click vào Identity Provider metadatađể hiển thị thông tin metadata của IdPvà lấy url của nó, phần cấu hình tự động lấy thông tin của IdP từ metadatachính là câu lệnh này trong rails:

settings = idp_metadata_parser.parse_remote("https://dev-879121.okta.com/app/abcefasdfasfafa/sso/saml/metadata")

Sau khi đã cài đặt SPIdPxong thì bạn truy cập vào url http://localhost:3001/mrs/saml/sign_inđể test (mình dùng cổng 3001 cho rails app).

Link tham khảo:

https://en.wikipedia.org/wiki/SAML_Metadata

https://developer.okta.com/standards/SAML/setting_up_a_saml_application_in_okta/

https://security.stackexchange.com/questions/133065/why-is-it-a-bad-idea-to-use-plain-oauth2-for-authentication

https://stackoverflow.com/questions/12779532/differences-between-sp-initiated-sso-and-idp-initiated-sso