作者 主題: [分享]Libnss + Pam_mysql ,以 mysql 做身份認證  (閱讀 19928 次)

0 會員 與 1 訪客 正在閱讀本文。

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[分享] Libnss + Pam_mysql ,以 mysql 做身份認證

說明
Libnss 是一套身份查詢程式,原來系統以自有的一些函式來取得自己的一些
身份上的參數,像 uid/gid , username 等等,這些函數像 getpwnam/getpwuid
/getspnam ...等等,而這些身份函數通像是傳回一些結構(struct),libnss 的
作用即是在於可以將這些函數改為使用 SQL 的語法
若使用了 libnss-mysql,原來的系統帳號還是有作用的,所以即使在設定 libnss 上
不成功,但對系統來說是不會有什麼嚴重的影響

至於 pam_mysql 則是用於您登入時的認證,如大家所知, pam 模組主要在做認證,
而原 pam 模組皆以 passwd/shadow 等做為認證來源,此時,若您多加一些設定,
即可以有兩套認證方式,一個是原來的 passwd/shadow ,而另一個就是 mysql 了

libnss-mysql 安裝
libnss-mysql 下載處    http://libnss-mysql.sourceforge.net
libnss-mysql 的安裝(可以在該 url 下找到 rpm 檔,但以下介紹皆以 tarball 做說明)

代碼: [選擇]

$>wget http://unc.dl.sourceforge.net/sourceforge/libnss-mysql/libnss-mysql-1.0.tar.gz
$>tar -zxvf libnss-mysql-1.0.tar.gz
$>cd libnss-mysql-1.0
# 查看 complier 可用參數,prefix 可不管,重要的是 mysql 部份
#  --with-mysql-inc=DIR    Location of your MySQL include files
#  --with-mysql-lib=DIR    Location of your MySQL libraries
$>./configure --help | more  
$>./configure   --with-mysql-inc=/usr/include/mysql --with-mysql-lib=/usr/lib/mysql
$>make
$>make install


libnss-mysql 的設定

裝好後有兩個重要的動作,產生認證的資料庫及設定 libnss 的設定
檔(/etc/libnss-mysql.cfg).認證的資料庫您可在 libnss-mysql-1.0
下的 sample 目錄下找到 sample_database.sql只要將他丟到 mysql
執行即可,
代碼: [選擇]

$>cat sample_database.sql| mysql -u username -pPassword

他會產生三個表,如下圖結構

只要您了解 passwd/shadow/group 等結構,您就會了解TABLE 中欄位的意義

libnss 的設定檔有兩個,及 libnss-mysql.cfg  libnss-mysql-root.cfg,其中最重要的
就是 libnss-mysql.cfg , 這個檔案的內容及功能如下:
代碼: [選擇]

# /etc/libnss-mysql.cfg
#以下皆是身份相關函式的 SQL 查詢設定
#可 man getpwnam 等方式查到其字義
[queries]
getpwnam    SELECT username,'x',uid,gid,gecos,homedir,shell FROM users WHERE username='%s' LIMIT 1
getpwuid    SELECT username,'x',uid,gid,gecos,homedir,shell FROM users WHERE uid='%u' LIMIT 1
getspnam    SELECT username,password,lstchg,min,max,warn,inact,expire,flag FROMusers WHERE username='%s' LIMIT 1
getpwent    SELECT username,'x',uid,gid,gecos,homedir,shell FROM users
getspent    SELECT username,password,lstchg,min,max,warn,inact,expire,flag FROM users
getgrnam    SELECT name,password,gid FROM groups WHERE name='%s' LIMIT 1
getgrgid    SELECT name,password,gid FROM groups WHERE gid='%u' LIMIT 1
getgrent    SELECT name,password,gid FROM groups
memsbygid   SELECT username FROM grouplist WHERE gid='%u'
gidsbymem   SELECT gid FROM grouplist where username='%s'


