paint-brush
将传统 Web 应用程序连接到 Postgres 数据库经过@ockam
423 讀數
423 讀數

将传统 Web 应用程序连接到 Postgres 数据库

经过 Ockam8m2023/08/31
Read on Terminal Reader

太長; 讀書

了解如何以设计安全、需要最少/无需更改代码且无需防火墙管理的方式将传统 Web 应用程序连接到 postgres 数据库
featured image - 将传统 Web 应用程序连接到 Postgres 数据库
Ockam HackerNoon profile picture
0-item


奥卡姆是一套Rust库、命令行工具和托管云服务,用于大规模协调端到端加密、相互身份验证、密钥管理、凭证管理和授权策略实施。奥卡姆的端到端安全通道保证应用层所有动态数据的真实性、完整性和机密性。


如果您将数据存储在关系数据库、 NoSQL 、图形数据库或类似数据库中,则该数据可能是私有的。而且您可能不想将其暴露在互联网上。因此,您可以通过将其放置在私有子网内来解决此问题。但是,现在您必须管理网络访问控制列表、安全组或路由表,以允许其他计算机打开与数据库的连接。这是很大的开销。


借助 Ockam,网络管理员无需更新网络访问控制列表、安全组或路由表。 Ockam 通过基于属性的访问控制对您的服务进行细粒度控制。你甚至可以与外部身份提供商集成像 Okta 一样限制谁可以访问您的服务。


在这篇博文中,我们将探索 Ockam 命令行界面ockam ,并了解如何在最少/无需更改代码的情况下将传统 Web 应用程序连接到 PostgreSQL 数据库。我们将创建一个非常基本的 Python Flask 应用程序,它只是增加 PostgreSQL 数据库中的计数器。然后我们将通过 Ockam 安全通道移动应用程序和数据库之间的连接。


我们的旅程

在开始之前,让我们先看一下我们将在本博文中执行的步骤。

我们的旅程


  1. 使用ockam enroll安装 Ockam 应用程序并创建 Ockam 项目。这是第一个前提。


  2. 设置 PostgreSQL 数据库。这是第二个前提。然后配置一个连接到数据库服务器的 Ockam“出口”。我们将在下面的“连接数据库”部分中了解更多相关信息。


  3. 设置 Web 应用程序 (Python Flask)。这是第三个前提。然后从 Python 应用程序配置 Ockam“入口”。我们将在下面的“连接网络应用程序”部分中了解更多相关信息。


先决条件

为了继续进行,请确保安装下面列出的所有先决条件。


  1. 奥卡姆指挥部
    • 运行brew install build-trust/ockam/ockam通过brew安装它。然后,您将能够在终端中运行ockam CLI 应用程序。


  2. Python 和库:Flash、psycopg2
    • 运行brew install python通过brew安装它。然后您就可以在终端中运行python3命令。

    • 有关如何获取依赖项( Flaskpsycopg2 )的说明位于Python代码下面的部分。


  3. PostgreSQL
    • 通过brew运行brew install postgresql@15 。然后,您将能够在计算机上的默认端口5432上运行 PostgreSQL 数据库服务器。请确保遵循brew的说明并将PostgreSQL添加到您的路径中。

    • 运行brew services start postgresql@15来启动PostgreSQL服务器。

    • 然后您可以为数据库用户postgres设置新密码。将此密码设置为password 。下面的 Python 代码使用postgres:password@localhost作为数据库驱动程序的连接字符串。


      以下说明允许您在Linux和 macOS 上执行此操作:


      • 在终端中运行sudo -u postgres psql --username postgres --password --dbname template1postgres用户身份本地登录数据库。

      • 然后在 REPL 中输入: ALTER USER postgres PASSWORD 'password'; ,最后输入exit



Web 应用程序 - Python 代码

Python Flask Web 应用程序会增加 PostgreSQL 数据库中的计数器。整个应用程序适合一个文件。


在您的计算机上创建一个main.py文件,然后将以下代码复制并粘贴到其中。


 import os import psycopg2 from flask import Flask CREATE_TABLE = ( "CREATE TABLE IF NOT EXISTS events (id SERIAL PRIMARY KEY, name TEXT);" ) INSERT_RETURN_ID = "INSERT INTO events (name) VALUES (%s) RETURNING id;" app = Flask(__name__) pg_port = os.environ['APP_PG_PORT'] # 5432 is the default port url = "postgres://postgres:password@localhost:%s/"%pg_port connection = psycopg2.connect(url) @app.route("/") def hello_world(): with connection: with connection.cursor() as cursor: cursor.execute(CREATE_TABLE) cursor.execute(INSERT_RETURN_ID, ("",)) id = cursor.fetchone()[0] return "I've been visited {} times".format(id), 201



