Scooldをインストールしてみる

Q&Aサイトを立ち上げて、そこによくある問い合わせを書き込んでおく。ユーザーは問い合わせる前にまずそこで探し、なければそこで問い合わせて、誰かがそれに答える。夢の世界…





Stack Overflowに触発されて作られたというScooldをオンプレに構築してみようと思う。

ScooldはJARで提供されており、Paraというバックエンドフレームワークの上で動作する。どちらもErudikaという企業が開発している。

 

環境

VMware PlayerでUbuntu18.04を立ち上げ、そこで動かしてみる。
LDAP認証にも対応しているので、Samba AD DCで認証してみよう。

インストール

インストール手順はこちらに書かれている。
Github / Scoold – Stack Overflow in a JAR

ここではただ起動するだけでなく、サービスとして登録して使えるようにする。

Java

ParaとScooldはJava1.8以上で動作するとのこと。

$ sudo apt install openjdk-8-jre
$ java -version
$ java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

 

Para

ダウンロード

ParaはJARファイルで提供されている。これをサーバー上に配置してサービスとして起動できるようにする。

ファイルのダウンロード先はこちら。この日はv1.37.0だった。

$ sudo mkdir /opt/para
$ cd /opt/para
$ sudo wget https://oss.sonatype.org/service/local/repositories/releases/content/com/erudika/para-jar/1.37.0/para-jar-1.37.0.jar

 

設定ファイルの作成

設定ファイルはQuick Startのものを丸写し。

/opt/para/application.conf
# the name of the root app
para.app_name = "Para"
# or set it to 'production'
para.env = "embedded"
# if true, users can be created without verifying their emails
para.security.allow_unverified_emails = false
# if hosting multiple apps on Para, set this to false
para.clients_can_access_root_app = true
# if false caching is disabled
para.cache_enabled = true
# root app secret, used for token generation, should be a random string
para.app_secret_key = "b8db69a24a43f2ce134909f164a45263"
# enable API request signature verification
para.security.api_security = true
# the node number from 1 to 1024, used for distributed ID generation
para.worker_id = 1

 

起動スクリプトの作成

起動スクリプトを作成する。

/opt/para/run
#!/bin/bash
java -jar -Dconfig.file=./application.conf para-jar-1.37.0.jar

実行権限を付ける。

$ sudo chmod +x /opt/para/run

 

サービスとして登録する

スクリプトをサービスとして登録する。過去記事と以下を参考にした。
DZone / Run Your Java App as a Service on Ubuntu

サービス実行用のユーザーを作成し、ディレクトリごとこのユーザーの持ち物にする。

$ sudo useradd --system --user-group scoold
$ sudo chown scoold:scoold -R /opt/para/

/etc/systemd/system/para.service
[Unit]
Description=Para general-purpose backend framework
After=syslog.target network.target

[Service]
User=scoold
WorkingDirectory=/opt/para
ExecStart=/opt/para/run
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

サービスを登録し、起動してみる。

$ sudo systemctl daemon-reload
$ sudo systemctl enable para
$ sudo systemctl start para
$ journalctl -u para

ログはジャーナルに出力されている。どうやら起動したようだ。

Jun 06 04:43:56 temp systemd[1]: Started Para general-purpose backend framework.
Jun 06 04:43:58 temp run[19628]:       ____  ___ _ ____ ___ _
Jun 06 04:43:58 temp run[19628]:      / __ \/ __` / ___/ __` /
Jun 06 04:43:58 temp run[19628]:     / /_/ / /_/ / /  / /_/ /
Jun 06 04:43:58 temp run[19628]:    / .___/\__,_/_/   \__,_/  v1.37.0
Jun 06 04:43:58 temp run[19628]:   /_/
Jun 06 04:43:58 temp run[19628]: 2020-06-06 04:43:58 [INFO ] --- Para.initialize() [embedded] ---
Jun 06 04:43:58 temp run[19628]: 2020-06-06 04:43:58 [INFO ] Loaded new DAO, Search and Cache implementations - H2DAO, LuceneSearch and CaffeineCache.
Jun 06 04:43:58 temp run[19628]: 2020-06-06 04:43:58 [INFO ] Created H2 table 'para'.
Jun 06 04:43:58 temp run[19628]: 2020-06-06 04:43:58 [WARN ] Server is unhealthy - root app not found. Open http://localhost:8080/v1/_setup in the browser to initialize Para.
Jun 06 04:43:58 temp run[19628]: 2020-06-06 04:43:58 [INFO ] Instance #1 initialized.
Jun 06 04:43:59 temp run[19628]: 2020-06-06 04:43:59 [INFO ] Starting ParaServer on temp with PID 19629 (/opt/para/para-jar-1.37.0.jar started by scoold in /opt/para)
Jun 06 04:43:59 temp run[19628]: 2020-06-06 04:43:59 [INFO ] The following profiles are active: embedded
Jun 06 04:44:00 temp run[19628]: 2020-06-06 04:44:00 [INFO ] Listening on port 8080...
Jun 06 04:44:02 temp run[19628]: 2020-06-06 04:44:02 [INFO ] Started ParaServer in 3.783 seconds (JVM running for 6.643)

