2009-04-22

Fedora--令人愛恨交織的openwebmail over LDAP

嗯…這是之前我放棄之後又覺得不對頭的事務

對的,之前因為廠商已確定要接手這一塊,所以我就不想再花腦力去想這個部份…

但是,最近有聽到,廠商在openwebmail中修改密碼的這一塊要link去額外的網頁來做,我就在想為什麼需要這樣???

基本上,一般來說這一類安全性比較重要的問題通常都不太會去動系統預設的功能;結果,詢問了原因,原來是因為,pam這方面支援問題

雖然我原先認為這無關緊要,反正有人做就好…
但因為主管認為如果修改密碼要放到額外的網頁來處理的話,那openwebmail上的修改密碼就不能讓使用者使用,就要改連結之類的做法…

但由於我們學校用濾擎的mail系統,廠商說我們可以自己來改,但會遇到mail更新後也會重新蓋過這一個地方,那就代表只要有更新就得重改一次…
(我很懷疑這一點,因為如果只要更新就會重改,那config的東西也會嗎,如果也會那就很奇怪了…還是說config是放另外的地方???)


所以,為了不動濾擎版的openwebmail主程式的前提,所以主管就在想有沒有其他的方法可以讓使用者點選了openwebmail上修改密碼的link後,可以連到新的改密碼的網頁,而不是原來那個改了跟你講成功但ldap上卻沒有修改的…

我就想到了htaccess的rewrite功能…
經前篇的說明,還好有微風站上的cflee3000大的幫忙,以確定可以修改這個link…
但,同樣微風站上的11大說了一句讓在下十分認同的話,就是,openwebmail上沒道理會有這樣支援性差的問題,畢盡是opensource的東西…

所以,在下就開始著手在即將上線的新mail系統之前,來玩玩這個修改密碼的問題…

=============
一 開始,要讓openwebmail跑ldap-auth的話,先到openwebmail-install-path/etc /openwebmail.conf,把auth_module auth_unix.pl改成auth_module auth_ldap.pl…

再來進入到openwebmail-install-path/etc/defaults/auth_ldap.conf
把ldap相關資訊填一填…大至如下
host 127.0.0.1(ldap-server的位置)
ou People(看看你想對應的群組,雖然登入時會從根去找uid…)
dc1 xxx
dc2 xxx
dc[] 好像可以用陣列的方式
cn member(cn我一直搞不是很懂是什麼,不過,可以從uid與cn的gid來判斷是群組用的)
password (我本來一直認為是root的密碼,但,好像是cn這個group密碼)

auth_ldap.conf是與openwebmail-install-path/auth/auth_ldap.pl對應的…
auth_ldap.pl要改的東西可以說不多…
其本上…可以說不用改,但你auth_ldap.conf的dc多的話,就在auth_ldap.pl加多或自己結合…perl的語言還不是看不懂啦…可以自行觀看ldap的log來自行調配

不過,經我二天以來的腦力…與國外文件的威力,我終於找到大部份遇到openwebmail無法去修改ldap上的userpassword了…
重點就是在ldap中slapd.conf的ACL設定…

access to xxxxx,就是這個東東…
為什麼預設值會不行咧(因為slapd.conf的ACL預設是空的)

我自己的認為啦…
很簡單的方向去想,ldap我們都是拿來做登入的user帳號、密碼的資料管理…
ldap會拿去over系統、服務、資料庫的登入依據,如果這些東西不好好的處理很容易就被偷取…
所以,依我的判斷,預設的slapd.conf的ACL,空的代表是readonly…
所有的要求只能接收讀取的…若是要動到modify的,在無依據的情況下,是不行的…

所以,在我嘗試失敗高達數百次的失敗與看到眼快花的log之下,使用了以下的ACL…
Apr 22 13:03:01 ldap slapd[18089]: do_modify
Apr 22 13:03:01 ldap slapd[18089]: do_modify: dn (uid=test10, ou=People, dc=ldap, dc=xxx, dc=abc, dc=dd)
Apr 22 13:03:01 ldap slapd[18089]: >>> dnPrettyNormal:
Apr 22 13:03:01 ldap slapd[18089]: <<< uid="test10,ou=" dc="ldap,dc=" dc="abc,dc=">,
Apr 22 13:03:01 ldap slapd[18089]: modifications:
Apr 22 13:03:01 ldap slapd[18089]: #011replace: userPassword<-這是說你要做的動作,取代密碼
Apr 22 13:03:01 ldap slapd[18089]: #011#011one value, length 20
Apr 22 13:03:01 ldap slapd[18089]: bdb_dn2entry("uid=test10,ou=people,dc=ldap,dc=xxx,dc=abc,dc=dd")
Apr 22 13:03:01 ldap slapd[18089]: bdb_modify: uid=test10,ou=People,dc=ldap,dc=xxx,dc=abc,dc=dd
Apr 22 13:03:01 ldap slapd[18089]: bdb_dn2entry("uid=test10,ou=people,dc=ldap,dc=xxx,dc=abc,dc=dd")
Apr 22 13:03:01 ldap slapd[18089]: bdb_modify_internal: 0x00000069: uid=test10,ou=People,dc=ldap,dc=xxx,dc=abc,dc=dd

Apr 22 13:03:01 ldap slapd[18089]: bdb_modify: modify failed (50)<-這邊就是說modify的狀況,得到error code 50,50的意思是LDAP_INSUFFICIENT_ACCESS(無存取的權限) Apr 22 13:03:01 ldap slapd[18089]: send_ldap_result: conn=3 op=1 p=3 Apr 22 13:03:01 ldap slapd[18089]: send_ldap_result: err=50 matched="" text="" Apr 22 13:03:01 ldap slapd[18089]: send_ldap_response: msgid=3 tag=103 err=50

以上是LOG…可以很明白的看出error的原因

接著是我的ACL
access to attrs=userPassword<-可以存取userPassword屬性的有符合以下規則的 by dn="cn=member,ou=Group,dc=ldap,dc=xxx,dc=abc,dc=dd" write by dn="cn=root,ou=Group,dc=ldap,dc=xxx,dc=abc,dc=dd" write by self write by * auth access to dn.base="" by * read access to * by dn="cn=member,ou=Group,dc=ldap,dc=xxx,dc=abc,dc=dd" write by dn="cn=root,ou=Group,dc=ldap,dc=xxx,dc=abc,dc=dd" write by * read

以上的acl我並沒有做到很安全的考量…
不過反正我也只是測試用的…

但是,終究讓我完成了…

沒有留言: