測試環境:Debian 6.0 (squeeze)
安裝mysql、phpmyadmin、libpam-mysql和libnss-mysql
以下對數據庫的操作使用phpmyadmin來實現。
創建數據庫user_database,用於存放用戶數據。
在數據庫中創建以下的表
名稱 |
說明 |
字段數 |
users |
每個記錄對應於一個用戶 |
15 |
groups |
每個記錄對應於一個羣 |
5 |
users_groups |
一個用戶可包含到多個羣中 |
2 |
需要注意的是,不可使用group作爲表名稱,因爲group是SQL語句中的關鍵字
users表
字段 |
說明 |
類型 |
長度 |
默認值 |
備註 |
ID |
索引編號 |
INT |
|
|
自動增長、主鍵 |
Account |
用戶帳戶 |
VARCHAR |
64 |
'' |
|
Name |
用戶姓名 |
VARCHAR |
64 |
'' |
|
Shell |
用戶Shell |
VARCHAR |
32 |
'/bin/bash' |
|
Password |
用戶密碼 |
VARCHAR |
64 |
'' |
可以是加密後的 |
Status |
賬戶狀態 |
CHAR |
1 |
'A' |
A表示有效,否則無效 |
Uid |
|
INT |
|
|
|
Gid |
|
INT |
|
|
|
Home |
用戶目錄 |
VARCHAR |
64 |
'/home' |
|
LastChange |
最後修改日期(自1970年1月1日起的天數) |
VARCHAR |
64 |
'' |
|
Min |
兩次修改口令之間所需的最小天數 |
INT |
|
|
0表示無限制 |
Max |
口令保持有效的最大天數 |
INT |
|
|
空白表示不限制密碼有效期,這將不使用Warning和Inactive特性,但需要修改字段屬性爲VARCHAR來表示空白。一般用99999表示無限制。 |
Warning |
提前多少天通知密碼失效 |
INT |
|
|
0表示不警告(這可能需要修改字段屬性爲VARCHAR),一般爲7 |
Inactive |
超過口令必須更改的日期多少天后,系統會自動將這個帳戶停止 |
INT |
|
|
空白表示不限制 |
Expire |
賬戶失效日期(自1970年1月1日起的天數) |
VARCHAR |
64 |
|
空白表示不限制 |
groups表
字段 |
說明 |
類型 |
長度 |
默認值 |
備註 |
ID |
索引編號 |
INT |
|
|
自動增長、主鍵 |
Name |
羣名稱 |
VARCHAR |
64 |
'' |
|
gid |
|
INT |
|
|
|
Status |
羣狀態 |
CHAR |
1 |
'A' |
A表示有效,否則無效 |
Password |
羣密碼 |
VARCHAR |
64 |
'x' |
|
users_groups羣與用戶關係表,此表用來表示每個羣中的用戶
字段 |
說明 |
類型 |
長度 |
默認值 |
備註 |
user_ID |
用戶在users表中的編號 |
INT |
|
|
不是uid |
groups_ID |
羣在groups中的編號 |
INT |
|
|
不是gid |
建立兩個數據庫用戶PAM_user和PAM_root,其中pam_root有該數據庫的全部權限,而PAM_user則僅能對users中部分字段和groups/users_groups全部字段進行查詢
PAM_user可查詢的字段:
ID |
索引編號 |
Account |
用戶帳戶 |
Name |
用戶姓名 |
Shell |
用戶Shell |
Status |
賬戶狀態 |
uid |
|
gid |
|
Home |
用戶目錄 |
修改/etc/nsswitch.conf,改爲(在以下三行後面添加mysql)
passwd: compat mysql
group: compat mysql
shadow: compat mysql
修改/etc/nss-mysql.conf的以下行,注意密碼要設置爲PAM_user的密碼,若表的名字有改動,要相應修改(例如users改爲abc,則users.gid應改爲abc.gid)
conf.version = 2;
users.host =inet:localhost:3306;
users.database =user_database;
users.db_user = PAM_user;
users.db_password = PAM_user的密碼;
#users.backup_host =inet:backup:3306;
#users.backup_database =nss_mysql_backup;
users.table = users;
users.where_clause =users.Status = 'A';
users.user_column =users.Account;
users.password_column =users.Password;
users.userid_column =users.ID;
users.uid_column = users.uid;
users.gid_column = users.gid;
users.realname_column =users.Name;
users.homedir_column =users.Home;
users.shell_column =users.Shell;
groups.group_info_table =groups;
groups.where_clause =groups.Status = 'A';
groups.group_name_column =groups.Name;
groups.groupid_column =groups.ID;
groups.gid_column =groups.gid;
groups.password_column =groups.Password;
groups.members_table =users_groups;
groups.member_userid_column =users_groups.users_ID;
groups.member_groupid_column =users_groups.groups_ID;
修改/etc/nss-mysql-root.conf的以下行,注意密碼要設置爲PAM_root的密碼,若表的名字有改動,要相應修改(例如users改爲abc,則users.gid應改爲abc.gid)
conf.version = 2;
shadow.host =inet:localhost:3306;
shadow.database =user_database;
shadow.db_user = PAM_root;
shadow.db_password = PAM_root的密碼;
#shadow.backup_host =inet:backup:3306;
#shadow.backup_database =nss_mysql_backup;
shadow.table = users;
shadow.where_clause =users.Status = 'A';
shadow.userid_column =users.ID;
shadow.user_column =users.Account;
shadow.password_column =users.Password;
shadow.lastchange_column =users.LastChange;
shadow.min_column = users.Min;
shadow.max_column = users.Max;
shadow.warn_column =users.Warning;
shadow.inact_column =users.Inactive;
shadow.expire_column =users.Expire;
爲了避免其他用戶看到PAM_root的密碼,/etc/nss-mysql-root.conf應只允許root用戶查看:
chown root/etc/nss-mysql-root.conf
chmod 600/etc/nss-mysql-root.conf
修改/etc/pam-mysql.conf的以下行,注意密碼要設置爲PAM_root的密碼,若表的名字有改動,要相應修改(例如users改爲abc,則users.gid應改爲abc.gid)
users.host = localhost
users.database = user_database
users.db_user = PAM_root
users.db_passwd = PAM_root的密碼
#users.where_clause = (host)
users.table = users
#users.update_table = (update_table)
users.user_column = Account
users.password_column = Password
#users.status_column = (statcolumn)
users.password_crypt = 1
#users.use_323_password =(use_323_passwd)
users.use_md5 = yes
#users.where_clause = (where)
#users.disconnect_every_operation = (disconnect_every_op) *1
#verbose = (verbose)
#log.enabled = (sqllog)
#log.table = (logtable)
#log.message_column = (logmsgcolumn)
#log.pid_column = (logpidcolumn)
#log.user_column = (logusercolumn)
#log.host_column = (loghostcolumn)
#log.rhost_column = (logrhostcolumn) *2
#log.time_column = (logtimecolumn)
爲了避免其他用戶看到PAM_root的密碼,/etc/pam-mysql.conf應只允許root用戶查看:
chown root /etc/pam-mysql.conf
chmod 600 /etc/pam-mysql.conf
修改/etc/pam.d/common-account,在pam_unix.so上面添加一行:
account sufficient pam_mysql.so config_file=/etc/pam-mysql.conf
修改/etc/pam.d/common-auth,在pam_unix.so上面添加一行:
auth sufficient pam_mysql.so config_file=/etc/pam-mysql.conf
修改/etc/pam.d/common-session,在pam_permit.so上面添加一行:
session sufficient pam_mysql.so config_file=/etc/pam-mysql.conf
修改/etc/pam.d/common-password,在pam_unix.so上面添加一行:
password sufficient pam_mysql.so config_file=/etc/pam-mysql.conf
對於新增加的用戶,需要使用password來更新用戶密碼。
已驗證,可支持密鑰文件不詢問密碼直接登錄。
爲了方便使用,還需要實現以下腳本:
add_users.sh |
從文本文件批量導入 |
add_user.sh |
添加一個用戶(交互式) |
delete_user.sh |
刪除一個用戶(按用戶名) |
add_group.sh |
新建一個組 |
delete_group.sh |
刪除一個組 |