ここでセットアップURLを呼び出す。

$ curl http://localhost:8080/v1/_setup
{
  "accessKey" : "app:para",
  "message" : "Save these keys - they are shown only once!",
  "secretKey" : "wq1RQZoIkzAhgcykkvILmv5lNobnzBIsE06c875VfR6sQbAcWq6DTQ=="
}

※この鍵は1度しか表示されないから保管してね、と書かれている。

para-cli

Paraへのアクセスを簡単にするツール。npmを使ってインストールする。

npmのインストール

npm(Node Package Manager)は、Node.jsのパッケージを管理するツール。
TECH ACADEMY magazine / 便利なパッケージ管理ツール!npmとは【初心者向け】

Node.jsというのはサーバー側でJavaScriptを実行する環境。
TECH ACADEMY magazine / リアルタイム通信で活用!注目の技術「Node.js」とは【初心者向け】

Paraへのアクセスを簡単にするというpara-cliはnpmを使ってインストールするので、まずはnpmからインストールしていく。

$ sudo apt install npm

※かなり巨大なパッケージ群が一気にインストールされる。

para-cliのインストール

npmを使ってpara-cliをインストールする。

$ sudo npm install -g para-cli

※決して少なくないパッケージ群がインストールされる。

セットアップする。キーはParaの初回セットアップで表示されたものを使う。
サーバー端末にインストールしているので、Endpointはlocalhostとした。

$ para-cli setup
Secret key not provided. Make sure you call 'signIn()' first.
Para Access Key: app:para
Para Secret Key: wq1RQZoIkzAhgcykkvILmv5lNobnzBIsE06c875VfR6sQbAcWq6DTQ==
Para Endpoint: http://localhost:8080
? New JWT generated and saved in /home/rohhie/.config/para-cli-nodejs/config.json
? Connected to Para server v1.37.0 on http://localhost:8080. Authenticated as: app Para (app:para)

※ここで入力した設定値は、~/.config/para-cli-nodejs/config.jsonに保管されている。

Scoold

ダウンロード

ScooldもJARファイルで提供されている。これをサーバー上に配置してサービスとして起動できるようにする。

ファイルのダウンロード先はこちら。この日はv1.39.3だった。

$ sudo mkdir /opt/scoold
$ cd /opt/scoold
$ sudo wget https://github.com/Erudika/scoold/releases/download/1.39.3/scoold-1.39.3.jar

 

Paraへのアプリケーション登録

まだScooldはインストールできていないんだけど、起動してParaに接続するためにキーが必要で、そのキーを取得するために先にアプリケーションを登録する。

$ para-cli new-app "scoold" --name "Scoold"
? App created:
{
  "accessKey": "app:scoold",
  "message": "Save these keys - they are shown only once!",
  "secretKey": "+sWQDxiKv1RkFWUwfhRupN0FLot678cgE6VIna5OyG0JggbXeg+Owg=="
}

※これも1回しか表示されないことになっている。でも、必要なら登録し直せば良いのだろうと思う。

設定ファイルの作成

設定ファイルはQuick Startのものをベースにちょっとだけ改変。