#mysql 連結參數,請依實際狀況調整
[server]
host        Mysql_IP
database    auth
username    nss
password    nss-password
#socket      /var/lib/mysql/mysql.sock
#port        3306
ssl         0
timeout     3
compress    0
#initcmd     sql-statement-here


另外,尚有兩個檔案要小改
代碼: [選擇]

#/etc/libnss-mysql-root.cfg 內容
#這個檔案的意義我就不懂了,因為官網中好像沒有什麼特別的設明,所以我就設成和上相同
[server]
username    nss
password    nss-password


另一個是最重要的,原來您的系統上就有這個檔案,而 libnss 也附了一個給你,
/etc/nsswitch.conf,這個內容基本上您可直接使用 libnss 附的即可,
他只在裏面加了三行而以
代碼: [選擇]

# files 即原來的系統,  mysql 則是第二選擇,建議您以 files 為先
#....前略
# 若您
passwd:     files mysql
shadow:     files mysql
group:      files mysql

#...後略

基本上 libnss-mysql 僅是提供查詢 mysql 函數,要等人 Login 後才會用到,
而 Login時是透過 PAM 做認證,所以我們還需要 pam_mysql 模組


PAM_MYSQL
pam_mysql 下載處 http://sourceforge.net/project/showfiles.php?group_id=5741&package_id=5797

安裝
代碼: [選擇]

$>wget http://cesnet.dl.sourceforge.net/sourceforge/pam-mysql/pam_mysql-0.5.tar.gz
$>tar -zxvf pam_mysql-0.5.tar.gz
$>cd pam_mysql
# 注意 MakeFile 中, export LD_D=gcc -shared -Xlinker -x -L/usr/lib/mysql -lz 這一行中
# 的 mysql lib 路徑是否是確
$>make
$>make install
# 就我所知,有的版本 make install 會失效,此時可直接將cp pam_mysql.so 到 pam 模組路徑
$> cp pam_mysql.so /lib/security/


修改 /etc/pam.d 下相關檔案,其中的 login , passwd 最重要,至於其他如 pop,imap ...改不改看個人
代碼: [選擇]

#/etc/pam.d/login
#%PAM-1.0

#這一段是原來的部份
auth       required     /lib/security/pam_securetty.so
auth       required     /lib/security/pam_stack.so service=system-auth
auth       required     /lib/security/pam_nologin.so
account    required     /lib/security/pam_stack.so service=system-auth
password   required     /lib/security/pam_stack.so service=system-auth
session    required     /lib/security/pam_stack.so service=system-auth
session    optional     /lib/security/pam_console.so

#這一段是 pam_mysql 的部份
#  其中
# host/db/user/passwd: mysql 相關參數,請根據自己狀況填寫
# usercolumn: username 的欄位
# passwdcolumn: password 的欄位
# crypt:   0 明碼,1 Crypt(即一般的系統方式) ,2 mysql 的 PASSWORD 函式
# 其他請參考 pam_mysql 的 README 說明
auth       required     /lib/security/pam_mysql.so user=nss passwd=nss-password host=Mysql_IP db=auth usercolumn=username passwdcolumn=password crypt=1
account    required     /lib/security/pam_mysql.so user=nss passwd=nss-password host=Mysql_IP db=auth usercolumn=username passwdcolumn=password crypt=1
password   required     /lib/security/pam_mysql.so user=nss passwd=nss-password host=Mysql_IP db=auth usercolumn=username passwdcolumn=password crypt=1
session    required     /lib/security/pam_mysql.so user=nss passwd=nss-password host=Mysql_IP db=auth usercolumn=username passwdcolumn=password crypt=1


至於其他的 pam 設定只要將上述四行加入即可

