続・パスワード管理ツール「Passbolt」を導入してみた

# いざ！passbolt！！の前のnginxの.confファイルの設定
nginxのバーチャルホストの設定をするだけでしょ？と思ったらつまづいた…ので一から丁寧に設定してみた。

## 導入環境
EC2
CentOS7
PHP7
MariaDB
Nginx

## 参考
[passbotl How to install passbolt on your own server](https://www.passbolt.com/help/tech/install)
[URLリライティング](https://book.cakephp.org/2.0/ja/installation/url-rewriting.html)

## 手順
1. nginx上でPHPが動いているのか確認する。
2. CakePHPのindex.phpに接続する。

だけのはずなのに…

### 1. nginx上でPHPが動いているのか確認する。

[パスワード管理ツール「Passbolt」を導入してみた](http://qiita.com/mochimochi-inu/items/8ec978b7ac2fc2ca0aaf)
でpassboltのインストールが終わっているところからの手順です。

まず/var/www/index.php を作成し表示させてみる。中身は何でもよい。
続いてnginxの*.confファイルをコピーして作成する。default.confはじゃまなのでdefault.conf.ORGなどリネームしておいた。

```
cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/passbolt.conf
```

passbolt.conf を編集する。

 * rootのパスをindex.phpを置いているパスに変更する。
 * location ~ \.php$ のコメントアウトを外す
 * fastcgi_paramもindex.phpを置いているパスに変更する。

```
    location / {
        root   /var/www;
        index  index.php;
    }

    location ~ \.php$ {
        root           html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
        include        fastcgi_params;
    }    
```

ブラウザから接続してみるとPHPがnginx上で動作していることとバーチャルホスト設定がうまくいっていることが確認できる。
今回はechoで「testtest」と表示されれば設定がうまくいったことになる。

```
testtest
```

### 2. CakePHPのindex.phpに接続する。

CackPHPのrootは /passboltをインストールしたディレクトリ/passbolt/app/webroot の中の index.php なのでそのように設定をする。
パスをpassboltように変更しただけではCakePHPは表示できないようなので、公式ページを参考に書き直す。
[公式ページ](https://book.cakephp.org/2.0/ja/installation/url-rewriting.html)
ついでにlogのファイル設定もする。

```
　　root   /passboltがあるところのパス/app/webroot;
　　index  index.php;
    
    location / {
         try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include        fastcgi_params;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /passboltがあるところのパス/app/webroot$fastcgi_script_name;
    }
```

nginxを再起動する。

```
systemctl restart nginx
```

ブラウザから確認したら真っ白だったので app/Config/core.php を編集してエラーが出るようにした。1がエラーが表示されるデバッグモード。

```
Configure::write('debug', 1);
```

もう一度確認するとエラーが大量にでた。
 
```
Warning: _cake_core_ cache was unable to write 'cake_dev_ja' to File cache in /.../passbolt/lib/Cake/Cache/Cache.php on line 327

Warning: /.../passbolt/app/tmp/cache/persistent/ is not writable in /.../passbolt/lib/Cake/Cache/Engine/FileEngine.php on line 385

Fatal error: Uncaught CacheException: Cache engine "_cake_core_" is not properly configured. Ensure required extensions are installed, and credentials/permissions are correct in /.../passbolt/lib/Cake/Cache/Cache.php:186 Stack trace: #0 /.../passbolt/lib/Cake/Cache/Cache.php(151): Cache::_buildEngine('_cake_core_') #1 /.../passbolt/app/Config/core.php(400): Cache::config('_cake_core_', Array) #2 /.../passbolt/lib/Cake/Core/Configure.php(72): include('/.../p...') #3 /.../passbolt/lib/Cake/bootstrap.php(432): Configure::bootstrap(true) #4 /.../passbolt/app/webroot/index.php(95): include('/.../p...') #5 {main} thrown in /.../passbolt/lib/Cake/Cache/Cache.php on line 186
```

このエラーが表示された時の原因は主に3つ。
 1. Permissionがrootになっている。
 2. Permissionに書き込み権限がない。
 3. SELinuxが有効になっている。

#### Permissionの変更
 
app/tmp/cache以下にいつのまにか作られていたフォルダが作られていた。

 * models
 * persistent

app/tmp/cache/ 以下の権限を変更し、変更されたことを確認する。

```
chown -R nginx:nginx app/tmp/cache/
chmod -R 766 app/tmp/cache/
```

#### SELinuxを無効にする

今回はEC2上にインストールしている。EC2はデフォルトでSELinuxがenforcingになっていて、それが原因でアクセスできないらしい。
まずはサーバーのSELinuxの状態を確認する。

```
getenforce
```

このコマンドでEnforcingと表示されればSELinuxが有効になっている。

```
Enforcing
```

/etc/selinux/config を編集して無効の状態にする。
permissiveは警告はするけど無効という状態。

```
SELINUX=permissive
```

SELinuxの変更を反映させるためにサーバーを再起動させる。

```
reboot
```

nginx、mariadb、php-fpmをstartさせる。

```
systemctl start nginx
service mariadb start
service php-fpm start
```

もう一度ブラウザから接続すると別のエラーがでた。

```
The GPG Server key defined in the config is not found in the gpg keyring

Error: An Internal Error Has Occurred.

Stack Trace

APP/Controller/Component/Auth/GpgAuthenticate.php line 49 → GpgAuthenticate->_initKeyring()
CORE/Cake/Controller/Component/AuthComponent.php line 770 → GpgAuthenticate->authenticate(CakeRequest, CakeResponse)
CORE/Cake/Controller/Component/AuthComponent.php line 611 → AuthComponent->identify(CakeRequest, CakeResponse)
APP/Controller/AuthController.php line 35 → AuthComponent->login()
[internal function] → AuthController->login()
CORE/Cake/Controller/Controller.php line 491 → ReflectionMethod->invokeArgs(AuthController, array)
CORE/Cake/Routing/Dispatcher.php line 193 → Controller->invokeAction(CakeRequest)
CORE/Cake/Routing/Dispatcher.php line 167 → Dispatcher->_invoke(AuthController, CakeRequest)
APP/webroot/index.php line 110 → Dispatcher->dispatch(CakeRequest, CakeResponse)
```

調べてみると、[前回](http://qiita.com/mochimochi-inu/items/8ec978b7ac2fc2ca0aaf)設定したはずの /opt/passbolt/.gnupg のPermissionが不足していた。

```
chmod -R 777 /opt/passbolt/.gnupg/
```

これでやっとつながった…が、「ユーザーが一人も作成されていませんよ？」的な警告を受けたのでそちらの手順も残しておくことにした。
管理者を作成する前にメールの設定も行っておくと、登録時のメールアドレスにpassboltからメールが送信されるのでそちらもしておく。

```
cp app/Config/email.php.default app/Config/email.php
vim app/Config/email.php
```

[passboltの公式サイト](https://www.passbolt.com/help/tech/install#toc_gpg)を参考に設定する。

```
public $default = array(
	'transport' => 'Smtp',
	'from' => array('passbolt@yourdomain.com' => 'Passbolt'),
	'host' => 'メールを送信するサーバーのホスト名',
	'port' => 587,
	'timeout' => 30,
	'username' => 'ユーザー名',
	'password' => 'パスワード名',
);
```

cronで送信を実行するコマンドも設定してあげる。

```
* * * * * /passboltまでのパス/app/Console/cake EmailQueue.sender > /passboltまでのパス/app/log/sendmail.log
```

メール送信の設定がうまく行われていれば、次のコマンドで管理者を作成後に指定したメールアドレスにpassboltからメールが届く。

```
app/Console/cake passbolt register_user -u 登録する人のメールアドレス -f myFirtsname -l myLastname -r admin
```

あとはメールに記載されているリンクからpassboltに接続をして完了。