SAMLを介したIPとESIAの統合

ESIAとの統合

次の州の命令を実行する際、私たちのチームはサイトをESIAと統合する問題に直面しました。 ネットワーク上でこの問題を解決するための指示はありません。ただし、通信省の公式文書(3つの規則で約300ページ)の情報を除きます。 ESIAの統合のための有料サービスを提供する会社もあります。 統合プロセスを実装、説明し、habrahabrコミュニティと共有することにしました。


ESIAとは


識別の統一システムと識別のA-政府機関や一部の商業組織のWebサイトへのアクセス(登録、認証)を提供するロシアの情報システム。 ウィキペディアで詳細を読む


ESIAの統合中に、システムは要求をESIAに送信し、認証に成功すると、応答としてユーザーデータを受信できます。


承認スクリプトは次のようになります。



内容


  1. 一般的な情報
  2. SimpleSAMLphpをインストールする
  3. ESIAテスト環境に接続するためのSimpleSAMLphpの構成
  4. メタデータファイルの構成
  5. ISをESIAテスト環境に接続するために、通信省の住所に申請書を送付する
  6. ESIAとの機能統合およびESIAを介した許可ユーザーのデータの受信
  7. IPを生産的なESIA環境に接続するためのアプリケーションを送信する

一般的な情報


「統一識別認証システムの使用に関するガイドライン」と題された文書が通信省のウェブサイトに掲載されており、最新版は常に通信省のウェブサイトにあります。 ドキュメント自体はかなり大きく、200ページ近くあります。もちろん、詳細に勉強したい人はほとんどいません。誰もが理解できるわけではないので、最後にプロセスを説明します。


ICをESIAに接続するには2つの方法があります。



2つのアプローチを比較すると、実際にはこれらのアプローチに大きな違いはありません。RESTアプローチに基づく方法にはいくつかの利点があります。 私の意見では多額のお金でESIAをつなぎ、RESTの利点についてここに書いた人がいます


しかし、ほとんどの場合、最初のアプローチはすべての必要な機能をカバーしています。 したがって、SAML 2.0によるESIAの実装について説明します


SimpleSAMLphpをインストールする


統合には、SimpleSAMLphpを使用します。 セットアップするシステムがPHPで記述されていない場合でも、このモジュールを使用できます。サイトにphpで認証機能が実装されているだけで、ESIAからXML形式でデータを受け取ります。


SimplSAMLphpの最新の公式バージョンは、 SimpleSamlPHPの公式Webサイトで入手できます。 アーカイブをダウンロードし、/ varフォルダーにモジュールを解凍します。セキュリティ上の理由から、解凍されたモジュールがあるフォルダーでは、rootユーザーのみにアクセス権を設定する必要があります。 サーバー構成で、エイリアスと次のルールを追加します。


<VirtualHost *> ServerName service.example.com DocumentRoot /var/www/service.example.com SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/simplesamlphp/config Alias /simplesaml /var/simplesamlphp/www <Directory /var/simplesamlphp/www> <IfModule !mod_authz_core.c> # For Apache 2.2: Order allow,deny Allow from all </IfModule> <IfModule mod_authz_core.c> # For Apache 2.4: Require all granted </IfModule> </Directory> </VirtualHost> 

一番下の行は、 ServerName/simplesamlリクエストでServerName/simplesamlウェルカムページが開きます。 すべてを正しく行った場合、 ServerName/simplesamlリクエストで、そのようなページが表示されます



SimpleSamlPHP

ESIAテスト環境に接続するためのSimpleSAMLphpの構成


統合するには、証明書( cert.crt )とキー( key.key )がkey.key 。 重要なのは(!)GOST証明書では何もうまくいかないこと、それを行う方法をグーグルで調べて無料の証明書を取得するか、自分で証明書を発行できることです。 キーと証明書をsimplesamlphp/certフォルダーに入れます


SimpleSAMLphpを構成するには、次のファイルを編集する必要があります。



重要な注意-サーバー上の時間は1分以上ECIA時間と変わらないようにする必要があります。


simplesamlphp/config/config.php


 //         simplesamlphp 'certdir' => 'cert/' //  'secretsalt' => 'defaultsecretsalt', //  'technicalcontact_name' => 'Familiya Imya', 'technicalcontact_email' => 'po4ta@domen.zone', 

システムにentityIDがあるかどうかを知ることが重要です。ない場合は、システムのアドレスを'entityID'フィールドで指定する必要があります


simplesamlphp/config/authsources.php


 esia' => array ( 'saml:SP', 'name' => 'Esia', //   'privatekey' => 'key.key', //  'privatekey_pass' => '12345678', //   'certificate' => 'cert.crt', // , 'entityID' => 'ServerName', 'discoURL' => NULL, 'redirect.sign' => TRUE, 'redirect.validate' => TRUE, 'validate.logout' => FALSE, //idp      'idp' => 'https://esia-portal1.test.gosuslugi.ru/idp/shibboleth', //idp      // 'idp' => 'https://esia.gosuslugi.ru/idp/shibboleth', //  'OrganizationName' => 'Organization Name', //url  'OrganizationURL' => 'ServerName', 

次に、証明書(指紋)の署名を取得する必要があります。 これは、いずれかのコマンドのターミナルで実行できます



simplesamlphp/metadata/saml20-idp-remote.php


 // idp      $metadata['https://esia-portal1.test.gosuslugi.ru/idp/shibboleth'] = array( 'name' => array( 'en' => 'Esia', 'no' => 'ESIA', ), //idp SignOn   'SingleSignOnService' => 'https://esia-portal1.test.gosuslugi.ru/idp/profile/SAML2/Redirect/SSO', //idp LogOut   'SingleLogoutService' => 'https://esia-portal1.test.gosuslugi.ru/idp/profile/SAML2/Redirect/SLO', //Fingerprint  'certFingerprint' => 'f17393ae5927293ae5927261b6515c44501e4450', ); 