/opt/scoold/application.conf
### Minimal configuration ###
# the name of the application
para.app_name = "Scoold"
# the port for Scoold
para.port = 8000
# change this to "production" later
para.env = "development"
# the public-facing URL where Scoold is hosted
para.host_url = "http://localhost:8000"
# the URL of Para - can also be "https://paraio.com"
para.endpoint = "http://localhost:8080"
# access key for your Para app
para.access_key = "app:scoold"
# secret key for your Para app
para.secret_key = "+sWQDxiKv1RkFWUwfhRupN0FLot678cgE6VIna5OyG0JggbXeg+Owg=="
# the email or identifier of the admin user - check Para user object
para.admins = "webmaster@hogeserver.hogeddns.jp"
##############################

####### Authentication #######
# enable or disable email and password authentication
#para.password_auth_enabled = true
para.password_auth_enabled = false
# Session cookie name
para.auth_cookie = "scoold-auth"
# Facebook - create your own Facebook app first!
#para.fb_app_id = "123456789"
# Google - create your own Google app first!
#para.google_client_id = "123-abcd.apps.googleusercontent.com"
###############################

### Misc. ###
# if false, commenting is allowed after 100+ reputation
para.new_users_can_comment = true
# if true, posts by new users require approval from moderator
para.posts_need_approval = false
# reputation needed for posts to be auto-approved
para.posts_rep_threshold = 100
# needed for geolocation filtering of posts
#para.gmaps_api_key = ""
# Enable/disable near me feature (geolocation)
#para.nearme_feature_enabled = false
# GA code
#para.google_analytics_id = "UA-123456-7"
# enables syntax highlighting in posts
para.code_highlighting_enabled = true
# If true, the default space will be accessible by everyone
para.is_default_space_public = true
# If true, users can change their profile pictures
para.avatar_edits_enabled = true
# If true, users can change their names
para.name_edits_enabled = true
# Enable/disable webhooks support
para.webhooks_enabled = true
# Enable/disable wiki style answers
para.wiki_answers_enabled = true
# Comment limits
para.max_comments_per_id = 1000
para.max_comment_length = 255
# Post body limit (characters)
para.max_post_length = 20000
# Tags per post limit, must be < 100
para.max_tags_per_post = 5
# Sets the default tag for new questions
para.default_question_tag = "question"
# Enable/disable numeric pagination (< 1 2 3...N >)
para.numeric_pagination_enabled = false
# Selects the default language to load on startup, defaults to 'en'
para.default_language_code = "ja"

 

起動スクリプトの作成

起動スクリプトを作成する。

/opt/scoold/run
#!/bin/bash
java -jar -Dconfig.file=./application.conf scoold-1.39.3.jar

実行権限を付ける。

$ sudo chmod +x /opt/scoold/run

 

サービスとして登録する

Scooldもサービスとして登録する。

ディレクトリごとscooldユーザーの持ち物にする。

$ sudo chown scoold:scoold -R /opt/scoold/

/etc/systemd/system/scoold.service
[Unit]
Description=Scoold - Stack Overflow in a JAR
After=para.target

[Service]
User=scoold
WorkingDirectory=/opt/scoold
ExecStart=/opt/scoold/run
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

サービスを登録し、起動してみる。

$ sudo systemctl daemon-reload
$ sudo systemctl enable scoold
$ sudo systemctl start scoold
$ journalctl -u scoold

これもどうにか起動した。

Jun 06 05:50:33 temp systemd[1]: Started Scoold - Stack Overflow in a JAR.
Jun 06 05:50:35 temp run[20188]:                           __    __
Jun 06 05:50:35 temp run[20188]:    ______________  ____  / /___/ /
Jun 06 05:50:35 temp run[20188]:   / ___/ ___/ __ \/ __ \/ / __  /
Jun 06 05:50:35 temp run[20188]:  (__  ) /__/ /_/ / /_/ / / /_/ /
Jun 06 05:50:35 temp run[20188]: /____/\___/\____/\____/_/\__,_/     (v1.39.3)
Jun 06 05:50:35 temp run[20188]: 2020-06-06 05:50:35 [INFO ] Starting ScooldServer v1.39.3 on temp with PID 20189 (/opt/scoold/scoold-1.39.3.jar started by scoold in /opt/scoold)
Jun 06 05:50:35 temp run[20188]: 2020-06-06 05:50:35 [INFO ] The following profiles are active: development
Jun 06 05:50:39 temp run[20188]: 2020-06-06 05:50:39 [INFO ] Listening on port 8000...
Jun 06 05:50:39 temp run[20188]: 2020-06-06 05:50:39 [INFO ] Initialized ParaClient with endpoint http://localhost:8080 and access key 'app:scoold'.
Jun 06 05:50:41 temp run[20188]: 2020-06-06 05:50:41 [INFO ] SpringResourceLoader for Velocity: using resource loader [org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@32d992b2, started on Sat Jun 06 05:50:36 JST 2020] and resource loader paths [classpath:templates/]
Jun 06 05:50:42 temp run[20188]: 2020-06-06 05:50:42 [INFO ] Started ScooldServer in 6.982 seconds (JVM running for 8.723)

 

