don't stop believing

CAS 서버 설치 (on CentOS) 본문

Tools/LDAP & CAS

CAS 서버 설치 (on CentOS)

Tongchun 2018. 10. 11. 10:52

CAS 서버를 설치하겠습니다.

CAS 서버에 대한 간략한 설명은 아래와 같습니다.

Client Access Server (CAS)

The client access server (CAS) is a server role that handles all client connections to Exchange Server 2010 and Exchange 2013. The CAS supports all client connections to Exchange Server from Microsoft Outlook and Outlook Web App, as well as ActiveSync applications. The CAS also provides access to free/busy data in Exchange calendars.

The CAS is one of five server roles in Exchange Server 2007 and Exchange 2010, and one of two server roles in Exchange Server 2013. It must be installed in every Exchange Server organization and on every Active Directory (AD) site that has the Exchange mailbox server role installed. In Exchange 2007, Outlook client connections were handled by the mailbox server.

https://apereo.github.io

CAS 서버의 architecture는 아래 링크에서 확인할 수 있습니다.

https://apereo.github.io/cas/5.2.x/planning/Architecture.html


CAS 서버를 설치하기 전 아래 3가지가 설치되어 있어야 합니다.

  • JDK 1.8 버전
  • Git
  • Maven 또는 Gradle
  • Tomcat

JDK를 먼저 설치하겠습니다.

$ sudo yum -y install java-1.8.0-openjdk-devel

설치가 되었다면 java version을 확인해 봅니다.

$ java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

Git도 설치해 줍니다.

$ sudo yum -y install git

CAS Source를 빌드하기 위해 Maven이나 Gradle을 설치합니다. 저는 둘 다 설치해 보겠습니다.

먼저 Maven입니다.

Maven 다운로드와 최빌 서번은 아래 링크에서 확인할 수 있습니다.

https://maven.apache.org/download.cgi

현재 3.5.4 버전이네요. 

Maven home directory로 이동해 wget 명령으로 받아 보겠습니다.

$ cd /usr/local/src
$ sudo wget http://www-us.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz

다운받은 maven 파일의 압축을 풀고 mv 명령을 이용해 폴더명에 버전을 지워줍니다.

$ sudo tar -xf apache-maven-3.5.4-bin.tar.gz
$ sudo mv apache-maven-3.5.4/ apache-maven/

이제 maven 설정파일을 만들고 PATH 등을 등록합니다.

$ cd /etc/profile.d/
$ sudo vim maven.sh

새로만든 maven.sh 파일에 아래 내용을 추가합니다.

# Apache Maven Environment Variables
# MAVEN_HOME for Maven 1 - M2_HOME for Maven 2
export M2_HOME=/usr/local/src/apache-maven
export PATH=${M2_HOME}/bin:${PATH}

만들어진 maven.sh 파일에 실행 권한을 주고 source 명령을 설정을 등록합니다.

$ sudo chmod +x maven.sh
$ source /etc/profile.d/maven.sh

maven 설정이 다 되었다면 버전을 확인해 봅니다.

$ mvn --version
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T14:33:14-04:00)
Maven home: /usr/local/src/apache-maven
Java version: 1.8.0_181, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64/jre
Default locale: ko_KR, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.11.6.el7.x86_64", arch: "amd64", family: "unix"


이번에는 Gradle도 설치해 보겠습니다.

Gradle에 대한 정보는 아래 링크에서 확인할 수 있습니다. 현제 버전은 4.10.2 입니다.

https://gradle.org/releases/


user home directory로 이동 후 Gradle 바이너리 파일을 다운로드 받습니다.

$ cd ~
$ sudo wget https://services.gradle.org/distributions/gradle-4.10.2-bin.zip

/opt/gradle 폴더를 만들고 해당 폴더에 zip 파일의 압축을 풉니다.

$ sudo mkdir /opt/gradle
$ sudo unzip -d /opt/gradle gradle-4.10.2-bin.zip

gradle 명령을 환경변수에 지정합니다.

$ sudo vim /etc/profile

아래와 같이 gragle 경로를 지정합니다. profile 파일 제일 아래줄에 아래와 같이 추가 합니다.

export GRADLE_USER_HOME=/opt/gradle/gradle-4.10.2/bin
export PATH=$PATH:$GRADLE_USER_HOME

profile 파일을 저장하고 source로 설정을 등록합니다.

$ source /etc/profile

환경변수 등록이 되었다면 gradle 버전을 확인해 봅니다.

$ gradle -v

------------------------------------------------------------
Gradle 4.10.2
------------------------------------------------------------

