sssdクライアントがローカルユーザのsudoOptionを取ってこれない問題とpasspromptが効かない問題

ldap奥が深くてすぐ忘れそうなので備忘録です。

* sssdつかうなら元からつかってたldapクライアントいらないんじゃねという話でそうしていた。
* sudoは未サポートらしくローカルユーザがsudoOptionとってくるのうまくいかなかった。
* ローカルユーザのsudoOptionはldapつかえばとってこれることはわかったがすっきりしないしsudoersのマニュアルにはrootユーザのroot_sudoを無効にする意味なしと書かれており。
* sssdのマニュアルにはローカルユーザをfilterするやりかたはかかれているがldapからSudoOptionとってくる方法は載ってなかった、むしろ未対応であるようなチケットが存在していた。
* ちなみにldapに登録されてる一般ユーザの情報をsssdで取ってくるのは特に問題なさそう（ローカルユーザだけ無理そう）。

#### ・**sssdクライアントがsudoOptionを取ってこない問題**

結果として問題という感じでもなかった。
CentOS7のsssdがローカルユーザのsudoOptionをldapからとってこなくてsudoOption: !root_sudoなどが効いて無い(rootユーザがsudoできる)ようだった。

CentOS6ではsssd使っていなくてldapで見させてたのでこんな感じの差分が
差分はこのあたり（CentOS6ではsudoOptionが取れているが7では取れてなかった）

```text:差分（もろにldapサーバ側で設定してるsudoOption)
$ sudo -l -U root
～略～
    !root_sudo, !lecture, log_host, log_year,
    ignore_dot, ignore_local_sudoers, timestamp_timeout=5, passprompt=Enter [%u]'s
    Password:, badpass_message=The password is not corresponding. Try again.
～略～
```

調べたんですがsssdでldapサーバからsudoOptionとってきてる例がまるで見当たらず、
うまくできなかったからsudoだけsssdをあきらめてldap連携させているというような情報や、
公式でもローカルユーザやグループはfilter_userというldap連携除外するというオプションが存在しており、
そのオプションでrootなどを除外している解説はあってもldapからsudoOption連携さすようなのは存在しませんでした。

で、教えていただいて、sssdはローカルユーザのsudoers未サポートらしいと判明↓↓↓。