Apach

サービスは8000ポートで起動しているから、Aacheで443ポートにProxyする。

$ sudo apt install apache2
$ sudo a2dissite 000-default.conf
$ sudo a2enmod proxy proxy_http proxy_https ssl

設定ファイルを作る。
/etc/apache2/sites-available/scoold.conf
<VirtualHost *:80>
        ServerName temp.hogeserver.hogeddns.jp
        ServerAdmin webmaster@hogeserver.hogeddns.jp
        Redirect permanent / https://temp.hogeserver.hogeddns.jp/
</VirtualHost>

<VirtualHost *:443>
        ServerName temp.hogeserver.hogeddns.jp
        ServerAdmin webmaster@hogeserver.hogeddns.jp

        ErrorLog  ${APACHE_LOG_DIR}/scoold-error.log
        CustomLog ${APACHE_LOG_DIR}/scoold-access.log combined

        SSLProxyEngine on
        ProxyPreserveHost on
        ProxyPass        / http://localhost:8000/
        ProxyPassReverse / http://localhost:8000/

        SSLEngine on
        SSLCertificateFile    /etc/ssl/private/temp.hogeserver.hogeddns.jp.crt
        SSLCertificateKeyFile /etc/ssl/private/temp.hogeserver.hogeddns.jp.key
</VirtualHost>

作ったサイトを有効化して、Apacheを再起動して追加したモジュールも有効化させる。

$ sudo a2ensite scoold.conf
$ sudo systemctl restart apache2

これでアクセスできるようになったはず。

LDAP認証

会社で使うことを考えたので、最低でもLDAP認証が必要だった。

ウチではオレオレ認証局を運用しており、LDAPSはオレオレ認証局が署名した公開鍵を利用している。オレオレ認証局のCA証明書をOSに取り込んでおく必要がある。

Samba AD DC向けの設定

試行錯誤の結果、以下となった。

/opt/scoold/application.conf
…(設定は、必要になったら読み込まれる。どこにあっても問題はない)
para.security.ldap.server_url = "ldaps://addc.hogeserver.hogeddns.jp"
para.security.ldap.active_directory_domain = "hogeserver.hogeddns.jp"
para.security.ldap.base_dn = "cn=Users,dc=hogeserver,dc=jpgeddns,dc=jp"
para.security.ldap.user_search_filter = "(&(objectClass=user)(sAMAccountName={1}))"

※ソースコードを見た感じ、これ以外のパラメーターは指定しても使われないので無駄。OpenLDAP等を使うときにはまた違う最適解があると思う。

server_url
URLとしてldapを指定した場合、サーバーがstrong authを求めると対応ができない。一度ちゃんと頑張れば、安定して動くように思うので、ldaps(LDAP over SSL/TLS)を指定するのがおすすめ。

active_directory_domain
設定しないと強制的に uid=username,cn=Users,dc=hogeserver,dc=hogeddns,dc=jp みたいなユーザーでバインド認証しようとする。指定すれば username@hogeserver.hogeddns.jp形式でバインドしようとするので、選択肢はこれしかない。

base_dn
検索の基本位置を表している。ログイン時に1度だけ使われる。その後にあるmods_group_nodeとadmins_group_nodeは、ユーザーのdn(識別名、cn=hogehoge,cn=Users,dc=hogeserver,dc=hogeddns,dc=jpのこと)で判定される。

