「パスワードの付箋はもう卒業!」GoとVaultで作る、セキュリティ・クッキング
今回の主役は、Hashicorp Vault。 「パスワードを付箋に書いてモニターに貼っちゃう」なんていう、おっちょこちょいなエンジニアの皆さん、必見です!
エンジニア界隈では、APIキーやデータベースのパスワードのことを「シークレット」と呼びます。これをコードの中に直接書く(ハードコードする)のは、まるでカレーの隠し味を街中の看板に掲示するようなもの!筒抜けです!
そこで、Vaultの出番。
秘密の保管庫(Secrets Management)
大事な鍵をガッチリガード。
暗号化の達人(Encryption as a Service)
データを暗号化して、万が一盗まれても読めなくします。
使い捨ての鍵(Dynamic Secrets)
必要な時だけ発行して、使い終わったら自動で消える魔法の鍵。
まずは、Vaultサーバーを立ち上げましょう。今日は手軽に「開発モード」で仕込みます。
お使いのパッケージマネージャーでサクッと。
brew install hashicorp/tap/vault
# ターミナルで「へいお待ち!」
vault server -dev
これで、http://127.0.0.1:8200 に保管庫ができました。
それでは、Go言語という「最新の調理器具」を使って、Vaultからパスワードを取り出してみましょう!
package main
import (
"context"
"fmt"
"log"
vault "github.com/hashicorp/vault/api"
)
func main() {
// 1. Vaultクライアントの設定(キッチンの入り口)
config := vault.DefaultConfig()
config.Address = "http://127.0.0.1:8200"
client, err := vault.NewClient(config)
if err != nil {
log.Fatalf("クライアントが作れないよ!: %v", err)
}
// 2. 認証トークンのセット(合言葉!)
// ※開発モードのデフォルトトークンは "root" です
client.SetToken("root")
// 3. シークレットの読み込み(冷蔵庫から隠し味を取り出す)
secret, err := client.KVv2("secret").Get(context.Background(), "my-recipe")
if err != nil {
log.Fatalf("レシピが見つからない!: %v", err)
}
// 4. データの中身を表示
apiKey := secret.Data["api_key"]
fmt.Printf("今日の隠し味(API Key)は... 【%s】 です!\n", apiKey)
}
「Vaultを使うと何が嬉しいの?」という声が聞こえてきますね。
「鍵どこだっけ?」がなくなる
バラバラな設定ファイルに書くのではなく、Vaultという「一箇所」で管理できるので、整理整頓が捗ります。
履歴が残る(監査ログ)
「誰がいつ、冷蔵庫(シークレット)を開けたか」が丸見え。つまみ食いは厳禁です!
自動で鍵を替える(ローテーション)
「3ヶ月に一度パスワードを変える」なんて面倒な作業も、Vaultなら自動化できます。
いかがでしたか?Vaultを使えば、あなたのシステムは三ツ星レストラン並みの安心感に包まれます。