Nodejs mysql SSL

Một trong những yêu cầu để tuân thủ HIPAA là đảm bảo rằng tất cả giao tiếp giữa các thành phần ứng dụng được thực hiện một cách an toàn

Ứng dụng phụ trợ cần tuân thủ HIPAA bao gồm

  • một nút. js chạy trong bộ chứa Docker trong máy AWS EC2
  • Một Cân bằng tải đàn hồi đang hiển thị API qua HTTPS
  • Cơ sở dữ liệu RDS mà API đang sử dụng

Giao tiếp giữa ELB và API đã được thực hiện qua HTTPS. Nhưng API đã truy cập cơ sở dữ liệu qua HTTP

Vấn đề

Chúng tôi cần đảm bảo rằng tất cả các thành phần ứng dụng đang sử dụng mã hóa để liên lạc giữa chúng

Dung dịch

Chúng tôi có thể thiết lập kết nối SSL với từng loại cơ sở dữ liệu RDS (Amazon Aurora, MySQL, PostgreSQL, v.v.). Trong hướng dẫn này, chúng tôi sẽ trình bày các bước để kết nối qua SSL với Cơ sở dữ liệu RDS PostgreSQL từ một Nút. ứng dụng js chạy trên EC2

Hỗ trợ SSL có sẵn ở tất cả các khu vực AWS cho PostgreSQL. Amazon RDS tạo chứng chỉ SSL cho phiên bản CSDL PostgreSQL của bạn khi phiên bản được tạo. Nếu chúng tôi bật xác minh chứng chỉ SSL, thì chứng chỉ SSL sẽ bao gồm điểm cuối phiên bản CSDL làm Tên chung (CN) cho chứng chỉ SSL để bảo vệ chống lại các cuộc tấn công giả mạo

Để định cấu hình Nút của chúng tôi. js để giao tiếp bằng SSL với RDS DB, chúng tôi đã làm theo các bước tiếp theo

  1. Chúng tôi đã tải xuống chứng chỉ gốc từ https. //s3. amazonaws. com/rds-downloads/rds-ca-2015-root. pem
  2. Chúng tôi đã lưu nó vào một trong các thư mục ứng dụng của mình, chẳng hạn như /src/config/certs/rds-ca-2015-root. pem
  3. Chúng tôi đã định cấu hình ORM của mình, trong trường hợp của chúng tôi là typeorm, để kết nối qua SSL
public initializeSSLDbConnection = () => {
const config = constants.SQL;
Logger.info(`connecting to ${constants.environment} SQL ...`);

createConnection({
type: "postgres",
host: config.host,
port: config.port,
username: config.username,
password: config.password,
database: config.name,
entities: ["src/persistance/entities/*.ts"],
synchronize: true,
migrations: ["src/persistance/migrations/*.js"],
migrationsTableName: "custom_migration_table",
logging: constants.SQL.logging,
ssl: {
ca: fs
.readFileSync("./src/config/certs/rds-ca-2015-root.pem")
.toString()
}
})
.then(async connection => {
Logger.info(`connected to ${constants.environment} SQL`);
this.connection = connection;
})
.catch(error => Logger.error("TypeORM connection error: ", error));
};

4. thử nghiệm ứng dụng

Kết nối với Công cụ DB qua SSL

Trong trường hợp chúng tôi muốn truy vấn trực tiếp một số dữ liệu từ cơ sở dữ liệu của mình, chúng tôi cũng cần kết nối với nó qua SSL. Để làm điều đó, chúng tôi đã sử dụng DBeaver bằng cách sử dụng cấu hình mạng tiếp theo

Số nguyên trong JavaScript sử dụng biểu diễn IEEE-754. Điều này có nghĩa là nút. js không thể biểu diễn chính xác các số nguyên trong phạm vi ±9,007,199,254,740,991. Tuy nhiên, MariaDB không hỗ trợ số nguyên lớn hơn

Điều này có nghĩa là khi giá trị được đặt trên một cột không nằm trong phạm vi an toàn, thì việc triển khai mặc định sẽ nhận được biểu thị không chính xác của số

Trình kết nối cung cấp hai tùy chọn để giải quyết vấn đề này

SSL

