paint-brush
Kết nối ứng dụng web truyền thống với cơ sở dữ liệu Postgrestừ tác giả@ockam
993 lượt đọc
993 lượt đọc

Kết nối ứng dụng web truyền thống với cơ sở dữ liệu Postgres

từ tác giả Ockam8m2023/08/31
Read on Terminal Reader

dài quá đọc không nổi

Tìm hiểu cách kết nối ứng dụng web truyền thống với cơ sở dữ liệu postgres, theo cách bảo mật theo thiết kế và yêu cầu tối thiểu/không thay đổi mã cũng như không quản lý tường lửa
featured image - Kết nối ứng dụng web truyền thống với cơ sở dữ liệu Postgres
Ockam HackerNoon profile picture
0-item


ockam là một bộ thư viện Rust , công cụ dòng lệnh và dịch vụ đám mây được quản lý để điều phối mã hóa hai đầu, xác thực lẫn nhau, quản lý khóa, quản lý thông tin xác thực và thực thi chính sách ủy quyền — tất cả đều trên quy mô lớn. Từ đầu đến cuối của Ockam kênh an toàn đảm bảo tính xác thực, tính toàn vẹn và bảo mật của tất cả dữ liệu đang chuyển động ở lớp ứng dụng.


Nếu bạn lưu trữ dữ liệu của mình trong cơ sở dữ liệu quan hệ, NoSQL , cơ sở dữ liệu đồ thị hoặc cơ sở dữ liệu tương tự, thì dữ liệu đó có thể là riêng tư. Và bạn có thể không muốn đưa nó lên Internet. Vì vậy, bạn có thể giải quyết vấn đề này bằng cách đặt nó bên trong một mạng con riêng tư. Tuy nhiên, bây giờ bạn phải quản lý danh sách kiểm soát truy cập mạng, nhóm bảo mật hoặc bảng định tuyến để cho phép các máy khác mở kết nối tới cơ sở dữ liệu. Đó là rất nhiều chi phí.


Với Ockam, quản trị viên mạng không phải cập nhật danh sách kiểm soát truy cập mạng, nhóm bảo mật hoặc bảng định tuyến. Ockam áp dụng kiểm soát chi tiết cho các dịch vụ của bạn thông qua Kiểm soát truy cập dựa trên thuộc tính. Và bạn thậm chí có thể tích hợp với nhà cung cấp danh tính bên ngoài như Okta để hạn chế những người có thể truy cập dịch vụ của bạn.


Trong bài đăng trên blog này, chúng ta sẽ khám phá giao diện dòng lệnh Ockam, ockam và xem cách chúng ta có thể kết nối một ứng dụng web truyền thống với cơ sở dữ liệu PostgreSQL mà không cần thay đổi mã nhiều/tối thiểu. Chúng tôi sẽ tạo một ứng dụng Python Flask rất cơ bản, chỉ đơn giản là tăng bộ đếm trong cơ sở dữ liệu PostgreSQL. Sau đó, chúng tôi sẽ di chuyển kết nối giữa ứng dụng và cơ sở dữ liệu thông qua kênh bảo mật Ockam.


Hành trình của chúng tôi

Trước khi bắt đầu, chúng ta hãy xem các bước chúng tôi sẽ thực hiện trong bài đăng blog này.

Hành trình của chúng tôi


  1. Sử dụng ockam enroll để cài đặt ứng dụng Ockam và tạo dự án Ockam. Đây là điều kiện tiên quyết đầu tiên.


  2. Thiết lập cơ sở dữ liệu PostgreSQL. Đây là điều kiện tiên quyết thứ hai. Sau đó cấu hình một "ổ cắm" Ockam tới máy chủ cơ sở dữ liệu. Chúng ta sẽ tìm hiểu thêm về điều này trong phần "kết nối cơ sở dữ liệu" bên dưới.


  3. Thiết lập ứng dụng web (Python Flask). Đây là điều kiện tiên quyết thứ ba. Sau đó định cấu hình "đầu vào" Ockam từ ứng dụng Python. Chúng ta sẽ tìm hiểu thêm về điều này trong phần "kết nối ứng dụng web" bên dưới.


Điều kiện tiên quyết