user_search_filter
認証された直後にユーザー情報取得のために使われる(といっても、取り出したデータの中で使われるのはユーザーのdnのみだけど)。そのため、この条件式でユーザーが一意に定まらなければならない。

なお、認証時のエラーは、Scooldではなく、Paraに出力されるので注意。

ユーザーに役割を持たせる

ユーザーを示すDN(識別名、cn=hoge,dc=hogeserver,dc=hogeddns,dc=jpのような情報)の中に特定の文字を持っていれば役割を持たせることができる。

…(設定は、必要になったら読み込まれる。どこにあっても問題はない)
#para.security.ldap.mods_group_node = "dc=hogeserver"
#para.security.ldap.admins_group_node = "dc=hogeserver"

mods_group_nodeとadmins_group_node
ユーザーのdcに含まれていればモデレーター、または、管理者のフラグが立つ。ユーザーのdnとの比較なので、ユーザーが常にcn=Usersに作られるSamba ad dcでは使い物にならない。管理者作業をするときだけ、一時的に行を有効にして使うくらいかなって思う。

ログイン直後にユーザーの情報を問い合わせるロジックになっていて、Samba AD DCはユーザーの全ての情報を返している。ソースコードに手を入れれば特定のグループに所属している人を管理者にしたり、モデレーターにしたりできるだろう。やってやれないことはないはずだ…。

どうやら、役割を持たせるところのソースコードはこれ。
Github / Erudica / para / LdapAuthFilter.java

でもこれには手を掛けなかった。ちょっとウチの運用ではこのシステムは使えないだろうと判断したため。

データーの扱い

運用をはじめたら、データーのバックアップは取っておきたいだろう。それに、設定の初期で色々試した後にリセットするにはどうしたらいいの?とか色々考えると、データーがどこにあるのかを知っておく必要があるな、と。
Github / Erudika / scoold / README.md – Migrating from one Para deployment to another

結論としては、以下の赤文字がデーターの模様。

/opt/
├ para/ ← 今回インストールした場所。必要時は読み替え。
│ ├ para-jar-1.37.0.jar
│ ├ application.conf ※設定ファイル
│ ├ run              ※実行スクリプト
│ └ data/
│   ├ para.mv.db
│   ├ para.trace.db
│   ├ para-lucene/
│   └ scoold-lucene/
│     └ _0.cfe, _0.cfs, … segments_9, write.lock
└ scoold/

インデックスはpara-cliコマンドで簡単にできると書いてあった。

$ para-cli rebuild-index --endpoint "http://localhost:8080" --accessKey "app:para" --secretKey "secret1"
$ para-cli rebuild-index --endpoint "http://localhost:8080" --accessKey "app:scoold" --secretKey "secret2"

 

バックアップ

/opt/para と /opt/scoold をまるごと、また、ユーザーのホームディレクトリ配下にある ~/.config/para-cli-nodejs をバックアップすれば、恐らくは問題ないと思われる。

インストールは面倒だけど難しいことはしていないので、そのまま展開して不足分だけをちょっと作業してあげれば、恐らく環境を復元できるだろう。

リフレッシュ

サービスを停止した後、赤で示したディレクトリをまるごと消せばリフレッシュできた。

サービスを起動したら、curl http://localhost:8080/v1/_setup で新しいキーを取得する必要がある。

ParaにScooldを新規アプリケーションとして登録すべきように見えたが、しなくてもScooldはちゃんと起動して、LDAP認証もできた。

起きたこと

ParaのLDAP認証について

認証に失敗したか、またはキャンセルされました。

これに悩まされた。丸二日、なんでLDAP認証ができないのか、と試行錯誤。

どうやらParaはSpring Secrity のライブラリに渡すパラメーターをすべて外出しにしてくれているらしいことがソースを見て分かった。

ウチはSamba AD DCなので、最初はLDAPAuthentication.javaのソースを見てみたが、結局それでは認証がうまくいかず、ActiveDirectoryの方も見て、読み取った条件を設定したところ認証ができるようになった。

BindAuthenticatorを呼び出すとして、application.confに追加する項目は…

