暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

【译】CockroachDB 与 Django 和 MIT Kerberos

原创 Ellison 2022-06-13
830


在本文中,我们将讨论将 Django 与 kerberized CockroachDB 一起使用的方法以及它的含义。


原文作者:阿尔乔姆·埃尔维茨

原文地址https://dzone.com/articles/cockroachdb-with-django-and-mit-kerberos

今天,我将讨论将 Django 与 kerberized CockroachDB 一起使用的方法以及它的含义。这在生产用例中并不少见,期望企业级访问开发框架是我们的一些客户的赌注。

涵盖 CockroachDB 和 Kerberos 的文章

我发现 Kerberos 的主题非常有趣,我的同事通常会向我寻求有关这个复杂主题的帮助。我绝不是 Kerberos 方面的专家,但我对它足够熟悉以至于很危险。也就是说,我已经写了多篇关于这个主题的文章,你可以在下面找到:

  1. CockroachDB 与 MIT Kerberos
  2. CockroachDB 与 Active Directory
  3. CockroachDB 与 MIT Kerberos 和 Docker Compose
  4. 通过 GSSAPI 执行 CockroachDB 表导入
  5. CockroachDB 与 SQLAlchemy 和 MIT Kerberos
  6. CockroachDB 与 MIT Kerberos 证书用户身份验证
  1. CockroachDB With MIT Kerberos
  2. CockroachDB With Active Directory
  3. CockroachDB With MIT Kerberos and Docker Compose
  4. Executing CockroachDB table import via GSSAPI
  5. CockroachDB With SQLAlchemy and MIT Kerberos
  6. CockroachDB With MIT Kerberos Cert User Authentication

今天,我将演示如何将 CockroachDB 与 MIT Kerberos 和 Django 项目结合使用。我们有很多客户使用我们来满足他们的 Python 数据库需求,您可以在我们的文档网站上查看一些选项。对于今天的设置,我有一个多节点 CockroachDB 集群、一个名为 的 Django 容器web、一个负载均衡器容器和一个 Kerberos KDC 容器。 

您可以在我的repo中找到此示例的代码。我的示例是对您可以从Docker中找到的示例稍作修改。

  1. 克隆回购。


git clone https://github.com/dbist/cockroach-docker
cd cockroach-docker/cockroach-gssapi-django


  1. 创建一个 Django 项目。

正如我所说,我的版本与 Docker 网站上的版本有点不同,因为我添加了一个 Kerberos 分发中心、一个负载均衡器和一个三节点 CockroachDB 集群。否则几乎其他一切都是一样的。不起作用的是像 Docker 快速入门中那样通过容器创建项目。所以docker-compose run web django-admin startproject composeexample .不会起作用,因为我的 Django 容器中有一个额外的入口点来启动 KDC。这是一个很小的代价,所以我们将手动运行它。


a) 在本地安装 Django。


pip3 install django==2.2



Collecting django==2.2
  Using cached Django-2.2-py3-none-any.whl (7.4 MB)
Requirement already satisfied: pytz in /usr/local/lib/python3.8/site-packages (from django==2.2) (2020.1)
Requirement already satisfied: sqlparse in /usr/local/lib/python3.8/site-packages (from django==2.2) (0.3.1)
Installing collected packages: django
  Attempting uninstall: django
    Found existing installation: Django 3.1
    Uninstalling Django-3.1:
      Successfully uninstalled Django-3.1
Successfully installed django-2.2


Django 2.2 是当前的长期版本,但此设置也适用于 Django 3.0 和 3.1,我稍后会介绍。

b) 创建一个项目。

在 docker-compose 目录的根目录下,初始化一个新的 Django 项目。


django-admin startproject example .


现在您应该看到一个名为 example 的目录和一个名为 manage.py 的文件。

  1. 编辑 Django 属性文件。

使用以下属性编辑 example/settings.py:


ALLOWED_HOSTS = ['*']



DATABASES = {
    'default': {
        'ENGINE': 'django_cockroachdb',
        'NAME': 'defaultdb',
        'USER': 'tester',
        'HOST': 'lb',
        'PORT': '26257',
        'OPTIONS': {
            'sslmode': 'verify-full',
            'sslrootcert': '/certs/ca.crt',
        },
    },
}