Build time:   2018-09-19 18:10:15 UTC
Revision:     b4d8d5d170bb4ba516e88d7fe5647e2323d791dd

Kotlin DSL:   1.0-rc-6
Kotlin:       1.2.61
Groovy:       2.4.15
Ant:          Apache Ant(TM) version 1.9.11 compiled on March 23 2018
JVM:          1.8.0_181 (Oracle Corporation 25.181-b13)
OS:           Linux 3.10.0-862.11.6.el7.x86_64 amd64


이제 Tomcat을 설치할 차례입니다.

현재 9 버전까지 나왔는데 저는 8 버전으로 설치하겠습니다.

https://tomcat.apache.org/download-80.cgi

$ sudo wget http://apache.mirror.cdnetworks.com/tomcat/tomcat-8/v8.5.34/bin/apache-tomcat-8.5.34.tar.gz
$ sudo tar xzf apache-tomcat-8.5.34.tar.gz
$ sudo mv apache-tomcat-8.5.34 /usr/share/tomcat8

tomcat 환경변수도 추가해 줍니다.

$ sudo vim /etc/profile

profile 파일에 아래와 같이 설정을 추가합니다.

export CATALINA_HOME=/usr/share/tomcat8
export PATH=$PATH:$CATALINA_HOME/bin

profile 파일을 저장하고 source 명령으로 설정을 등록합니다.

설정이 잘 되었는지 CATALINA_HOME 변수도 확인해 봅니다.

$ source /etc/profile
$ echo $CATALINA_HOME
/usr/share/tomcat8

Tomcat을 실행하고 기본 페이지가 정상적으로 접속 되는지 확인해 봅시다.

$ sudo sh /usr/share/tomcat8/bin/startup.sh
Using CATALINA_BASE:   /usr/share/tomcat8
Using CATALINA_HOME:   /usr/share/tomcat8
Using CATALINA_TMPDIR: /usr/share/tomcat8/temp
Using JRE_HOME:        /
Using CLASSPATH:       /usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar
Tomcat started.

설치된 서버의 ip와 tomcat 기본 포트인 8080으로 접속해 봅니다.

Tomcat을 손쉽게 Start, Stop 시키기 위해 서비스에 등록해 보겠습니다.

/etc/init.d 폴더 안에 tomcat8 파일을 만들고 스크립트를 추가해 줍니다.

$ sudo vim /etc/init.d/tomcat8

tomcat8 파일안에 들어갈 스크립트 입니다.

#!/bin/bash
# description: Tomcat Start Stop Restart
# processname: tomcat8
# chkconfig: 234 20 80

JAVA_HOME=$JAVA_HOME
export JAVA_HOME

PATH=$JAVA_HOME/bin:$PATH
export PATH

CATALINA_HOME=/usr/share/tomcat8

case $1 in

start)
sh $CATALINA_HOME/bin/startup.sh
;;

stop)
sh $CATALINA_HOME/bin/shutdown.sh
;;

restart)
sh $CATALINA_HOME/bin/shutdown.sh
sh $CATALINA_HOME/bin/startup.sh
;;

esac
exit 0

파일 저장후 아래와 같이 권한을 변경합니다.

$ sudo chmod +x /etc/init.d/tomcat8
$ sudo chmod 755 /etc/init.d/tomcat8

CentOS가 재시작되면 자동으로 tomcat이 실해되도록 chkconfig에도 추가하고 확인도 해봅니다.

$ sudo chkconfig --add tomcat8
$ sudo chkconfig --list tomcat8

tomcat 로그도 권한 설정을 해 줍니다.

chown은 현재 계정으로 추가합니다. sudo chown -R <접속계정>:<접속계정> /usr/share/tomcat8/logs

$ sudo chown -R ngle:ngle /usr/share/tomcat8/logs
$ sudo chmod -R u+rw /usr/share/tomcat8/logs

tomcat을 시작하기 전 JAVA_OPTS를 추가해 줍니다.

catalina.sh를 열고 아래와 같이 추가 합니다.

$ sudo vim /usr/share/tomcat8/bin/catalina.sh

catalina.sh 파일을 열고 주석이 끝나는 부분에 아래와 같이 JAVA_OPTS를 추가합니다.

JAVA_OPTS="-Xms600m -Xmx1024m -XX:MaxPermSize=200m"

이제 tomcat설치와 설정은 끝났고 service로 tomcat을 start또는 restart해 줍니다.

$ sudo service tomcat8 restart

tomcat 실행 확인은 아래 명령으로 확인할 수 있습니다.

$ ps -ef | grep java
$ sudo tail -f /usr/share/tomcat8/logs/catalina.out

