credstash について

Qiita 上に意外に credstash の記事が無いので、初歩的な内容ですが自分の備忘録的に書いておきます。

# はじめに

プログラムをしている中で、秘匿化しなければいけない多くは数多くあります（データベースのパスワード文字列、外部サービスの API Key 等）。

これらの情報管理ツールは商用・無償それぞれ多種多様にありますが、AWS を用いている環境下で手軽に秘匿情報が扱えるツールとして credstash について書きます。

# credstash とは
https://github.com/fugue/credstash
https://github.com/winebarrel/gcredstash
https://github.com/adorechic/rcredstash

Python 製のコマンドラインツールです。亜種として **gcredstash** (go) や **rcredstash** (ruby) などがありますが、基本的なコンセプトと使い方はだいたい同じです。

- key / value の組み合わせで値を管理する
  - put で保存し、get で取り出す
- value 値は Aamazon KMS (Key Management Service) を用いて暗号化・復号化をする
- key と KMS により暗号化された value の組み合わせは DynamoDB の所定のテーブルに保存する。

# Amazon Key Management Service
https://aws.amazon.com/jp/kms/
AWS が提供している暗号処理関連のサービスです。
暗号化処理について、キーの管理と、当該キーを使用できるユーザーの管理を IAM Role ベースで行ってくれるのが特徴です。
これにより、IAM Role を用いて暗号化・復号化が行えるユーザーや機能の管理を細かく行えます。

システム管理 / DevOps の観点において、KMS を上手に使っているツールのひとつが、この credstash になります。

# 使い方
## インストール

python のインストールされている環境で pip install をすれば、credstash をインストールすることができます。

```
$ pip install credstash
```

また、動作させる環境に AWS の Credentials 情報が何かしらの手段（IAM Role、環境変数、~/.aws/credentials) で設定されている必要があります。

## セットアップ
まったく credstash のセットアップが行われていない状態であれば、 init コマンドを実行することで DynamoDB のテーブルの作成を行ってくれます。

```
$ credstash init
```

init コマンドを実行すると、 **credential-store** というテーブルが作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/8e58ca36-e663-f825-aac6-aebaaacb8102.png)


こちらのテーブルに、credstash で put した秘匿値情報が保存されていきます。
なお、複数ユーザー間、ならびに credstash / gcredstash / rcredstash など各種言語向けツール間で、このテーブルは共有させることが可能です。

## KMS のキー作成
暗号化に使用する KMS のキー情報を作成します。
手順については公式マニュアルにも記載されているので、こちらをご参照ください。
https://github.com/fugue/credstash#setting-up-kms

```
1. Go to the AWS console
2. Go to the IAM console/tab
3. Click "Encryption Keys" in the left
4. Click "Create Key". For alias, put "credstash". If you want to use a different name, be sure to pass it to credstash with the -k flag
5. Decide what IAM principals you want to be able to manage the key
6. On the "Key Usage Permissions" screen, pick the IAM users/roles that will be using credstash (you can change your mind later)
7. Done!
```

基本的には、 IAM Role の設定画面から KMS の管理画面を開き、任意のキーを作成すれば OK です。
標準では credstash という名前のキーを作成することを推奨されていますが、別名で作成することも可能です（別名作成時は、put コマンド呼び出し時に明示的にキーの名前を指定する必要があります）

## 値の保存（put）
put コマンドを使います。

```
$ credstash put {key} {value}
```

たとえば以下のように実行すると、 sada-credstash という名前の KMS キーを使用して **sada.masashi** という key に **masashi_sada** という文字列が暗号化されて保存されます。

```
$ credstash put --key alias/sada-credstash sada.masashi masashi_sada
```

DynamoDB 上では以下のように値が保存されます。sha-256 にて暗号化されていることがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/1e167263-53cd-fc87-98df-18dac36a0727.png)


## 値の取得 (get)
get コマンドを使います。

```
$ credstash get {key}
```
たとえば以下のように実行すると、上記で保存された sada.masashi の情報が復号化されて取得できます。

```
$ credstash get sada.masashi
 
masashi_sada
```

## 値の削除 (delete)
delete コマンドを使うと、指定したキーの情報を削除することができます。
```
$ credstash delete {key}
```

# credstash の利点
開発、DevOps の観点のみ以下記載します。

ソースコード管理を考えたときに、出来る限りすべての開発リソースは git repository などに保存をしておきたいですが、不特定多数の人が閲覧する可能性のある git 上にパスワード情報などを保存するのはセキュリティの観点から非常にまずいです。

ただ credstash を用いるようにしておくと、暗号化情報を取得するためのキー文字列だけを git に登録しておけば良くなるため、セキュリティリスクが減ります。

復号化処理も一部の人にのみ限定することが容易なため、退職者発生時の情報漏えいのリスクも減らすことができます。

# credstash の応用
credstash はコマンドラインや python インターフェースを用意しているため、手軽に各ツールに組み込むことが可能です。

## ansible
provisioning ツールの ansible では、lookup プラグインという機構を使って credstash 経由で保存されている暗号化情報を provisioning 復号化することができます。
http://docs.ansible.com/ansible/latest/playbooks_lookups.html#the-credstash-lookup

```
---
- name: "Test credstash lookup plugin -- get my github password"
  debug: msg="Credstash lookup! {{ lookup('credstash', 'sada.masashi') }}"
```

AWS であれば provisining は基本的に EC2 環境上にて実施するので、AWS アカウントを保持していない人に秘匿情報を不要に公開してしまうリスクがかなり低減できます。

# まとめにかえて
と記事を書いてきましたが、AWS を使うのであれば最近は **Parameter Store** を使うのが自然かな、とも感じています。
https://aws.amazon.com/jp/ec2/systems-manager/parameter-store/

ただ色々なツールとの連携も今のところ credstash の方が行いやすい印象もありますし、以下の Issue にもあるように credstash は DynamoDB の limitation / quota にのみ影響を受けるので Parameter Store よりも制約が少ない、という話もあります。

[Comparison to Parameter Store?](https://github.com/fugue/credstash/issues/164)

> Credstash uses GenerateDataKey, not Encrypt.
> The only limitation on size would be imposed by DynamoDB, which is ~400kb (post encryption, minus overheads)

過去に credstash を導入して運用しているシステムなどもあると思いますので、ケースバイケースで使っていければ良いのかなと思います。