Redmineに2段階認証プラグインを導入する(v4.2以前)

#はじめに
- Redmine4.2からワンタイムパスワードによる二要素認証機能が実装されているようです
  - https://redmine.jp/tech_note/two-factor-authentication/
- 影響なければ素直にRedmineをVUPしましょう
- この記事はなんらかの理由でRedmineがVUPできない方向けです

##概要
- サービスを利用する上で認証は大事ですよね？ ID/PW認証は破られるものです
- 今回Redmineのセキュリティを高める為に2段階認証プラグインを導入しました
 - Gmail経由でユーザのメールアドレスにワンタイムパスワードを送るものです
 - https://www.redmine.org/plugins/redmine_out_of_band_auth
- プラグインの導入手順とかをまとめています

##実行環境
- EC2(AmazonLinux)
- Redmine 4.1.0
- ruby 2.7.0
- Rails 5.2.4.1
- gem 3.1.2
- mysql 5.7.29

##実施したこと
1. プラグインのインストール
2. 送信元Gmailアカウントの設定
3. Redmineサーバの設定
4. Redmine利用ユーザの設定

##手順
##### 1. プラグインのインストール

> 一般的なRedmineプラグインインストールの手順です
> Railsのバージョンによりつまずきます

```shell
cd /path/to/redmine/plugin
git clone https://github.com/matsukei/redmine_out_of_band_auth.git
cd /path/to/redmine
bundle install
bundle exec rake redmine:plugins:migrate NAME=redmine_out_of_band_auth RAILS_ENV=production
```
ここでエラー。

```shell
StandardError: An error has occurred, all later migrations canceled:
Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:

  class CreateAuthSourceOutOfBands < ActiveRecord::Migration[4.2]

~~略~~
```
- 以下の記事によるとRails4で作られたmigrationファイルをRails5で実行すると発生するらしい
  - https://qiita.com/tackeyy/items/1a6599d9d565cd89cdbc
- プラグイン内のファイルを編集します

```shell
vim /path/to/redmine/plugins/redmine_out_of_band_auth/db/migrate/001_create_auth_source_out_of_bands.rb

前： class CreateAuthSourceOutOfBands < ActiveRecord::Migration
後： class CreateAuthSourceOutOfBands < ActiveRecord::Migration[4.2]
```

- もう一度実行して解消。

```shell
bundle exec rake redmine:plugins:migrate NAME=redmine_out_of_band_auth RAILS_ENV=production
```

##### 2. メール送信用Googleアカウントの設定
> - ワンタイムパスワードをユーザに送るためのGoogleアカウントを作成（既存で持っているものでもOKです）
> - 他のアプリからGoogleのサービスを利用する場合、アカウントのパスワードではなくアプリ用のパスワードを作成して利用する必要があります
 - http://phjkahby98327u5o0qwe709uli.blogspot.com/2015/12/redminegmail534-5714.html


- Googleでアカウント作成後、「アカウント管理」→「セキュリティ」から2段階認証設定をする
- アプリパスワードから、Redmineメール送信用のアプリパスワードを作成する(名前は適当でOK)
- :bomb: 16桁のパスワードは作成時しか確認できないためどこかにメモること

##### 3. Redmineサーバの設定
> configファイルに記載してRedmineを再起動します

```shell
vim /path/to/redmine/config/configuration.yml
```

- 以下を記載します

```yaml
default:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      enable_starttls_auto: true
      address: "smtp.gmail.com"
      port: 587
      domain: "smtp.gmail.com"
      authentication: :plain
      user_name: "作成したGoogleアカウントのメールアドレス"
      password: "作成したアプリパスワード"
```

- Redmineを再起動します。問題なくアクセスできればOKです 

```shell
service httpd restart
```


##### 4. Redmine利用ユーザの設定
> - メール通知を設定し、そもそもRedmineでメール通知ができるかを確認します
> - ユーザのメール認証を有効にします

Redmineに管理者ユーザでログイン
「管理」→「設定」→「メール通知」から、送信元メールアドレスにメール送信用Googleアカウントのアドレスを記載
<img width="789" alt="スクリーンショット 2020-02-21 12.16.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289060/8edd31f3-754b-164a-6b1c-411a17594771.png">
右下の「テストメール送信」からログインしたユーザのアドレスにテストメールが送信されれば、メール通知の設定はOK
「534-5.7.14 ~~~~」のようなエラーが出たら、アプリパスワードの設定ミスを疑ってください


「管理」→「ユーザ」→「メール通知」から、利用ユーザのアドレスとアウトオブバンド認証を有効にする
<img width="1111" alt="スクリーンショット 2020-02-21 12.25.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289060/e9ee9277-666f-01a7-2920-4c2d135e9d9a.png">
実際にログインし、以下の画面が出てログインできれば設定完了です。
<img width="759" alt="スクリーンショット 2020-02-21 12.36.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289060/91898a5d-cfb6-df58-b4c4-c9cffef0704f.png">
<img width="581" alt="スクリーンショット 2020-02-21 12.37.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289060/6320efcf-c4fe-a45a-11a7-de6e676722f1.png">

##おわりに
- Redmineのインストール手順は今後できたらまとめます
- Rubyの知識なしにとりあえず入れてみたのでbundle?gem?な状態です。少し勉強します

ありがとうございました。