Project

General

Profile

Shibbolethの構築

CentOS7にShibbolethを構築し、SSOを実施する。
Shibbolethは認証を行うIdPと、認証を要求するSPに分かれています。
ここではIdPとSPを異なるサーバに、それぞれ構築を行います。

Shibboleth-IdPの構築

準備

  • 必要なパッケージをインストールする
    # yum install wget httpd mod_ssl java tomcat
    
  • tomcatを有効にする
    # systemctl enable tomcat
    
  • Tomcatの環境変数設定シェルを作成する
    # vi /etc/profile.d/java-tomcat.sh
    -----------------------------
    JAVA_HOME=/usr/lib/jvm/jre
    #export MANPATH=$MANPATH:/usr/java/default/man
    CATALINA_HOME=/usr/share/tomcat
    CATALINA_BASE=$CATALINA_HOME
    PATH=$JAVA_HOME/bin:$CATALINA_BASE/bin:$CATALINA_HOME/bin:$PATH
    export PATH JAVA_HOME CATALINA_HOME CATALINA_BASE
    
  • 環境変数を再読み込みします
    # source /etc/profile
    
  • Tomcatの起動オプションを変更する
    # vi /etc/sysconfig/tomcat
    -----------------------------
    # You can pass some parameters to java here if you wish to
    #JAVA_OPTS="-Xminf0.1 -Xmaxf0.3" 
    JAVA_OPTS="-server -Xmx1500m -XX:MaxPermSize=256m -XX:+UseG1GC " 
    
  • ApacheのServerNameにServerNameにFQDNとtomcatへのプロキシパスを設定する
    # vi /etc/httpd/conf/httpd.conf
    -----------------------------
    #ServerName www.example.com:80
    ServerName shibboleth.example.com:80
    
    ProxyPass /idp/ ajp://localhost:8009/idp/
    
  • ApacheのSSLバーチャルホストのServerNameにFQDNとtomcatへのプロキシパスを設定する
    # vi /etc/httpd/conf.d/ssl.conf
    -----------------------------
    #ServerName www.example.com:443
    ServerName shibboleth.example.com:443
    
    ProxyPass /idp/ ajp://localhost:8009/idp/ 
    
  • Apacheを起動・サービス登録する
    # systemctl enable httpd
    # systemctl start httpd
    
  • Tomcatの設定をコメントアウトおよび追加する
    # vi /usr/share/tomcat/conf/server.xml
    -----------------------------
    <!--
        <Connector port="8080" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="8443" />
    -->
    <!--
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    -->
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" 
               enableLookups="false" tomcatAuthentication="false" address="127.0.0.1" maxPostSize="100000" />
    

