Làm thế nào để một người xử lý dữ liệu nhạy cảm khi sử dụng Github và Heroku?


49

Tôi vẫn chưa quen với cách Git hoạt động (Và tự hỏi liệu có ai đó ngoài Linus không;)).

Nếu bạn sử dụng Heroku để lưu trữ ứng dụng của mình, bạn cần kiểm tra mã của mình trong repo Git. Nếu bạn làm việc trong một dự án nguồn mở, nhiều khả năng bạn sẽ chia sẻ repo này trên Github hoặc các máy chủ Git khác.

Một số điều không nên được kiểm tra trong repo công cộng; mật khẩu cơ sở dữ liệu, khóa API, chứng chỉ, v.v ... Nhưng những thứ này vẫn cần phải là một phần của repo Git vì bạn sử dụng nó để đẩy mã của mình sang Heroku.

Làm thế nào để làm việc với trường hợp sử dụng này?

Lưu ý: Tôi biết rằng Heroku hoặc PHPFog có thể sử dụng các biến máy chủ để khắc phục vấn đề này. Câu hỏi của tôi là về cách "ẩn" các phần của mã.


3
Tôi sẽ bắt đầu với việc sử dụng repo riêng. Sau đó, tùy thuộc vào mức độ tôi tin tưởng, tôi có thể .gitignore các tệp cấu hình của tôi có chứa dữ liệu nhạy cảm và chỉ phiên bản chúng cục bộ. (Địa phương là một vị trí trung tâm không bên ngoài có thể là máy chủ nội bộ hoặc ai biết)
Rig

Câu trả lời:


30

Phương pháp ưa thích để giữ bí mật mật khẩu / khóa api trên heroku là đặt giá trị cấu hình thông qua ứng dụng dòng lệnh heroku. Ví dụ sau đây được lấy từ một bài báo trung tâm heroku dev

(Ví dụ dưới đây và toàn bộ câu trả lời của tôi liên quan đến các ứng dụng rails)

$ cd myapp
$ heroku config:add S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190
Adding config vars and restarting myapp... done, v14
S3_KEY:     8N029N81
S3_SECRET:  9s83109d3+583493190

Sau đó tham chiếu các giá trị cấu hình này trong mã của bạn bằng biến ENV []

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

