溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

LINUX PAM驗證機制是什么

發(fā)布時間:2021-10-22 11:01:05 來源:億速云 閱讀:142 作者:柒染 欄目:云計算

今天就跟大家聊聊有關(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è)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(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)容。

AI