将多个 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-command。 my-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
字符串,可以是sha256、md5或legacy(默认值)。用于计算按键指纹的默认哈希算法。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 公钥。指纹由找到的以下第一个确定:
SSH_KEY_FINGERPRINT环境变量,它应该包含密钥的 MD5 指纹(这是 ssh-keygen -l生成的第二个字段)。
SSH_KEY环境变量应该包含标准 openssh 格式(与~/.ssh/id_rsa.pub格式相同)的密钥,被发送到ssh-keygen -l以确定指纹。
标准 openssh 格式的密钥从标准输入读取并发送到ssh-keygen -l以确定指纹。
这个程序:
可以直接与AuthorizedKeysCommand一起使用(忽略用户名参数)。
需要修补过的 OpenSSH 服务器;可以在以下位置之一找到兼容的补丁程序:
openssh-akcenv(这是首选补丁)
如果您希望所有 Django 用户通过共享的系统用户帐户访问 SSH 并由他们的 SSH 公钥识别,这是理想的选择。