結語
如果使用 libnss-mysql + pam_mysql 請注意,最好在原系統的 /etc/passwd
保留一個一般使用者的帳號,以免檔當您 mysql 不 work 時,無法登入系統處
理,另外,亦可在每部的 Unix/Linux 的機器裝這個東東,即可以共用一套認證
來源.而有其他學員及學長提到的 ldap 認證,亦是接近的做法,只是 protocol
不同,可參考 ldap 討論區外,亦可以看看下面這個網址詳細的介紹
http://www.hut.fi/cc/docs/kerberos/nss_ldap.html
至於使用者相關的操作,adduser/userdel/passwd 並無法作用於 libnss-mysql,
雖然我們只自有寫一套如上相關的 command 去增加 mysql 中的 user,但其中
的做法較複雜,且程式沉長,較無法為大家介紹.而一般的做法會建議您使用
phpMyAdmin 來操作上面的 command , 至於 homedir 實際的建立就只有手動了

jackalchiou

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
請教一下大大
« 回覆 #1 於: 2004-10-06 18:19 »
我也完整的安裝完成了可是在認證出現了問題,我在mysql上新增帳號,可是確無法驗證,我有試過去使用useradd的方式去測試系統會回應我帳號已存在了,到底我是那裡做錯了可以幫忙一下回覆我嗎  謝謝>_<””

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[分享]Libnss + Pam_mysql ,以 mysql 做身份認證
« 回覆 #2 於: 2004-10-06 18:36 »
你用系統的 useradd 怎可能會加到 mysql 中呢 !?
最後一段就有說了,另外,登入不進去只能從 log 判斷
log 中都會有訊息

此外,建議你改用 1.2 版的 nss-mysql , 1.0 版有點小問題,
做法皆相同,詳細原因可在 libnss-mysql 官網的 change log
中找到

jackalchiou

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
[分享]Libnss + Pam_mysql ,以 mysql 做身份認證
« 回覆 #3 於: 2004-10-06 23:31 »
學長大大^^
謝謝您的回覆,您可能誤會我的意思了,我是用useradd來測一下mysq內l的帳號是否有在工作,系統正確的告訴我,這個帳號是存在的,只是帳號在mysql,學長可以請問您一下,我是設定crypt=1,他是不是用DES的編碼的方式,如果是的話他是怎麼產生的呢?還是他是別的編碼方式呢??我在想我是不是在密碼那卡關了,可是我設定crypt=0用明碼的方式還是不能認證,學長可以貼一下您pam.d的設定或是在mysql帳號密碼的設定方式,謝謝>_<”
  對了學長請問一下,LIBNSS-MYSQL不能建HOME DIRECTORY是不是有什麼替代的方案
               感溫內  一個找不到問題的學弟

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[分享]Libnss + Pam_mysql ,以 mysql 做身份認證
« 回覆 #4 於: 2004-10-07 10:49 »
my pam.d/login content:
代碼: [選擇]

[root@pc071 root]# cat /etc/pam.d/login
#%PAM-1.0
auth       required     pam_securetty.so
auth       required     pam_stack.so service=system-auth
auth       required     pam_nologin.so
account    required     pam_stack.so service=system-auth
password   required     pam_stack.so service=system-auth
session    required     pam_stack.so service=system-auth
session    optional     pam_console.so

auth       required     /lib/security/pam_mysql.so db=users usercolumn=user_name
 passwdcolumn=password crypt=1 where=status='A'
account    required     /lib/security/pam_mysql.so db=users usercolumn=user_name
 passwdcolumn=password crypt=1 where=status='A'
password   required     /lib/security/pam_mysql.so db=users usercolumn=user_name
 passwdcolumn=password crypt=1 where=status='A'
session    required     /lib/security/pam_mysql.so db=users usercolumn=user_name
 passwdcolumn=password crypt=1 where=status='A'

至於 host/dbuser/dbpasswd 那些我就沒寫了,因為我直接改程式,
最後你先弄懂 pam 功能,再研究 pam_mysql, pam_mysql 中的
README 寫得很清楚

crypt=1 表示用 crypt function 加密,在 mysql 中則要用 encrypt
去做,不能用 PASSWORD 等,這邊要對等

$HOME 問題等你這些狀況都解決了,再來討論,前提是你懂原來
系統 adduser 有那些動作為行為,就很好解決了

有問題,多看 log (/var/log/message) , 訓練自己 TroubleShooting
的能力,儘量先不發問

