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では取れてなかった)
$ 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未サポートらしいと判明↓↓↓。
そんなわけで以下のようにクライアント側の設定を変更したところうまく値が取れた。
※だけど結果としてローカルユーザの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
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
manみたところ「passprompt_override をセットすると、 passprompt が無条件で使われる」と書かれていました。
$ man 5 sudoers
~略~
passprompt_override
通常、passprompt オプションによって指定された
パスワードプロンプトが使用されるのは、PAM の
ようなシステムが用意しているパスワードプロン
プトが "Password:" という文字列にマッチしてい
るときだけである。passprompt_override をセッ
トすると、 passprompt が無条件で使われること
になる。このフラグはデフォルトでは off である
~略~
$ 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 の項も参照してほしい)。
~略~
で、以下のとおりpassprompt_overrideを設定するとpasspromptが使われるようになりました。
$ sudo visudo
Defaults passprompt_override ##追記(または/etc/sudoers.d/の下にファイル置く)
$ sudo id
Enter [komi]'s Password: ##★プロンプトが"パスワード:"ではなくldapからsudoOptionのpassprompt読んでくれた
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
さくらのクラウドで普通のLDAP認証ができるサーバーを量産する - mazgi.log
認証システムSSSD+LDAP+SUDOの構築手順 | 外道父の匠
Man page of SUDOERS
Man page of SUDO
Man page of SUDOERS.LDAP
SSSD-sudo(5):SSSD用の設定ファイル - Linuxのmanページ
3.2. SSSD とシステムサービス
11.2.2. sssd.conf ファイルの設定
11.2.26. SSSD キャッシュの管理
chef-sssd/default.rb at master · localytics/chef-sssd
Troubleshooting – SSSD
HOWTO_Troubleshoot_SUDO – SSSD
CentOS / Scientific Linux でsudoを使ってみる | レンタルサーバー・自宅サーバー設定・構築のヒント
authentication - Multiple Domain realmd/sssd Configuration on RHEL7? - Server Fault
りなっくすなう。: Apache Directory Studio インストール手順