ContextSourcepara.security.ldap.server_url
para.security.ldap.base_dn の組み合わせ
userSearchBase
userSearchFilter
security.ldap.user_search_base
security.ldap.user_search_filter
userDnPatternsecurity.ldap.user_dn_pattern
多分、userSearchBase+userSearchFilter と userDnPattern は同時に設定しても意味がなさそう。

どうも、Paraは過去にLDAP認証で不具合を抱えていたらしく、こんなやりとりが。
Github / Erudika / scoold / para LDAP config is not picked up correctly

だけど、逆に言えば、今はこの不具合は収束しているはずだ。

LDAP認証

ウチのサーバーは過去に紆余曲折して、LDAPとはいえStrong authentication requiredになっている。
Paraはこれに対応していない。

何度やっても認証が上手くいかない、Samba AD DCのログレベルを上げてもログを出してくれない。ほとほと困り果てて、Wiresharkで見てみたらその点でハンドシェークできていないことが分かった。

他のシステムはすべてLDAPSで設定ができているので影響はないだろう、ということでセキュリティレベルを下げたところ、認証エラーが発生している。
エラーログは出ないので、パケットキャプチャーして取り出した結果がこれ。

■bindRequest
"uid=hogehoge,dc=hogeserver,dc=hogeddns,dc=jp" simple:生のパスワード
■bindResponse
invalidCredentials (49)
80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1

※本当に生のパスワードが流れ、簡単に見られるんだなー。

なんだかよく分からないけれど、uid=hogehoge が問い合わせの先頭に付いている。こんなの設定したつもりもないんだけどなぁ。

ここで、application.confに以下の行を設定してみたところ、認証が成功した。

para.security.ldap.active_directory_domain = "hogeserver.hogeddns.jp"

この時には、以下のパケットが飛んでいた。

■bindRequest
"rohhie@hogeserver.hogeddns.jp" simple:生のパスワード
■bindResponse
success
■searchRequest
baseObject "cn=Users,dc=hogeserver,dc=hogeddns,dc=jp" ← para.security.ldap.base_dnの設定値
Filter "Filter: (&(objectClass=user)(sAMAccountName=rohhie))" ← para.security.ldap.user_search_filterの設定値

※para.security.ldap.user_search_baseに設定した値は効果が出ない…。

LDAPS認証

これも全然上手くいかない。設定値をいくら変えても常にエラーというのは疲れる。

Wiresharkで見ようにも中身が暗号化されている。そこで、鍵を入れて中身を見られるようにしてみようと思った。

編集→設定でダイアログを開き、RSA Keysにサーバー側の鍵を取り込む。
パケットの中の読みたい部分を選択し、分析→…としてデコードとして、復元してみた。

中身の完全な理解はできないけれど、どうやらサーバーから公開鍵を渡したっぽいところまでは見えて、その後はたいしたやりとりなく終わっている。オレオレ認証局が署名した公開鍵を、Para側が信用できずに通信を取りやめているような…。

CA証明書を登録

そこで、/usr/local/share/ca-certificatesにオレオレ認証局の自己署名証明書をコピーしてきて、以下を実行。
$ sudo update-ca-certificates

最初は効果がないように思われたが、結局これが解決策だったと思われる。

LDAPSの認証強化

サーバー側で準備している認証が弱い?と思って確認してみたところ、過去にsmb.confに以下を追加していた。当時、これをしないと認証が上手くいかなかったんだろうな…。

…
    # LDAPSを有効化
    tls enabled  = true
    tls keyfile  = /etc/ssl/private/hogesamba.key
    tls certfile = /etc/ssl/private/hogesamba.crt
    tls cafile   = /usr/share/ca-certificates/hogeCA.crt
    tls verify peer = ca_and_name
#   tls crlfile  =
…

※tls verify peerで接続してくる人にca_and_name程度のチェックを求めている。しかし、as_strict_as_possible(できるだけ厳しく)にはしていない、CRL(Certificate Revocation List/証明書失効リスト)が準備できなかったから。

これが原因かどうかは分からないけれど、実際、テストの過程で失効させた証明書もあったりするから、CRLを配備してチェックを強化してみることにした。

/etc/samba/smb.conf ※サーバー側
…
    tls crlfile  = /etc/ssl/private/hogeCA.crl
    tls verify peer = as_strict_as_possible
…