インストール

  • 下記コマンドでShibboleth最新版をダウンロードします
    # wget http://shibboleth.net/downloads/identity-provider/latest/shibboleth-identity-provider-3.3.3.tar.gz
    
  • 取得したShibbolethを展開し、ディレクトリ内に移動します
    # tar xzf shibboleth-identity-provider-3.3.3.tar.gz
    # cd shibboleth-identity-provider-3.3.3
    
  • インストールスクリプトを実行します
    # ./bin/install.sh -Didp.conf.filemode=640
    -----------------------------
    Source (Distribution) Directory (press <enter> to accept default): [/root/shibboleth-identity-provider-3.3.3]
    
    Installation Directory: [/opt/shibboleth-idp]
    
    Hostname: [shibboleth.example.com]
    
    SAML EntityID: [https://shibboleth.example.com/idp/shibboleth]
    
    Attribute Scope: [example.com]
    
    Backchannel PKCS12 Password:
    Re-enter password:
    Cookie Encryption Key Password:
    Re-enter password:
    Warning: /opt/shibboleth-idp/bin does not exist.
    Warning: /opt/shibboleth-idp/dist does not exist.
    Warning: /opt/shibboleth-idp/doc does not exist.
    Warning: /opt/shibboleth-idp/system does not exist.
    Warning: /opt/shibboleth-idp/webapp does not exist.
    Generating Signing Key, CN = shibboleth.example.com URI = https://shibboleth.example.com/idp/shibboleth ...
    ...done
    Creating Encryption Key, CN = shibboleth.example.com URI = https://shibboleth.example.com/idp/shibboleth ...
    ...done
    Creating Backchannel keystore, CN = shibboleth.example.com URI = https://shibboleth.example.com/idp/shibboleth ...
    ...done
    Creating cookie encryption key files...
    ...done
    Rebuilding /opt/shibboleth-idp/war/idp.war ...
    ...done
    
    BUILD SUCCESSFUL
    Total time: 56 seconds
    
  • パーミッションやオーナー権限の変更を行う
    # chown -R tomcat:tomcat /opt/shibboleth-idp/logs
    # chgrp -R tomcat /opt/shibboleth-idp/conf
    # chmod -R g+r /opt/shibboleth-idp/conf
    # find /opt/shibboleth-idp/conf -type d -exec chmod -R g+s {} \;
    # chgrp tomcat /opt/shibboleth-idp/metadata
    # chmod g+w /opt/shibboleth-idp/metadata
    # chmod +t /opt/shibboleth-idp/metadata
    
  • idp.warファイルのビルドに必要なパッケージをインストールします
    # yum install jakarta-taglibs-standard
    
  • パッケージに含まれる必要なjarファイルのシンボリックリンクを作成します
    # ln -s /usr/share/java/jakarta-taglibs-core.jar /opt/shibboleth-idp/edit-webapp/WEB-INF/lib/jakarta-taglibs-core.jar
    # ln -s /usr/share/java/jakarta-taglibs-standard.jar /opt/shibboleth-idp/edit-webapp/WEB-INF/lib/jakarta-taglibs-standard.jar
    
  • idp.warのビルドを行います
    # /opt/shibboleth-idp/bin/build.sh
    -----------------------------
    Rebuilding /opt/shibboleth-idp/war/idp.war ...
    ...done
    
    BUILD SUCCESSFUL
    Total time: 14 seconds
    
  • tomcatにidp.warの定義を追加します
    # vi /usr/share/tomcat/conf/Catalina/localhost/idp.xml
    -----------------------------
    <Context docBase="/opt/shibboleth-idp/war/idp.war" 
             privileged="true" 
             antiResourceLocking="false" 
             swallowOutput="true">
    
        <Manager pathname="" />
    
        <!-- Work around lack of Max-Age support in IE/Edge -->
        <CookieProcessor alwaysAddExpires="true" />
    
    </Context>
    
  • アクセス許可設定ファイルを編集します。アクセス元ネットワークを追加します。
    # vi /opt/shibboleth-idp/conf/access-control.xml
    -----------------------------
            <entry key="AccessByIPAddress">
                <bean id="AccessByIPAddress" parent="shibboleth.IPRangeAccessControl" 
                    p:allowedRanges="#{ {'127.0.0.1/32', '::1/128', '192.168.0.0/24'} }" />
            </entry>
    
  • Tomcatのサービスを開始する
    # systemctl start tomcat
    
  • tomcatのログにエラーが出ていないことを確認する
    # tail /usr/share/tomcat/logs/catalina.YYYY-MM-DD.log
    
  • 該当ネットワークからブラウザで下記にアクセスする
    https://IdPサーバのIPアドレス/idp/status
    -----------------------------
    ### Operating Environment Information
    operating_system: Linux
    operating_system_version: 3.10.0-862.9.1.el7.x86_64
    operating_system_architecture: amd64
    jdk_version: 1.8.0_181
    available_cores: 1
    used_memory: 143 MB
    maximum_memory: 1500 MB
    
    ### Identity Provider Information
    idp_version: 3.3.3
    start_time: 2018-08-16T12:26:49+09:00
    current_time: 2018-08-16T12:26:51+09:00
    uptime: 2712 ms
    …
    (後略)
    …
    

設定

SSL証明書の設定(自己証明書ではない場合)

  • 証明書・秘密鍵ファイルをコピーする
    # cp -p server.crt /opt/shibboleth-idp/credentials/
    # cp -p server.key /opt/shibboleth-idp/credentials/
    
  • 秘密鍵ファイルのオーナーとパーミッションを変更する
    # chown tomcat:root /opt/shibboleth-idp/credentials/server.key
    # chmod 400 /opt/shibboleth-idp/credentials/server.key
    
  • 設定ファイルを編集する
    # vi /opt/shibboleth-idp/conf/idp.properties
    -----------------------------
    idp.signing.key= %{idp.home}/credentials/server.key
    idp.signing.cert= %{idp.home}/credentials/server.crt
    idp.encryption.key= %{idp.home}/credentials/server.key
    idp.encryption.cert= %{idp.home}/credentials/server.crt
    
  • Tomcatのサービスを再起動する
    # systemctl restart tomcat
    
  • tomcatのログにエラーが出ていないことを確認する
    # tail /usr/share/tomcat/logs/catalina.YYYY-MM-DD.log
    

LDAPサーバとの連携

  • openldapクライアントをインストールする
    # yum install openldap-clients
    
  • 別途存在するldapサーバから情報を取得できるか確認する
    # ldapsearch -h 10.3.0.70 -x -b 'dc=example,dc=com' '(objectclass=*)'
    -----------------------------
    …
    (前略)
    …
    # search result
    search: 2
    result: 0 Success
    
    # numResponses: 7
    # numEntries: 6
    
  • 設定ファイルを編集する
    # vi /opt/shibboleth-idp/conf/ldap.properties
    -----------------------------
    ## Connection properties ##
    #idp.authn.LDAP.ldapURL                          = ldap://localhost:10389
    idp.authn.LDAP.ldapURL                          = ldap://LDAPサーバのアドレス
    #idp.authn.LDAP.useStartTLS                     = true
    idp.authn.LDAP.useStartTLS                     = false
    #idp.authn.LDAP.useSSL                          = false
    # Time in milliseconds that connects will block
    #idp.authn.LDAP.connectTimeout                  = PT3S
    # Time in milliseconds to wait for responses
    #idp.authn.LDAP.responseTimeout                 = PT3S
    
    #idp.authn.LDAP.baseDN                           = ou=people,dc=example,dc=org
    idp.authn.LDAP.baseDN                           = ou=Members,dc=example,dc=com
    #idp.authn.LDAP.subtreeSearch                   = false
    idp.authn.LDAP.subtreeSearch                   = true
    idp.authn.LDAP.userFilter                       = (uid={user})
    
    #idp.authn.LDAP.bindDN                           = uid=myservice,ou=system
    idp.authn.LDAP.bindDN                           = cn=Manager,dc=example,dc=com
    #idp.authn.LDAP.bindDNCredential                 = myServicePassword
    idp.authn.LDAP.bindDNCredential                 = Managerのパスワード
    
  • Tomcatのサービスを再起動する
    # systemctl restart tomcat
    
  • tomcatのログにエラーが出ていないことを確認する
    # tail /usr/share/tomcat/logs/catalina.YYYY-MM-DD.log
    

SAMLの設定

  • SAMLの設定を変更します
    # vi /opt/shibboleth-idp/conf/saml-nameid.properties
    -----------------------------
    # For computed IDs, set a source attribute and a secret salt:
    #idp.persistentId.sourceAttribute = changethistosomethingreal
    idp.persistentId.sourceAttribute = uid
    
    #idp.persistentId.salt = changethistosomethingrandom
    idp.persistentId.salt = ランダムな文字列を設定
    

動作確認

  • 次のコマンドで動作確認を行う
    # wget -O - https://localhost/idp/status --no-check-certificate
    -----------------------------
    ## Operating Environment Information
    operating_system: Linux
    operating_system_version: 3.10.0-862.9.1.el7.x86_64
    operating_system_architecture: amd64
    jdk_version: 1.8.0_181
    available_cores: 1
    used_memory: 78 MB
    maximum_memory: 1500 MB
    
    ### Identity Provider Information
    idp_version: 3.3.3
    start_time: 2018-08-01T16:39:59+09:00
    current_time: 2018-08-01T16:40:02+09:00
    uptime: 2956 ms
    
    service: shibboleth.LoggingService
    last successful reload attempt: 2018-08-01T07:38:43Z
    last reload attempt: 2018-08-01T07:38:43Z
    
    service: shibboleth.ReloadableAccessControlService
    last successful reload attempt: 2018-08-01T07:38:48Z
    last reload attempt: 2018-08-01T07:38:48Z
    
    service: shibboleth.MetadataResolverService
    last successful reload attempt: 2018-08-01T07:38:48Z
    last reload attempt: 2018-08-01T07:38:48Z
    
    service: shibboleth.RelyingPartyResolverService
    last reload attempt: 2018-08-01T07:38:48Z
    
    service: shibboleth.NameIdentifierGenerationService
    last successful reload attempt: 2018-08-01T07:38:47Z
    last reload attempt: 2018-08-01T07:38:47Z
    
    service: shibboleth.AttributeResolverService
    last successful reload attempt: 2018-08-01T07:38:47Z
    last reload attempt: 2018-08-01T07:38:47Z
    
            DataConnector staticAttributes: has never failed
    
    service: shibboleth.AttributeFilterService
    last successful reload attempt: 2018-08-01T07:38:46Z
    last reload attempt: 2018-08-01T07:38:46Z
    
    100%[======================================>] 1,373       --.-K/s 時間 0s
    
    2018-08-01 16:40:02 (82.9 MB/s) - stdout へ出力完了 [1373/1373]