Computer >> Máy Tính >  >> Lập trình >> Ruby

Trường hợp chống lại việc sử dụng RubyGems.org trong sản xuất

Screed + một screencast hướng dẫn bạn cách lưu trữ những viên ngọc quý của riêng bạn

Hãy giải quyết vấn đề này một cách dễ dàng:đá quý thật tuyệt vời và RubyGems.org là một dịch vụ tuyệt vời.

... Nhưng gần đây, tôi luôn cảm thấy buồn nôn mỗi khi thêm một viên ngọc mới vào một ứng dụng. Càng nghĩ về điều đó, tôi càng thấy rằng cách chúng ta sử dụng đá quý không chỉ là sai sót. Đó là một thảm họa đang chờ xảy ra.

Kỹ thuật xã hội FTW

Vài ngày trước tại RubyNation, Ben Smith đã có một bài nói chuyện tuyệt vời có tên Hacking With Gems.

Không tấn công trên đá quý, nhưng sử dụng đá quý như một cách để hack ... như một vectơ tấn công.

Anh ấy đã thực hiện một thử nghiệm thú vị.

Nếu bạn có mặt tại hội nghị, bạn có thể nhìn thấy chồng thẻ được in độc đáo bên cạnh hình dán github và các thẻ swag khác.

Thẻ nói một điều:gem install rubynation . Và khoảng 10% người tham dự đã làm.

Trường hợp chống lại việc sử dụng RubyGems.org trong sản xuất

Điều mà viên ngọc không làm được

Viên ngọc đã làm một số điều hữu ích. Nhưng những gì nó không làm thú vị hơn.

Nó không:

  • Đánh cắp thông tin đăng nhập RubyGems.org từ tệp dotfile gemcutter của bạn

  • Chặn mật khẩu văn bản rõ và lưu trữ chúng trong thư mục rails / public của bạn

  • Thêm tài khoản SSH bí mật vào hệ thống của bạn

Nhưng nó có thể có. Hỏi Ben nếu bạn không tin tôi.

Điều này sẽ khiến bạn sợ hãi

Hãy để tôi sao lưu và nói lại điều này, để nó sẽ chìm vào trong.

Khoảng 25 người - LẬP TRÌNH VIÊN MÁY TÍNH - đã bị điều khiển để chạy mã tùy ý trên máy phát triển của họ. Một số thậm chí còn chạy nó dưới dạng root.

Tôi không có ý định chọn những người này. Đây chỉ là tiêu chuẩn trong cộng đồng Ruby.

Tại sao điều đó lại xảy ra?

Mọi người tin tưởng đá quý.

  • Vì chúng thường hoạt động.

  • Bởi vì Rails là một viên ngọc.

  • Bởi vì những người nổi tiếng như Aaron Patterson, Steve Klabnik và Yehuda Katz duy trì chúng.

Nhưng đó là một vấn đề khi bạn bắt đầu tin tưởng những người mà bạn không biết.

Đó là sự cố khi bạn nhập gem install rubynation không chần chừ gì nữa, bạn nhập gem install rails .

Và hãy trung thực. Ai đã không làm điều này ít nhất một lần? Chúng ta lười biếng và đá quý thì dễ dàng.

Rubygems.org không đáng trách

Nó chỉ làm cho nó cực kỳ dễ dàng để làm điều sai trái. Để chạy mã không đáng tin cậy trên máy chủ của bạn. Không được biết về thay đổi trong mã chạy trên máy chủ của bạn.

Đó là lý do tại sao tôi đề nghị tất cả chúng ta ngừng sử dụng nó trong sản xuất.

Giải pháp

Chữ ký là không đủ

Mọi người nên ký vào đá quý của họ. Nhưng chữ ký là không đủ. Chữ ký chỉ xác minh danh tính của nhà xuất bản. Nó không cho bạn biết họ là thiện, ác hay hỗn loạn trung lập.

Không có ai đến giải cứu

Trong một thế giới hoàn hảo, chúng tôi có một tổ chức đáng tin cậy phân phối các phiên bản đá quý được cho là tốt.

