Skip to main content

将多个 SSH 公钥与 Django 用户帐户相关联。

项目描述

django-sshkey 允许您将多个 SSH 公钥与 Django 用户帐户相关联。它提供了列出、添加、编辑和删除键的视图,每个键都供最终用户使用。它还提供了适合与 OpenSSH 6.2 及更高版本中的AuthorizedKeysCommand功能一起使用的查找视图和相应的查找命令。

Django 应用程序

要在您的 Django 项目中使用 django-sshkey,只需将django_sshkey添加到 settings.py中的INSTALLED_APPS中,将 URL 映射到您的项目中,并为视图提供模板(示例模板在源代码中提供)。

为了将传入的公钥与用户相关联,您必须 在项目的settings.py中定义SSHKEY_AUTHORIZED_KEYS_OPTIONS。这应该是一个包含 sshd 接受的选项的字符串,其中{username} 被替换为与传入公钥关联的用户的用户名。

django-sshkey 还可以帮助您跟踪上次使用密钥的时间。 SSHKEY_AUTHORIZED_KEYS_OPTIONS也将{key_id}替换为密钥的 ID。然后,运行的命令可以通过向查找 URL 发出 HTTP POST 来通知 django-sshkey 该密钥已被使用,并将 key_id 放在请求正文中。

例如:

SSHKEY_AUTHORIZED_KEYS_OPTIONS = 'command="my-command {username} {key_id}",no-pty'

在 settings.py 中将导致由以下命令生成的键看起来类似于:

command="my-command fred 15",no-pty ssh-rsa AAAAB3NzaC1yc2E...

然后 sshd 将验证密钥是否正确并运行my-commandmy-command然后会知道这是 fred 并且他正在使用密钥 15,并且可以告诉 django-sshkey 通过运行此命令的等效项来更新该密钥的 last_used 字段:

curl -d 15 http://localhost:8000/sshkey/lookup

您的 URL 可能因您的配置而异。

网址配置

此文本假定您的项目的urls.py将django_sshkey.urls映射 到 URL 命名空间,如下所示:

import django_sshkey.urls
urlpatterns = patterns('',
  ...
  url('^sshkey/', include(django_sshkey.urls)),
  ...
)

如果您使用不同的映射,则需要在以下示例中调整您的 URL。

设置

SSHKEY_AUTHORIZED_KEYS_OPTIONS

字符串,可选。定义将附加到每个公钥的 SSH 选项。 {username}将替换为用户名;{key_id} 将替换为密钥的 ID。2.3 版中的新功能。

SSHKEY_ALLOW_EDIT

布尔值,默认为False。是否允许编辑键。请注意,在任何情况下都不会在编辑密钥时发送电子邮件,因此默认情况下禁用编辑密钥的原因。2.3 版中的新功能。

SSHKEY_DEFAULT_HASH

字符串,可以是sha256md5legacy(默认值)。用于计算按键指纹的默认哈希算法。Legacy 行为强制执行 OpenSSH 的 6.8 之前的 MD5 行为,没有MD5: 前缀。2.5 版中的新功能。

SSHKEY_EMAIL_ADD_KEY

布尔值,默认为True。向用户添加新密钥时是否应向用户发送电子邮件。2.3 版中的新功能。

SSHKEY_EMAIL_ADD_KEY_SUBJECT

字符串,默认为"A new key was added to your account"。添加新密钥时发送的电子邮件的主题。2.3 版中的新功能。

SSHKEY_FROM_EMAIL

字符串,默认为DEFAULT_FROM_EMAIL。2.3 版中的新功能。

SSHKEY_SEND_HTML_EMAIL

布尔值,默认为False。是否应发送多部分 HTML 电子邮件。2.3 版中的新功能。

模板

示例模板在templates.example目录中可用。

sshkey/userkey_list.html

在列出用户的密钥时使用。

sshkey/userkey_detail.html

在添加或编辑用户密钥时使用。

sshkey/add_key.txt

添加新密钥时发送的电子邮件的纯文本正文。2.3 版中的新功能。

sshkey/add_key.html

添加新密钥时发送的电子邮件的 HTML 正文。2.3 版中的新功能。

管理命令

import_sshkey [--auto-resolve] [--prefix PREFIX] [--name NAME] USERNAME KEY_PATH ...

导入 SSH 公钥以绑定到用户。如果给出了--auto-resolve/-a,尝试使用 UUID 生成唯一的键名。此过程中使用的前缀是键名,但可以使用--prefix/-p进行更改。

normalize_sshkeys [用户名 KEY_NAME]

重新计算密钥数据以反映更改的设置,例如,如果您更改了SSHKEY_DEFAULT_HASH并且某些密钥在数据库中的指纹不正确。没有参数,所有键都将被规范化。用户名 asnd 键名是可选的,如果指定,则将受影响的键限制为用户拥有的键或用户的特定键。这也可以通过管理面板完成,但如果您有一个大型密钥数据库,则请求最终可能会超时。

