web-dev-qa-db-ja.com

グループによるPAM動的LDAP承認

現在、私のPAMはLDAPを介して/etc/pam.d/systhem-authのカスタム認証スタックと統合されています。

auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth required pam_listfile.so onerr=fail item=group sense=allow file=/etc/login.netgroup.allowed
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass retry=3
password    sufficient    pam_unix.so sha512 nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     optional      pam_mkhomedir.so skel=/etc/skel umask=077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so

ご覧のとおり、承認はLDAPグループのリストを含む/etc/login.netgroup.allowファイルのルックアップによって行われます。したがって、ユーザーが少なくとも1つ以上のグループに属している場合、ユーザーはこのサーバーにログインするかどうかに関係なく、.

このチェックは静的に行われます。つまり、login.netgroup.allowファイルは不変であり、グループのリストのみが含まれています。 LDAPチェックを介してこのチェックを動的に行う方法または提案はありますか?つまり、サーバーのホスト名を含むエントリと、このサーバーに関連付けられているグループのリストを含む複数値属性を含むLDAPブランチがあるとします。ファイルではなくLDAPで直接チェックすることはできますか?

情報:OS:Red Hat 6.4 LDAPクライアント:nslcd

編集:現時点では、カスタムスクリプトを使用して機能させています。

これはsystem-authサーバーのhostname1です。

auth        sufficient    pam_unix.so nullok try_first_pass
auth            required        pam_exec.so /usr/sbin/netgroupCheck
auth            required        pam_listfile.so onerr=fail item=group sense=allow file=/etc/login.netgroup.allowed

/usr/sbin/netgroupCheckスクリプトを使用して、LDAPで許可されたグループを直接確認しています。

#!/usr/bin/env bash

#Allowed Netgroup File
file=/etc/login.netgroup.allowed

#LDAP Client
uri=$(cat /etc/nslcd.conf | grep uri | grep "^[^#;]" | sed 's/[^ ]* //')
oud_user=$( cat /etc/nslcd.conf | grep binddn | grep "^[^#;]" | sed 's/[^ ]* //')
oud_password=$( cat /etc/nslcd.conf | grep bindpw | grep "^[^#;]" | sed 's/[^ ]* //')
hostname=$(hostname)

#Refresh Allowed Netgroup File from LDAP
ldapsearch -LLL -D $oud_user -H $uri -w $oud_password -b "dc=base,dc=it" "(cn=$hostname)" Allowednetgroup | grep -i Allowednetgroup | sed 's/[^ ]* //' > $file

そして、これはLDAPのエントリです。

dc: cn=hostname1,ou=servers,dc=base,dc=it
objectClass: Host
objectClass: ipHost
objectClass: top
cn: hostname1
ipHostNumber: 10.10.10.10
Allowednetgroup: GROUP1
Allowednetgroup: GROUP2
Allowednetgroup: GROUP3

このようにして、サーバーで編集せずに、LDAPでallowednetgroupを直接編集できます。

2
LucaP

確かに、これはnslcd.confファイルのfilter passwdディレクティブを介して行われます。次のようになります。

 filter passwd (memberOf=cn=myLoginGroup,ou=groups,dc=foo,dc=bar)

filter passwdはLDAPフィルターを参照するため、論理式内に複数のグループ制約を含めるなど、必要に応じて複雑にすることができます。

1
drookie

問題

私が正しく理解している場合、LDAPプラグインに到達する前に、ファイルを使用して認証を確認しています。そして、このファイルはLDAPに接続しており、LDAPは(少なくとも)2つのグループをチェックし、それらの2つのグループ(のいずれか)に属するユーザーが認証できるようにします。

この場合は、これをpam_ldapに委任し、代わりにその段階で認証をフィルタリングするように構成できます。

いずれにせよ、LDAPを実行している場合は、すでに動的グループがあります。必要なのは、それらのグループをクライアントにフィードすることです。私は何かが足りないかもしれませんが、ここに私が考えることができるいくつかのオプションがあります:

PAM LDAP

単一グループ

新しいグループを作成したり、GROUP1とGROUP2を統合したり、GROUP1およびのすべてのユーザーを追加したりする可能性がある場合は、PAM_LDAPの設定オプションpam_groupdn GROUP2そのグループに、例えば。それをGROUPと呼びましょう。

次に、次の行を/etc/ldap.confに追加する必要があります。

pam_groupdn cn=GROUP3,ou=groups,dc=foo,dc=bar

必要に応じてサービスを再起動します。

私の知る限り、pam_groupdnでは複数のグループを許可していません。 GROUP1とGROUP2を3番目のGROUP3にマージできない場合、他のオプションはSSSDを使用することです。

複数のグループ

SSSDをインストールする必要があります。使用しているディストリビューションはわかりませんが、通常、パッケージの名前はsssdと同じです。 。

[domain]セクションの下の/etc/sssd/sssd.confに次の行を追加します。

access_provider = ldap
ldap_access_filter = (|(memberOf=cn=GROUP1,ou=groups,dc=foo,dc=bar)(memberOf=cn=GROUP2,ou=groups,dc=foo,dc=bar))

必要に応じてサービスを再起動します。

0
Leo