LDAPのsudoers, env_keepではまった

あらまし

githubのprivate repositoryをchefから参照したくて、rootユーザにssh-agentの鍵を持たせるようにしようとしたところ、LDAPの設定ではまった。

結論

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 -llenv_keep+=という形で閲覧できるので、このオプションも便利

蛇足

坂の上の雲をやっと読み終わりました。

次は何にしようか考え中。