CentOS7+CAS5.3の構築メモ


はじめに

CAS(オープンソースのSingle Sign-Onサーバ)について個人的に調べたメモ。

個人用なので参考程度に...

環境について

以下を用いた。OSとJavaとCAS以外はあまりバージョンにこだわっていないです。

  • CentOS 7.6
  • Java 1.8 (CentOS7の標準)
  • CAS 5.3系
  • MySQLのテーブルを使って認証
  • Tomcat 9
  • nginx 1.15.12

CASのバージョン・プロトコル等

CASバージョン 対応するJavaのバージョン CAS Protocol
CAS 3.x Java 1.6 2.0
CAS 5.3.x Java 1.8 3.0.2
CAS 6.x Java 11 3.0.2

CentOS6系がメインだった頃はどこもかしこもCAS3.xだったと思うがCentOS7系がメインとなった今はCAS5.3系が良い気がする。
(保守の観点からyumリポジトリ標準のJavaを使用したい。ソースコンパイルしだすと色々面倒...)

インストールについて

CAS3.xの頃はcas-server-webappをダウンロードしてきて手動でmvn packageをしてcas.warを作成しTomcatでデプロイ、という運用だったが、現在はWar Overlayを使ってビルドする。

必要なものを勝手にダウンロードして頑張ってくれる、らしい。
参考: WAR Overlay Installation

使ってみる

以下のリポジトリを使ってゴニョゴニョする。
リポジトリ:cas-overlay-template,GitHub

$ mkdir ~/tmp
$ cd ~/tmp

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

ブランチ一覧を確認する。今回は5.3を使う

$ git branch -r
  origin/4.1
  origin/4.2
  origin/5.0.x
  origin/5.1
  origin/5.2
  origin/5.3
  origin/6.0
  origin/HEAD -> origin/master
  origin/master

$ git checkout origin/5.3

warを作成するためには中に入っているbuild.shを使う

// というか、先にhelpしてコマンドリストを確認しておこう
$ ./build.sh help
...

// ビルドする
$ ./build.sh package

[INFO] Scanning for projects...
[INFO] 
[INFO] Using the MultiThreadedBuilder implementation with a thread count of 5
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building cas-overlay 1.0
[INFO] ------------------------------------------------------------------------
...
[INFO] Building war: /home/user/tmp/cas-overlay-template/target/cas.war
[INFO] 
[INFO] --- spring-boot-maven-plugin:1.5.18.RELEASE:repackage (default) @ cas-overlay ---
[INFO] Layout: WAR
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.699 s (Wall Clock)
[INFO] Finished at: 2019-05-15T12:12:07+09:00
[INFO] Final Memory: 36M/347M
[INFO] ------------------------------------------------------------------------
$
$ ls ./target
cas  cas.war  classes  maven-archiver  war

BUILD SUCCESSと書かれていれば./target/cas.warが生成されている。それをTomcatとかでホストして使いましょう。終わり。(違)

@@後のカスタマイズでtarget以下を参考にしたりするので、一度ビルドするといいよ。

カスタマイズする