将 OpenSSH 绑定到 django-sshkey

有多种方法可以将 OpenSSH 连接到 django-sshkey。此处列出的所有方法都需要使用OpenSSH 6.2 及更高版本中存在的sshd_config中的AuthorizedKeysCommand指令。请注意,该指令引用的命令及其祖先目录必须由 root 拥有,并且只能由所有者写入。

除非另有说明,否则以下所有方法都使用SSHKEY_LOOKUP_URL 环境变量来确定/sshkey/lookup URL 的URL。如果未定义此环境变量,则默认为 http://localhost:8000/sshkey/lookup。如果这个环境变量是在 sshd 进程中定义的,那么它将被 AuthorizedKeysCommand继承。

此外,以下所有方法都使用curl(首选)或 wget。一些命令也使用ssh-keygen。这些命令必须存在于PATH中。

如果您不想使用这些外部命令,那么可以使用纯 Python 实现的查找命令的变体。但是,它们 慢得多。要使用变体,请将lookup替换为pylookup。例如,使用django-sshkey-pylookup-all代替 django-sshkey-lookup-all

使用django-sshkey-lookup

Usage: django-sshkey-lookup -a URL
       django-sshkey-lookup -u URL USERNAME
       django-sshkey-lookup -f URL FINGERPRINT
       django-sshkey-lookup URL [USERNAME]

该程序有不同的操作模式:

-一个

打印所有公钥。

-u

打印指定用户拥有的所有公钥。

-F

打印与指定指纹匹配的所有公钥。

默认

兼容模式。如果给出了用户名参数,则打印指定用户拥有的所有公钥;否则执行与django-sshkey-lookup-by-fingerprint相同的功能 (见下文)。

从 OpenSSH 6.9 及更高版本开始,AuthorizedKeysCommand指令支持使用用户指定的命令行参数,并且可以将有关身份验证尝试的不同详细信息传递给程序。这使得django-sshkey-lookup非常适合更高版本的 OpenSSH 服务器。

# Show all available public keys
AuthorizedKeysCommand /usr/local/bin/django-sshkey-lookup -a URL

# Filter keys owned by Django user (assuming the user matches)
AuthorizedKeysCommand /usr/local/bin/django-sshkey-lookup -u URL %u

# Filter keys matching a sha256 fingerprint
AuthorizedKeysCommand /usr/local/bin/django-sshkey-lookup -f URL %f

所有模式都希望将查找 URL 指定为第一个非选项参数。

此命令与旧脚本lookup.sh兼容,但在系统范围内安装时已重命名为具有较少歧义的名称。符号链接保留在其位置以实现向后兼容性。

使用django-sshkey-lookup-all

用法:django-sshkey-lookup-all

该程序打印您站点上定义的所有 SSH 公钥。sshd 必须扫描所有这些以找到第一个匹配项,因此对于许多键,此方法会很慢。但是,它不需要修补过的 OpenSSH 服务器。

这个程序:

  • 可以直接与 pre-6.9 AuthorizedKeysCommand一起使用(用户名参数被忽略)。

  • 不需要修补过的 OpenSSH 服务器。

  • 不能很好地扩展到大量用户密钥。

使用django-sshkey-lookup-by-username

用法:django-sshkey-lookup-by-username USERNAME

此程序打印与指定用户关联的所有 SSH 公钥。

这个程序:

  • 可以直接与 pre-6.9 AuthorizedKeysCommand一起使用。

  • 不需要修补过的 OpenSSH 服务器。

  • 如果每个 Django 用户对应一个系统用户帐户,这是理想的。

使用django-sshkey-lookup-by-fingerprint

用法:django-sshkey-lookup-by-fingerprint

该程序打印与给定指纹匹配的所有 SSH 公钥。指纹由找到的以下第一个确定:

  1. SSH_KEY_FINGERPRINT环境变量,它应该包含密钥的 MD5 指纹(这是 ssh-keygen -l生成的第二个字段)。

  2. SSH_KEY环境变量应该包含标准 openssh 格式(与~/.ssh/id_rsa.pub格式相同)的密钥,被发送到ssh-keygen -l以确定指纹。

  3. 标准 openssh 格式的密钥从标准输入读取并发送到ssh-keygen -l以确定指纹。

这个程序:

  • 可以直接与AuthorizedKeysCommand一起使用(忽略用户名参数)。

  • 需要修补过的 OpenSSH 服务器;可以在以下位置之一找到兼容的补丁程序:

  • 如果您希望所有 Django 用户通过共享的系统用户帐户访问 SSH 并由他们的 SSH 公钥识别,这是理想的选择。

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

django-sshkey-2.5.0.tar.gz (26.8 kB 查看哈希)

已上传 source