여기까지 CAS 서버를 설치하기 위한 준비를 마쳤습니다.

이제 드디어 CAS 서버입니다.


CAS 서버는 WAR Overlay method 방식을 통해 빌드/배포됩니다.

Overlay 방식은 CAS 전체 Codebase를 다운받아 컴파일/빌드하지 않고 수정(커스터마이즈)이 필요한 부분만 개발/적용하여 기본 베이스 코드를 덮어쓰도록 빌드하여 cas.war 파일을 만들어내는 방식입니다.


WAR Overlay가 가능한 Maven이나 Gradle 빌드 툴을 사용해 적용할 수 있습니다.

Gradle 빌드를 사용해 CAS를 설치해 보겠습니다.

github에서 gradle overlay template을 받아 빌드합니다.

$ cd ~
$ git clone https://github.com/apereo/cas-gradle-overlay-template.git
$ cd cas-gradle-overlay-template

buildNeeded 옵션으로 build에 필요한 것들이 모두 있는지 확인해 봅니다.

$ $ sudo ./gradlew buildNeeded

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.8/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 8s
3 actionable tasks: 3 executed

다른 옵션들을 확인하려면 tasks로 확인할 수 있습니다.

$ sudo ./gradlew tasks

빌드를 하기 전에 config들을 설정해 줘야 합니다.

cas의 config 기본 경로는 /etc/cas/config 입니다.

아래와 같이 디렉토리를 만들어 줍니다.

$ sudo mkdir /etc/cas/config $ sudo mkdir /etc/cas/logs

cas의 log 기록은 log4j2를 사용할겁니다. 그래서 설정 파일인 log4j2.xml 파일을 아래와 같이 만들어 줍니다.

$ sudo vim /etc/cas/config/log4j2.xml

log4.2.xml 파일 안에는 아래 내용을 추가합니다. (내용이 길어 link로 대체합니다.)

https://github.com/apereo/cas/blob/master/webapp/resources/log4j2.xml


keytool을 이용해 ssl 인증서 파일도 만들어 줍니다.

아래와 같이 keytool을 이용해 만들어 줍니다. -keystore 값은 /etc/cas/thekeystore로 해줍니다.

sudo keytool -genkey -alias cas -keyalg RSA -validity 999 -keystore /etc/cas/thekeystore -ext san=dns:ngle.co.kr

기본 유저 정보는 아래와 같이 등록해서 만들었습니다.

$ sudo keytool -genkey -alias cas -keyalg RSA -validity 999 -keystore /etc/cas/thekeystore -ext san=dns:ngle.co.kr
Enter keystore password:  
Re-enter new password: 
What is your first and last name?
  [Unknown]:  Tongchun Kim
What is the name of your organizational unit?
  [Unknown]:  Platform
What is the name of your organization?
  [Unknown]:  nGle
What is the name of your City or Locality?
  [Unknown]:  Seongnam
What is the name of your State or Province?
  [Unknown]:  Gyeonggi
What is the two-letter country code for this unit?
  [Unknown]:  KR
Is CN=Tongchun Kim, OU=Platform, O=nGle, L=Seongnam, ST=Gyeonggi, C=KR correct?
  [no]:  yes

Enter key password for 
	(RETURN if same as keystore password):  
Re-enter new password: 

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /etc/cas/thekeystore -destkeystore /etc/cas/thekeystore -deststoretype pkcs12".

cas properties 파일도 만들어 줍니다.

$ sudo vim /etc/cas/config/cas.properties

cas.properties 파일 안에는 아래와 같이 추가합니다.

SSL 설정은 앞서 생성한 thekeystore 경로와 비번으로 합니다.

server.port=8443

# Theme
# cas.theme.paramName=theme
cas.theme.defaultThemeName=cas-theme-default

# SSL
server.ssl.keyStore=/etc/cas/thekeystore
server.ssl.keyStorePassword=ngle9999
server.ssl.keyPassword=ngle9999
server.ssl.enabled=true
server.contextPath=/

# log4j2 setting
logging.config=file:/etc/cas/log4j2.xml
server.contextParameters.isLog4jAutoInitializationDisabled=true

cas.tgc.crypto.encryption.key=ngle1PbwSbnHeinpkZ
cas.tgc.crypto.signing.key=ngle_szxK-5_eJjs-aUj-64Mp
cas.logout.followServiceRedirects=true

# Control log levels via properties
logging.level.org.apereo.cas=DEBUG

# CAS Server
cas.server.name=https://cas.ngle.co.kr:8443
cas.server.prefix=https://cas.ngle.co.kr:8443/cas
# cas.host.name=