Để làm theo, hãy đảm bảo cài đặt tất cả các điều kiện tiên quyết được liệt kê bên dưới.


  1. Lệnh Ockam
    • Chạy brew install build-trust/ockam/ockam để cài đặt cái này thông qua brew . Sau đó, bạn sẽ có thể chạy ứng dụng ockam CLI trong thiết bị đầu cuối của mình.


  2. Python và các thư viện: Flash, psycopg2
    • Chạy brew install python để cài đặt cái này qua brew . Sau đó, bạn sẽ có thể chạy lệnh python3 trong thiết bị đầu cuối của mình.

    • Hướng dẫn cách lấy các phần phụ thuộc ( Flask , psycopg2 ) có trong Mã Python phần bên dưới.


  3. Postgresql
    • Chạy brew install postgresql@15 qua brew . Sau đó, bạn sẽ có thể chạy máy chủ cơ sở dữ liệu PostgreSQL trên máy của mình trên cổng mặc định là 5432 . Hãy đảm bảo làm theo hướng dẫn của brew và thêm PostgreSQL vào đường dẫn của bạn.

    • Chạy brew services start postgresql@15 để khởi động máy chủ PostgreSQL.

    • Sau đó, bạn có thể đặt mật khẩu mới cho người dùng cơ sở dữ liệu postgres . Đặt mật khẩu này thành password . Mã Python bên dưới sử dụng postgres:password@localhost làm chuỗi kết nối cho trình điều khiển db.


      Các hướng dẫn bên dưới cho phép bạn thực hiện việc này trên Linux và macOS:


      • Trong một thiết bị đầu cuối chạy sudo -u postgres psql --username postgres --password --dbname template1 để đăng nhập vào cơ sở dữ liệu cục bộ với tư cách là người dùng postgres .

      • Sau đó nhập cái này vào REPL: ALTER USER postgres PASSWORD 'password'; và cuối cùng gõ exit .



Ứng dụng web - Mã Python

Ứng dụng web Python Flask tăng bộ đếm trong cơ sở dữ liệu PostgreSQL. Toàn bộ ứng dụng nằm gọn trong một tập tin duy nhất.


Tạo một tệp main.py trên máy của bạn rồi sao chép và dán mã bên dưới vào đó.


 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



Trong tập lệnh này, chúng tôi sử dụng "postgres://postgres:password@localhost:%s/"%pg_port để thiết lập kết nối tới cơ sở dữ liệu.


  • pg_port nhận giá trị từ biến môi trường APP_PG_PORT .

  • Chúng tôi sẽ đặt biến môi trường APP_PG_PORT thành 5432 trước khi chạy tập lệnh Python (hướng dẫn bên dưới).

  • Vì vậy, chuỗi kết nối cơ sở dữ liệu chỉ đơn giản trỏ đến localhost:5432 .


Vui lòng ghi chú biến pg_port Python và biến môi trường APP_PG_PORT . Trong quá trình sản xuất, chúng tôi thường tải cổng từ một biến môi trường và nó không được mã hóa cứng trong nguồn.


Chạy ứng dụng web

Thực hiện theo các hướng dẫn bên dưới để chạy ứng dụng web.


  1. Trước tiên, hãy đảm bảo thêm các phần phụ thuộc Python cần thiết với:

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


  1. Sau đó khởi động ứng dụng Flask ( main.py ) với:

     export APP_PG_PORT=5432 flask --app main run


  1. Cuối cùng, trong trình duyệt web, hãy mở URL này: http://localhost:5000/ .


Cài đặt Ockam

Bây giờ chúng ta đã thiết lập ứng dụng web và cơ sở dữ liệu của mình, hãy thực hiện việc này tiếp theo:


  1. Thêm Ockam vào hỗn hợp.

  2. Cập nhật biến môi trường APP_PG_PORT của chúng tôi để nó kết nối với một cổng mới (không phải 5432 là nơi máy chủ PostgreSQL chạy).


Đầu tiên, hãy chạy ockam enroll . Đảm bảo rằng bạn đã cài đặt Ockam CLI như được mô tả trong phần điều kiện tiên quyết ở trên.


Trong cửa sổ terminal, hãy chạy lệnh này và làm theo lời nhắc để hoàn tất quá trình đăng ký (vào Ockam Orchestrator).

 ockam enroll


Đây là những gì lệnh ockam enroll thực hiện:

  • Nó kiểm tra xem mọi thứ đã được cài đặt chính xác chưa sau khi đăng ký thành công với Ockam Orchestrator.
  • Nó tạo Không gian và Dự án cho bạn trong Ockam Orchestrator và cung cấp Rơle mã hóa đầu cuối trong dự án default của bạn tại /project/default .


Kết nối cơ sở dữ liệu

