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ể
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.
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.
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.
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.
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.
Để 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.
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.
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
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 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.
Thực hiện theo các hướng dẫn bên dưới để chạy ứng dụng web.
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
Sau đó khởi động ứng dụng Flask
( main.py
) với:
export APP_PG_PORT=5432 flask --app main run
http://localhost:5000/
.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:
Thêm Ockam vào hỗn hợp.
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:
default
của bạn tại /project/default
.
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ú:
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.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).
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ú:
$OCKAM_PORT
trỏ đến một cổng mới 5433
.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/
.
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 🔐.
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 🎉.
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:
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.
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).
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
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?ockam node --help
. Đây là những ví dụ ngắn hơn để bạn làm quen với các lệnh.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?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?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.