2019/11/08
SeciossLinkで認証したユーザーでJava Servletで作ったWebアプリケーションにSSOする。
SeciossLinkとSAML Service ProviderとのSAML認証は Apache httpd と mod_auth_mellon を使います。
Java ServletコンテナとしてApache Tomcatを使用し、Apache httpd と Apache Tomcat 間の連携には AJP(Apache Jserv Protocol)を使用します。
SAML SPをつくろう 【mod_auth_mellon編】の構築が行われていることを本稿の前提条件とします。
CentOSにtomcatをインストールします。
# yum install tomcat
標準でAJPは有効な状態なので、一行だけ修正してTomcatでの認証を無効化します。
# vi /etc/tomcat/server.xml
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" tomcatAuthentication="false" /></code>
tomcat を起動します。
# systemctl start tomcat
以前、作成した mellon.conf にAJPへのリバースプロキシー設定を追加します。
# vi /etc/httpd/conf.d/mellon.conf
<Location />
MellonEndpointPath "/mellon"
MellonIdPMetadataFile /etc/httpd/metadata/SlinkMetadata.xml
MellonSPPrivateKeyFile /etc/httpd/metadata/https_centos_.int.secioss.work_samlsp.key
MellonSPCertFile /etc/httpd/metadata/https_centos_.int.secioss.work_samlsp.cert
MellonSPMetadataFile /etc/httpd/metadata/https_centos_.int.secioss.work_samlsp.xml
</Location>
<Location /mellon>
AuthType "Mellon"
Require valid-user
MellonEnable "auth"
</Location>
Alias /app /var/www/app
<Location /app>
AuthType "Mellon"
Require valid-user
MellonEnable "auth"
</Location>
<Location /servlet>
AuthType "Mellon"
Require valid-user
MellonEnable "auth"
ProxyPass ajp://localhost:8009/
</Location>
※ /servlet は検証ページのパスです。
httpd を再起動します。
# systemctl restart httpd
以前、設定したSAML SPの設定を一部変更します。
項目名 |
設定値 |
サービスID | mellon ※変更なし |
サービス名 | mellon ※変更なし |
エンティティID | https://centos76.int.secioss.work/samlsp ※変更なし |
Assertion Consumer Service | https://centos76.int.secioss.work/mellon/postResponse ※変更なし |
ログアウトURL | https://centos76.int.secioss.work/mellon/logout ※変更なし |
アクセス先URL | https://centos76.int.secioss.work/servlet/ ※Java Servlet用の検証ページに変更します。 |
IDの属性 | urn:oasis:names:tc:SAML:2.0:nameid-format:persistent ※変更なし |
登録したSAML SPをユーザーに割り当てます。
以前、設定済みでしたら変更する必要はありません。
テスト用ページの作成します。
ちょっと手抜きをして、JSPだけの検証ページです。
# mkdir /var/lib/tomcat/webapps/ROOT
# /var/lib/tomcat/webapps/ROOT/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
<h1>こんにちは <%=request.getUserPrincipal().getName()%> さん</h1>
</body>
</html>
SAML認証したユーザIDは HttpServletRequest#getUserPrincipal() に設定されているので、それを表示しています。
ブラウザでアクセスURLにアクセスすると、SeciossLinkのログイン画面にリダイレクトされ、
ログインすると以下のような画面が表示されます。
https://centos76.int.secioss.work/servlet/
このようにAJPを使ったリクエストの送信ではREMOTE_USERなど限られた情報しか渡せませんが、少ない修正で簡単にSAML連携ができます。
それではまた。