2010-03-07 12 views
144

Tôi có một tập lệnh Bash nhỏ mà tôi sử dụng để truy cập twitter và bật lên thông báo Growl trong các tình huống nhất định. Whats cách tốt nhất để xử lý lưu trữ mật khẩu của tôi với tập lệnh là gì?Cách tốt nhất để xử lý mật khẩu trong github là gì?

Tôi muốn đăng tập lệnh này lên GitHub, nhưng tôi tự hỏi cách tốt nhất để giữ bí mật đăng nhập/mật khẩu của tôi trong khi thực hiện điều này là gì. Hiện tại mật khẩu được lưu trữ trong chính kịch bản lệnh. Tôi không thể xóa nó ngay trước khi tôi đẩy vì tất cả các cam kết cũ sẽ chứa mật khẩu. Phát triển mà không có mật khẩu không phải là một lựa chọn. Tôi tưởng tượng rằng tôi nên lưu trữ mật khẩu trong một tập tin cấu hình bên ngoài, nhưng tôi nghĩ rằng tôi muốn kiểm tra xem nếu có một cách được thiết lập để xử lý điều này trước khi tôi cố gắng và đặt một cái gì đó lại với nhau.

Trả lời

172

Cách điển hình để thực hiện việc này là đọc thông tin mật khẩu từ tệp cấu hình. Nếu tệp cấu hình của bạn được gọi là foobar.config, thì bạn sẽ cam kết tệp có tên là foobar.config.example vào kho lưu trữ, chứa dữ liệu mẫu. Để chạy chương trình của bạn, bạn sẽ tạo một tệp cục bộ (không được theo dõi) được gọi là foobar.config với dữ liệu mật khẩu thực thực của bạn.

Để lọc mật khẩu hiện tại của bạn khỏi các cam kết trước đó, hãy xem trang trợ giúp GitHub theo số Removing sensitive data.

+3

Btw, bạn có thể thêm một ví dụ foobar.config vào repo và sau đó thêm foobar.config vào tệp .ignore. Bằng cách này, ví dụ foobar.config sẽ xuất hiện khi nhân bản và mật khẩu thực của bạn sẽ không được thêm vào repo. –

+12

@Mr_Chimp: Tệp '.gitignore' không áp dụng cho các tệp được theo dõi * đã có trong kho lưu trữ. Ví dụ, 'git add -u' sẽ thêm một tập tin thay đổi ngay cả khi nó đã có trong' .gitignore'. –

+1

Là một bổ sung, đây là một liên kết thú vị trong trường hợp bạn đã thêm tệp cấu hình do tai nạn và bạn muốn xóa nó khỏi lịch sử git: https://help.github.com/articles/remove-sensitive-data – Louhike

13

Điều gì Greg said nhưng tôi muốn thêm rằng bạn nên kiểm tra một tệp foobar.config-TEMPLATE.

Nó phải chứa tên mẫu, mật khẩu hoặc thông tin cấu hình khác. Sau đó, nó là rất rõ ràng những gì foobar.config thực sự nên chứa, mà không cần phải nhìn vào tất cả các mã mà giá trị phải có mặt trong foobar.config và những gì định dạng mà họ cần phải có.

Thường thì giá trị cấu hình có thể không rõ ràng, như chuỗi kết nối cơ sở dữ liệu và những thứ tương tự.

1

Nếu bạn đang sử dụng ruby ​​trên đường ray, đá quý Figaro rất tốt, dễ dàng và đáng tin cậy. Nó có yếu tố đau đầu thấp với môi trường sản xuất.

+1

Bạn có thể cung cấp một số chi tiết về đá quý đó làm gì không? Bằng cách đó, có thể (có khả năng) được coi là 'thực hành' áp dụng trên nhiều ngôn ngữ. – mattumotu

18

Cách tiếp cận có thể là đặt mật khẩu (hoặc khóa API) bằng biến môi trường. Vì vậy, mật khẩu này nằm ngoài tầm kiểm soát.

Với Bash, bạn có thể thiết lập biến môi trường sử dụng

export YOUR_ENV_VARIABLE=your_password 

Cách tiếp cận này có thể được sử dụng với các dịch vụ tích hợp liên tục như Travis, mã của bạn (không có mật khẩu) được lưu trữ trong một kho lưu trữ GitHub có thể được thực hiện bởi Travis (với mật khẩu của bạn được đặt bằng biến môi trường).

Với Bash, bạn có thể nhận được giá trị của một biến môi trường sử dụng:

echo $YOUR_ENV_VARIABLE 

Với Python, bạn có thể nhận được giá trị của một biến môi trường sử dụng:

import os 
print os.environ['YOUR_ENV_VARIABLE'] 

PS: lưu ý rằng đó là có thể hơi mạo hiểm (nhưng đó là một thực tế khá phổ biến) https://www.bleepingcomputer.com/news/security/javascript-packages-caught-stealing-environment-variables/

PS2: bài viết này có tiêu đề "Cách lưu trữ an toàn khóa API" https://dev.to/bpedro/how-to-securely-store-api-keys-ab6 có thể thú vị để đọc

+0

Làm thế nào để ngăn chặn khả năng "không an toàn" mã beeing xây dựng từ đọc nội dung của biến môi trường của bạn? – gorootde

+0

Tôi khuyên bạn nên xem https://blog.travis-ci.com/2013-06-10-secure-env-in-pull-requests/ và https://docs.travis-ci.com/user/pull-requests/# Pull-Requests-and-Security-Restrictions – scls

3

Người ta có thể sử dụng Vault mà đóng chặt, cửa hàng, và điều khiển truy cập vào thẻ, mật khẩu, giấy chứng nhận, khóa API, vv Ví dụ Ansible sử dụng Ansible Vault trong đó đề với mật khẩu hoặc giấy chứng nhận sử dụng trong playbooks

+0

Tôi thấy Ansible Vault quá phức tạp chắc chắn so với việc tạo một tệp cấu hình ví dụ. – icc97

+0

@ icc97 Vâng, thật đáng buồn. Nhưng chúng ta cần đề cập đến khả năng này. Theo ý kiến ​​của tôi, đối với các tác vụ phức tạp hơn thì lưu trữ vài mật khẩu cho môi trường một người dùng tốt hơn là sử dụng các giải pháp chuyên biệt ngay từ đầu. –