Tiếp theo, hãy thiết lập một tcp-outlet cho phép chúng tôi gửi lưu lượng TCP thô đến máy chủ PostgreSQL trên cổng 5432 . Sau đó tạo một rơle trong dự án Trình soạn thảo mặc định của chúng tôi. Để thực hiện việc này, hãy chạy các lệnh này trong terminal của bạn.

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


Ghi chú:

  • Ở đây chúng tôi sử dụng biến môi trường PG_PORT chứ không phải APP_PG_PORT (được sử dụng trong ứng dụng web của chúng tôi). Nó trỏ đến cổng PostgreSQL mặc định là 5432 . Trong phần bên dưới, chúng tôi sẽ thay đổi APP_PG_PORT thành một giá trị khác.
  • Chúng ta sẽ tạo tcp-inlet tương ứng trong phần tiếp theo.

Rơle cho phép bạn thiết lập các giao thức đầu cuối với các dịch vụ hoạt động trong mạng riêng từ xa. Chúng loại bỏ nhu cầu hiển thị các cổng trên dịch vụ từ xa (với mạng thù địch như Internet).


Kết nối ứng dụng web

Cuối cùng, hãy thiết lập một tcp-inlet cục bộ để chúng ta có thể nhận lưu lượng TCP thô trên cổng 5433 trước khi nó được chuyển tiếp.

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


Ghi chú:

  • Biến môi trường mới $OCKAM_PORT trỏ đến một cổng mới 5433 .
  • Đây là cổng mà tcp-inlet sẽ lắng nghe. Và nó khác với cổng PostgreSQL mặc định.

Đầu vào TCP là một cách để xác định nơi nút lắng nghe các kết nối của nó. Và sau đó nó sẽ chuyển tiếp lưu lượng truy cập đó đến đâu. Một đầu vào và đầu ra phối hợp với nhau để tạo thành một cổng thông tin.


Tiếp theo, khởi động lại ứng dụng web của bạn bằng các lệnh bên dưới.


 export APP_PG_PORT=$OCKAM_PORT flask --app main run


Cuối cùng, kết nối lại với URL này từ trình duyệt web của bạn http://localhost:5000/ .


  1. Chúng tôi đã thay đổi $APP_PG_PORT thành cùng giá trị với $OCKAM_PORT ( 5433 ). Ứng dụng web của chúng tôi (tập lệnh main.py ) không kết nối trực tiếp với máy chủ cơ sở dữ liệu không an toàn (trên cổng 5432 ). Bây giờ nó đi qua kênh an toàn 🔐.

  2. Bộ đếm sẽ tiếp tục tăng như trước đây mà không có thay đổi mã nào đối với ứng dụng của bạn. Nhưng ứng dụng web hiện giao tiếp với cơ sở dữ liệu thông qua kênh bảo mật Ockam 🎉.


Nhiều máy

Bạn cũng có thể mở rộng ví dụ này và di chuyển dịch vụ PostgreSQL vào vùng chứa Docker hoặc sang một máy hoàn toàn khác. Sau khi các nút được đăng ký (sau khi chạy ockam enroll ), bản demo này sẽ tiếp tục hoạt động mà không cần thay đổi mã ứng dụng và không cần hiển thị trực tiếp các cổng PostgreSQL với Internet.


Ngoài ra, bạn có thể chạy ứng dụng web và cơ sở dữ liệu trên các máy khác nhau. Để làm điều này:


  1. Thay đổi localhost trong tập lệnh main.py thành địa chỉ IP của máy lưu trữ cơ sở dữ liệu.

  2. Chạy ockam enroll trên cả hai máy (máy ứng dụng web và máy chủ cơ sở dữ liệu).


Khám phá các lệnh khác

Bây giờ bạn đã hoàn thành ví dụ này, đây là một số lệnh để bạn thử xem chúng hoạt động như thế nào. Bạn luôn có thể tra cứu chi tiết về những gì họ làm trong thủ công . Khi bạn thử từng cách này, hãy chú ý đến những thứ bạn có thể đã tạo ra trong bài tập này.


  • Hãy thử ockam node list . Bạn có thấy các nút mà bạn đã tạo trong bài tập này không?
  • Hãy thử ockam node --help . Đây là những ví dụ ngắn hơn để bạn làm quen với các lệnh.
  • Hãy thử ockam node show web . Bạn có thấy tcp-inlet mà bạn đã tạo trong bài tập này không?
  • Hãy thử ockam node show db . Bạn có thấy tcp-outlet mà bạn đã tạo trong bài tập này không?
  • Hãy thử ockam identity list . Bạn có thấy những đặc điểm nhận dạng mà bạn đã tạo ra trong bài tập này không?


Cũng được xuất bản ở đây.