【Rails5.2】秘匿情報はsecret.ymlではなくcredentials.yml.encで管理する【初心者】


##はじめに
credentials.yml.encについては下記の記事を参考に使用しました。
本稿は、そもそも本番環境の構築に不慣れな中で、個人的に詰まったところを含めつつまとめてみたものになります。

[Rails5.2から追加された credentials.yml.enc のキホン](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)
[Add credentials using a generic EncryptedConfiguration class](https://github.com/rails/rails/pull/30067)
※またRails 6以降からは、環境ごとのファイルについて追加変更があるようです。
[Add support for multi environment credentials](https://github.com/rails/rails/pull/33521)

##特徴
- 本番でのみ使われる想定で環境ごとの分割はない
    - 環境ごとに使い分けられるようにするgem【**rails-env-credentials**】あり
- 秘匿情報の取得は`Rails.application.credentials.xxx`
- 復号は`master.key` か `ENV['RAILS_MASTER_KEY']`


##ポイント
- rails newした際に、`credentials.yml.enc`と`master.key`が生成される
- 復号用の`master.key`がなくてもRails自体は動く
- `credentials.yml.enc`は暗号化された状態でgitで共有可能
- `master.key`はgit.ignorに含まれているのでgit経由では共有できない
- 中身の編集はvimで行う

##どこにあるの？どこに置くの？
###①ローカル
どちらもconfig下にいます。
app/config/credentials.yml.enc
app/config/master.key
※git cloneしたアプリなどは`master.key`は無い状態。

###②本番環境※
applicationname/current/config/master.key
applicationname/current/config/credentials.yml.enc
applicationname/shared/`ここにmaster.key配置する`
※個人差有

##使うコマンド
**エディタを初めに指定**して、vimコマンドで開くことができます。
環境変数でエディタを指定しておけば、つける必要はありません。

credentials.yml.encを編集する

```irb
# 基本
$ rails credentials:edit

# 環境変数EDITORにviを指定
$ EDITOR=vim bin/rails credentials:edit
$ EDITOR="vi" bin/rails credentials:edit

# 本番環境ではルート権限つけてみたり
$ sudo EDITOR=vim rails credentials:edit
```
予めエディタを環境変数で指定する

```irb
# .bash_profileに環境変数 EDITOR を設定
$ echo 'export EDITOR="vi"' >> ~/.bash_profile

# sourceで変更内容を実行中のシェルに反映
$ source ~/.bash_profile

# 確認のためechoコマンドで表示
$ echo $EDITOR
  #=> vi

# もちろんvim開いて書き込んでもおっけー
$ vim ~/.bash_profile
$ source ~/.bash_profile

# 編集コマンドのみで開ける
$ bin/rails credentials:edit
```

master keyを本番環境にコピーする

```irb
$
```

##credentials.yml.encの中身

初期値は下記の通り。
コメントアウトで入っているawsの記述を使う際は、取得サイドの記述と合うように気をつけると◎（例：取得では`aws_`を付けてしまった、などの不一致でエラー）
※又聞きですが、他のシークレットキー(API関連など)を入れる時は、awsと同じインデントで揃えないと取得できない現象も有るよう！

```ruby:credentials.yml.enc
# aws:
#   access_key_id: １２３
#   secret_access_key: ４５６

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: wsx3edc4rfv5tgb6yhn7ujm8ik.......
```

コメントアウトを外してid・keyを入れたら、コンソールで取得してみる

```irb
$ rails c
irb(main):001:0> Rails.application.credentials.aws[:access_key_id]
=> hogehogehoge
irb(main):002:0> exit
```

##環境変数で読み取る
###RAILS_MASTER_KEY
`master.key`を共有できない環境であれば、環境変数`RAILS_MASTER_KEY`で`master key`を設定。
どちらもない場合はファイルの読み取りはできません。

```irb
$ rails c
irb(main):001:0> Rails.application.credentials.secret_key_base
=> nil

# 環境変数でmaster keyを指定
$ export RAILS_MASTER_KEY= "aaaaaaaaaa......."
irb(main):002:0> Rails.application.credentials.secret_key_base
=> wsx3edc4rfv5tgb6yhn7ujm8ik.......

irb(main):003:0> exit
```

##オプション
###require_master_key
本番環境で、`master.key`の指定漏れ防止に推奨されているオプション。
開発＆テストでは、secret_key_baseはデフォルトではnilが返ります。（復号キーがなくても仮の値が使われる）

```config/environments/production.rb
config.require_master_key = true
```

##注意点
###ハマりやすいポイント
gitcloneしたアプリケーションや、途中でバージョンUPした人が詰まりやすいのかもしれません。

###【例】
チームで、git cloneして開発中。
`master.key`を持っていない状態で開こうとする＝編集コマンドを叩くと、その時点で`master.key`が生成される。
→本来の鍵と異なる`master.key`なので、アプリケーションを立ち上げられなくなる。
そのため、下記のようなケースに注意するとトラブルを防げるかと思います。

###【対応策】
####①`master.key`は、秘匿情報を扱うメンバー間で共有しておく。（文字列をコピーして`master.key`を置いてから編集する）

家を借りた人が鍵持ってるから、出入りしたい人は合鍵をつくる感じですかね！

####②うっかり新しい鍵を生成してしまった時→エディタに出現したconfig下の`master.key`を削除する。
（その後、①同様本物のキー情報をコピー。）
AWSやSNS認証など管理するべきKeyが増えるときなど。
鍵無くした〜このお家入りたい〜って別の鍵でガチャガチャしているような状態。
その鍵捨てて正しい鍵を保持しましょう！

####③newした人が鍵無くした場合→一度credentials.yml.encファイルを削除して編集コマンドを叩くことで、新しいファイルとキーを生成する。

鍵が無いのでドアごと替えてしまえ！みたいな状態です。

**ただし、注意点。**
**内側のポストの中身まで、一緒に捨てることになります。**

`credentials.yml.enc`に何を記載しているか、他メンバーが登録した情報はないか、分かっている時のみにするべし。
(初期段階だったり作り直すにしてもrails newしたひとが行うのが一般的だとは思いますが、、、別メンバーが作り直して共有することも可能です。)

`secret_key_base`はコマンドで生成して勝手に記述されるので、`env`や`bash`等で管理していない無い場合は、そちらも作成し直す必要が出るかも知れません。


##おわり
secret.ymlもあまり理解しないうちですが、シークレットキーを一元管理できるのは楽かな？という印象。
誤った記述があればお手数ですがご指摘ください・・・！