jackalchiou

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
[分享]Libnss + Pam_mysql ,以 mysql 做身份認證
« 回覆 #5 於: 2004-10-10 23:14 »
學長大大謝謝您我已經了解您上次說的意思了,可是我是無法使用libnss-mysql因為在/var/log/message又出現以下的錯誤
Oct 10 14:41:36 mail login(pam_unix)[3505]: authentication failure; logname=LOGIN uid=0 euid=0 tty=tty1 ruser= rhost=
Oct 10 14:41:36 mail login[3505]: Table 'auth.user' doesn't exist
Oct 10 14:41:38 mail login[3505]: FAILED LOGIN 1 FROM (null) FOR jackal, Authentication failure
他自動產生資料表又沒有產生user這張表只有users這張
去原網站又找不到是不是它的bug 不知道您是否有同樣的問題呢
                                     快瘋了的學弟
還有您好像有說過可以將root獨立出來是怎麼做呢可以教一下小弟嗎
謝謝>_<|||

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[分享]Libnss + Pam_mysql ,以 mysql 做身份認證
« 回覆 #6 於: 2004-10-13 02:15 »
引用
Oct 10 14:41:36 mail login[3505]: Table 'auth.user' doesn't exist

罰你 pam_mysql 中的 README 看十次,單字若不懂就查
這些問題你若有用心看 README 或我寫的東西,都不應該發生的
且問題是在 pam , 不在 nss 階段

MAC

  • 可愛的小學生
  • *
  • 文章數: 5
    • 檢視個人資料
自動建立各$Home
« 回覆 #7 於: 2005-01-07 08:46 »
我照著上面的步驟已把Mail&pop3用pam_mysql認證
如何在MySQL 建立一筆user後,自動建立各$Home

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[分享]Libnss + Pam_mysql ,以 mysql 做身份認證
« 回覆 #8 於: 2005-01-10 14:08 »
自己寫一個 adduser/passwd 的程式,例如 shell script,perl,php 等都可以做到,只要你知道建一個帳號流程,做起來並不難

JBZ

  • 可愛的小學生
  • *
  • 文章數: 29
    • 檢視個人資料
[分享]Libnss + Pam_mysql ,以 mysql 做身份認證
« 回覆 #9 於: 2005-01-11 10:16 »
透過MYSQL或是透過LDAP,這樣的作法,最大的好處是否在於可以集中統一帳號?

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[分享]Libnss + Pam_mysql ,以 mysql 做身份認證
« 回覆 #10 於: 2005-01-11 12:02 »
引述: "JBZ"
透過MYSQL或是透過LDAP,這樣的作法,最大的好處是否在於可以集中統一帳號?

是的,您覺得呢 ?
用 ldap/mysql 方式有助於二次開發,且集中控管在權限管理上
有效大的好處

例如上例中的 pam 的 status 欄位,可改為 M ,並在 smtp/pop 的 pam 中設定為 M , 則表示 user 可以收發信,但不能登入,
也可以給每部主機一個代號,什麼代號代表可以登入什麼主機...
免得每個主機都有一個 passwd 檔, 要求 user 三個月要改一定
密碼也只要改一台就好了

MAC

  • 可愛的小學生
  • *
  • 文章數: 5
    • 檢視個人資料
提供建立 $Home
« 回覆 #11 於: 2005-01-14 11:48 »
新增mkhome.awk 如下
#!/bin/awk
BEGIN   {
FS=":"
uidmin=5000
uidmax=20000
}
{
        if ( $3 >= uidmin && $3 <= uidmax ) {
                print "\nmake directory " $6 "\nchown " $3 "." $4 " "$6
                system("mkdir -p " $6 ";  chown " $3 "." $4 " " $6 )
        }
}

新增完後在用getent passwd 讀取帳號資訊並用引線帶到awk如下
getent passwd  | awk -f mkhome.awk

這樣OpenWebMAIL,POP3,SMTP 都用 PAM_MYSQL 認證
方便前端介面建帳號.......