ざっくりいうと以下のファイルを弄る。
- pom.xml
- src/main/resources/*

前者はモジュールの管理を行う。後者はテンプレートや各種設定値のカスタマイズをするのだが、、そもそもフォルダがないので自分で作成する。(ここではまった)

$ mkdir -p src/main/resources

あとはMavenかGradle好きな方を使ってゴニョゴニョするらしいよ。(よくわかってない)
今回はMavenで設定。

認証方法をMySQLにしてみる

標準ではMellonという認証らしい。(なるほどわからん)
LDAPや各種DBの認証に対応しているが、今回はMySQLのオレオレ認証テーブルを使う。

各種モジュールの追加

  • 設定ファイル: pom.xml

DB接続モジュールと、JsonServiceRegistryを追加する。
※JsonServiceRegistryってなんだ?ってなるが認証元ドメインを管理するために必要、、多分。

バックアップを取ってから以下のように変更。
(本当はリポジトリをForkして管理しよう..。)

$ cp -p pom.xml pom.xml.org
$ vi pom.xml
    125                 <!--
    126                 ...Additional dependencies may be placed here...
    127                 -->
+    128                 <dependency>
+    129                         <groupId>org.apereo.cas</groupId>
+    130                         <artifactId>cas-server-support-jdbc</artifactId>
+    131                         <version>${cas.version}</version>
+    132                 </dependency>
+    133                 <dependency>
+    134                         <groupId>org.apereo.cas</groupId>
+    135                         <artifactId>cas-server-support-jdbc-drivers</artifactId>
+    136                         <version>${cas.version}</version>
+    137                 </dependency>
...
+    145                  <!-- It means, enable to /etc/cas/config/services/*json -->
+    146                 <dependency>
+    147                         <groupId>org.apereo.cas</groupId>
+    148                         <artifactId>cas-server-support-json-service-registry</artifactId>
+    149                         <version>${cas.version}</version>
+    150                 </dependency>

MySQLを使った認証にする

  • 設定ファイル: application.properties

今回は以下のように設定したい。適宜読み替えてください。

項目 設定値
DBインスタンス casdb
DBユーザ名 dbuser
DBパスワード dbpassword
テーブル users
IDカラム loginid
パスワードカラム passwd
パスワードのエンコード MD5(SHA-1とかある)
Encoding UTF-8

先程素の状態で一度build.shを叩いているので、targetフォルダが生成されいているはず。そこから編集したいファイルをコピーします。※本当はapplication.propertiesファイルをいじらずに*.ymlをいじれと書かれているのだが方法がわかっていない。ヘルプ。

まずはコピー。

$ cp target/cas/WEB-INF/classes/application.properties src/main/resources/.

Mellon認証の設定を削除

いじる。以下の行以外いらないので、がさっと削除。

$ vi src/main/resources/application.properties
// Mellon使わないのでコメントアウトする
+ #cas.authn.accept.users=casuser::Mellon

DB設定を追記

cas.authn.jdbc.query[0].sql=SELECT * FROM users WHERE loginid=?
cas.authn.jdbc.query[0].url=jdbc:mysql://database.example.com:3306/casdb
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
cas.authn.jdbc.query[0].user=dbuser
cas.authn.jdbc.query[0].password=dbpassword
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
cas.authn.jdbc.query[0].fieldPassword=passwd
cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT
cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8

サービスURLの設定箇所を追記

あとから設定するのでとりあえず書いておく。

cas.serviceRegistry.watcherEnabled=true
cas.serviceRegistry.initFromJson=false
cas.serviceRegistry.json.location=file:/etc/cas/services

サービスURLの登録

  • 設定箇所: /etc/cas/services/*json(新規作成)

※Tomcatサーバから読めるようなパーミッションにすること

$ sudo mkdir -p /etc/cas/services
$ sudo vi /etc/cas/services/myservice-1001.json

// 中身はこんな感じ、任意のものに変更する
{
  "@class" :            "org.apereo.cas.services.RegexRegisteredService",
  "serviceId" :         "https?://www.example.com.*",
  "name" :              "HTTPS/IMAPS wildcard",
  "id" :                     1001,
  "evaluationOrder" :   99999,
//  "theme" :             "mytheme" // テーマを作るときのみ記載する
}

serviceIdは正規表現が使える。緩めに設定しないと後で(casclient側からのアクセス時に厳密に一致している必要がある)困ったりする。

デザイン(テーマ)変更

  • 設定箇所: src/main/resources/*

targetフォルダから必要なファイルを持ってきてゴニョゴニョする。
テーマを作成することが可能。
参考:Dynamic Themes

CSS, JSのカスタマイズ

自分の場合はテーマを作らずにダイレクトに変更した。

以下のファイルを新規作成する、中身は適当に読み替える。

  • src/main/resources/cas-theme-default.properties
cas.standard.css.file=/css/mycas.css
cas.admin.css.file=/css/admin.css
cas.javascript.file=/js/cas.js

設定したファイルは以下へ配置

src/main/resources/static/
.
├── css
│   ├── admin.css
│   └── mycas.css
├── images
│   └── custom_logo.png
└── js
    └── cas.js

テンプレートのカスタマイズ

  • 設定箇所: src/main/resources/templates/*

templatesフォルダを始めに作成し、変更したいファイルをコピーしてくる。
自分が変更したのは以下のファイル...(雑に説明)

src/main/resources/templates/
.
├── casLoginView.html
├── casLogoutView.html
├── fragments
│   ├── footer.html  // JSのインクルードはこのへん
│   ├── header.html  // ヘッダ画像とか
│   ├── loginform.html
│   └── loginsidebar.html
├── layout.html    // CSSのincludeはこのへん

CAS protocolの変更

TODO:

再ビルド

これまでの更新をwarに再度まとめる。

./build.sh package

cas.warをTomcatに投げてデプロイする。

nginx

TODO:
こんなかんじにホストする。(投げやり)

upstream tomcat-sso {
    server 127.0.0.1:18080;    // 自分のTomcatのListenAddressを使うこと
}

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ...

    location /cas {
        proxy_http_version 1.1;
        proxy_pass http://tomcat-sso/cas;
        proxy_redirect http://tomcat-sso/cas /;
        proxy_cookie_path /cas /;
    }
}

おつかれさまでした。