CentOS7+CAS5.3の構築メモ

# はじめに
[CAS(オープンソースのSingle Sign-Onサーバ)](https://www.apereo.org/projects/cas)について個人的に調べたメモ。

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

## 環境について

以下を用いた。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](https://apereo.github.io/cas/5.3.x/installation/Maven-Overlay-Installation.html)

## 使ってみる

以下のリポジトリを使ってゴニョゴニョする。
リポジトリ:[cas-overlay-template,GitHub](https://github.com/apereo/cas-overlay-template)

```
$ 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](https://apereo.github.io/cas/5.3.x/installation/User-Interface-Customization-Themes.html)


### 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 /;
    }
}
```


おつかれさまでした。