Các cân nhắc về bảo mật trong gRPC cho ASP.NET Core
Bài viết này cung cấp thông tin về việc bảo mật gRPC với .NET.
Transport security (bảo mật truyền tải)
Các message gRPC được gửi và nhận sử dụng HTTP/2. Khuyến nghị:
- Sử dụng Transport Layer Security (TLS) để bảo mật message trong các ứng dụng gRPC production.
- Các gRPC services chỉ nên lắng nghe và phản hồi qua các cổng được bảo mật.
TLS được cấu hình trong Kestrel. Để biết thêm thông tin về cấu hình các endpoints của Kestrel, xem Kestrel endpoint configuration.
Một TLS termination proxy (proxy chấm dứt TLS) có thể được kết hợp với TLS. Cần cân nhắc lợi ích của việc sử dụng TLS termination với các rủi ro bảo mật của việc gửi các HTTP request không được bảo mật giữa các ứng dụng trong mạng nội bộ.
Exceptions (ngoại lệ)
Các message exception thường được coi là dữ liệu nhạy cảm không nên tiết lộ cho client. Theo mặc định, gRPC không gửi chi tiết về một exception được ném bởi gRPC service cho client. Thay vào đó, client nhận được một message chung chung cho biết đã xảy ra lỗi. Việc gửi exception message cho client có thể được ghi đè (ví dụ: trong development hoặc test) với EnableDetailedErrors. Các exception messages không nên được tiết lộ cho client trong các ứng dụng production.
Message size limits (giới hạn kích thước message)
Các message đến gRPC clients và services được tải vào bộ nhớ. Giới hạn kích thước message là cơ chế giúp ngăn gRPC tiêu thụ tài nguyên quá mức.
gRPC sử dụng giới hạn kích thước cho mỗi message để quản lý các message đến và đi. Theo mặc định, gRPC giới hạn các message đến ở mức 4 MB. Không có giới hạn đối với các message đi.
Trên server, giới hạn message gRPC có thể được cấu hình cho tất cả các services trong một ứng dụng với AddGrpc:
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc(options =>
{
options.MaxReceiveMessageSize = 1 * 1024 * 1024; // 1 MB
options.MaxSendMessageSize = 1 * 1024 * 1024; // 1 MB
});
}Giới hạn cũng có thể được cấu hình cho từng service riêng lẻ sử dụng AddServiceOptions<TService>. Để biết thêm thông tin về cấu hình giới hạn kích thước message, xem gRPC configuration.
Client certificate validation (xác thực chứng chỉ client)
Client certificates (chứng chỉ client) ban đầu được xác thực khi kết nối được thiết lập. Theo mặc định, Kestrel không thực hiện xác thực bổ sung cho chứng chỉ client của một kết nối.
Khuyến nghị rằng các gRPC services được bảo mật bằng chứng chỉ client sử dụng package Microsoft.AspNetCore.Authentication.Certificate. Xác thực chứng chỉ ASP.NET Core sẽ thực hiện xác thực bổ sung trên chứng chỉ client, bao gồm:
- Chứng chỉ có extended key use (EKU - sử dụng khóa mở rộng) hợp lệ
- Nằm trong thời hạn hiệu lực
- Kiểm tra thu hồi chứng chỉ