Giữ bí mật ngoài tầm kiểm soát nguồn - chúng ta chỉ đang chuyển vấn đề?


10

Tôi đã kế thừa một số dự án trong đó các bí mật nằm trong kiểm soát nguồn trong App.config và các tệp tương tự. May mắn thay, nó không phải là một kho lưu trữ công cộng nên rủi ro không nghiêm trọng như nó có thể xảy ra. Tôi đang xem xét các cách tốt hơn để quản lý việc này, chẳng hạn như Azure KeyVault. (Nhưng tôi không có ý định đặt câu hỏi này cụ thể cho giải pháp đó.)

Nói chung, không phải chúng ta chỉ di chuyển vấn đề? Ví dụ: với Azure KeyVault, ID ứng dụng và bí mật ứng dụng trở thành những thứ bạn cần để tránh khỏi sự kiểm soát nguồn. Đây là một ví dụ điển hình về việc điều này có xu hướng sai. Các cách tiếp cận khác cuối cùng tương tự nhau, với các khóa API hoặc tệp kho khóa mà bạn phải bảo vệ.

Đối với tôi, dường như các sản phẩm như Azure KeyVault không tốt hơn và phức tạp hơn nhiều so với việc giữ bí mật của bạn trong một tệp cấu hình riêng biệt và đảm bảo rằng nó nằm trong .gitignore hoặc tương đương của bạn. Tập tin này sẽ phải được chia sẻ khi cần thông qua một kênh bên. Tất nhiên, mọi người có thể sẽ gửi email cho nhau một cách không an toàn ...

Có cách nào để quản lý các bí mật không chỉ chuyển vấn đề không? Tôi tin rằng câu hỏi này có một câu trả lời được xác định rõ ràng. Tương tự, nếu tôi hỏi làm thế nào HTTPS không chuyển vấn đề, câu trả lời sẽ là các khóa CA được phân phối với HĐH của bạn và chúng tôi tin tưởng chúng vì chúng tôi tin tưởng phương thức phân phối của HĐH. (Liệu chúng ta có nên là một câu hỏi riêng biệt ...)

Câu trả lời:


12

Bạn có thể nói bạn chỉ đang di chuyển vấn đề. Cuối cùng, sẽ phải có một bí mật được lưu trữ ở đâu đó mà ứng dụng của bạn có quyền truy cập để có mật khẩu, khóa ssh, bất cứ điều gì.

Nhưng, nếu được thực hiện đúng, bạn đang chuyển vấn đề từ một nơi khó bảo mật đúng cách sang một vấn đề mà bạn có thể bảo vệ tốt hơn. Ví dụ, đặt bí mật trong một repo github công khai khá giống như để chìa khóa nhà của bạn được dán vào cửa trước của bạn. Bất cứ ai muốn họ sẽ không gặp khó khăn khi tìm thấy chúng. Nhưng nếu bạn chuyển đến, giả sử một cửa hàng khóa trên mạng nội bộ không có kết nối bên ngoài, bạn sẽ có cơ hội bảo mật mật khẩu tốt hơn nhiều. Điều đó giống như giữ chìa khóa của bạn trong túi của bạn. Không thể mất chúng (ví dụ như đưa ra mật khẩu Azure của bạn), nhưng điều đó hạn chế việc bạn tiếp xúc so với việc nhấn các phím của bạn vào cửa của bạn.


4

Các bí mật như khóa mã hóa và thông tin đăng nhập không nên được kiểm tra trong kiểm soát nguồn vì một vài lý do. Đầu tiên rõ ràng là các khóa mã hóa và thông tin đăng nhập phải luôn luôn cần phải biết và kiểm soát nguồn không phải là cách đáng tin cậy để bảo vệ thông tin khỏi bị tiết lộ. Lý do khác khiến bạn không muốn có những bí mật như vậy trong kiểm soát nguồn của mình thường là vì các bí mật thường (nhưng không phải luôn luôn) đặc trưng cho một thuộc tính nhất định của môi trường mà ứng dụng của bạn sẽ chạy. (Ví dụ: Lấy khóa riêng để tạo kỹ thuật số chữ ký cần thiết cho ủy quyền dịch vụ web, điểm cuối cụ thể của dịch vụ web đó có thể đang chạy trong môi trường QA yêu cầu chữ ký QA).

Cách chính xác để xử lý một môi trường (hoặc bí mật toàn cầu) là đối xử với nó giống như bất kỳ thuộc tính cấu hình môi trường nào khác, với các điều khiển bảo mật bổ sung cho biện pháp tốt. Một mô-đun mã được thiết kế tốt, độc lập và có thể phiên bản phải giống hệt nhau giữa các môi trường sao cho môi trường chúng được triển khai để thông báo cho ứng dụng về các thuộc tính của nó (Ví dụ: chi tiết kết nối cơ sở dữ liệu, thông tin xác thực, điểm cuối dịch vụ web, đường dẫn tệp, v.v.) các chi tiết cấu hình quan trọng cho ứng dụng của bạn được đưa ra ngoài và trở thành các tham số cấu hình của môi trường của bạn.

Bây giờ để giải quyết một số đối số của bạn:

Nói chung, không phải chúng ta chỉ di chuyển vấn đề?

