编写一个pam_python模块:“KeyError:getspnam():name not found”

我正在使用pam_python模块来loggingSSH尝试中使用的用户名和密码。

/etc/pam.d/sshd我加了这行:

 auth requisite pam_python.so /lib64/security/pwreveal.py 

这是/lib64/security/pwreveal.py

 import crypt, spwd, syslog def auth_log(msg): """Send errors to default auth log""" syslog.openlog(facility=syslog.LOG_AUTH) syslog.syslog("SSH Attack Logged: " + msg) syslog.closelog() def check_pw(user, password): auth_log("User: " + user + " Password: " + password) """Check the password matches local unix password on file""" # try: hashed_pw = spwd.getspnam(user)[1] # except KeyError,e: # return False return crypt.crypt(password, hashed_pw) == hashed_pw def pam_sm_authenticate(pamh, flags, argv): try: user = pamh.get_user() except pamh.exception, e: return e.pam_result if not user: return pamh.PAM_USER_UNKNOWN try: resp = pamh.conversation(pamh.Message(pamh.PAM_PROMPT_ECHO_OFF, 'Password:')) except pamh.exception, e: return e.pam_result if not check_pw(user, resp.resp): auth_log("Remote Host: %s (%s:%s)" % (pamh.rhost, user, resp.resp)) return pamh.PAM_AUTH_ERR return pamh.PAM_SUCCESS def pam_sm_setcred(pamh, flags, argv): return pamh.PAM_SUCCESS def pam_sm_acct_mgmt(pamh, flags, argv): return pamh.PAM_SUCCESS def pam_sm_open_session(pamh, flags, argv): return pamh.PAM_SUCCESS def pam_sm_close_session(pamh, flags, argv): return pamh.PAM_SUCCESS def pam_sm_chauthtok(pamh, flags, argv): return pamh.PAM_SUCCESS 

这在某种程度上是有效的,我在SSH失败尝试(在本例中,来自另一个本地开发服务器的我)之后的/var/log/messages看到以下输出:

 Mar 3 14:35:59 localhost sshd: SSH Attack Logged: Remote Host: 192.168.1.7 (root:root123) 

我的问题是,无论用户名/密码组合是否正确,脚本始终输出/ var / log / secure中的相同错误,并且无法进行身份validation(因此,在使用此python脚本时,SSH已被有效破坏):

 Mar 3 14:50:41 localhost /lib64/security/pwreveal.py[13328]: Traceback (most recent call last): Mar 3 14:50:41 localhost /lib64/security/pwreveal.py[13328]: File "/lib64/security/pwreveal.py", line 32, in pam_sm_authenticate Mar 3 14:50:41 localhost /lib64/security/pwreveal.py[13328]: if not check_pw(user, resp.resp): Mar 3 14:50:41 localhost /lib64/security/pwreveal.py[13328]: File "/lib64/security/pwreveal.py", line 13, in check_pw Mar 3 14:50:41 localhost /lib64/security/pwreveal.py[13328]: hashed_pw = spwd.getspnam(user)[1] Mar 3 14:50:41 localhost /lib64/security/pwreveal.py[13328]: KeyError: getspnam(): name not found 

我知道“spwd”是影子密码数据库,我在网上发现了一些信息,提示在这种情况下,“未find的名称”被更准确地描述为“权限被拒绝”。 所以作为一个testing,我确信sshd用户已经读取了/ etc / shadow的权限 – 但是这并没有帮助。

我不知道我是否正在寻找正确的路线。 任何帮助?

注意:我意识到SSH密码日志logging在服务器上运行并不是一件好事。 我在一个只有我有权访问的个人开发盒上做这个。 这是一个“只为乐趣”的项目。

编辑 – 作为一个testing,我创build了一个独立的Python脚本,只是这样做:

 import spwd test = spwd.getspnam("myusername")[1] print test 

以root用户身份运行这个脚本,为“myusername”密码提供散列化的密码。 如果我故意拼错那个用户名,所以我正在有效地寻找一个不存在于影子文件中的用户名,我得到这个错误:

 KeyError: 'getspnam(): name not found' 

完全相同的错误。

所以从这我可以假设,当通过pam从pwreveal.py运行spwd.getspnam()时,它无法find用户。 虽然它在单独的脚本中独立运行,但它可以。

为什么会这样?

  • 有没有办法logging谁上传或更改特定文件? (centos)
  • X通过SSH到Ubuntu服务器
  • 在Ubuntu上慢速连接上ssh
  • 你如何为另一个用户创build一个ssh密钥?
  • SSH日志loggingfunction是否相当于logging私钥/公钥validation的function?
  • SSH可以通过configuration不正确的子网访问服务器吗?
  • One Solution collect form web for “编写一个pam_python模块:“KeyError:getspnam():name not found””

    我不知道我的问题是否正确,但是您试图说,从PAM脚本调用时,您的脚本始终会回溯。 当你写入无效用户(不是现有用户)时,你可以模拟相同的行为。

    所以让我们开始吧。 KeyErrorexception告诉你,由于某种原因,用户在数据库中找不到。 在你的第二个例子中,显然是因为用户实际上不在那里,它是预期的行为 – 这是如何在pythonexception工作,不是吗?

    您最初的问题很可能是由CentOS中的SELinux策略引起的。 正常进程不能读取/etc/shadow 。 当您从pam栈下启动python脚本时,暂停它并查看进程上下文(使用ps auxfZ ),您将看到脚本正在使用的实际上下文。 您最有可能在/var/log/audit/audit.log (或ausearch -m AVC )中看到一些AVC消息,说明哪些进程被禁止访问shadow文件。

    那么怎么走? 拳头的可能性是暂时切换SELinux到permissive ,以确保它是原因( setenfoce 0 )。 那么,它应该开始工作。 但是你不应该对此感到满意,如果你想正确地做到这一点,你应该尝试调整/写一个你的脚本的策略,但是这不符合Serverfault的答案的格式。

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.