Trình kết nối có thể mã hóa dữ liệu trong quá trình truyền bằng giao thức Bảo mật tầng vận chuyển (TLS). TLS/SSL cho phép mã hóa chuyển giao và có thể tùy chọn sử dụng xác thực danh tính cho máy chủ và máy khách

Thuật ngữ SSL (Lớp cổng bảo mật) thường được sử dụng thay thế cho TLS, mặc dù nói đúng ra thì giao thức SSL là tiền thân của TLS và không được triển khai vì nó hiện được coi là không an toàn

Có hai loại xác thực SSL khác nhau

  • Xác thực SSL một chiều. Máy khách xác minh chứng chỉ của máy chủ. Điều này cho phép bạn mã hóa tất cả các trao đổi và đảm bảo rằng bạn đang kết nối với máy chủ dự kiến ​​(để tránh một cuộc tấn công trung gian)
  • Xác thực SSL hai chiều Máy khách xác minh chứng chỉ của máy chủ, máy chủ xác minh chứng chỉ của máy khách. Điều này còn được gọi là xác thực lẫn nhau hoặc xác thực ứng dụng khách. Khi sử dụng hệ thống này, khách hàng cũng yêu cầu chứng chỉ chuyên dụng

Cấu hình máy chủ

Để sử dụng SSL, bạn cần đảm bảo rằng Máy chủ MariaDB được định cấu hình chính xác. Bạn có thể xác định điều này bằng biến hệ thống

SHOW VARIABLES LIKE 'have_ssl';

+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_ssl      | DISABLED |
+---------------+----------+

Giá trị NO chỉ ra rằng MariaDB đã được biên dịch mà không hỗ trợ TLS. ĐÃ TẮT có nghĩa là nó được biên dịch với sự hỗ trợ của TLS, nhưng nó hiện đang bị tắt. Để sử dụng SSL với Trình kết nối, máy chủ phải trả về CÓ, cho biết hỗ trợ TLS khả dụng và được bật. Để biết thêm thông tin, hãy xem tài liệu Máy chủ MariaDB

Cấu hình người dùng

Kích hoạt trên máy chủ, Trình kết nối sử dụng xác thực SSL một chiều để kết nối với máy chủ. Ngoài ra, bạn cũng nên định cấu hình người dùng của mình để kết nối thông qua SSL. Điều này đảm bảo rằng tài khoản của họ chỉ có thể được sử dụng với kết nối SSL

Đối với câu lệnh GRANT, hãy sử dụng tùy chọn xác thực SSL một chiều và tùy chọn xác thực SSL hai chiều. Để biết thêm thông tin, hãy xem tài liệu TẠO NGƯỜI DÙNG

CREATE USER 'johnSmith'@'%' IDENTIFIED BY PASSWORD('passwd');
GRANT ALL ON company.* TO 'johnSmith'@'%' REQUIRE SSL;

Bây giờ khi người dùng này cố gắng kết nối với MariaDB mà không có SSL, máy chủ sẽ từ chối kết nối

Cấu hình

  • ssl. đối tượng boolean/JSON

đối tượng JSON

Trình kết nối sử dụng Nút. js triển khai TLS. Để biết thêm thông tin, hãy xem tài liệu

CA đáng tin cậy