除了以下细微差别外,这与标准 Django 属性没有太大区别。

ENGINE是我们用于 Django 的 CockroachDB 本地驱动程序,NAME是数据库名称,USER是我们 Kerberos KDC 中的用户,HOST指向我们的负载均衡器实例,如果您需要进一步的上下文,请查看以前的文章。我们还包括sslmodesslrootcert验证我们的客户和节点的真实性。

  1. 验证需求文件具有正确版本的 Django 和 CockroachDB 驱动程序。


cd ./django
vi requirements.txt


取消注释所需版本的 Django 和 CockroachDB 驱动程序。

  1. 运行./up.sh脚本以启动环境。


./up.sh
cockroach uses an image, skipping
Building roach-cert
Step 1/15 : FROM cockroachdb/cockroach:v20.1.4 AS generator
 ---> 25bee4f016c4
...
SET CLUSTER SETTING

Time: 8.1053ms


  1. 检查以确保所有容器都已启动。


docker-compose ps



kdc          /start.sh                        Up
lb           /docker-entrypoint.sh hapr ...   Up      0.0.0.0:26257->26257/tcp,
                                                      5432/tcp,
                                                      0.0.0.0:8080->8080/tcp,
                                                      0.0.0.0:8081->8081/tcp
roach-0      /cockroach/cockroach.sh st ...   Up      26257/tcp, 8080/tcp
roach-1      /cockroach/cockroach.sh st ...   Up      26257/tcp, 8080/tcp
roach-2      /cockroach/cockroach.sh st ...   Up      26257/tcp, 8080/tcp
roach-cert   /bin/sh -c tail -f /dev/null     Up
web          /start.sh python manage.py ...   Up      0.0.0.0:8000->8000/tcp


  1. 检查 Web 容器的日志。


docker logs web



Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
August 07, 2020 - 19:41:52
Django version 2.2.15, using settings 'example.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.


我们可以看到服务器已启动,我们可以从您的主机导航到 Django门户。

我有一位客户询问如何将自定义 SPN 传递给 Django 项目。它没有记录,也不是那么直观,但经过一些试验和错误,通过添加krbsrvname到 example/settings.py 文件实现了以下操作。

  1. 带有自定义 SPN 的 Django。


DATABASES = {
    'default': {
        'ENGINE': 'django_cockroachdb',
        'NAME': 'defaultdb',
        'USER': 'tester',
        'HOST': 'lb',
        'PORT': '26257',
        'OPTIONS': {
            'sslmode': 'verify-full',
            'sslrootcert': '/certs/ca.crt',
            'krbsrvname': 'customspn',
        },
    },
}


使用名为的辅助脚本拆除环境,./down.sh然后使用./up.sh.


You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
August 07, 2020 - 19:55:59
Django version 2.2.15, using settings 'example.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.


让我们应用这些迁移!

  1. 应用迁移。


docker-compose exec web python manage.py migrate



Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK


  1. 升级 Django。

升级 Django的原因有很多。让我们用我们的项目来做这件事。

我们需要编辑我们的django/requirements.txt文件以匹配 Django 的目标版本,在我们的例子中是 3.1。


# Django 3.1
Django>=3.1.*
django-cockroachdb>=3.1.*


使用 down.sh 拆除环境并使用 up.sh 重新启动它。导航到 Django 门户,您将看到新版本。

毫无疑问,让我们连接到 Web 容器,看看是否已经与 Kerberos 建立了连接。


docker exec -ti web sh
klist



Default principal: tester@EXAMPLE.COM

Valid starting     Expires            Service principal
08/07/20 20:11:20  08/08/20 20:11:20  krbtgt/EXAMPLE.COM@EXAMPLE.COM
    renew until 08/07/20 20:11:20
08/07/20 20:11:31  08/08/20 20:11:20  customspn/lb@
    renew until 08/07/20 20:11:20
08/07/20 20:11:31  08/08/20 20:11:20  customspn/lb@EXAMPLE.COM
    renew until 08/07/20 20:11:20


今天就到这里,希望你喜欢这次 Kerberos 的 Django 之旅。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论