メタデータファイルの構成


次に、アプリケーションとともにESIAに送信するために、メタデータファイルを構成する必要があります


メタデータファイルは、 ServerName/simplesaml/module.php/saml/sp/metadata.php/esia?output=xhtml


メタデータファイルの例:


 <?xml version="1.0"?> <md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="ServerName"> <md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol" AuthnRequestsSigned="true"> <md:KeyDescriptor use="signing"> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509Data> <ds:X509Certificate> // </ ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:KeyDescriptor use="encryption"> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509Data> <ds:X509Certificate> // </ ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="ServerName/simplesaml/module.php/saml/sp/saml2-logout.php/esia"/> <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="ServerName/simplesaml/module.php/saml/sp/saml2-acs.php/esia" index="0"/> <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post" Location="ServerName/simplesaml/module.php/saml/sp/saml1-acs.php/esia" index="1"/> <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="ServerName/simplesaml/module.php/saml/sp/saml2-acs.php/esia" index="2"/> <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" Location="ServerName/simplesaml/module.php/saml/sp/saml1-acs.php/esia/artifact" index="3"/> </md:SPSSODescriptor> <md:Organization> <md:OrganizationName xml:lang="en">Organization Name</md:OrganizationName> <md:OrganizationDisplayName xml:lang="en">Organization Name</md:OrganizationDisplayName> <md:OrganizationURL xml:lang="en">ServerName</md:OrganizationURL> </md:Organization> <md:ContactPerson contactType="technical"> <md:GivenName>Imya</md:GivenName> <md:SurName>Familiya</md:SurName> <md:EmailAddress>po4ta@domen.zone</md:EmailAddress> </md:ContactPerson> </md:E</ntityDescriptor> 

しかし、残念ながら、SimpleSamlはメタデータファイルを生成しますが、これはESIA要件とはわずかに異なるため、段落A.6 メタデータファイルテンプレートの推奨事項に従って修正する必要があります


ESIA要件を満たすメタデータファイルの例は、 example.xmlダウンロードできexample.xml


ISをESIAテスト環境に接続するために、通信省の住所に申請書を送付する


現在、参加者とESIAオペレーターとの情報のやり取りに関する規則の「E」の形式でアプリケーションを作成しています。 リンクから当社のウェブサイトからdocx形式の申請書をダウンロードできます。


次に、「テストESIAの統合」という件名でesia@minsvyaz.ruリクエストを送信する必要があり、3つのファイルをレターに添付する必要があります。



サービスプロバイダー(ESIA)から「解決済み」のステータスとテスト用の添付ファイルを含む応答を受信した後、次の手順に進みます。


「リクエスト#には追加情報が必要です」という件名の回答が届く可能性があります。この場合、レターには修正が必要なものに関する情報が含まれます。


ESIAとの機能統合およびESIAを介した許可ユーザーのデータの受信


リンクをクリックして、テスト環境へのIP接続を確認します
ServerName/simplesaml/module.php/core/authenticate.php?as=esia


上記のすべての段落が正しく完了すると、ESIAテスト環境へのリンクを含むリンクが開きます。 テスト環境での認証には、ステータスが「解決済み」のレターでESIAから受信したデータが使用されます。 認証後、ESIAから受信したデータを含むテーブルを含むSimpleSAMLページにリダイレクトされます。


xml ESIA回答

次に、データを処理するスクリプトを作成します。 最初に、サイトを認証するボタンを追加します。


 //  action         <form action="inc/esia.php" method="POST"> <input name="esia" type="submit" value="  "/> </form> 

ハンドラーinc/esia.php ここでデータを取得し、データベースに書き込んだり、セッションに追加したりできます。 一般に、xmlを正しく解析する必要があります。 次に、画面にデータを表示します。



 if (isset($_POST['esia'])){ //   simplesamlphp/lib/_autoload.php require_once('../../simplesamlphp/lib/_autoload.php'); $as = new SimpleSAML_Auth_Simple('esia'); $as->requireAuth(); $attributes = $as->getAttributes(); foreach($attributes as $key => $value) { echo ($key . ' ' . $value . '<br/>'); } } 

IPを生産的なESIA環境に接続するためのアプリケーションを送信する


現在、参加者とESIAオペレーターとの情報のやり取りに関する規則の「M」の形式のアプリケーションを作成しています。 フォームEと大きな違いはありませんが、フォームを慎重に検討し、要求されたデータをフォームに追加する必要があり、証明書ファイルを添付する必要はありません。


ファイルsimplesamlphp/config/authsources.phpsimplesamlphp/metadata/saml20-idp-remote.php 、サービスプロバイダーidpをテスト環境から本稼働環境に置き換える必要があります。


 //idp      // 'idp' => 'https://esia-portal1.test.gosuslugi.ru/idp/shibboleth', //   idp      'idp' => 'https://esia.gosuslugi.ru/idp/shibboleth', 

ここで、新しいメタデータファイルを作成します。実際には、サービスフィールドのリンクのみが変更されます


esia@minsvyaz.ruに電子メールを送信し、2つのファイルを添付します。



これで、ステータスが「解決済み」の応答を受け取るはずです。その後、ESIAを介してエントリの機能を操作に入力できます。


執筆時点では、規則の現在のバージョンは2.7です。 規制を更新する場合、IPとESIAの相互作用にいくつかの変更が可能です。


Source: https://habr.com/ru/post/J326008/


All Articles