您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)LINUX PAM驗證機制是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
一.PAM簡介
Linux-PAM( linux可插入認(rèn)證模塊)是一套共享庫,使本地系統(tǒng)管理員可以隨意選擇程序的認(rèn)證方式.
換句話說,不用(重新編寫和)重新編譯一個包含PAM功能的應(yīng)用程序,就可以改變它使用的認(rèn)證機制.
這種方式下,就算升級本地認(rèn)證機制,也不用修改程序.
PAM使用配置文件/etc/pam.conf(或/etc/pam.d/下的文件),來管理對程序的認(rèn)證方式.應(yīng)用程序調(diào)用相應(yīng)的配置文件,從而調(diào)用本地的認(rèn)證模塊.模塊放置在/lib/security下,以加載動態(tài)庫的形式進行調(diào)用(dlopen(3)).
像我們使用su命令時,系統(tǒng)會提示你輸入root用戶的密碼.這就是su命令通過調(diào)用PAM模塊實現(xiàn)的.
二. PAM的配置文件介紹
1.PAM配置文件的格式
PAM配置文件有兩種寫法: 一種是寫在/etc/pam.conf中.格式如下:
ftpd auth required pam_unix.so nullok
ftpd:表示服務(wù)名,即針對哪一個服務(wù)進行的認(rèn)證配置.
required:為模塊類型.PAM有四中模塊類型,分別代表不同的任務(wù)類型.
pam_unix.so:為模塊路徑.即要調(diào)用模塊的位置.
nullok:為模塊參數(shù),即傳遞給模塊的參數(shù).
另一種寫法是,將PAM配置文件放到/etc/pam.d/目錄下,使用應(yīng)用程序名作為配置文件名.如:
vsftpd,login等.配置文件的格式與pam.conf類似,只是少了最左邊的服務(wù)名列.如:/etc/pam.d/cups
#%PAM-1.0
auth required pam_stack.so service=system-auth
account required pam_stack.so service=system-auth
2.PAM的模塊類型
Linux-PAM有四種模塊類型,分別代表四種不同的任務(wù).它們是:認(rèn)證管理,賬號管理,會話管理和密碼管理.一個類型可能有多行,它們按順序依次由PAM模塊調(diào)用.
auth
用來對用戶的身份進行識別.如:提示用戶輸入密碼,或判斷用戶是否為root等.
account
對帳號的各項屬性進行檢查.如:是否允許登錄,是否達(dá)到最大用戶數(shù),或是root用戶是否允許在這個終端登錄等.
session
這個模塊用來定義用戶登錄前的,及用戶退出后所要進行的操作.如:登錄連接信息,用戶數(shù)據(jù)的打開與關(guān)閉,掛載文件系統(tǒng)等.
password
使用用戶信息來更新.如:修改用戶密碼.
3.PAM的控制標(biāo)記
PAM使用控制標(biāo)記來處理和判斷各個模塊的返回值.
required
這個標(biāo)記表示需要模塊返回一個成功值.如果返回失敗,則繼續(xù)進行同類型的下一個操作,當(dāng)所有此類型的模塊都執(zhí)行完后.才返回失敗值.
requisite
與required相似,但是如果這個模塊返回失敗,則立刻向應(yīng)用程序返回失敗,表示此類型失敗.
不再進行同類型后面的操作.
sufficient
如果此模塊返回成功,則直接向應(yīng)用程序返回成功,表示此類型成功.不再進行同類型后面的操作.如果失敗,也不會影響這個類型的返回值.
optional
使用這個標(biāo)記的模塊,將不進行成功與否的返回.一般返回一個PAM_IGNORE(忽略).
4.模塊路徑
模塊路徑.即要調(diào)用模塊的位置. 一般保存在/lib/security/下,如: pam_unix.so同一個模塊,可以出現(xiàn)在不同的類型中.它在不同的類型中所執(zhí)行的操作都不相同.這是由于每個模塊針對不同的模塊類型,編制了不同的執(zhí)行函數(shù).
5.模塊參數(shù)
模塊參數(shù),即傳遞給模塊的參數(shù).參數(shù)可以有多個,之間用空格分隔開,如:
password required pam_unix.so nullok obscure min=4 max=8 md5
三.編寫PAM配置文件
1.PAM模塊介紹
pam_unix.so模塊:
auth類型: 提示用戶輸入密碼,并與/etc/shadow文件相比對.匹配返回0(PAM_SUCCESS).
account類型: 檢查用戶的賬號信息(包括是否過期等).帳號可用時,返回0.
password類型: 修改用戶的密碼. 將用戶輸入的密碼,作為用戶的新密碼更新shadow文件pam_cracklib.so模塊:
password類型: 這個模塊可以插入到一個程序的密碼棧中,用于檢查密碼的強度.
這個模塊的動作是提示用戶輸入密碼,并與系統(tǒng)中的字典進行比對,檢查其強度.
pam_loginuid.so模塊:
session類型:用來設(shè)置已通過認(rèn)證的進程的uid.以使程序通過正常的審核(audit).
pam_securetty.so模塊:
auth類型: 如果用戶要以root登錄時,則登錄的tty必須在在/etc/securetty中法之前.
pam_rootok.so模塊:
auth類型: pam_rootok模塊用來認(rèn)證用戶id是否為0.為0返回”PAM_SUCCESS”.
pam_console.so模塊:
session類型: 當(dāng)用戶登錄到終端時,改變終端文件文件的權(quán)限.在用戶登出后,再將它們修改回來.
pam_permit.so模塊:
auth,account,password,session類型: pam_permit模塊任何時候都返回成功.
pam_env.so模塊 :
auth類型: pam_env允許設(shè)置環(huán)境變量.默認(rèn)下,若沒有指定文件,將依據(jù)/etc/security/pam_env.conf進行環(huán)境變量的設(shè)置.
pam_xauth.so模塊:
session類型: pam_xauth用來在用戶之間轉(zhuǎn)發(fā)xauth-key.
如果不進行pam_xauth,當(dāng)用戶調(diào)用su成為另一個用戶時,這個用戶將不可以再訪問原來用戶的X顯示,因為新用戶沒有訪問顯示的key.pam_xauth解決了當(dāng)會話建立時,從原始用戶到目標(biāo)用戶轉(zhuǎn)發(fā)key和用戶退出時銷毀key的問題.
實驗:
注銷/etc/pam.d/su中的"session optional /lib/security/$ISA/pam_xauth.so"行在桌面終端執(zhí)行su切換到另一個用戶時,執(zhí)行xterm會報錯,提示無法訪問DISPLAY.
刪除注釋后,再使用su切換到另一個用戶時,執(zhí)行xterm,會正常打開一個xterm終端窗口.
pam_stack.so模塊:
auth,account,password,session: pam_stack可以調(diào)用另一個服務(wù).也就是多個服務(wù)可以包含到一個設(shè)置中.當(dāng)需要修改時,只修改一個文件就可以了.
pam_warn.so模塊:
auth,account,password,session: pam_warn用來記錄服務(wù),終端,用戶,遠(yuǎn)程用戶和遠(yuǎn)程主機的信息到系統(tǒng)日志.模塊總是返回PAM_IGNORE,意指不希望影響到認(rèn)證處理.
2.編寫PAM配置文件
以root身份執(zhí)行: # vi /etc/pam.d/pamtest
#提示用戶輸入密碼
auth required pam_unix.so
# 驗證用戶賬號是否可用
account required pam_unix.so
# 向系統(tǒng)日志輸出一條信息
account required pam_warn.so
四.基于PAM機制的應(yīng)用程序
1.編寫C源碼
#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <security/pam_modules.h>
#include <stdio.h>
/* 文件pamtest.c
此程序從命令行接收一個用戶名作為參數(shù),然后對這個用戶名進行auth和account驗證.
*/
// 定義一個pam_conv結(jié)構(gòu),用于與pam通信
static struct pam_conv conv = {
misc_conv,
NULL
};
// 主函數(shù)
int main(int argc, char *argv[])
{
pam_handle_t *pamh=NULL;
int retval;
const char *user="nobody";
const char *s1=NULL;
if(argc == 2)
user = argv[1];
else
exit(1);
if(argc > 2) {
fprintf(stderr, "Usage: pamtest0 [username]\n");
exit(1);
}
printf("user: %s\n",user);
retval = 0;
//調(diào)用pamtest配置文件
retval = pam_start("pamtest", user, &conv, &pamh);
if (retval == PAM_SUCCESS)
//進行auth類型認(rèn)證
retval = pam_authenticate(pamh, 0); /* is user really user? */
else {
//如果認(rèn)證出錯,pam_strerror將輸出錯誤信息.
printf("pam_authenticate(): %d\n",retval);
s1=pam_strerror( pamh, retval);
printf("%s\n",s1);
}
if (retval == PAM_SUCCESS)
//進行account類型認(rèn)證
retval = pam_acct_mgmt(pamh, 0); /* permitted access? */
else {
printf("pam_acct_mgmt() : %d\n",retval);
s1=pam_strerror( pamh, retval);
printf("%s\n",s1);
}
/* This is where we have been authorized or not. */
if (retval == PAM_SUCCESS) {
fprintf(stdout, "Authenticated\n");
} else {
fprintf(stdout, "Not Authenticated\n");
}
if (pam_end(pamh,retval) != PAM_SUCCESS) { /* close Linux-PAM */
pamh = NULL;
fprintf(stderr, "pamtest0: failed to release authenticator\n");
exit(1);
}
return ( retval == PAM_SUCCESS ? 0:1 ); /* indicate success */
}
//END
2.編譯
$ cc -o pamtest pamtest.c -lpam -lpam_misc -ldl
3.編寫PAM配置文件
以root身份執(zhí)行: vi /etc/pam.d/pamtest
auth required /lib/security/pam_unix.so
account required /lib/security/pam_unix.so
4. 修改可執(zhí)行程序權(quán)限
由于pam_unix.so需要訪問/etc/shadow和/etc/passwd文件,所以要給pamtest文件附上SUID權(quán)限.
# chown root.root pamtest
# chmod 111 pamtest
# ls pamtest
# ls pamtest -hl
---s--x--x 1 root root 12K 2007-07-16 01:52 pamtest
5.執(zhí)行
pamtest程序通過pam_unix.so,先對用戶的密碼進行驗證,然后對用戶的賬號信息進行驗證.
以普通用戶身份執(zhí)行,輸入錯誤的maj密碼時.
maj@m2-u:01:52:09/var/tmp$ ./pamtest maj
user: maj
Password:
pam_acct_mgmt() : 7
Authentication failure
Not Authenticated
輸入正確的密碼時
maj@m2-u:01:54:44/var/tmp$ ./pamtest maj
user: maj
Password:
Authenticated
輸入錯誤的root密碼時
maj@m2-u:01:58:37/var/tmp$ ./pamtest root
user: root
Password:
pam_acct_mgmt() : 7
Authentication failure
Not Authenticated
maj@m2-u:01:59:15/var/tmp$
輸入正確的root密碼時
maj@m2-u:01:54:50/var/tmp$ ./pamtest root
user: root
Password:
Authenticated
maj@m2-u:01:58:37/var/tmp$
看完上述內(nèi)容,你們對LINUX PAM驗證機制是什么有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。