現在、私の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を直接編集できます。
確かに、これはnslcd.confファイルのfilter passwd
ディレクティブを介して行われます。次のようになります。
filter passwd (memberOf=cn=myLoginGroup,ou=groups,dc=foo,dc=bar)
filter passwd
はLDAPフィルターを参照するため、論理式内に複数のグループ制約を含めるなど、必要に応じて複雑にすることができます。
私が正しく理解している場合、LDAPプラグインに到達する前に、ファイルを使用して認証を確認しています。そして、このファイルはLDAPに接続しており、LDAPは(少なくとも)2つのグループをチェックし、それらの2つのグループ(のいずれか)に属するユーザーが認証できるようにします。
この場合は、これをpam_ldapに委任し、代わりにその段階で認証をフィルタリングするように構成できます。
いずれにせよ、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))
必要に応じてサービスを再起動します。