Theo mặc định, Nút. js tin tưởng Cơ quan cấp chứng chỉ gốc nổi tiếng (CA), dựa trên Mozilla. Để có danh sách đầy đủ, (bao gồm Let's Encrypt phổ biến và miễn phí), hãy xem Danh sách chứng chỉ CA

Khi sử dụng chứng chỉ được ký bằng chuỗi chứng chỉ từ CA gốc mà Node biết. js, cấu hình duy nhất bạn cần làm là bật tùy chọn

CREATE USER 'johnSmith'@'%' IDENTIFIED BY PASSWORD('passwd');
GRANT ALL ON company.* TO 'johnSmith'@'%' REQUIRE SSL;
3

Chuỗi chứng chỉ là danh sách các chứng chỉ được cấp từ cùng một hệ thống phân cấp của Tổ chức phát hành chứng chỉ. Để bất kỳ chứng chỉ nào được xác thực, tất cả các chứng chỉ trong chuỗi phải được xác thực

Trong trường hợp chứng chỉ trung gian hoặc chứng chỉ gốc không được Trình kết nối tin cậy, Trình kết nối sẽ từ chối kết nối và đưa ra lỗi

Chứng chỉ có thể cung cấp xác minh tên máy chủ cho trình điều khiển. Theo mặc định, điều này được thực hiện đối với trường tên DNS subjectAlternativeName của chứng chỉ

Khi chứng chỉ máy chủ được ký bằng chuỗi chứng chỉ sử dụng CA gốc đã biết trong kho lưu trữ tin cậy JavaScript, việc đặt tùy chọn

CREATE USER 'johnSmith'@'%' IDENTIFIED BY PASSWORD('passwd');
GRANT ALL ON company.* TO 'johnSmith'@'%' REQUIRE SSL;
3 sẽ bật xác thực SSL một chiều

Ví dụ,

const mariadb = require('mariadb');
mariadb
 .createConnection({
   host: 'myHost.com', 
   ssl: true, 
   user: 'myUser', 
   password:'MyPwd', 
   database:'db_name'
 }).then(conn => {})

Khi máy chủ sử dụng chứng chỉ tự ký hoặc sử dụng chứng chỉ trung gian, có hai khả năng khác nhau

Trong môi trường phi sản xuất, bạn có thể yêu cầu Trình kết nối tin cậy tất cả các chứng chỉ bằng cách đặt rejectUnauthorized thành false. KHÔNG sử dụng cái này trong sản xuất

//connecting
mariadb
 .createConnection({
   host: 'myHost.com', 
   ssl: {
	 rejectUnauthorized: false
   }, 
   user: 'myUser', 
   password:'MyPwd', 
 }).then(conn => {})

Một giải pháp thay thế an toàn hơn là cung cấp chuỗi chứng chỉ cho Trình kết nối

const fs = require("fs");
const mariadb = require('mariadb');

//reading certificates from file
const serverCert = [fs.readFileSync("server.pem", "utf8")];

//connecting
mariadb
 .createConnection({
   user: "myUser",
   host: "myHost.com",
   ssl: {
	 ca: serverCert
   }
 }).then(conn => {})

Sử dụng các giao thức hoặc mật mã TLS cụ thể

Trong trường hợp bạn không thích giao thức hoặc mật mã TLS mặc định hoặc khi bạn muốn sử dụng một phiên bản cụ thể, bạn buộc Trình kết nối sử dụng phiên bản bạn muốn bằng cách sử dụng tùy chọn

CREATE USER 'johnSmith'@'%' IDENTIFIED BY PASSWORD('passwd');
GRANT ALL ON company.* TO 'johnSmith'@'%' REQUIRE SSL;
5 và
CREATE USER 'johnSmith'@'%' IDENTIFIED BY PASSWORD('passwd');
GRANT ALL ON company.* TO 'johnSmith'@'%' REQUIRE SSL;
6

Chẳng hạn, giả sử bạn muốn kết nối bằng TLS phiên bản 1. 2

SHOW VARIABLES LIKE 'have_ssl';

+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_ssl      | DISABLED |
+---------------+----------+
0

Để biết thêm thông tin về những gì có sẵn, hãy xem các giá trị

Xác thực SSL lẫn nhau hoặc xác thực lẫn nhau dựa trên chứng chỉ đề cập đến việc hai bên xác thực lẫn nhau bằng cách xác minh các chứng chỉ kỹ thuật số được cung cấp. Điều này cho phép cả hai bên yên tâm về danh tính của bên kia. Để sử dụng xác thực lẫn nhau, bạn phải đặt tùy chọn trong câu lệnh GRANT. Ví dụ,

SHOW VARIABLES LIKE 'have_ssl';

+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_ssl      | DISABLED |
+---------------+----------+
1

Tùy chọn này khiến máy chủ yêu cầu Trình kết nối cấp chứng chỉ ứng dụng khách. Nếu người dùng không được đặt với YÊU CẦU X509, thì máy chủ sẽ mặc định xác thực một chiều

Khi sử dụng xác thực lẫn nhau, bạn cần có chứng chỉ (và khóa riêng liên quan của nó) cho Trình kết nối cũng như máy chủ. Nếu Trình kết nối không cung cấp chứng chỉ và người dùng được đặt thành YÊU CẦU X509, máy chủ sẽ trả về thông báo cơ bản

CREATE USER 'johnSmith'@'%' IDENTIFIED BY PASSWORD('passwd');
GRANT ALL ON company.* TO 'johnSmith'@'%' REQUIRE SSL;
7

Trong trường hợp bạn muốn xem cách xác định người dùng, bạn có thể tìm thấy thông tin này bằng cách truy vấn mysql. bảng người dùng trên máy chủ. Chẳng hạn, giả sử bạn muốn có thông tin về người dùng johnSmith

SHOW VARIABLES LIKE 'have_ssl';

+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_ssl      | DISABLED |
+---------------+----------+
3

Bạn có thể kiểm tra bằng cách tạo người dùng với REQUIRE X509 để kiểm tra

SHOW VARIABLES LIKE 'have_ssl';

+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_ssl      | DISABLED |
+---------------+----------+
4

Sau đó sử dụng thông tin đăng nhập của nó trong ứng dụng của bạn

SHOW VARIABLES LIKE 'have_ssl';

+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_ssl      | DISABLED |
+---------------+----------+
5

Sử dụng kho khóa

Kho khóa cho phép bạn lưu trữ khóa riêng và chuỗi chứng chỉ được mã hóa bằng mật khẩu để gửi. Chẳng hạn, sử dụng OpenSSL, bạn có thể tạo kho khóa bằng định dạng PKCS12

CREATE USER 'johnSmith'@'%' IDENTIFIED BY PASSWORD('passwd');
GRANT ALL ON company.* TO 'johnSmith'@'%' REQUIRE SSL;
0

Sau đó, bạn có thể sử dụng kho khóa trong ứng dụng của mình

CREATE USER 'johnSmith'@'%' IDENTIFIED BY PASSWORD('passwd');
GRANT ALL ON company.* TO 'johnSmith'@'%' REQUIRE SSL;
1

Sự lựa chọn khác

F. A. Q

Khách hàng xác minh chứng chỉ SAN (tên thay thế chủ đề) và CN để đảm bảo rằng chứng chỉ tương ứng với tên máy chủ. Nếu SAN/CN của chứng chỉ không tương ứng với tùy chọn máy chủ, nó sẽ trả về một lỗi chẳng hạn như

CREATE USER 'johnSmith'@'%' IDENTIFIED BY PASSWORD('passwd');
GRANT ALL ON company.* TO 'johnSmith'@'%' REQUIRE SSL;
2

Để khắc phục điều này, hãy sửa giá trị máy chủ để tương ứng với máy chủ được xác định trong chứng chỉ

thói quen lỗi. ssl_choose_client_version. giao thức không được hỗ trợ

Kể từ nút. js 12 phiên bản TLS tối thiểu được đặt thành 1. 2

Máy chủ MariaDB có thể được xây dựng với thư viện SSL khác nhau, phiên bản cũ chỉ hỗ trợ TLS tối đa 1. 1. Lỗi "1976. lỗi. 1425F102. quy trình SSL. ssl_choose_client_version. giao thức không được hỗ trợ" có thể xảy ra nếu triển khai SSL MariaDB không hỗ trợ TLSv1. 2

Làm cách nào để kết nối với cơ sở dữ liệu MySQL bằng SSL?

Định cấu hình kết nối SSL MySQL .
Tạo thư mục để lưu trữ các khóa SSL. Để tạo thư mục chứa khóa SSL, hãy thực hiện các bước sau. .
Tạo khóa SSL. Ghi chú. .
Chỉnh sửa cấu hình MySQL. .
Kiểm tra cấu hình SSL. .
Tạo người dùng và cho phép truy cập từ xa. .
Kiểm tra kết nối MySQL từ xa

MySQL có tốt cho Nodejs không?

js được kết hợp với MongoDB và các cơ sở dữ liệu NoSQL khác, nhưng Node. js cũng hoạt động tốt với các cơ sở dữ liệu quan hệ như MySQL . Nếu bạn muốn viết một microservice mới với Node. js cho cơ sở dữ liệu hiện có, rất có thể bạn sẽ sử dụng MySQL, một trong những cơ sở dữ liệu mã nguồn mở phổ biến nhất thế giới.

Nodejs có thể giao tiếp với MySQL không?

Khi bạn đã thiết lập và chạy MySQL trên máy tính của mình, bạn có thể truy cập nó bằng cách sử dụng Nút. js . Để truy cập cơ sở dữ liệu MySQL bằng Node. js, bạn cần có trình điều khiển MySQL.