Bằng cách này, mật khẩu nhạy cảm của bạn không được lưu trữ trong kho git. (Lưu ý: Khi chạy ứng dụng cục bộ, hãy đặt các giá trị này trong .bashrctệp của bạn

Ngoài ra, tôi không chắc bạn đang chạy loại ứng dụng nào, nhưng trong Rails, heroku không sử dụng tệp cơ sở dữ liệu của bạn, nó chỉ đơn giản đặt tên người dùng / mật khẩu cơ sở dữ liệu của bạn theo cài đặt ứng dụng của bạn. Vì vậy, bạn có thể tránh lưu các thông tin đăng nhập trong git

Ngoài ra, nếu bạn đang chạy ứng dụng của riêng mình và muốn nó ở chế độ riêng tư, một sự thay thế tuyệt vời cho github là bitbucket cung cấp các kho riêng tư miễn phí.


17

Một số ý tưởng ... Mật mã khóa công khai là câu trả lời linh hoạt nhất.

Obfuscation (chỉ dành cho mã)

Đối với các phần của mã bạn muốn ẩn, bạn có thể đặt chúng vào một dự án khác, biên dịch chúng và chỉ kiểm tra mã được biên dịch, không phải nguồn không? Đây không phải là mã hóa và không phù hợp để mã hóa mật khẩu hoặc khóa. Mọi người vẫn có thể thiết kế ngược mã được biên dịch của bạn, nhưng họ không nhận được nguồn.

Kho lưu trữ GIT riêng

Nó có phải là một kho lưu trữ git công cộng ?

Lưu trữ máy chủ

Bạn có thể lưu trữ thông tin này trong một tệp được bảo vệ trong thư mục chính của tài khoản người dùng mà ứng dụng chạy bên dưới không? Tôi sẽ sao chép cách ssh thực hiện điều này với ~ / .ssh / id_rsa và chmod là 600. Không thể sử dụng biến môi trường. Bạn cần một nơi nào đó trên máy chủ để lưu trữ một số loại chìa khóa, hoặc không có cách nào bạn có thể bảo vệ bất cứ điều gì.

Mật mã đối xứng (chỉ dành cho bạn)

Nếu bạn là nhà phát triển duy nhất, bạn có thể đặt một khóa trên máy chủ và có cùng khóa đó trên máy của bạn và sử dụng sơ đồ mã hóa đối xứng để bảo vệ một số dữ liệu như mật khẩu hoặc chứng chỉ. Chia sẻ khóa đối xứng với bạn bè trở nên lộn xộn.

Mật mã bất đối xứng (dành cho nhiều nhà phát triển)

Nếu các nhà phát triển khác cần kiểm tra những thứ bí mật vào kho lưu trữ git công khai, thì mật mã khóa công khai / khóa riêng (không đối xứng) được tạo ra cho loại điều này. Cài đặt khóa riêng trên máy chủ của bạn (không kiểm tra nó vào kiểm soát nguồn!) Và tạo khóa chung từ nó. Mã hóa dữ liệu bí mật của bạn bằng khóa chung của máy chủ. Chỉ máy chủ mới có thể giải mã dữ liệu đó bằng khóa riêng của nó. Bạn thậm chí có thể kiểm tra khóa chung vào kiểm soát nguồn để người khác có thể mã hóa dữ liệu bằng cùng một khóa chung và chỉ máy chủ mới có thể giải mã được.

Dụng cụ

Openssl có lẽ là công cụ mã hóa duy nhất bạn cần. Không viết thuật toán mật mã của riêng bạn hoặc thực hiện thuật toán được xuất bản của riêng bạn.

Bớt tư tưởng

Nếu "máy chủ" là một máy chủ web sử dụng https, thì bạn đã có một kho khóa an toàn của một loại nào đó trên máy chủ để lưu trữ khóa riêng tư. Thật là phiền khi một công ty lưu trữ sẽ không cho phép điều này. Có lẽ họ có một số gợi ý về cách người khác giải quyết thách thức mà bạn đang đối mặt?


Để thêm, WRT vào bộ lưu trữ phía máy chủ - Tôi không biết liệu bạn có thể làm điều này với Heroku không, nhưng tôi đã thấy các thiết lập trong đó tập lệnh được bắn từ hook sau nhận và / hoặc thứ gì đó như Capistrano trên máy chủ triển khai để sao chép tệp cơ sở dữ liệu triển khai đến vị trí chính xác. Điều này cho phép bạn giữ hoàn toàn tệp cơ sở dữ liệu khỏi repo và có cơ chế tự động để đảm bảo thông tin đó vẫn được giữ nguyên.
Shauna

Ngay cả repos GIT tư nhân cũng nên bảo vệ dữ liệu nhạy cảm. Chỉ trong trường hợp nó đi công khai một cách tình cờ trong một thời gian. Ngoài ra, tôi nghĩ rằng nên sử dụng tiền điện tử bất đối xứng, thay vì đối xứng. Tôi thấy không có nhược điểm nào, chỉ có nhược điểm này: bạn thậm chí có thể để API ở đâu đó để dễ dàng mã hóa dữ liệu nhạy cảm mới được mã hóa cứng.
Tiberiu-Ionuț Stan

7

Nếu bạn muốn chạy mã của mình trên Heroku, bạn phải đưa mã cho họ - bạn không thể giữ bí mật "từ nhà cung cấp dịch vụ lưu trữ của mình.

Theo như các kho lưu trữ git công khai, nếu dự án của bạn là nguồn mở nhưng bạn không muốn chia sẻ chi tiết lưu trữ, bạn sẽ cần duy trì một nhánh riêng của dự án cho mục đích triển khai.


1
Cảm ơn, nhưng quy trình làm việc cho việc này là gì?
Jonas

6

Bạn không nên ẩn các phần của mã. Bảo mật hệ thống của bạn không nên dựa vào tính bảo mật của mã; đó được gọi là "bảo mật thông qua che khuất", được các chuyên gia bảo mật cau mày vì nó hoạt động rất kém.

Thay vào đó, mật khẩu, khóa mật mã, v.v ... nên được giữ tách biệt với mã. Lưu trữ chúng trong một tệp cấu hình riêng hoặc giá trị cấu hình được đọc bởi mã. Bạn không cần lưu trữ chúng trong git.

Quan trọng: Không bao giờ mã hóa khóa mật mã, mật khẩu hoặc các bí mật khác trong mã nguồn của bạn! Đó là thực tế rất xấu.

Xem thêm:

Plug: IT Security.SE là một nơi tuyệt vời để đặt câu hỏi về bảo mật!

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.