地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【CLI】envchain入門

github.com

envchainとは

秘匿情報を[環境変数]に入れるのを、多少安全にしてくれるツールでC言語で実装されている。

インストール方法

$ git clone https://github.com/sorah/envchain.git
$ cd envchain
$ yum install   readline-devel libsecret-devel

$ make
cc -c -Wall -Wextra -ansi -pedantic -std=c99 `pkg-config --cflags libsecret-1`  -o envchain_linux.o envchain_linux.c
cc  -o envchain envchain.o envchain_linux.o -lreadline `pkg-config --libs libsecret-1`
$ make install
install -d /usr/./bin
install -m755 ./envchain /usr/./bin/envchain

Usage

./envchain version 1.0.1

Usage:
  Add variables
    ./envchain (--set|-s) [--[no-]require-passphrase|-p|-P] [--noecho|-n] NAMESPACE ENV [ENV ..]
  Execute with variables
    ./envchain NAMESPACE CMD [ARG ...]
  List namespaces
    ./envchain --list

Options:
  --set (-s):
    Add keychain item of environment variable +ENV+ for namespace +NAMESPACE+.

  --noecho (-n):
    Enable noecho mode when prompting values. Requires stdin to be a terminal.

  --require-passphrase (-p), --no-require-passphrase (-P):
    Replace the item's ACL list to require passphrase (or not).
    Leave as is when both options are omitted.

使ってみる

setで環境を指定して入れたい変数を引数に入れることで変数をセットすることができる。その後はenvchainの引数としてセットした環境とコマンドを実行することでその変数がセットされた状態でコマンドを実行することが可能となる。

$ envchain --set aws AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY
aws.AWS_ACCESS_KEY_ID: aaaa
envchain: secret_password_store_sync failed with 0: Cannot autolaunch D-Bus without X11 $DISPLAY
aws.AWS_SECRET_ACCESS_KEY: bbbb

仕組みは結構シンプルで機密情報を含む環境変数macOSのKeychainに保存し、コマンドを実行するときにそれを復号してくれるみたいな仕組み。実行箇所でsetenvを読んでexecvpでコマンドを実行する。

static void
envchain_exec_value_callback(const char* key, const char* value, void *context)
{
  (void)context; /* silence warning */

  setenv(key, value, 1);
}