Không có thứ gọi là bảo mật hoàn hảo, tuy nhiên "chuyển" vấn đề sang một khu vực có thể áp dụng các biện pháp và kiểm soát bổ sung sẽ cải thiện khó khăn và giảm khả năng tiết lộ bí mật hoặc vô tình tiết lộ bí mật. Một nguyên tắc tốt để tuân theo khi thiết kế một hệ thống trong đó dữ liệu bí mật phải được bảo vệ là luôn đặt các điều khiển trong twos. Điều tôi muốn nói là để đảm bảo rằng việc tiết lộ thông tin bí mật hoặc sự cố bảo mật xảy ra sau đó sẽ phải xảy ra sự cố hoặc trong hai hoặc nhiều biện pháp kiểm soát.

Một ví dụ điển hình của việc này có thể là lưu trữ một tệp được mã hóa trên máy chủ. Tôi cũng có một khóa giải mã bí mật mà tôi phải giữ bí mật trong một tệp khác.

  • Lưu trữ khóa và tệp được mã hóa trong cùng một máy chủ (0 Điều khiển, bất kỳ ai có quyền truy cập vào máy chủ đều có thể thu được thông tin bí mật một cách tầm thường)
  • Thực hiện các bước trên và bảo vệ quyền truy cập tệp vào cả hai tệp để người dùng thời gian chạy ứng dụng của HĐH chỉ có thể đọc được.
  • Lưu trữ khóa trong kho khóa ngoài, lấy khóa bằng nhiều biện pháp bảo mật như liệt kê trắng địa chỉ IP, xác thực chứng chỉ và các biện pháp khác cho ứng dụng có thể truy cập tệp được mã hóa trên hệ thống tệp của nó. (Nhiều điều khiển, nhiều lỗi của kiểm soát bảo mật phải xảy ra để dữ liệu bí mật bị xâm phạm)

Một lần nữa, không có thứ gọi là bảo mật hoàn hảo nhưng mục tiêu có nhiều điều khiển đảm bảo rằng nhiều lỗi cần phải xảy ra để tiết lộ xảy ra.

Dường như với tôi rằng các sản phẩm như Azure KeyVault không tốt hơn và phức tạp hơn nhiều,

Có phức tạp, vô nghĩa là hoàn toàn chủ quan. Chúng ta không thể có một cuộc thảo luận về sự vô nghĩa của bảo mật bổ sung mà không tính đến thực tế về mức độ nghiêm trọng của dữ liệu bí mật sẽ bị lộ. Nếu ai đó có thể sử dụng dữ liệu bí mật để gửi chuyển khoản bất hợp pháp ra khỏi tổ chức tài chính của bạn thì một cái gì đó giống như một kho tiền chính là về thứ xa nhất từ ​​vô nghĩa sẽ có.

hơn là giữ bí mật của bạn trong một tệp cấu hình riêng biệt và đảm bảo rằng nó nằm trong .gitignore hoặc tương đương của bạn.

Cho đến khi ai đó vô tình kiểm tra nó vào kiểm soát nguồn, bây giờ bí mật được nhúng trong lịch sử kiểm soát nguồn mãi mãi.

Tất nhiên, mọi người có thể sẽ gửi email cho nhau một cách không an toàn ...

Bảo mật không chỉ là vấn đề kỹ thuật, nó cũng là vấn đề của mọi người. Điều đó sẽ lạc đề tuy nhiên tôi cảm thấy vào thời điểm này bạn đang cố gắng tự nói ra những việc cần thiết.

Có cách nào để quản lý các bí mật không chỉ chuyển vấn đề không? Tôi tin rằng câu hỏi này có một câu trả lời được xác định rõ ràng. Tương tự, nếu tôi hỏi làm thế nào HTTPS không chuyển vấn đề, câu trả lời sẽ là các khóa CA được phân phối với HĐH của bạn và chúng tôi tin tưởng chúng vì chúng tôi tin tưởng phương thức phân phối của HĐH.

An ninh không phải lúc nào cũng khiến vấn đề biến mất, phần lớn thời gian nó đặt các điều khiển xung quanh chúng. Sự tương tự của bạn ngắn gọn bởi vì trên thực tế đó chính xác là những gì mật mã khóa công khai làm. Chúng tôi đang "chuyển vấn đề" sang CA bằng cách đặt niềm tin không được thừa nhận và hoàn toàn tin tưởng vào CA của chúng tôi để xác nhận danh tính của đơn vị sở hữu chứng chỉ công khai. Về cơ bản, không có gì thiếu một chuỗi thất bại thảm hại (ví dụ như mất niềm tin vào CA) sẽ phải xảy ra để dẫn đến một vấn đề bảo mật.

Cũng như nhiều thứ khác, bảo mật là một dòng bạn phải rút ra dựa trên các tiêu chí chủ quan, bản chất của dữ liệu, hậu quả của việc tiết lộ, khẩu vị rủi ro, ngân sách, v.v ...


0

Thật đáng để xem xét git secretdự án ( http://git-secret.io/ ) để giữ các tệp bí mật trong git repo được mã hóa bằng khóa không đối xứng . Khóa công khai cũng có trong repo, khóa riêng không.

Các tính năng của phương pháp này là:

  • khi người dùng / máy mới cần giải mã các tệp được bảo mật - anh ta xuất bản / gửi khóa gpg (gnu Privacy Guard aka pgp) công khai của mình. Người dùng đã có thể giải mã các tệp được bảo mật có thể mã hóa lại chúng bằng khóa bổ sung mới - sau đó người dùng mới có thể giải mã các tệp được bảo mật bằng khóa riêng của mình.
  • rõ ràng bạn cần kiểm soát ai có thể cam kết / đẩy vào kho git. Nếu không, kẻ tấn công có thể cam kết khóa công khai của riêng mình và đợi cho đến khi ai đó được ủy quyền sẽ mã hóa lại các tệp được bảo mật bằng khóa chung bị xâm phạm mới này.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.