您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關LINUX PAM驗證機制是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
一.PAM簡介
Linux-PAM( linux可插入認證模塊)是一套共享庫,使本地系統管理員可以隨意選擇程序的認證方式.
換句話說,不用(重新編寫和)重新編譯一個包含PAM功能的應用程序,就可以改變它使用的認證機制.
這種方式下,就算升級本地認證機制,也不用修改程序.
PAM使用配置文件/etc/pam.conf(或/etc/pam.d/下的文件),來管理對程序的認證方式.應用程序調用相應的配置文件,從而調用本地的認證模塊.模塊放置在/lib/security下,以加載動態庫的形式進行調用(dlopen(3)).
像我們使用su命令時,系統會提示你輸入root用戶的密碼.這就是su命令通過調用PAM模塊實現的.
二. PAM的配置文件介紹
1.PAM配置文件的格式
PAM配置文件有兩種寫法: 一種是寫在/etc/pam.conf中.格式如下:
ftpd auth required pam_unix.so nullok
ftpd:表示服務名,即針對哪一個服務進行的認證配置.
required:為模塊類型.PAM有四中模塊類型,分別代表不同的任務類型.
pam_unix.so:為模塊路徑.即要調用模塊的位置.
nullok:為模塊參數,即傳遞給模塊的參數.
另一種寫法是,將PAM配置文件放到/etc/pam.d/目錄下,使用應用程序名作為配置文件名.如:
vsftpd,login等.配置文件的格式與pam.conf類似,只是少了最左邊的服務名列.如:/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有四種模塊類型,分別代表四種不同的任務.它們是:認證管理,賬號管理,會話管理和密碼管理.一個類型可能有多行,它們按順序依次由PAM模塊調用.
auth
用來對用戶的身份進行識別.如:提示用戶輸入密碼,或判斷用戶是否為root等.
account
對帳號的各項屬性進行檢查.如:是否允許登錄,是否達到最大用戶數,或是root用戶是否允許在這個終端登錄等.
session
這個模塊用來定義用戶登錄前的,及用戶退出后所要進行的操作.如:登錄連接信息,用戶數據的打開與關閉,掛載文件系統等.
password
使用用戶信息來更新.如:修改用戶密碼.
3.PAM的控制標記
PAM使用控制標記來處理和判斷各個模塊的返回值.
required
這個標記表示需要模塊返回一個成功值.如果返回失敗,則繼續進行同類型的下一個操作,當所有此類型的模塊都執行完后.才返回失敗值.
requisite
與required相似,但是如果這個模塊返回失敗,則立刻向應用程序返回失敗,表示此類型失敗.
不再進行同類型后面的操作.
sufficient
如果此模塊返回成功,則直接向應用程序返回成功,表示此類型成功.不再進行同類型后面的操作.如果失敗,也不會影響這個類型的返回值.
optional
使用這個標記的模塊,將不進行成功與否的返回.一般返回一個PAM_IGNORE(忽略).
4.模塊路徑
模塊路徑.即要調用模塊的位置. 一般保存在/lib/security/下,如: pam_unix.so同一個模塊,可以出現在不同的類型中.它在不同的類型中所執行的操作都不相同.這是由于每個模塊針對不同的模塊類型,編制了不同的執行函數.
5.模塊參數
模塊參數,即傳遞給模塊的參數.參數可以有多個,之間用空格分隔開,如:
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類型: 這個模塊可以插入到一個程序的密碼棧中,用于檢查密碼的強度.
這個模塊的動作是提示用戶輸入密碼,并與系統中的字典進行比對,檢查其強度.
pam_loginuid.so模塊:
session類型:用來設置已通過認證的進程的uid.以使程序通過正常的審核(audit).
pam_securetty.so模塊:
auth類型: 如果用戶要以root登錄時,則登錄的tty必須在在/etc/securetty中法之前.
pam_rootok.so模塊:
auth類型: pam_rootok模塊用來認證用戶id是否為0.為0返回”PAM_SUCCESS”.
pam_console.so模塊:
session類型: 當用戶登錄到終端時,改變終端文件文件的權限.在用戶登出后,再將它們修改回來.
pam_permit.so模塊:
auth,account,password,session類型: pam_permit模塊任何時候都返回成功.
pam_env.so模塊 :
auth類型: pam_env允許設置環境變量.默認下,若沒有指定文件,將依據/etc/security/pam_env.conf進行環境變量的設置.
pam_xauth.so模塊:
session類型: pam_xauth用來在用戶之間轉發xauth-key.
如果不進行pam_xauth,當用戶調用su成為另一個用戶時,這個用戶將不可以再訪問原來用戶的X顯示,因為新用戶沒有訪問顯示的key.pam_xauth解決了當會話建立時,從原始用戶到目標用戶轉發key和用戶退出時銷毀key的問題.
實驗:
注銷/etc/pam.d/su中的"session optional /lib/security/$ISA/pam_xauth.so"行在桌面終端執行su切換到另一個用戶時,執行xterm會報錯,提示無法訪問DISPLAY.
刪除注釋后,再使用su切換到另一個用戶時,執行xterm,會正常打開一個xterm終端窗口.
pam_stack.so模塊:
auth,account,password,session: pam_stack可以調用另一個服務.也就是多個服務可以包含到一個設置中.當需要修改時,只修改一個文件就可以了.
pam_warn.so模塊:
auth,account,password,session: pam_warn用來記錄服務,終端,用戶,遠程用戶和遠程主機的信息到系統日志.模塊總是返回PAM_IGNORE,意指不希望影響到認證處理.
2.編寫PAM配置文件
以root身份執行: # vi /etc/pam.d/pamtest
#提示用戶輸入密碼
auth required pam_unix.so
# 驗證用戶賬號是否可用
account required pam_unix.so
# 向系統日志輸出一條信息
account required pam_warn.so
四.基于PAM機制的應用程序
1.編寫C源碼
#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <security/pam_modules.h>
#include <stdio.h>
/* 文件pamtest.c
此程序從命令行接收一個用戶名作為參數,然后對這個用戶名進行auth和account驗證.
*/
// 定義一個pam_conv結構,用于與pam通信
static struct pam_conv conv = {
misc_conv,
NULL
};
// 主函數
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;
//調用pamtest配置文件
retval = pam_start("pamtest", user, &conv, &pamh);
if (retval == PAM_SUCCESS)
//進行auth類型認證
retval = pam_authenticate(pamh, 0); /* is user really user? */
else {
//如果認證出錯,pam_strerror將輸出錯誤信息.
printf("pam_authenticate(): %d\n",retval);
s1=pam_strerror( pamh, retval);
printf("%s\n",s1);
}
if (retval == PAM_SUCCESS)
//進行account類型認證
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身份執行: vi /etc/pam.d/pamtest
auth required /lib/security/pam_unix.so
account required /lib/security/pam_unix.so
4. 修改可執行程序權限
由于pam_unix.so需要訪問/etc/shadow和/etc/passwd文件,所以要給pamtest文件附上SUID權限.
# 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.執行
pamtest程序通過pam_unix.so,先對用戶的密碼進行驗證,然后對用戶的賬號信息進行驗證.
以普通用戶身份執行,輸入錯誤的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$
看完上述內容,你們對LINUX PAM驗證機制是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。