あらまし
githubのprivate repositoryをchefから参照したくて、rootユーザにssh-agentの鍵を持たせるようにしようとしたところ、LDAPの設定ではまった。
結論
env_keep+="HOGE SSH_AUTH_SOCK"
と記述した場合、後ろのダブルクォートも合わせたSSH_AUTH_SOCK"
という環境変数として見なされた。
env_keep+="HOGE SSH_AUTH_SOCK "
と行末にスペースを入れて解決。
内容
通常、SSH_AUTH_SOCK
がrootでも参照出来ない場合は以下のような結果になる。
(なお、macではなぜか参照できる)
$ sh -c 'ssh-add -l' 2048 11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11 /Users/yoan/.ssh/id_rsa (RSA) $ sudo sh -c 'ssh-add -l' Could not open a connection to your authentication agent.
まず、LDAPでenv_keepが使える事から以下の用に記述した。
Defaults env_keep+="LC_ALL LC_TIME SSH_AUTH_SOCK"
この状態でssh-addを行って、rootでも参照出来る事を期待したけどうまく行かなかった。
$sudo sudo -V ... 正当性の確認を行う環境変数: TERM" LINGUAS LC_* LANGUAGE LANG COLORTERM 削除する環境変数: RUBYOPT RUBYLIB ... "IFS 保護する環境変数: SSH_AUTH_SOCK" LC_ALL LC_TIME ... "COLORS
env_keep
がダブルクォートの中でスペースを区切り文字にして複数の環境変数を指定できることから、SSH_AUTH_SOCK"と"COLORSのダブルクォートは保護する環境変数郡を1つの配列にまとめて、後ろから表示していると予想。
なお、/etc/sudores
ではこれで正常に動作する。
色々試してみると、LC_ALL
は確かに参照できる。
Defaults env_keep+="LC_ALL LC_TIME HOGE SSH_AUTH_SOCK"
と環境変数HOGE
を追加して試してみると、HOGE
は参照されるが、SSH_AUTH_SOCK
は参照できない。
もしかして、と順番を入れ替える。
Defaults env_keep+="LC_ALL LC_TIME SSH_AUTH_SOCK HOGE"
すると見事に参照された。
$ sh -c 'ssh-add -l' 2048 11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11 /Users/yoan/.ssh/id_rsa (RSA) $ sudo sh -c 'ssh-add -l' 2048 11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11 /Users/yoan/.ssh/id_rsa (RSA)
このとき、sudo sudo -V
の結果のSSH_AUTH_SOCK"
が(末尾のダブルクォートを含め)そのまま1つの環境変数として認識されているのだと判明。
Defaults env_keep+="LC_ALL LC_TIME SSH_AUTH_SOCK "
とSSH_AUTH_SOCK
の後ろにスペースを入れてみると、
$sudo sudo -V ... 保護する環境変数: " SSH_AUTH_SOCK LC_ALL LC_TIME ... "COLORS
と表記が変わり、SSH_AUTH_SOCK
が無事にrootでも参照された。
まとめ
- LDAPのコンフィグにはバグがあり、環境変数の保護が出来ない場合がある
- そんなときは、行末にスペースをいれる
- rootの状態で
sudo -V
をすると参照できる環境変数一覧が見えるってことも初めて知った sudo -ll
はenv_keep+=
という形で閲覧できるので、このオプションも便利
蛇足
坂の上の雲をやっと読み終わりました。
次は何にしようか考え中。