#include
#include
#include
/* 文件pamtest.c

此程序從命令行接收一個用戶名作為參數(shù),然后對這個用戶名進行auth和account驗證

*/
// 定義一個pam_conv結構,用于與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]
");
               exit(1);
           }
    printf("user: %s
",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
",retval);
     s1=pam_strerror( pamh, retval);
     printf("%s
",s1);
  }
           if (retval == PAM_SUCCESS)

//進行account類型認證
               retval = pam_acct_mgmt(pamh, 0);       /* permitted access? */
    else {
     printf("pam_acct_mgmt() : %d
",retval);
     s1=pam_strerror( pamh, retval);
     printf("%s
",s1);
  }
           /* This is where we have been authorized or not. */

           if (retval == PAM_SUCCESS) {
               fprintf(stdout, "Authenticated
");
           } else {
               fprintf(stdout, "Not Authenticated
");
           }

           if (pam_end(pamh,retval) != PAM_SUCCESS) {     /* close Linux-PAM */
               pamh = NULL;
               fprintf(stderr, "pamtest0: failed to release authenticator
");
               exit(1);
           }

           return ( retval == PAM_SUCCESS ? 0:1 );       /* indicate success */
       }
//END

2.編譯

$ cc -o pamtest pamtest.c -lpam -lpam_misc -ldl

3.編寫PAM配置文件

以root身份編輯/etc/pam.d/pamtest,并添加下面內容:

auth  required  /lib/security/pam_unix.so
account required /lib/security/pam_unix.so

4. 修改可執(zhí)行程序權限

由于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.執(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$

分享到

多易

相關推薦