CAS (Single Sign On) kurulumu

Kurulmasl bir çok sistemde kullanıcı doğrulamaları gerekmektedir ve bunu tek şifre ile tek merkezden idare etmek de önemli. Single Sign On (SSO) bu tip gereksinimlerde tek yerden kullanıcı doğrulaması alınması için kullanılıyor.

Özellikle büyük networklerde bütün ağın toplandığı noktalara ek sistemler kurmak tüm ağı yavaşlatabilir. Bunun için networklerde switch konfigurasyonu ile SSO kullanmak en mantıklı çözüm olarak görünüyor. Böylece doğrulma iş yükü her bir network cihazına yıkılıyor ve ağın yavaşlaması gibi durum ortadan kalkıyor. Ayrıca doğrulama almadan da ağa girmek imkansız hale geliyor.

Bu yazıda da özellikle kurulumu sırasında zorluk yaşadığım APEREO’ya ait CAS (Central Authentication Service) yazılımını kurmayı ve LDAP ile doğrulama alınmasını anlatacağım.

CAS dökümantasyonu ve desteği oldukça sıkıntılı geldi bana, bu yüzden türkçe bir kaynak da bulunsun istedim.

İşletim sistemi olarak Ubuntu 14.04 x64 kuruyoruz. Bunun üzerine Apache Tomcat7 kuruyoruz.

sudo apt-get install tomcat7

İşletim sistemi ve web sunucumuz hazır.

Şuradaki CAS Overlay’i indirip Maven ile kuracağız.
https://github.com/apereo/cas-overlay-template

zip dosyasını indirip ftp ile veya wget ile sunucuya bir şekilde indiriyoruz ardından zip’ten dosyaları çıkarıyoruz.

cd cas-overlay-template-master

ile klasörün içine giriyoruz. mvnw ile projenin oluşturulmasını başlatıyoruz.

mvnw clean package

Burada işlem biraz uzun sürüyor. Sağdan soldan topladığı paketlerle CAS.war dosyasını hazırlıyor.

Ve işlem bitince Tomcat’te çalıştıracağımız war dosyası target klasörünün altında bizi bekliyor olacak.

cp target/cas.war /var/lib/tomcat7/webapps/

cas.war dosyasını tomcat’a yolladık şimdi tomcat7’yi yeniden başlatalım.

sudo service tomcat7 restart
* Stopping Tomcat servlet engine tomcat7           [ OK ] 
* Starting Tomcat servlet engine tomcat7           [ OK ]

İkinci [ OK ] göründükten sonra tomcat cas.war’i işlemeye başlıyor. Bu yüzden hemen görünmüyor bir süre beklemek gerekli.

http://sunucuadresi:8080/cas adresini açıyoruz ve CAS’a ait ekran gelmiş olmalı. Gelmediyse yukarıdaki işlemleri hatasız yaptınız mı kontrol edin.

Cas geldi ama “Non-secure Connection” hatası görünüyor?

https yani ssl kurulu olmadığı için sizi uyarıyor, /var/lib/tomcat7/webapps/cas/WEB-INF/view/jsp/default/ui/casLoginView.jsp dosyasında aşağıdaki satırları silerseniz uyarı kaybolur. SSL kullanıyorsanız zaten gerek kalmaz.

<c:if test="${not pageContext.request.secure}">
  <div id="msg" class="errors">
    <h2>Non-secure Connection</h2>
    <p>You are currently accessing CAS over a non-secure connection.  Single Sign On WILL NOT WORK.  In order to have single sign on work, you MUST log in over HTTPS.</p>
  </div>
</c:if>

Bu hata da gitti. Sırada can alıcı konfigurasyonlar var.

/var/lib/tomcat7/webapps/cas/WEB-INF/deployerConfigContext.xml dosyasını açıyoruz.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:ldaptive="http://www.ldaptive.org/schema/spring-ext"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:sec="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
       http://www.ldaptive.org/schema/spring-ext http://www.ldaptive.org/schema/spring-ext.xsd
">



    <util:map id="authenticationHandlersResolvers">
        <entry key-ref="ldapAuthenticationHandler" value-ref="primaryPrincipalResolver" />
        <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
        <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
    </util:map>

    <util:list id="authenticationMetadataPopulators">
        <ref bean="successfulHandlerMetaDataPopulator" />
        <ref bean="rememberMeAuthenticationMetaDataPopulator" />
    </util:list>


<ldaptive:bind-search-authenticator id="authenticator"
        ldapUrl="${ldap.url}"
        baseDn="${ldap.baseDn}"
        userFilter="${ldap.authn.searchFilter}"
        bindDn="${ldap.managerDn}"
        bindCredential="${ldap.managerPassword}"
        connectTimeout="${ldap.connectTimeout}"
        useStartTLS="${ldap.useStartTLS}"
        blockWaitTime="${ldap.pool.blockWaitTime}"
        maxPoolSize="${ldap.pool.maxSize}"
        allowMultipleDns="${ldap.allowMultipleDns:false}"
        usePasswordPolicy="${ldap.usePpolicy:false}"
        minPoolSize="${ldap.pool.minSize}"
        validateOnCheckOut="${ldap.pool.validateOnCheckout}"
        validatePeriodically="${ldap.pool.validatePeriodically}"
        validatePeriod="${ldap.pool.validatePeriod}"
        idleTime="${ldap.pool.idleTime}"
        prunePeriod="${ldap.pool.prunePeriod}"
        failFastInitialize="true"
        subtreeSearch="${ldap.subtree.search:true}"
        useSSL="${ldap.use.ssl:false}"