在此脚本中,我们使用"postgres://postgres:password@localhost:%s/"%pg_port建立与数据库的连接。


  • pg_port从环境变量APP_PG_PORT获取其值。

  • 在运行 Python 脚本之前,我们将环境变量APP_PG_PORT设置为5432 (说明如下)。

  • 因此数据库连接字符串只是指向localhost:5432


请记下pg_port Python 变量和APP_PG_PORT环境变量。在生产中,我们通常从环境变量加载端口,并且它没有硬编码在源代码中。


运行网络应用程序

请按照以下说明运行网络应用程序。


  1. 首先,确保添加所需的 Python 依赖项:

     # Install flask. pip3 install flask # Install psycopg2. pip3 install psycopg2-binary


  1. 然后使用以下命令启动Flask应用程序 ( main.py ):

     export APP_PG_PORT=5432 flask --app main run


  1. 最后,在 Web 浏览器中打开此 URL: http://localhost:5000/


安装奥卡姆

现在我们已经设置了网络应用程序和数据库,接下来让我们执行此操作:


  1. 将奥卡姆添加到混合物中。

  2. 更新我们的APP_PG_PORT环境变量,以便它连接到新端口(而不是 PostgreSQL 服务器运行的5432 )。


首先,让我们运行ockam enroll 。确保您已经按照上面先决条件部分中的描述安装了 Ockam CLI。


在终端窗口中,运行此命令并按照提示完成注册过程(进入 Ockam Orchestrator)。

 ockam enroll


这就是ockam enroll命令的作用:

  • 成功注册 Ockam Orchestrator 后,它会检查所有内容是否安装正确。
  • 它在 Ockam Orchestrator 中为您创建一个空间和项目,并在/project/default default项目中配置端到端加密中继。


连接数据库

接下来,让我们设置一个tcp-outlet ,它允许我们通过端口5432将原始 TCP 流量发送到 PostgreSQL 服务器。然后在我们的默认 Orchestrator 项目中创建一个中继。为此,请在终端中运行这些命令。

 export PG_PORT=5432 ockam tcp-outlet create --to $PG_PORT ockam relay create


笔记:

  • 我们在这里使用PG_PORT环境变量,而不是APP_PG_PORT (在我们的 Web 应用程序中使用)。它指向默认的 PostgreSQL 端口5432 。在下面的部分中,我们将把APP_PG_PORT更改为不同的值。
  • 我们将在下一节中创建相应的tcp-inlet

中继允许您与在远程专用网络中运行的服务建立端到端协议。它们消除了将远程服务上的端口暴露给互联网等恶意网络的需要。


连接网络应用程序

最后,让我们设置一个本地tcp-inlet以便我们可以在转发之前在端口5433上接收原始 TCP 流量。

 export OCKAM_PORT=5433 ockam tcp-inlet create --from $OCKAM_PORT


笔记:

  • 新的环境变量$OCKAM_PORT指向新端口5433
  • 这是tcp-inlet将侦听的端口。它与默认的 PostgreSQL 端口不同。

TCP 入口是一种定义节点侦听其连接的位置的方法。然后应该将该流量转发到哪里。入口和出口共同形成入口。


接下来,使用以下命令再次启动您的网络应用程序。


 export APP_PG_PORT=$OCKAM_PORT flask --app main run


最后,从 Web 浏览器再次连接到此 URL http://localhost:5000/


  1. 我们已将$APP_PG_PORT更改为与$OCKAM_PORT ( 5433 ) 相同的值。我们的 Web 应用程序( main.py脚本)不会直接连接到不安全的数据库服务器(在端口5432上)。它现在通过安全通道🔐。

  2. 计数器将像以前一样继续递增,对应用程序的代码更改为零。但 Web 应用程序现在通过 Ockam 安全通道 🎉 与数据库进行通信。


多台机器

您还可以扩展此示例并将 PostgreSQL 服务移至 Docker 容器或完全不同的计算机中。一旦节点注册完毕(在ockam enroll运行之后),该演示将继续工作,无需更改应用程序代码,也无需将 PostgreSQL 端口直接公开到 Internet。


此外,您可以在不同的计算机上运行 Web 应用程序和数据库。去做这个:


  1. main.py脚本中的localhost更改为托管数据库的计算机的 IP 地址。

  2. 在两台计算机(Web 应用程序计算机和数据库服务器计算机)上运行ockam enroll


探索其他命令

现在您已经完成了这个示例,下面有一些命令供您尝试看看它们的作用。您随时可以在其中查找他们所做的详细信息手动的。当您尝试其中每一项时,请留意您在本练习中可能创建的内容。


  • 尝试ockam node list 。您看到在本练习中创建的节点了吗?
  • 尝试ockam node --help 。这些是较短的示例,可帮助您熟悉命令。
  • 尝试ockam node show web 。您看到在本练习中创建的tcp-inlet了吗?
  • 尝试ockam node show db 。您看到在本练习中创建的tcp-outlet了吗?
  • 尝试ockam identity list 。您看到在本练习中创建的身份了吗?


也发布在这里。