使用MySQL管理Linux用戶認證

測試環境: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

刪除一個組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章