請安裝 ports/net/nss_ldap:
# cd /usr/ports/net/nss_ldap # cat > files/patch-shadow <<EOF --- ldap-pwd.c.orig Sat Oct 16 22:22:29 2004 +++ ldap-pwd.c Sun Oct 17 12:45:08 2004 @@ -92,19 +92,19 @@ size_t tmplen; char *tmp; - if (_nss_ldap_oc_check (ld, e, "shadowAccount") == NSS_SUCCESS) - { - /* don't include password for shadowAccount */ - if (buflen < 3) - return NSS_TRYAGAIN; - - pw->pw_passwd = buffer; - strcpy (buffer, "x"); - buffer += 2; - buflen -= 2; - } - else - { +/* if (_nss_ldap_oc_check (ld, e, "shadowAccount") == NSS_SUCCESS) + * { + */ /* don't include password for shadowAccount */ +/* if (buflen < 3) + * return NSS_TRYAGAIN; + * + * pw->pw_passwd = buffer; + * strcpy (buffer, "x"); + * buffer += 2; + * buflen -= 2; + * } + * else + */ { stat = _nss_ldap_assign_userpassword (ld, e, AT (userPassword), &pw->pw_passwd, &buffer, &buflen); EOF # make install clean
Patch 的原因請看這裡。
接著請修改 /usr/local/etc/nss_ldap.conf:
# cat > /usr/local/etc/nss_ldap.conf <<EOF
# The distinguished name of the search base.
base dc=cs,dc=nctu,dc=edu,dc=tw# Another way to specify your LDAP server is to provide an
# uri with the server name. This allows to use
# Unix Domain Sockets to connect to a local LDAP Server.
#uri ldap://127.0.0.1/
#uri ldapi://%2fvar%2frun%2fopenldap%2fldapi/
#uri ldaps://127.0.0.1/
uri ldaps://ldap.cs.nctu.edu.tw/# The distinguished name to bind to the server with
# if the effective user ID is root. Password is
# stored in /etc/ldap.secret (mode 600)
rootbinddn cn=Manager,dc=cs,dc=nctu,dc=edu,dc=tw# Filter to AND with uid=%s
pam_filter objectclass=posixAccount# The user ID attribute (defaults to uid)
pam_login_attribute uid# RFC2307bis naming contexts
# Syntax:
# nss_base_XXX base?scope?filter
# where scope is {base,one,sub}
# and filter is a filter to be &'d with the
# default filter.
# You can omit the suffix eg:
# nss_base_passwd ou=People,
# to append the default base DN but this
# may incur a small performance impact.
#nss_base_passwd ou=People,
#nss_base_shadow ou=People,
nss_base_group ou=Group,
nss_base_hosts ou=Hosts,
nss_base_services ou=Services,
nss_base_networks ou=Networks,
nss_base_protocols ou=Protocols,
nss_base_rpc ou=Rpc,
nss_base_ethers ou=Ethers,
nss_base_netmasks ou=Networks,
nss_base_bootparams ou=Ethers,
nss_base_aliases ou=Aliases,
nss_base_netgroup ou=Netgroup,EOF
如果你不使用 samba, 則 nss_base_passwd 及 nss_base_shadow 兩行前面的註解可以拿掉。
接著請將 rootdn 的密碼存放在 /usr/local/etc/nss_ldap.secret 中,讓 nss_ldap 可以用 rootdn 讀寫 LDAP 中的密碼。
# echo 'rootdn_password' > /usr/local/etc/nss_ldap.secret
# chmod 600 /usr/local/etc/nss_ldap.secret
接著修改 /etc/master.passwd,在最後面加上一行: +:*::::::::
還有 /etc/group,也是在最後面加上: +:*::
接著修改 /etc/nsswitch.conf:(斜體字的部份表示增加的部份)
group: compat
group_compat: ldap nis
hosts: files dns
networks: files
passwd: compat
passwd_compat: ldap nis
shells: files
接下來就可以登入測試看看了。
這樣的修改方式不能使用 /usr/bin/passwd 修改密碼,可以使用這個 script 來讓使用者修改密碼。原本的程式在這裡,我稍微修改了一下讓它適合用在目前的 LDAP 上。如果你不使用 Samba,請將 Samba 的部份 mark 起來。
註:
1. 如果你要讓 Linux 的系統也使用 LDAP 作認證,則你一定要加上 nss_ldap 的 patch,否則 FreeBSD 會無法登入。
2. 如果你可以登入,但是在普通 user下打 id 出來的結果沒有 username,那你要去修改 slapd.conf,將 Anonymous Read 的權限加入即可。
3. 目前 FreeBSD 5.x 只支援 passwd 與 group 檔的 name service switching, netgroup, amd map, hosts, alias 等尚未支援。
你好:
我想請問修改密碼的script,只是單純想讓使用者在login機器修改自己的密碼,使用你提供的script會出現以下訊息
ldapmodify: modify operation type is missing at line 6, entry “uid=pupu,ou=People,dc=test,dc=cs,dc=test,dc=edu,dc=tw”
這篇已經有點舊了,可能現在 ldapmodify 參數不一樣了。