※CRLなんて/etc/ssl/privateに置くようなものじゃないとは思うけれど、現時点でちょうどいい場所を用意できていないから、ここでいいや、と。

でも、効果がなかった。

Javaのキーストアに証明書を…

そうだ、Javaって独自にキーストアを持ってるんじゃなかったっけ?

$ dpkg -l | grep java
ii ca-certificates-java 20180516ubuntu1~18.04.1 all Common CA certificates (JKS keystore)
…
$ dpkg -L ca-certificates-java
/.
/etc
/etc/ca-certificates
/etc/ca-certificates/update.d
/etc/ca-certificates/update.d/jks-keystore
/etc/default
/etc/default/cacerts
/etc/ssl
/etc/ssl/certs
/etc/ssl/certs/java
/usr
/usr/share
/usr/share/ca-certificates-java
/usr/share/ca-certificates-java/ca-certificates-java.jar
/usr/share/doc
/usr/share/doc/ca-certificates-java
/usr/share/doc/ca-certificates-java/NEWS.Debian.gz
/usr/share/doc/ca-certificates-java/README.Debian
/usr/share/doc/ca-certificates-java/changelog.gz
/usr/share/doc/ca-certificates-java/copyright

/etc/default/cacerts に cacerts_updates=yes という定義があり、
/etc/ssl/certs/java/cacerts というバイナリファイルが作られている。これはキーストアらしい。
このあたりが、Javaで使うCA証明書関連の仕組みかな?

README.Debianを見てみる。

ca-certificates-java for Debian
-------------------------------

This package uses the hooks of the ca-certificates package to update the JKS
keystore /etc/ssl/certs/java/cacerts used for many java runtimes. The alias used
to store the certificate is the basename prefixed with 'debian:'. It will import
all *.pem files found in /etc/ssl/certs during its first installation.
このパッケージは、ca-certificatesパッケージのフックを使用して、多くのJavaランタイムで使用されるJKSキーストア/etc/ssl/certs/java/cacertsを更新します。
証明書の保存に使用されるエイリアスは、'debian:'で始まるベース名です。 最初のインストール時に/etc/ssl/certsにあるすべての*.pemファイルをインポートします。

ca-certificates-java doesn't automagically handle local certificates,
although these are not overwritten on updates.
ca-certificates-javaはローカル証明書を自動的に処理しませんが、更新時に上書きされません。

A full re-import can be triggered with the command 'update-ca-certificates -f' if needed.
必要に応じて、コマンド 'update-ca-certificates -f'を使用して完全な再インポートをトリガーできます。

 -- Torsten Werner twerner@debian.org Mon, 25 Apr 2011 15:18:22 +0200

これで行くと、このファイルは取り込まれているはず…。念のため、update-ca-certificates -f を実行してみる。
すると、確かに/etc/ssl/certs/java/cacertsが更新された。

メール送信失敗

初めてログインすると、ユーザーにメールが飛ぶらしい。ログにこんなのが出ていた。

2020-06-07 11:41:12 [INFO ] Created new user 'rohhie' with id=1180332029695234048:profile, groups=users, spaces=[].
2020-06-07 11:41:12 [ERROR] Failed to send email to [[rohhie@hogeserver.hogeddns.jp]] with body [<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

…

あなたは Scoold の一員になりました。 Scoold はあなたの質問に答えるフレンドリーな Q&A コミュニティです。
開始するには、「質問」ページに移動して、質問をしてみましょう。また、あなたは質問に答えることで人々を助けることができ、評価を得るでしょう。

…

メールを送信するための設定がどこかでできるはずだけど、それを見つけるのは諦めた。手順をかき集めるのは大変だし、管理者でログインしたところ機能が足りなくてウチでは運用できないだろうと判断したため。

LDAP認証に関してのエラーログ

いやはや、全くログが出なくて困っていたのだが、問題解決した後でPara側でログが出ていることが分かった。そうか、Paraの機能を使っているところはParaでログが出るのか、なるほど。

さいごに

良さそうなので期待してはじめたのだけれど、結果としてはウチの運用ではつかえないかな、という印象だった。また、別のシステムを試してみよう。

お気軽にどうぞ ~ 投稿に関するご意見・感想・他

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です