/>


<bean id="ldapAuthenticationHandler"
class="org.jasig.cas.authentication.LdapAuthenticationHandler"
      p:principalIdAttribute="uid"
      c:authenticator-ref="authenticator" />



    <bean id="attributeRepository" class="org.jasig.services.persondir.support.NamedStubPersonAttributeDao"
          p:backingMap-ref="attrRepoBackingMap" />

    <alias name="acceptUsersAuthenticationHandler" alias="primaryAuthenticationHandler" />
    <alias name="personDirectoryPrincipalResolver" alias="primaryPrincipalResolver" />

    <util:map id="attrRepoBackingMap">
        <entry key="uid" value="uid" />
        <entry key="eduPersonAffiliation" value="eduPersonAffiliation" />
        <entry key="groupMembership" value="groupMembership" />
        <entry>
            <key><value>memberOf</value></key>
            <list>
                <value>faculty</value>
                <value>staff</value>
                <value>org</value>
            </list>
        </entry>
    </util:map>

    <alias name="serviceThemeResolver" alias="themeResolver" />

    <alias name="jsonServiceRegistryDao" alias="serviceRegistryDao" />

    <alias name="defaultTicketRegistry" alias="ticketRegistry" />

    <alias name="ticketGrantingTicketExpirationPolicy" alias="grantingTicketExpirationPolicy" />
    <alias name="multiTimeUseOrTimeoutExpirationPolicy" alias="serviceTicketExpirationPolicy" />

    <alias name="anyAuthenticationPolicy" alias="authenticationPolicy" />
    <alias name="acceptAnyAuthenticationPolicyFactory" alias="authenticationPolicyFactory" />

    <bean id="auditTrailManager"
          class="org.jasig.inspektr.audit.support.Slf4jLoggingAuditTrailManager"
          p:entrySeparator="${cas.audit.singleline.separator:|}"
          p:useSingleLine="${cas.audit.singleline:false}"/>

    <alias name="neverThrottle" alias="authenticationThrottle" />

    <util:list id="monitorsList">
        <ref bean="memoryMonitor" />
        <ref bean="sessionMonitor" />
    </util:list>

    <alias name="defaultPrincipalFactory" alias="principalFactory" />
    <alias name="defaultAuthenticationTransactionManager" alias="authenticationTransactionManager" />
    <alias name="defaultPrincipalElectionStrategy" alias="principalElectionStrategy" />
    <alias name="tgcCipherExecutor" alias="defaultCookieCipherExecutor" />
</beans>

Yukarıda kalın yaparak işaretlediğim satırlara dikkat edin. Onlar yeni kurulmuş bir deployerConfigContext.xml dosyasında yok. İsterseniz seçip tek tek ekleyin isterseniz bu dosyayı olduğu gibi kullanın.

Not: CAS’ın kendi dökümantasyonunda geçen sAMAaccount değişken kafamı çok karıştırdı. Bu değişken LDAP’ta kullanıcı adının eşleştiği attribute olacak. Örneğin biz uid kullanıyoruz.

Gelelim /etc/cas/cas.properties dosyasına. Bu dosya çok uzun olduğu için sadece en sona eklenmesinin yeterli olacağı satırları veriyorum.

# http://apereo.github.io/cas/4.2.x/installation/LDAP-Authentication.html#ldap-supporting-direct-bind

#========================================
# General properties
#========================================
ldap.url=ldap://ldap.sunucu.adresi:389

# Start TLS for SSL connections
ldap.useStartTLS=false

# Directory root DN
ldap.rootDn=dc=usak,dc=edu,dc=tr

# Base DN of users to be authenticated
ldap.baseDn=dc=usak,dc=edu,dc=tr

# LDAP connection timeout in milliseconds
ldap.connectTimeout=3000

# Manager credential DN
ldap.managerDn=cn=admin,dc=usak,dc=edu,dc=tr

# Manager credential password
ldap.managerPassword=Sifre123

#========================================
# LDAP connection pool configuration
#========================================
ldap.pool.minSize=1
ldap.pool.maxSize=100
ldap.pool.validateOnCheckout=true
ldap.pool.validatePeriodically=true

# Amount of time in milliseconds to block on pool exhausted condition
# before giving up.
ldap.pool.blockWaitTime=3000

# Frequency of connection validation in seconds
# Only applies if validatePeriodically=true
ldap.pool.validatePeriod=300

# Attempt to prune connections every N seconds
ldap.pool.prunePeriod=300

# Maximum amount of time an idle connection is allowed to be in
# pool before it is liable to be removed/destroyed
ldap.pool.idleTime=600

#========================================
# Authentication
#========================================
ldap.authn.searchFilter=uid={user}

# Ldap domain used to resolve dn
ldap.domain=

# Should LDAP Password Policy be enabled?
ldap.usePpolicy=true

# Allow multiple DNs during authentication?
ldap.allowMultipleDns=false

LDAP konfigurasyonu da hazır. Tomcat’i yeniden başlatarak http://sunucuadresi:8080/cas adresinden -kendine gelmesini bekleyin- giriş yapmayı deneyebilirsiniz.

Sonuç:

2016-08-23_13-37-21

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.