Nếu điều đó khiến bạn hiểu sai cách, thì hãy nghĩ về cách các tổ chức như Debian làm điều gì đó tương tự cho Linux. Nếu điều đó vẫn khiến bạn đi sai cách .... thì tôi rất vinh dự khi bạn đang đọc blog của tôi, ông Stallman.

Tại sao tôi lại nói trong một thế giới hoàn hảo? Chà, bởi vì các lựa chọn thay thế khác là rất nhiều công việc và tôi không muốn làm điều đó.

... một người trong số các bạn YC hy vọng có thể làm ơn làm ơn cho điều này được không?

Lựa chọn thực sự duy nhất:DIY

Thật không may là tôi phải sống trong thế giới thực cũ kỹ hôi hám này. Cách thực sự duy nhất để có toàn quyền kiểm soát các viên ngọc của bạn là.

  • Xem lại mã phản bội

  • Tự mình lưu trữ đá quý

May mắn thay, lưu trữ đá quý của riêng bạn rất dễ dàng. Tôi sẽ chỉ cho bạn cách làm.

Cách lưu trữ đá quý của riêng bạn

Trường hợp chống lại việc sử dụng RubyGems.org trong sản xuất

Nó không phải là phép thuật

Một “máy chủ” đá quý chỉ là một loạt các tệp phẳng trên web. Bạn có thể lưu trữ chúng ở bất cứ đâu, ngay cả trên S3 hoặc dropbox.

Tạo ứng dụng Rails làm testbench

Lý do duy nhất tôi sử dụng đường ray ở đây là vì nó cung cấp cho chúng ta một Gemfile được tạo sẵn để chơi cùng. Ứng dụng này không làm gì cả.

`$ rails new myapp
$ cd myapp
`

Tải xuống các tệp .gem

Lệnh Bundler này sẽ tải xuống tất cả các tệp .gem được tham chiếu bởi Gemfile.lock và đặt chúng vào /vendor/cache

`$ bundle package
$ mkdir /tmp/gem_server
$ mv vendor/cache/ /tmp/gem_server/gems
`

Tạo tệp 'máy chủ'

Để lấy một thư mục các tệp .gem và làm cho chúng sẵn sàng để phân phát, bạn chạy gem generate_index .

`$ gem generate_index -d /tmp/gem_server/
`

Đưa tất cả trực tuyến

Bây giờ tôi sẽ không đề xuất điều này trong sản xuất, nhưng ...

`$ mv /tmp/gem_server /Users/snhorne/Dropbox/Public/
`

Chỉnh sửa Gemfile và cập nhật gói của bạn

Cập nhật dòng "nguồn" để trỏ đến máy chủ mới của bạn thay vì rubygem

`# Gemfile

source 'https://dl.dropboxusercontent.com/u/12345/gem_server'
...
gem 'rails', '3.2.13'
`

Mát mẻ! Nó lấy đá quý từ tài khoản đăng của tôi.

`$ bundle update
Fetching gem metadata from https://dl.dropboxusercontent.com/u/12345/gem_server/.
Fetching full source index from https://dl.dropboxusercontent.com/u/12345/gem_server/
Using rake (10.1.0)
Using i18n (0.6.1)
Using multi_json (1.7.7)
Using activesupport (3.2.13)
`

Phần thưởng:Đá quý riêng có thể được bảo vệ bằng xác thực cơ bản HTTP

Chỉ cần làm cho tệp gem của bạn trông như thế này:

`# Gemfile

source 'https://username:password@example.com/'
`

Lựa chọn thay thế

Cách tiếp cận này không hiệu quả với bạn? Có một số giải pháp lưu trữ đá quý miễn phí và thương mại cung cấp cho bạn thêm một vài tiếng chuông và tiếng vang.

Geminabox là một ứng dụng mã nguồn mở giúp loại bỏ rất nhiều công việc dòng lệnh.

Gemfury là một công ty lưu trữ đá quý tư nhân. Trước đây, tôi đã sử dụng chúng để lưu trữ một số viên ngọc độc quyền cho khách hàng. Nó dễ dàng thiết lập và không bao giờ gặp sự cố.