【问题标题】:Client authorization with python backend使用 python 后端进行客户端授权
【发布时间】:2011-08-23 17:06:18
【问题描述】:

我正在编写管理 nginx(域、重写等)、svn 和其他服务的面板。为此,我正在编写可在 root 上运行的后端(更改 nginx 配置、重新加载它们、更改用户密码等)和客户端(控制台客户端和 Web 应用程序)。

应用程序在 unix 套接字上工作,我为它制定了非常简单的协议:

\0\0\0\0user\0key\0module\0command\0data\0

嗯,这很简单。客户端发送命令和数据到后端,狐狸前:

\0\0\0\0morsik\0\0nginx\0add_domain\0www.domain.tld something\0

问题是,如何验证那个用户真的是 morsik?对于 Web 界面,我不必这样做 - 网页有它自己的授权,因此我可以发送一些密钥,该密钥适用于每个没人知道的用户。 问题是如果有人可以访问 ssh。然后他可以编写简单的客户端来欺骗用户名,然后他可以更改其他用户配置。

那么,我怎样才能对用户进行正确的授权呢?

【问题讨论】:

  • 您可能想先学习 Bruce Schneier 的《应用密码学》一书。您可能必须使用具有相同密钥的 HMAC。
  • HMAC 看起来很有趣,但是如果密钥是公开的,那么仍然存在欺骗数据的可能性。因为这是python脚本,所以必须是公开的……还是有其他方式来存储key?
  • 我想我知道该怎么做。它将是为用户使用私钥的系统。用户将拥有 .serveradmin.key 和自己的 400 chmod 密钥,因此其他用户不会阅读。此外,服务器将包含 users.db 文件,其中包含有效的密钥和用户(当然是 root:root 400)。在 www 上,它可以存储在 DB(MySQL、PostgreSQL 等)中。我会在它起作用时发布结果。

标签: python security sockets authorization


【解决方案1】:

不要重新发明轮子。 ;) 我发现这个讨论很有启发性:

【讨论】:

  • 这对我帮助不大。我知道在 python 中使用 unix auth。问题是如果数据包在没有输入密码的情况下没有损坏,如何进行身份验证(如果 sb 登录到 ssh,他可能不想输入 pass...)。
  • 第一篇链接的文章正是讨论了这一点。
  • 根据您的第一个链接:>>“客户端程序——在这种情况下为“cancel”或“lp”,或任何使用 libcups 打印对话框的程序,如 Evince 文档查看器——可以通过域套接字将其 UID(与用户名对应的数字 ID)传递给服务器。所以 UID 可能在这里被欺骗。"
  • "内核保证以这种方式传递的凭证不能被伪造。"提到阅读“man unix 7”。也许这可以为您提供完成的线索。
  • 找到另一个链接,正在添加。应该能让你大部分时间到达那里。然后只需从 uid 获取用户名并与给定的匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 2018-12-01
相关资源
最近更新 更多