広告

パスワードをログやファイルに残さないように設定する

タグ: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 -
  
以上で無事パスワードを見えるところにできるだけ残さずに引き渡すことができた。