Mattermostでgitlabを利用してLDAP認証を行う。SSL通信にも対応してみる。

# はじめに

世間ではSlackが流行しているらしいですが、弊社のようにクラウドツールの使用許可が下りず、
使えていないという人も多いのではないでしょうか。

今回はSlackクローンを自称するMattermostを構築していきます。

# Mattermostとは

公式：https://www.mattermost.org/

Wikipediaより
> Mattermost（マターモースト）は、オープンソースのセルフホスティング式のチャットサービスである。組織や企業の内部チャットとして設計されており、Slackの代替として売り出されている[3]。<br>
元々はゲーム開発スタジオのSpinPunchの内部チャットとして使用されており、その当時はプロプライエタリであったが、後にオープンソース化された[3]。バージョン1.0は2015年2月10日にリリースされた[4]。<br>
MattermostはMattermost, Inc.によって開発と保守が行われている[5]。同社はオープンソース版にはないサポートサービスと追加機能がある商用版を販売することによって利益を得ている。<br>
iOS・Android・Windows・macOS・Linux向けのクライアントが提供されている。<br>
マスメディアはMattermostを人気の高いSlackの代替であると見做している[6][7][8][9]。GitLabはもう一つの人気のあるチャットツールであるGitter（英語版）を買収したが[10]、Mattermostを"GitLab Mattermost"としてGitLabに統合した[11]。 

要は、
- Slackライクなチャットツール
- 自分でサーバを構築してオンプレミスで利用可能
- gitlabが開発していて、gitlabをインストールすると一緒についてくる
- Jenkins、RedmineなどとWebhookを使用した連携が可能

# 前提

ActiveDirectoryや、ドメインコントローラはすでに構築済みであることを前提にしています。
gitlabはあくまでLDAP認証を使用するためだけに使用するので、ドメインは1つしか割り当てません。
こっちもリポジトリとして使っていきたい場合は、公式の手順通りにドメインを2つ用意した方が良いです。
基本的に作業はrootユーザで行っている前提です。

| 設定項目 | 設定値 |
|---|---|
| OS | CentOS 7.5 |
| 割り当てるドメイン  | sample.local.com  |
| gitlabの起動ポート  |  9999 |
| mattermostの起動ポート  | 8065  |
| ドメインコントローラのドメイン | dc.local.com |

# gitlabの構築

## インストール

rpmからインストールします。`EXTERNAL_URL`には用意したドメインを設定してください。

```
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
EXTERNAL_URL="http://sample.local.com:9999" yum install -y gitlab-ee
```

## ポートの開放

最終的に必要になるポートを開けていきます。
Mattermostはhttpsで接続させるので、2つだけ解放します。

```
firewall-cmd --add-port=443/tcp --zone=public --permanent
firewall-cmd --add-port=9999/tcp --zone=public --permanent
firewall-cmd --reload
```

## 管理者パスワード設定

ブラウザで`http://sample.local.com:9999`にアクセスします。
管理者ユーザのパスワード入力を求められるので入力します。

その後、ログインできれば成功です。

| ユーザ名 | パスワード |
|:-:|:-:|
| root  | 入力したパスワード  |

## LDAP設定

GUIからは設定できないようなので、設定ファイルを修正してLDAPの設定を行います。
最後のEOSもコメントを解除する必要がありますが、忘れやすいです。

``` diff:/etc/gitlab/gitlab.rb
gitlab_rails['ldap_enabled'] = true

###! **remember to close this block with 'EOS' below**
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
main: # 'main' is the GitLab 'provider ID' of this LDAP server
  label: 'LDAP'
  host: 'dc.local.com'
  port: 389
  uid: 'sAMAccountName'
  bind_dn: 'CN=Administrator,CN=Users,DC=local,DC=com'
  password: '{ドメイン管理者のパスワード}'
  encryption: 'start_tls' # "start_tls" or "simple_tls" or "plain"
  verify_certificates: false
  smartcard_auth: false
  active_directory: true
  allow_username_or_email_login: false
  lowercase_usernames: false
  block_auto_created_users: false
  base: 'DC=local,DC=com'
  user_filter: ''
EOS
```

gitlabを再構築します。

```
gitlab-ctl stop
gitlab-ctl reconfigure
gitlab-ctl restart
```

再度ブラウザでアクセスしてみます。
LDAPのタブが表示され、自身のユーザでログインできればOKです。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379994/e06df92e-1913-f8d5-c76f-a6513e60699b.png)

## Mattermostで連携するとき用の設定

