Ò»¡¢PAMµÄ½á¹¹
ϵͳ¹ÜÀíԱͨ¹ýPAMÅäÖÃÎļþÀ´Öƶ¨ÈÏÖ¤²ßÂÔ£¬¼´Ö¸¶¨Ê²Ã´·þÎñ¸Ã²ÉÓÃʲôÑùµÄÈÏÖ¤·½·¨£»Ó¦ÓóÌÐò¿ª·¢Õßͨ¹ýÔÚ·þÎñ³ÌÐòÖÐʹÓÃPAM API¶øÊµÏÖ¶ÔÈÏÖ¤·½·¨µÄµ÷Óã»¶øPAM·þÎñÄ£¿é£¨service module£©µÄ¿ª·¢ÕßÔòÀûÓÃPAM SPI£¨Service Module API£©À´±àдÈÏ֤ģ¿é£¨Ö÷ ÒªÊÇÒý³öһЩº¯Êýpam_sm_xxxx( )¹©libpamµ÷Óã©£¬½«²»Í¬µÄÈÏÖ¤»úÖÆ£¨±ÈÈ紫ͳµÄUNIXÈÏÖ¤·½·¨¡¢KerberosµÈ£©¼ÓÈ뵽ϵͳÖУ»PAMºË ÐĿ⣨libpam£©Ôò¶ÁÈ¡ÅäÖÃÎļþ£¬ÒÔ´ËΪ¸ù¾Ý½«·þÎñ³ÌÐòºÍÏàÓ¦µÄÈÏÖ¤·½·¨ÁªÏµÆðÀ´¡£
¶þ¡¢PAMÖ§³ÖµÄËÄÖÖ¹ÜÀí½çÃæ£º
1¡¢ÈÏÖ¤¹ÜÀí£¨authentication management£©
Ö÷ÒªÊǽÓÊÜÓû§ÃûºÍÃÜÂ룬½ø¶ø¶Ô¸ÃÓû§µÄÃÜÂë½øÐÐÈÏÖ¤£¬²¢¸ºÔðÉèÖÃÓû§µÄÒ»Ð©ÃØÃÜÐÅÏ¢¡£
2¡¢ÕÊ»§¹ÜÀí£¨account management£©
Ö÷ÒªÊǼì²éÕÊ»§ÊÇ·ñ±»ÔÊÐíµÇ¼ϵͳ£¬ÕʺÅÊÇ·ñÒѾ¹ýÆÚ£¬ÕʺŵĵǼÊÇ·ñÓÐʱ¼ä¶ÎµÄÏÞÖÆµÈµÈ¡£
3¡¢ÃÜÂë¹ÜÀí£¨password management£©
Ö÷ÒªÊÇÓÃÀ´ÐÞ¸ÄÓû§µÄÃÜÂë¡£
4¡¢»á»°¹ÜÀí£¨session management£©
Ö÷ÒªÊÇÌṩ¶Ô»á»°µÄ¹ÜÀíºÍ¼ÇÕË£¨accounting£©¡£
Èý¡¢PAMµÄÎļþ£º
/usr/lib/libpam.so.* PAMºËÐÄ¿â
/etc/pam.conf»òÕß/etc/pam.d/ PAMÅäÖÃÎļþ
/usr/lib/security/pam_*.so ¿É¶¯Ì¬¼ÓÔØµÄPAM service module
¶ÔÓÚRedHat£¬ÆäĿ¼²»ÊÇ/usr/lib£¬¶øÊÇ/lib¡£
ËÄ¡¢PAMµÄÅäÖãº
PAMµÄÅäÖÃÊÇͨ¹ýµ¥¸öÅäÖÃÎļþ/etc/pam.conf¡£RedHat»¹Ö§³ÖÁíÍâÒ»ÖÖÅäÖ÷½Ê½£¬¼´Í¨¹ýÅäÖÃĿ¼/etc/pam.d/£¬ÇÒÕâÖÖµÄÓÅÏȼ¶Òª¸ßÓÚµ¥ ¸öÅäÖÃÎļþµÄ·½Ê½¡£
1¡¢Ê¹ÓÃÅäÖÃÎļþ/etc/pam.conf
¸ÃÎļþÊÇÓÉÈçϵÄÐÐËù×é³ÉµÄ£º
service-name module-type control-flag module-path arguments
service-name ·þÎñµÄÃû×Ö£¬±ÈÈçtelnet¡¢login¡¢ftpµÈ£¬·þÎñÃû×Ö¡°OTHER¡±´ú±íËùÓÐûÓÐÔÚ¸ÃÎļþÖÐÃ÷È·ÅäÖÃµÄÆäËü·þÎñ¡£
module-type Ä£¿éÀàÐÍÓÐËÄÖÖ£ºauth¡¢account¡¢session¡¢password£¬¼´¶ÔÓ¦PAMËùÖ§³ÖµÄËÄÖÖ¹ÜÀí·½Ê½¡£Í¬Ò»¸ö·þÎñ¿ÉÒÔµ÷Óöà¸ö PAMÄ£¿é½øÐÐÈÏÖ¤£¬ÕâЩģ¿é¹¹³ÉÒ»¸östack¡£
control-flag ÓÃÀ´¸æËßPAM¿â¸ÃÈçºÎ´¦ÀíÓë¸Ã·þÎñÏà¹ØµÄPAMÄ£¿éµÄ³É¹¦»òʧ°ÜÇé¿ö¡£ËüÓÐËÄÖÖ¿ÉÄÜµÄ Öµ£ºrequired£¬requisite£¬sufficient£¬optional¡£
required ±íʾ±¾Ä£¿é±ØÐë·µ»Ø³É¹¦²ÅÄÜͨ¹ýÈÏÖ¤£¬µ«ÊÇÈç¹û¸ÃÄ£¿é·µ»ØÊ§°ÜµÄ»°£¬Ê§°Ü½á¹ûÒ²²»»áÁ¢¼´Í¨ÖªÓû§£¬¶øÊÇÒªµÈµ½Í¬Ò»stack ÖеÄËùÓÐÄ£¿éÈ«²¿Ö´ÐÐÍê±ÏÔÙ½«Ê§°Ü½á¹û·µ»Ø¸øÓ¦ÓóÌÐò¡£¿ÉÒÔÈÏΪÊÇÒ»¸ö±ØÒªÌõ¼þ¡£
requisite ÓërequiredÀàËÆ£¬¸ÃÄ£¿é±ØÐë·µ»Ø³É¹¦²ÅÄÜͨ¹ýÈÏÖ¤£¬µ«ÊÇÒ»µ©¸ÃÄ£¿é·µ»ØÊ§°Ü£¬½«²»ÔÙÖ´ÐÐͬһstackÄÚµÄÈκÎÄ£¿é£¬¶øÊÇÖ± ½Ó½«¿ØÖÆÈ¨·µ»Ø¸øÓ¦ÓóÌÐò¡£ÊÇÒ»¸ö±ØÒªÌõ¼þ¡£×¢£ºÕâÖÖÖ»ÓÐRedHatÖ§³Ö£¬Solaris²»Ö§³Ö¡£
sufficient ±íÃ÷±¾Ä£¿é·µ»Ø³É¹¦ÒѾ×ãÒÔͨ¹ýÉí·ÝÈÏÖ¤µÄÒªÇ󣬲»±ØÔÙÖ´ÐÐͬһstackÄ򵀮äËüÄ£¿é£¬µ«ÊÇÈç¹û±¾Ä£¿é·µ»ØÊ§°ÜµÄ»°¿ÉÒÔ ºöÂÔ¡£¿ÉÒÔÈÏΪÊÇÒ»¸ö³ä·ÖÌõ¼þ¡£
optional±íÃ÷±¾Ä£¿éÊÇ¿ÉÑ¡µÄ£¬ËüµÄ³É¹¦Óë·ñÒ»°ã²»»á¶ÔÉí·ÝÈÏÖ¤Æð¹Ø¼ü×÷Óã¬Æä·µ»ØÖµÒ»°ã±»ºöÂÔ¡£
¶ÔÓÚcontrol-flag£¬´ÓLinux-PAM-0.63°æ±¾Æð£¬Ö§³ÖÒ»ÖÖеÄÓï·¨£¬¾ßÌå¿É²Î¿´Linux PAMÎĵµ¡£
module-path ÓÃÀ´Ö¸Ã÷±¾Ä£¿é¶ÔÓ¦µÄ³ÌÐòÎļþµÄ·¾¶Ãû£¬Ò»°ã²ÉÓþø¶Ô·¾¶£¬Èç¹ûûÓиø³ö¾ø¶Ô·¾¶£¬Ä¬ÈϸÃÎļþÔÚĿ¼/usr/lib/securityÏÂ Ãæ¡£
arguments ÊÇÓÃÀ´´«µÝ¸ø¸ÃÄ£¿éµÄ²ÎÊý¡£Ò»°ãÀ´ËµÃ¿¸öÄ£¿éµÄ²ÎÊý¶¼²»Ïàͬ£¬¿ÉÒÔÓɸÃÄ£¿éµÄ¿ª·¢Õß×Ô¼º¶¨Ò壬µ«ÊÇÒ²ÓÐÒÔϼ¸¸ö¹²Í¬ µÄ²ÎÊý£º
debug ¸ÃÄ£¿éÓ¦µ±ÓÃsyslog( )½«µ÷ÊÔÐÅϢдÈ뵽ϵͳÈÕÖ¾ÎļþÖС£
no_warn ±íÃ÷¸ÃÄ£¿é²»Ó¦°Ñ¾¯¸æÐÅÏ¢·¢Ë͸øÓ¦ÓóÌÐò¡£
use_first_pass ±íÃ÷¸ÃÄ£¿é²»ÄÜÌáʾÓû§ÊäÈëÃÜÂ룬¶øÓ¦Ê¹ÓÃǰһ¸öÄ£¿é´ÓÓû§ÄÇÀïµÃµ½µÄÃÜÂë¡£
try_first_pass ±íÃ÷¸ÃÄ£¿éÊ×ÏÈÓ¦µ±Ê¹ÓÃǰһ¸öÄ£¿é´ÓÓû§ÄÇÀïµÃµ½µÄÃÜÂ룬Èç¹û¸ÃÃÜÂëÑéÖ¤²»Í¨¹ý£¬ÔÙÌáʾÓû§ÊäÈëеÄÃÜÂë¡£
use_mapped_pass ¸ÃÄ£¿é²»ÄÜÌáʾÓû§ÊäÈëÃÜÂ룬¶øÊÇʹÓÃÓ³Éä¹ýµÄÃÜÂë¡£
expose_account ÔÊÐí¸ÃÄ£¿éÏÔʾÓû§µÄÕʺÅÃûµÈÐÅÏ¢£¬Ò»°ãÖ»ÄÜÔÚ°²È«µÄ»·¾³ÏÂʹÓã¬ÒòΪй©Óû§Ãû»á¶Ô°²È«Ôì³ÉÒ»¶¨³Ì¶ÈµÄÍþ в¡£
2¡¢Ê¹ÓÃÅäÖÃĿ¼/etc/pam.d/£¨Ö»ÊÊÓÃÓÚRedHat Linux£©
¸ÃĿ¼ÏµÄÿ¸öÎļþµÄÃû×Ö¶ÔÓ¦·þÎñÃû£¬ÀýÈçftp·þÎñ¶ÔÓ¦Îļþ/etc/pam.d/ftp¡£Èç¹ûÃûΪxxxxµÄ·þÎñËù¶ÔÓ¦µÄÅäÖÃÎļþ/etc/pam.d/xxxx²»´æ ÔÚ£¬Ôò¸Ã·þÎñ½«Ê¹ÓÃĬÈϵÄÅäÖÃÎļþ/etc/pam.d/other¡£Ã¿¸öÎļþÓÉÈçϸñʽµÄÎı¾ÐÐËù¹¹³É£º
module-type control-flag module-path arguments
ÿ¸ö×ֶεĺ¬ÒåºÍ/etc/pam.confÖеÄÏàͬ¡£
3¡¢ÅäÖõÄÀý×Ó
ÀýÒ»£ºÓÃ/etc/pam.confÅäÖÃĬÈϵÄÈÏÖ¤·½Ê½¡£
ÏÂÃæµÄÀý×Ó½«¾Ü¾øËùÓÐûÓÐÔÚ/etc/pam.confÖÐÃ÷È·ÅäÖõķþÎñ¡£OTHER´ú±íûÓÐÃ÷È·ÅäÖÃµÄÆäËüËùÓзþÎñ£¬pam_denyÄ£¿éµÄ×÷ÓÃÖ»ÊǼò µ¥µØ¾Ü¾øÍ¨¹ýÈÏÖ¤¡£
[code]OTHER auth required /usr/lib/security/pam_deny.so
OTHER account required /usr/lib/security/pam_deny.so
OTHER password required /usr/lib/security/pam_deny.so
OTHER session required /usr/lib/security/pam_deny.so[/code]
Àý¶þ£ºÍ¨¹ý/etc/pam.d/rshÎļþÅäÖÃrsh·þÎñµÄÈÏÖ¤·½Ê½¡£
rsh·þÎñÈÏÖ¤Óû§Ê±£¬ÏÈʹÓÃ/etc/hosts.equivºÍ.rhostsÎļþµÄÈÏÖ¤·½Ê½£¬È»ºóÔÙ¸ù¾Ý/etc/nologinÎļþµÄ´æÔÚÓë·ñÀ´ÅжÏÊÇ·ñÔÊÐí¸ÃÓû§Ê¹Óà rsh£¬×îºóʹÓÃpassword databaseÀ´ÈÏÖ¤Óû§¡£
[code]auth required /lib/security/pam_rhosts_auth.so
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
session required /lib/security/pam_pwdb.so[/code]
ÀýÈý£ºÍ¨¹ý/etc/pam.confÅäÖÃftpdµÄÈÏÖ¤·½Ê½¡£
ÏÂÃæÊÇftpd·þÎñÀûÓÃPAMÄ£¿é½øÐÐÓû§ÈÏÖ¤µÄÈý¸ö²½Öè¡£Ê×ÏÈÓÃpam_ftpÄ£¿é¼ì²éµ±Ç°Óû§ÊÇ·ñΪÄäÃûÓû§£¬Èç¹ûÊÇÄäÃûÓû§£¬Ôò sufficient¿ØÖƱêÖ¾±íÃ÷ÎÞÐèÔÙ½øÐкóÃæµÄÈÏÖ¤²½Ö裬ֱ½Óͨ¹ýÈÏÖ¤£»·ñÔò¼ÌÐøÊ¹ÓÃpam_unix_authÄ£¿éÀ´½øÐбê×¼µÄunixÈÏÖ¤£¬¼´ÓÃ/etc/ passwdºÍ/etc/shadow½øÐÐÈÏÖ¤£»Í¨¹ýÁËpam_unix_authÄ£¿éµÄÈÏÖ¤Ö®ºó£¬»¹Òª¼ÌÐøÓÃpam_listfileÄ£¿éÀ´¼ì²é¸ÃÓû§ÊÇ·ñ³öÏÖÔÚÎļþ/etc/ ftpusersÖУ¬Èç¹ûÊÇÔò¸ÃÓû§±»denyµô¡£
[code]ftpd auth sufficient /usr/lib/security/pam_ftp.so
ftpd auth required /usr/lib/security/pam_unix_auth.so use_first_pass
ftpd auth required /usr/lib/security/pam_listfile.so \
onerr=succeed item=user sense=deny file=/etc/ftpusers[/code]
Îå¡¢ÃÜÂëÓ³É䣨password-mapping£©
ÃÜÂëÓ³ÉäÔÊÐíÓû§ÔÚ²»Í¬µÄÈÏÖ¤»úÖÆÏÂʹÓò»Í¬µÄÃÜÂ룬ÆäÖÐÓÐÒ»¸öÖ÷ÃÜÂ루primary password£©£¬ÆäËüÃÜÂëΪ´ÎÃÜÂ루secondary passwords£¬¿ÉÄÜÓжà¸ö£©¡£Ö÷ÃÜÂëÓÃÀ´¶Ô´ÎÃÜÂë½øÐмÓÃÜ¡£ÔÚÖ÷ÃÜÂëÈÏ֤ͨ¹ýºó£¬ÈÏ֤ģ¿éÀûÓÃÖ÷ÃÜÂ뽫¼ÓÃܹýµÄ´ÎÃÜÂ루Ҳ³ÆÎª mapped password£©½âÃÜ£¬²¢¶Ô´ÎÃÜÂë½øÐÐÈÏÖ¤¡£
×¢£ºÈç¹ûʹÓÃÁËÒ»´ÎÐÔÃÜÂëµÄ»úÖÆ£¬¾Í²»Ê¹ÓÃÃÜÂëÓ³Éä¡£
ËùÓзþÎñÄ£¿é±ØÐëÖ§³ÖÈçÏÂ4¸öÓ³ÉäÑ¡ÏÔÚµÚËIJ¿·ÖÒѾ¼òµ¥½âÊ͹ý£©£º
1¡¢use_first_pass
Õâ¸öÑ¡Ïîָʾ±¾Ä£¿é²»ÄÜÌáʾÓû§ÊäÈëÃÜÂ룬¶øÊÇʹÓÃÒÑÓеÄÃÜÂ룬¼´´ÓµÚÒ»¸öÏòÓû§ÌáʾÊäÈëÃÜÂëµÄÄ£¿éÄÇÀïÈ¡µÃÃÜÂ룬²¢¶Ô¸ÃÃÜÂë½ø ÐÐÈÏÖ¤¡£
2¡¢try_first_pass
Õâ¸öÑ¡Ïîָʾ±¾Ä£¿éÊ×Ïȳ¢ÊÔʹÓÃÒÑÓеÄÃÜÂ룬¼´´ÓµÚÒ»¸öÏòÓû§ÌáʾÊäÈëÃÜÂëµÄÄ£¿éÄÇÀïÈ¡µÃÃÜÂ룬²¢¶Ô¸ÃÃÜÂë½øÐÐÈÏÖ¤¡£Èç¹ûÃÜÂëÈÏ Ö¤Ê§°Ü£¬ÔòÔÙÌáʾÓû§ÊäÈëÃÜÂë¡£
3¡¢use_mapped_pass
Õâ¸öÑ¡Ïîָʾ±¾Ä£¿é²»ÄÜÏòÓû§ÌáʾÊäÈëÃÜÂ룬¶øÓ¦Ê¹ÓÃÓ³Éä¹ýµÄÃÜÂ룬¼´ÀûÓÃÖ÷ÃÜÂ뽫¼ÓÃܹýµÄ´ÎÃÜÂë½âÃܳöÀ´²¢½øÐÐÈÏÖ¤¡£
4¡¢try_mapped_pass
Õâ¸öÑ¡Ïîָʾ±¾Ä£¿éÊ×Ïȳ¢ÊÔʹÓÃÓ³Éä¹ýµÄÃÜÂ룬¼´ÀûÓÃÖ÷ÃÜÂ뽫¼ÓÃܹýµÄ´ÎÃÜÂë½âÃܳöÀ´²¢½øÐÐÈÏÖ¤¡£Èç¹ûÃÜÂëÈÏ֤ʧ°Ü£¬ÔòÔÙÌáʾÓà »§ÊäÈëÃÜÂë¡£
ÃÜÂëÓ³ÉäµÄÀý×Ó£º
ÏÂÃæÊÇ/etc/pam.confÖйØÓÚlogin·þÎñµÄÅäÖá£ÕâÀïlogin¹²ÓÐ3ÖÖÈÏÖ¤»úÖÆ£ºKerberos¡¢UNIXºÍRSAÈÏÖ¤£¬Á½¸örequired¿ØÖƱêÖ¾±íÃ÷Óû§±Ø Ðëͨ¹ýKerberosÈÏÖ¤ºÍUNIXÈÏÖ¤²ÅÄÜʹÓÃlogin·þÎñ£¬optionalÑ¡ÏîÔò˵Ã÷RSAÈÏÖ¤ÊÇ¿ÉÑ¡µÄ¡£Ê×ÏÈÓû§ÊäÈëÖ÷ÃÜÂë½øÐÐKerberosÈÏ Ö¤£»use_mapped_passÑ¡ÏîָʾUNIXÈÏ֤ģ¿éÀûÓÃÖ÷ÃÜÂ뽫ÓÃÓÚUNIXÈÏÖ¤µÄ´ÎÃÜÂë½âÃܳöÀ´²¢¶Ô¸Ã´ÎÃÜÂë½øÐÐÈÏÖ¤£»try_first_passÑ¡Ïî ָʾRSAÈÏ֤ģ¿éÏÈʹÓõÚÒ»¸öÄ£¿é£¨¼´KerberosÄ£¿é£©µÄÃÜÂë×÷Ϊ½øÐÐÈÏÖ¤µÄÃÜÂ룬µ±¶Ô¸ÃÃÜÂëÈÏ֤ʧ°Üʱ²ÅÌáʾÓû§ÊäÈëÓÃÓÚRSAÈÏ Ö¤µÄ´ÎÃÜÂë¡£
[code]login auth required pam_kerb_auth.so debug
login auth required pam_unix_auth.so use_mapped_pass
login auth optional pam_rsa_auth.so try_first_pass[/code]
Áù¡¢PAM API
1¡¢¿ò¼ÜAPI£º
ÈκÎÒ»¸öÖ§³ÖPAMµÄ·þÎñ³ÌÐòÔÚ½øÐÐÈÏ֤ʱ±ØÐëÒÔpam_start()¿ªÊ¼½øÐгõʼ»¯£¬×îºóÒÔpam_end()½áÊøÒÔ±ã½øÐÐÇåÀí¹¤×÷¡£
2¡¢ÈÏÖ¤¹ÜÀíAPI£º
pam_authenticate( )¶ÔÓû§Ãû/ÃÜÂë½øÐÐÈÏÖ¤¡£
pam_setcred( )ÓÃÀ´ÐÞ¸ÄÓû§µÄÃØÃÜÐÅÏ¢¡£
3¡¢ÕÊ»§¹ÜÀíAPI£º
pam_acct_mgmt( )¼ì²éÕÊ»§±¾ÉíÊÇ·ñÓÐȨÏ޵Ǽϵͳ¡¢ÕÊ»§ÊÇ·ñ¹ýÆÚ¡¢ÕÊ»§ÊÇ·ñÓеǼʱ¼äÏÞÖÆµÈ¡£
4¡¢ÃÜÂë¹ÜÀíAPI£º
pam_chauthtok( )ÐÞ¸ÄÓû§µÄÃÜÂë¡£
5¡¢»á»°¹ÜÀíAPI£º
Ò»¸ö»á»°ÒÔpam_open_session( )¿ªÊ¼£¬×îºóÒÔpam_close_session( )½áÊø¡£
6¡¢ÆäËü£º
pam_get_item( )¡¢pam_set_item( )ÓÃÀ´¶ÁдPAMÊÂÎñ(transaction)µÄ״̬ÐÅÏ¢¡£
pam_get_data( )¡¢pam_set_data( )ÓÃÀ´È¡µÃºÍÉèÖÃPAMÄ£¿é¼°»á»°µÄÏà¹ØÐÅÏ¢¡£
pam_putenv( )¡¢pam_getenv( )¡¢pam_getenvlist( )ÓÃÀ´¶Áд»·¾³±äÁ¿¡£
pam_strerror( )·µ»ØÏà¹ØµÄ´íÎóÐÅÏ¢¡£
Àý×Ó³ÌÐò£¨Õª×ÔSunµÄ°×ƤÊ飩£º
ÏÂÃæµÄÀý×ÓʹÓÃPAM APIдÁËÒ»¸ö¼òµ¥µÄlogin·þÎñ³ÌÐò£¨×¢£ºÕâ²»ÊǸöÍêÕûµÄ³ÌÐò£¬ËùÒÔÊ¡ÂÔÁ˶Ôpam_close_sessionµÄµ÷Óã©¡£
ÒýÓÃ:#include
/* »Øµ÷º¯Êý */
static int login_conv(int num_msg, struct pam_message **msg, struct pam_response **response, void *appdata_ptr);
struct pam_conv pam_conv = {login_conv, NULL};
pam_handle_t *pamh; /* ½øÐÐÈÏÖ¤µÄPAM¾ä±ú */
void main(int argc, char *argv[], char **renvp)
{
/* ³õʼ»¯£¬²¢Ìṩһ¸ö»Øµ÷º¯Êý */
if ((pam_start("login", user_name, &pam_conv, &pamh)) != PAM_SUCCESS)
login_exit(1);
/* ÉèÖÃһЩ²ÎÊý */
pam_set_item(pamh, PAM_TTY, ttyn);
pam_set_item(pamh, PAM_RHOST, remote_host);
while (!authenticated && retry < MAX_RETRIES)
{
status = pam_authenticate(pamh, 0); /* ÃÜÂëÈÏÖ¤¹ÜÀí£¬¼ì²éÓû§ÊäÈëµÄÃÜÂëÊÇ·ñÕýÈ· */
authenticated = (status == PAM_SUCCESS);
}
if (status != PAM_SUCCESS)
{
fprintf(stderr,"error: %s\n", pam_strerror(pamh, status)); /* ÏÔʾ´íÎóÔÒò */
login_exit(1);
}
/* ͨ¹ýÁËÃÜÂëÈÏÖ¤Ö®ºóÔÙµ÷ÓÃÕÊ»§¹ÜÀíAPI£¬¼ì²éÓû§ÕʺÅÊÇ·ñÒѾ¹ýÆÚ */
if ((status = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS)
{
if (status == PAM_AUTHTOK_EXPIRED)
{
status = pam_chauthtok(pamh, 0); /* ¹ýÆÚÔòÒªÇóÓû§¸ü¸ÄÃÜÂë */
if (status != PAM_SUCCESS)
login_exit(1);
}
}
/* ͨ¹ýÕÊ»§¹ÜÀí¼ì²éÖ®ºóÔò´ò¿ª»á»° */
if (status = pam_open_session(pamh, 0) != PAM_SUCCESS)
login_exit(status);
/* ÉèÖÃÓû§×é */
setgid(pwd->pw_gid);
/*
* Initialize the supplementary group access list before
* pam_setcred because PAM modules might add groups
* during the pam_setcred call
*/
initgroups(user_name, pwd->pw_gid);
status = pam_setcred(pamh, PAM_ESTABLISH_CRED);
if (status != PAM_SUCCESS)
login_exit(status);
/* ÉèÖÃÕæÊµµÄÓû§ID£¨»òÕßÓÐЧµÄÓû§ID£©*/
setuid(pwd->pw_uid);
pam_end(pamh, PAM_SUCCESS); /* PAMÊÂÎñµÄ½áÊø */
/*
´Ë´¦¿ÉÓÃÀ´ÊµÏÖÓëloginÓÐ¹ØµÄÆäËüÄÚÈÝ
*/
}
/* ³ö´íÔòÇåÀíÏÖ³¡²¢Í˳ö */
static void login_exit(int exit_code)
{
if (pamh)
pam_end(pamh, PAM_ABORT);
exit(exit_code);
}
/* Õâ¸ö»Øµ÷º¯Êý±»PAMÈÏ֤ģ¿éµ÷ÓÃÒÔ±ãÏÔʾ´íÎóÐÅÏ¢»òÕß»òÕßÓÃÀ´È¡µÃÓû§ÊäÈ룬²ÉÓÃͼÐνçÃæµÄ·þÎñ³ÌÐòÔòӦʹÓÃͼÐνçÃæÀ´È¡µÃ Óû§ÊäÈë»òÏÔʾÌáʾÐÅÏ¢*/
int login_conv(int num_msg, struct pam_message **msg, struct pam_response **response, void *appdata_ptr)
{
while (num_msg--)
{
switch (m->msg_style)
{
case PAM_PROMPT_ECHO_OFF:
r->resp = strdup(getpass(m->msg));
break;
case PAM_PROMPT_ECHO_ON:
(void) fputs(m->msg, stdout);
r->resp = malloc(PAM_MAX_RESP_SIZE);
fgets(r->resp, PAM_MAX_RESP_SIZE, stdin);
/* add code here to remove \n from fputs */
break;
case PAM_ERROR_MSG:
(void) fputs(m->msg, stderr);
break;
case PAM_TEXT_INFO:
(void) fputs(m->msg, stdout);
break;
default:
log_error();
break;
}
}
return (PAM_SUCCESS);
}
Æß¡¢PAM SPI
µ±·þÎñ³ÌÐò£¨ftpd¡¢telnetdµÈ£©µ÷ÓÃPAM APIº¯Êýpam_xxx( )ʱ£¬ÓÉPAM ¿ò¼Ü£¨libpam£©¸ù¾Ý¸Ã·þÎñÔÚ/etc/pam.confÎļþÖеÄÅäÖõ÷ÓÃÖ¸ ¶¨µÄPAMÄ£¿éÖжÔÓ¦µÄSPIº¯Êýpam_sm_xxx( )¡£ÈçÏ£º
APIº¯ÊýµÄÃû×ÖΪpam_xxx()£¬¶ÔÓ¦µÄSPIº¯ÊýµÄÃû×ÖΪpam_sm_xxx()£¬¼´Ã¿¸ö·þÎñÄ£¿éÐèÒªÒý³öÏàÓ¦µÄº¯ÊýÒÔ¹©libpamµ÷Óá£Îª·½±ã¶ÔÕÕ£¬ÔÙÁÐһϡ£
[code]API ¶ÔÓ¦µÄ SPI
ÕʺŹÜÀí pam_acct_mgmt( ) pam_sm_acct_mgmt( )
ÈÏÖ¤¹ÜÀí pam_authenticate( ) pam_sm_authenticate( )
ÃÜÂë¹ÜÀí pam_chauthtok( ) pam_sm_chauthtok( )
»á»°¹ÜÀí pam_open_session( ) pam_sm_open_session( )
»á»°¹ÜÀí pam_close_session( ) pam_sm_close_session( )
ÈÏÖ¤¹ÜÀí pam_setcred( ) pam_sm_setcred( )[/code]
°Ë¡¢³£ÓõÄPAM·þÎñÄ£¿é
ÏÂÃæÊÇLinuxÌṩµÄPAMÄ£¿éÁÐ±í£¨Ö»ÊÇÆäÖÐÒ»²¿·Ö£©£º
[code]Ä£¿éÎļþ Ä£¿é¹¦ÄÜÃèÊö Ïà¹ØÅäÖÃÎļþ
pam_access Ìṩlogdaemon·ç¸ñµÄµÇ¼¿ØÖÆ /etc/security/access.conf
pam_chroot ÌṩÀàËÆchrootÃüÁîµÄ¹¦ÄÜ
pam_cracklib ¶ÔÃÜÂëµÄÇ¿¶È½øÐÐÒ»¶¨µÄ¼ì²é ¿âÎļþlibcrackºÍ×ÖµäÎļþ
/usr/lib/cracklib_dict
pam_deny ×ÜÊÇÎÞÌõ¼þµØÊ¹ÈÏ֤ʧ°Ü
pam_env ÉèÖûòÈ¡Ïû»·¾³±äÁ¿ /etc/security/pam_env.conf
pam_filter ¶ÔÊäÈëÊä³öÁ÷½øÐйýÂË filters
pam_ftp.so ¶ÔÄäÃûftpÓû§½øÐÐÈÏÖ¤
pam_group µ±Óû§ÔÚÖ¸¶¨µÄÖÕ¶ËÉÏÇëÇóÖ¸¶¨µÄ /etc/security/group.conf
·þÎñʱ¸³Óè¸ÃÓû§ÏàÓ¦µÄ×éȨÏÞ
pam_issue ÔÚÌáʾÓû§ÊäÈëÓû§Ãû֮ǰÏÔʾ /etc/issue
/etc/issueÎļþµÄÄÚÈÝ
pam_krb4 ¶ÔÓû§ÃÜÂë½øÐÐKerberosÈÏÖ¤ÏàÓ¦µÄKerberos¿âÎļþ
pam_lastlog ÔÚÓû§µÇ¼³É¹¦ºóÏÔʾ¹ØÓÚ /var/log/lastlog
Óû§ÉϴεǼµÄÐÅÏ¢£¬²¢Î¬»¤/var/log/lastlogÎļþ¡£
pam_limits ÏÞÖÆÓû§»á»°ËùÄÜʹÓõÄϵͳ×ÊÔ´ /etc/security/limits.conf
pam_listfile ¸ù¾ÝÖ¸¶¨µÄij¸öÎļþ¾ö¶¨ÊÇ·ñ ÀýÈç/etc/ftpusers
ÔÊÐí»ò½ûÖ¹Ìṩ·þÎñ
pam_mail ¼ì²éÓû§µÄÓÊÏäÖÐÊÇ·ñÓÐÐÂÓʼþ /var/spool/mail/xxxx
pam_mkhomedir ΪÓû§½¨Á¢Ö÷Ŀ¼ /etc/skel/
pam_motd ÏÔʾ/etc/motdÎļþµÄÄÚÈÝ /etc/motd
pam_nologin ¸ù¾Ý/etc/nologinÎļþµÄ´æÔÚÓë·ñ/etc/nologinÀ´¾ö¶¨Óû§ÈÏÖ¤ÊÇ·ñ³É¹¦
pam_permit ×ÜÊÇÎÞÌõ¼þµØÊ¹ÈÏÖ¤³É¹¦
pam_pwdb ×÷Ϊpam_unix_xxxxÄ£¿éµÄÒ»¸öÌæ´ú¡£/etc/pwdb.conf
ʹÓÃPassword DatabaseͨÓýӿڽøÐÐÈÏÖ¤¡£
pam_radius ÌṩԶ³ÌÉí·ÝÑéÖ¤²¦ÈëÓû§·þÎñ
(RADIUS)µÄÈÏÖ¤
pam_rhosts_auth ÀûÓÃÎļþ~/.rhostsºÍ /etc/hosts.equivºÍ~/.rhosts
/etc/hosts.equiv¶ÔÓû§½øÐÐÈÏÖ¤¡£
pam_rootok ¼ì²éÓû§ÊÇ·ñΪ³¬¼¶Óû§£¬Èç¹ûÊdz¬¼¶Óû§ÔòÎÞÌõ¼þµØÍ¨¹ýÈÏÖ¤¡£
pam_securetty Ìṩ±ê×¼µÄUnix securetty¼ì²é /etc/securetty
pam_time Ìṩ»ùÓÚʱ¼äµÄ¿ØÖÆ£¬±ÈÈçÏÞÖÆ /etc/security/time.conf
Óû§Ö»ÄÜÔÚij¸öʱ¼ä¶ÎÄÚ²ÅÄܵǼ
pam_unix Ìṩ±ê×¼µÄUnixÈÏÖ¤ /etc/passwdºÍ /etc/shadow
pam_userdb ÀûÓÃBerkeley DBÊý¾Ý¿âÀ´¼ì²é Berkeley DB Óû§/ÃÜÂë
pam_warn ÀûÓÃsyslog( )¼Ç¼һÌõ¸æ¾¯ÐÅÏ¢
pam_wheel Ö»ÔÊÐíwheel×éµÄÓû§Óг¬¼¶Óû§µÄ´æÈ¡È¨ÏÞ[/code]
²Î¿¼×ÊÁÏ£º
1¡¢DCE/OSF-RFC 86.0
2¡¢Linux-PAM documentation & source code
3¡¢Sun Solaris PAM documentation


kxajd001 ÓÚ 2009-07-24 00:34:35·¢±í:
²»´í ¿´ÏÂ:0wpoi2
kxajd001 ÓÚ 2009-07-24 00:34:21·¢±í:
²»´í ¿´ÏÂ:0wpoi2
tellmewhy52 ÓÚ 2009-07-17 18:16:18·¢±í:
¶¥
tellmewhy52 ÓÚ 2009-07-17 18:12:35·¢±í:
лл
forlinux0518 ÓÚ 2009-07-17 17:00:59·¢±í:
ÎÒÃǵÄÏîÄ¿ÏÖÔÚÓÃPAM£¬ÕýÔÚÑо¿ÖÐ~~
ËÞ·É ÓÚ 2006-08-24 19:33:26·¢±í:
Ìý˵Õâ·½ÃæºÜÄѶ԰ɣ¡
½ñÌì¸ÕѧµÄ
лл¥Ö÷£¡
coolentboy ÓÚ 2006-08-24 18:42:33·¢±í:
ѧϰÁË