# InMemory Ticket Registry
# Enable the backing map to be cacheable
cas.ticket.registry.inMemory.cache=true

cas.ticket.registry.inMemory.loadFactor=1
cas.ticket.registry.inMemory.concurrency=20
cas.ticket.registry.inMemory.initialCapacity=1000

cas.ticket.registry.inMemory.crypto.signing.key=
cas.ticket.registry.inMemory.crypto.signing.keySize=512
cas.ticket.registry.inMemory.crypto.encryption.key=
cas.ticket.registry.inMemory.crypto.encryption.keySize=16
cas.ticket.registry.inMemory.crypto.alg=AES
cas.ticket.registry.inMemory.crypto.enabled=false

cas.ticket.tgt.maxTimeToLiveInSeconds=2592000
cas.ticket.tgt.timeToKillInSeconds=2592000

cas.adminPagesSecurity.ip=127\.0\.0\.1

이제 빌드를 합니다.

$ sudo ./gradlew build

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.8/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 5s
3 actionable tasks: 3 executed

cas는 자체 tomcat 서버를 가지고 있습니다. cas를 바로 실행할 수도 있습니다.

$ sudo ./gradlew run

저는 실행했는데 Ready에서 inMemory 쪽에서 15분동안 같은 메시지만 보였습니다. 결국 종료했습니다.

설정에 누락이 있는건지 이건 좀 확인이 필요해 보입니다.

2018-10-11 22:36:12,725 DEBUG [org.apereo.cas.authentication.PseudoPlatformTransactionManager] - <Creating new transaction with name [org.apereo.cas.ticket.registry.DefaultTicketRegistryCleaner.clean]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; 'ticketTransactionManager'>
2018-10-11 22:36:12,734 DEBUG [org.apereo.cas.ticket.registry.DefaultTicketRegistryCleaner] - <Attempting to acquire ticket cleanup lock.>
2018-10-11 22:36:12,734 DEBUG [org.apereo.cas.ticket.registry.DefaultTicketRegistryCleaner] - <Acquired lock. Proceeding with cleanup.>
2018-10-11 22:36:12,737 INFO [org.apereo.cas.ticket.registry.DefaultTicketRegistryCleaner] - <[0] expired tickets removed.>
2018-10-11 22:36:12,737 DEBUG [org.apereo.cas.ticket.registry.DefaultTicketRegistryCleaner] - <Releasing ticket cleanup lock.>
2018-10-11 22:36:12,738 DEBUG [org.apereo.cas.ticket.registry.DefaultTicketRegistryCleaner] - <Finished ticket cleanup.>
2018-10-11 22:36:12,739 DEBUG [org.apereo.cas.authentication.PseudoPlatformTransactionManager] - <Initiating transaction commit>
2018-10-11 22:37:02,713 DEBUG [org.apereo.cas.services.AbstractServicesManager] - <Loading services from [org.apereo.cas.services.ChainingServiceRegistry@83df233]>
2018-10-11 22:37:02,715 INFO [org.apereo.cas.services.AbstractServicesManager] - <Loaded [0] service(s) from [InMemoryServiceRegistry].>
2018-10-11 22:38:02,715 DEBUG [org.apereo.cas.services.AbstractServicesManager] - <Loading services from [org.apereo.cas.services.ChainingServiceRegistry@83df233]>
2018-10-11 22:38:02,717 INFO [org.apereo.cas.services.AbstractServicesManager] - <Loaded [0] service(s) from [InMemoryServiceRegistry].>


이번에는 Tomcat에서 실행할 war파일을 생성합니다.

$ sudo ./gradlew war

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.8/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 5s
1 actionable task: 1 executed

war 파일은 cas/build/libs/cas.war에 성생됩니다.

생성된 war 파일을 tomcat의 webapps 폴더에 ROOT.war로 복사합니다.

그리고 tomcat을 다시 실행해 줍니다.

$ sudo cp cas/build/libs/cas.war $CATALINA_HOME/webapps/ROOT.war
$ sudo service tomcat8 restart

이제 브라우저에서 8080포트의 login 경로로 접속합니다.

http://<서버 IP>:8080/login


기본 계정은 casuser, 비번은 Mellon 입니다.






'Tools > LDAP & CAS' 카테고리의 다른 글

OpenLDAP + phpLDAPAdmin 설치 (on Ubuntu)  (1) 2019.03.26
LDAP Client 설치 (on CentOS)  (2) 2018.10.12
LDAP Server 설치 (on CentOS)  (1) 2018.10.12
Comments