linux
パスワードを設定ファイルに書き込まないといけないケースが、docker composeやkubenetesなどである。 これはパスワードを安全に運用しようとすると厄介な障害になる。
権限等しっかり設定してパスワードの入った設定ファイルを作ってしまう手もあるが、 どうしてもGitHubなどにうっかりpushしてしまわないか不安になる。
環境変数にパスワード入れておいてそれを見に行かせれば多少ましであるが、それでも
$ export PASSWD=[password, 見えてほしくない]
がログに残ってhistoryコマンドでうっかり
見れてしまったりするリスクがある。
このようなパスワード漏れリスクを回避するためには、標準入力経由でファイル・historyどちらにもパスワードが見える形で残らないように 処理するのが良い。
処理の流れ:
- パスワードを標準入力経由で環境変数に入れる
- envsubstで環境変数から取得したパスワードを設定ファイルにはめ込んで、標準出力に出す
- パイプ経由でパスワードの入った設定ファイルを設定対象のコマンド(kubectl等を想定)に流し込む
まずパスワードを標準入力経由で環境変数に入れる。標準入力を得コマンドはいろいろあるが、 ここでは簡単にcatを使う。catは入力ファイル名を"-"にすると入力待ちになるので、 これをバッククート (``) 節で評価・環境変数に流し込む。
$ export PASSWD=`cat -` # このコマンドは待機状態になる password # パスワードを入れEnter -> Ctrl+D (EOF) で終了させる $ echo ${PASSWD} password # 上で設定されたパスワードが入っていればOK
次にまず設定ファイルのテンプレートを、パスワード部分をプレースホルダにして作っておく。 例としてkubenetes secret (kube上で機密データなどを管理する仕組み) の設定yamlを想定する。 公式ドキュメントを参考に
apiVersion: v1 kind: Secret metadata: name: secret-sa-sample annotations: kubernetes.io/service-account.name: "sa-name" type: kubernetes.io/service-account-token data: passwd: ${PASSWD} #ここが環境変数で置き換わるなるyamlファイルを作っておいておく。
これに環境変数を入れ込むためにはenvsubstを使う。envsubstはテキストファイル内の${}を環境変数に置き換えて 標準出力に流してくれるツールだ。
$ envsubst < secret.yaml # 目視確認のため出力をコンソールへ出してみる apiVersion: v1 kind: Secret metadata: name: secret-sa-sample annotations: kubernetes.io/service-account.name: "sa-name" type: kubernetes.io/service-account-token data: passwd: passwd #ここが環境変数で置き換わる最後にenvsubstからkubectlに流し込む
$ envsubst < secret.yaml | kubectl -f -以上で無事パスワードを見えるところにできるだけ残さずに引き渡すことができた。