ブラウザから管理者ユーザでgitlabにログインします。
以下画面の`Configure GitLab`をクリックします。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379994/4beca7c4-11f3-e977-1988-e201193950f2.png)

`Application`を選択して、`New Application`ボタンをクリックします。
連携用の情報を設定していきます。

| 設定項目 | 値 |
|---|---|
|Name|Mattermost|
|  Callback URL | https://sample.local.com/login/gitlab/complete<br> https://sample.local.com/signup/gitlab/complete |
| Trusted  |  未チェック<br>※連携許可の確認が不要の場合はチェック |
| Scopes  | API  |

設定完了後に表示される`Application ID`と`Secret`は後で使うので、控えておきます。

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379994/f1ff4be9-b7f0-c876-92f5-6fbc47272846.png)

# MySQLの構築

gitlabインストール時にPostgreSQLがインストールされるのですが、
今回はMattermost用にMySQLをインストールします。（付属ぽすぐれに設定する方法がわからなかったのは内緒。。。）

## インストール

rpmを取得してインストールします。

```
cd /usr/local/src
wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
yum localinstall mysql57-community-release-el7-9.noarch.rpm
yum install mysql-community-server
```

DBを起動しつつ、サーバを再起動したときにMySQLが自動起動されるように設定しておきます。

```
systemctl start mysqld
systemctl enable mysqld
```

## Mattermost用のユーザ、DBを作成

以下を作成します。

|  |  |
|---|---|
| ユーザ名  | mmuser  |
| パスワード  |  p@assWord123 |
| DB名  | mattermost_production  |

rootユーザでログインするための一時パスワードを取得。

```
grep 'temporary password' /var/log/mysqld.log
```

表示されたパスワードでログインし、rootユーザのパスワード含め設定。

```
mysql -u root -p

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '{任意のパスワード}';
mysql> create user 'mmuser'@'%' identified by 'p@assWord123';
mysql> create database mattermost_production;
mysql> grant all privileges on mattermost_production.* to 'mmuser'@'%';
```

# Mattermostの構築

## Mattermostを有効化

gitlab付属のMattermostを有効化します。
同時にLet's Encryptの設定を有効化して、証明書を自動的に取得するように設定します。

``` diff:/etc/gitlab/gitlab.rb
gitlab_rails['mattermost_host'] = "https://sample.local.com"
mattermost['enable'] = true
mattermost['service_address'] = "0.0.0.0"
mattermost['service_port'] = "8065"
mattermost['sql_driver_name'] = 'mysql'
mattermost['sql_data_source'] = "mmuser:p@assWord123@tcp(localhost:3306)/mattermost_production?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s"
mattermost['gitlab_id'] = "{GitLabのID}"
mattermost['gitlab_secret'] = "{GitLabのシークレットキー}"
mattermost['gitlab_auth_endpoint'] = "http://sample.local.com:9999/oauth/authorize"
mattermost['gitlab_token_endpoint'] = "http://sample.local.com:9999/oauth/token"
mattermost['gitlab_user_api_endpoint'] = "http://sample.local.com:9999/api/v4/user"


mattermost_nginx['enable'] = true
+mattermost_nginx['redirect_http_to_https'] = true
+mattermost_nginx['ssl_certificate'] = "/etc/gitlab/ssl/sample.local.com.crt"
+mattermost_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/sample.local.com.key"
+mattermost['service_use_ssl'] = true

letsencrypt['enable'] = true
letsencrypt['auto_renew'] = true
```

gitlabを再構築します。
`Validation failed for domain ~`と言ったエラーが出るかもしれませんが、
証明書はちゃんと作成されているようなので置いておきます。

```
gitlab-ctl stop
gitlab-ctl reconfigure
gitlab-ctl restart
```

## Mattermostの設定

ブラウザで`https://sample.local.com`にアクセスします。
`GitLabでログインする`を選択して、認証情報を入力します。
Mattermostへのログインが成功すればOKです。

最初にログインしたユーザが管理者ユーザとなるようなので、
システムコンソールから好きなように設定を変更してください。

# おわりに

以上で、Mattermostの構築は完了です。

これまではChat&Messangerを利用してきましたが、以下の点で優れていると感じてます。

- 返信が別スレッドで表示されるため後からやり取りを確認しやすい
- 後から参加した人も過去のやり取りを閲覧できる
- Markdown記法が使える

Slackを使ったことがないので何ともですが、けっこう気に入ってます。
ぜひ、使ってみてください。