[#2494 (Allow sssd to retrieve sudo rules of local users whose sudo rules stored in ldap server) – SSSD](https://fedorahosted.org/sssd/ticket/2494)

そんなわけで以下のようにクライアント側の設定を変更したところうまく値が取れた。
※だけど結果としてローカルユーザのSudoOptionはldapからとってくるの必要ないからやめようという話にまとまりました。
（ローカルユーザはrootかroot相当の権限のしかいないので!root_sudoしてもセキュリティに関係ないであろうと）

・sssdがあるからldap無効にしてたがsudoだけldapによる認証にするなら以下の感じでローカルユーザのSudoOption効くように

```
vi /etc/authconfig/arguments
--enableldap --enableldapauth ##追加
```

・/etc/sysconfig/authconfigを更新

```
cat /etc/authconfig/arguments | /usr/bin/xargs /usr/sbin/authconfig --updateall
```

※--testにすると更新箇所が表示される。

・nssにてsudoersだけldapを見させるように更新（sssdの再起動不要）

```
vi /etc/nsswitch.conf
#sudoers: files sss
sudoers: files sss ldap ##sssよりldapが前でも動作は同じ
```

・sudo-ldap.confに認証情報を記載

```
vi /etc/sudo-ldap.conf
uri ldaps://ldap1.mng.hoge.local ldaps://ldap2.mng.hoge.local
sudoers_base ou=mng,ou=Sudoers,dc=hoge,dc=example,dc=net

binddn uid=auth,ou=system,dc=hoge,dc=example,dc=net
bindpw *******
```

・動作確認

```
# sudo ls
sudo: sudoers specifies that root is not allowed to sudo

$ sudo -l -U root
このホスト上でユーザー root に一致したデフォルト項目:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS
    DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1
    PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY
    LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL
    LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", env_keep+=SSH_AUTH_SOCK,
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, !root_sudo, !lecture,
    log_host, log_year, ignore_dot, ignore_local_sudoers,
    timestamp_timeout=5, passprompt=Enter [%u]'s Password:,
    badpass_message=The password is not corresponding. Try again.

ユーザー root
    は次のコマンドをこのホスト上で実行できます:
    (ALL) ALL
```

※以前はコマンドの結果としてファイルが確認できていたがsudoはできなくなっている模様。

sudoersのmanにはroot_sudoはセキュリティにあまり関係ないようなことが書かれてた
参考：[Man page of SUDOERS](https://linuxjm.osdn.jp/html/sudo/man5/sudoers.5.html)

sudoのデバッグログの出し方が以下のような感じでした。

``` 
# vi /etc/sudo.conf 
Debug sudo /var/log/sudo_debug all@debug
Debug sudoers.so /var/log/sudo_debug all@debug
```

sssdだけだとrootでsudoするとそんなユーザいないって感じのエラーが出てました。
（デバッグの様子を書き留めておきたかっただけ）


#### ・**sudoOptionは取れてそうなのにpasspromptが効いてない問題**

なんだかldap登録してある一般ユーザなのに帰ってくるプロンプトにsudoOptionのpassprompt効いてない様子が確認されました。

```
$ sudo id
パスワード:
```

結果として、sudoOptionは取れてるのにPAMで無効化されててpassprompt_overrideで上書きを有効化しなくてはならなかったようでした。

以下URLには優先度は以下であると記載されていました。

sudo pオプション > SUDO_PROMPT > /etc/sudoers

[sudoコマンドのメッセージを変える方法 - Qiita](http://qiita.com/aibou/items/5e58a609eafa79dbc0a2)

manみたところ「**passprompt_override をセットすると、 passprompt が無条件で使われる**」と書かれていました。
<pre>
$ man 5 sudoers
～略～
       passprompt_override
                       通常、passprompt オプションによって指定された
                       パスワードプロンプトが使用されるのは、PAM の
                       ようなシステムが用意しているパスワードプロン
                       プトが "Password:" という文字列にマッチしてい
                       るときだけである。passprompt_override をセッ
                       トすると、 passprompt が無条件で使われること
                       になる。このフラグはデフォルトでは off である
～略～
</pre>

<pre>
$ man 8 sudo
～略～
       -p prompt   -p (prompt) オプションを使うと、デフォルトのパス
                   ワードプロンプトを変更して、好きな文句にすること
                   ができる。以下のパーセント (‘%’) エスケープが使用
                   できる。

                   %H  ドメイン名を含むローカルホスト名に展開される
                       (マシンのホスト名が完全修飾名であるか
                       、sudoers ファイルで fqdn オプションがセット
                       されている場合に有効)

                   %h  ドメイン名なしのローカルホスト名に展開

                   %p  パスワードを要求されるユーザ名に展開 (sudoers
                       ファイルのフラグ rootpw、targetpw、runaspw を
                       尊重する)

                   %U  変身対象になる (デフォルトでは root) ユーザの
                       ログイン名に展開される

                   %u  sudo を起動するユーザのログイン名に展開される

                   %%  連続した二つの % は、一個の % 文字そのものを
                       意味する

                   -p で指定したプロンプトが、PAM をサポートしている
                   システムにおいてシステムのパスワードプロンプトを
                   上書きするのは、 sudoers で passprompt_override
                   が有効になっている場合である (訳注: sudoers(5) の
                   passprompt_override の項も参照してほしい)。
～略～
</pre>

で、以下のとおりpassprompt_overrideを設定するとpasspromptが使われるようになりました。
<pre>
$ sudo visudo
Defaults    passprompt_override ##追記（または/etc/sudoers.d/の下にファイル置く）

$ sudo id
Enter [komi]'s Password:  ##★プロンプトが"パスワード："ではなくldapからsudoOptionのpassprompt読んでくれた
</pre>

PAMの設定と動きがCentOS6と7で少し違うのかもしれないのですが、その特定には至っていないです。

で、passprompt_overrideについては結果としてローカルにファイル置くのだと全サーバに撒かないといけなくなるので、
ldapサーバに登録する話に。というわけで以下のような感じでldap_modifyで登録するためのldifを作って登録など。

```
$ ldapsearch -x -D 'cn=Manager,dc=hoge,dc=example,dc=net' -w `sudo cat /pathtofile` -b 'ou=Sudoers,dc=hoge,dc=example,dc=net' -LLL > 20161014sudoers.txt

$ grep ^dn: 20161014sudoers.txt |grep cn=defaults|perl -pe 's/\n/\nadd: sudoOption\nsudoOption: passprompt_override\n\n/g' > add_passprompt_override.ldif

$ cat add_passprompt_override.ldif
dn: cn=defaults,ou=dev,ou=Sudoers,dc=hoge,dc=example,dc=net
add: sudoOption
sudoOption: passprompt_override

dn: cn=defaults,ou=mng,ou=Sudoers,dc=hoge,dc=example,dc=net
add: sudoOption
sudoOption: passprompt_override
～略～

$ ldapmodify -x -D "cn=Manager,dc=hoge,dc=example,dc=net" -w `sudo cat /pathtofile` -f add_passprompt_override.ldif
```

#### 参考
[#2494 (Allow sssd to retrieve sudo rules of local users whose sudo rules stored in ldap server) – SSSD](https://fedorahosted.org/sssd/ticket/2494)
[さくらのクラウドで普通のLDAP認証ができるサーバーを量産する - mazgi.log](http://blog.mazgi.net/entry/cloning_ldap_authenticatable_server_on_sacloud)
[認証システムSSSD+LDAP+SUDOの構築手順 | 外道父の匠](http://blog.father.gedow.net/2015/09/29/sssd-ldap-sudo/)
[Man page of SUDOERS](https://linuxjm.osdn.jp/html/sudo/man5/sudoers.5.html)
[Man page of SUDO](https://linuxjm.osdn.jp/html/sudo/man8/sudo.8.html)
[Man page of SUDOERS.LDAP](https://linuxjm.osdn.jp/html/sudo/man5/sudoers.ldap.5.html)
[SSSD-sudo（5）：SSSD用の設定ファイル - Linuxのmanページ](https://linux.die.net/man/5/sssd-sudo)
[3.2. SSSD とシステムサービス](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System-Level_Authentication_Guide/Configuring_Services.html#sssd-ldap-sudo)
[11.2.2. sssd.conf ファイルの設定](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/about-sssd.conf.html)
[11.2.26. SSSD キャッシュの管理](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/sssd-cache.html)
[chef-sssd/default.rb at master · localytics/chef-sssd](https://github.com/localytics/chef-sssd/blob/master/recipes/default.rb)
[Troubleshooting – SSSD](https://fedorahosted.org/sssd/wiki/Troubleshooting)
[HOWTO_Troubleshoot_SUDO – SSSD](https://fedorahosted.org/sssd/wiki/HOWTO_Troubleshoot_SUDO)
[CentOS / Scientific Linux でsudoを使ってみる | レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/centos/sudo-install.html)
[authentication - Multiple Domain realmd/sssd Configuration on RHEL7? - Server Fault](http://serverfault.com/questions/677679/multiple-domain-realmd-sssd-configuration-on-rhel7)
[りなっくすなう。: Apache Directory Studio インストール手順](http://tanyaolinux.blogspot.jp/2013/01/apache-directory-studio.html)