Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

กรณีต่อต้านการใช้ RubyGems.org ในการผลิต

การพูดนานน่าเบื่อ + screencast แสดงวิธีการโฮสต์อัญมณีของคุณเอง

เลิกกันเถอะ อัญมณีนั้นยอดเยี่ยม และ RubyGems.org เป็นบริการที่ยอดเยี่ยม

...แต่ช่วงหลังนี้ฉันรู้สึกไม่สบายใจทุกครั้งที่เพิ่มอัญมณีใหม่ลงในแอป ยิ่งฉันคิดเกี่ยวกับมันมากเท่าไหร่ ก็ยิ่งดูเหมือนว่าวิธีที่เราใช้อัญมณีไม่ได้เป็นเพียงข้อบกพร่อง มันคือหายนะที่รออยู่

วิศวกรรมสังคม FTW

เมื่อไม่กี่วันก่อนที่ RubyNation เบ็น สมิธได้พูดคุยอย่างยอดเยี่ยมเรื่อง Hacking With Gems

ไม่แฮ็ค เปิด อัญมณี แต่ใช้อัญมณีเป็นวิธีการแฮก...เป็นเวกเตอร์โจมตี

เขาทำการทดลองที่ยอดเยี่ยม

หากคุณอยู่ที่การประชุม คุณอาจเห็นกองการ์ดที่พิมพ์อย่างสวยงามอยู่ติดกับสติกเกอร์ GitHub และสินค้าอื่นๆ

การ์ดพูดอย่างหนึ่งว่า gem install rubynation . และผู้เข้าร่วมประมาณ 10% ก็ทำได้

กรณีต่อต้านการใช้ RubyGems.org ในการผลิต

สิ่งที่เพชรไม่ได้ทำ

อัญมณีทำสิ่งที่มีประโยชน์บางอย่าง แต่สิ่งที่ไม่ได้ทำนั้นน่าสนใจกว่า

มันไม่ได้:

  • ขโมยข้อมูลประจำตัว RubyGems.org จาก dotfile gemcutter ของคุณ

  • สกัดกั้นรหัสผ่านข้อความธรรมดาและเก็บไว้ใน Rails /public ไดเร็กทอรี

  • เพิ่มบัญชี SSH ลับในระบบของคุณ

แต่ก็สามารถ ถามเบ็นถ้าคุณไม่เชื่อฉัน

สิ่งนี้น่าจะทำให้คุณตกใจ

กลับมาพูดอีกทีเดี๋ยวก็จมปลัก

ประมาณ 25 คน - โปรแกรมคอมพิวเตอร์ - ถูกจัดการให้เรียกใช้รหัสโดยอำเภอใจบนเครื่องพัฒนาของพวกเขา บางคนถึงกับใช้ root

ฉันไม่ได้ตั้งใจจะเลือกคนเหล่านี้ นี่เป็นเพียงบรรทัดฐานในชุมชน Ruby

เหตุใดจึงเกิดขึ้น

ผู้คนไว้วางใจอัญมณี

  • เพราะมันใช้งานได้ปกติ

  • เพราะ Rails คืออัญมณี

  • เพราะคนที่มีชื่อเสียงอย่าง Aaron Patterson, Steve Klabnik และ Yehuda Katz เป็นผู้ดูแลรักษา

แต่มันเป็นปัญหาเมื่อคุณเริ่มไว้ใจคนที่คุณไม่รู้จัก

เกิดปัญหาเมื่อคุณพิมพ์ gem install rubynation โดยไม่ลังเลมากกว่าที่คุณจะพิมพ์ gem install rails .

และขอให้ซื่อสัตย์ ใครยังไม่ได้ทำอย่างน้อยหนึ่งครั้ง? เราขี้เกียจและอัญมณีก็ง่าย

Rubygems.org ไม่ผิด

มันทำให้ง่ายต่อการทำสิ่งที่ผิด เพื่อเรียกใช้รหัสที่ไม่น่าเชื่อถือบนเซิร์ฟเวอร์ของคุณ เพื่อจะได้ทราบเกี่ยวกับการเปลี่ยนแปลง ในโค้ดที่รันบนเซิร์ฟเวอร์ของคุณ

นั่นเป็นเหตุผลที่ฉันแนะนำให้ทุกคนหยุดใช้ในการผลิต

โซลูชัน

ลายเซ็นไม่เพียงพอ

ทุกคนควรลงนามในอัญมณีของตน แต่ลายเซ็นไม่เพียงพอ ลายเซ็นจะยืนยันตัวตนของผู้จัดพิมพ์เท่านั้น ไม่ได้บอกคุณว่าเป็นกลางดี ชั่ว หรือวุ่นวาย

ไม่มีใครมาช่วย

ในโลกที่สมบูรณ์แบบ เราจะมีองค์กรที่เชื่อถือได้ซึ่งจำหน่ายอัญมณีในเวอร์ชันที่รู้ว่าดี

หากนั่นทำให้คุณรู้สึกผิด ลองคิดดูว่าองค์กรอย่าง Debian ทำอะไรที่คล้ายคลึงกันสำหรับ Linux ถ้านั่นยังทำให้คุณรู้สึกผิด....ผมรู้สึกเป็นเกียรติที่คุณกำลังอ่านบล็อกของผม คุณสตอลแมน

ทำไมฉันถึงพูดในโลกที่สมบูรณ์แบบ? เพราะทางเลือกอื่นเป็นงานที่หนักหนา และฉันไม่อยากทำมัน

...YC คนใดคนหนึ่งในพวกคุณช่วยตอบเรื่องนี้ได้ไหม

ทางเลือกเดียวที่แท้จริง:DIY

น่าเสียดายที่ฉันต้องอยู่ในโลกแห่งความเป็นจริงอันเก่าแก่ที่มีกลิ่นเหม็น วิธีเดียวที่จะควบคุมอัญมณีของคุณได้อย่างแท้จริงคือทำ

  • ตรวจสอบรหัสสำหรับการทรยศหักหลัง

  • โฮสต์อัญมณีด้วยตัวคุณเอง

โชคดีที่การโฮสต์อัญมณีของคุณเองนั้นเป็นเรื่องง่าย ฉันจะแสดงให้คุณเห็นวิธีการ

วิธีการโฮสต์อัญมณีของคุณเอง

กรณีต่อต้านการใช้ RubyGems.org ในการผลิต

ไม่ใช่เวทมนตร์

“เซิร์ฟเวอร์” อัญมณีเป็นเพียงไฟล์เดียวบนเว็บ คุณสามารถโฮสต์ได้ทุกที่ แม้แต่ใน S3 หรือดรอปบ็อกซ์

สร้างแอป Rails เป็นม้านั่งทดสอบ

เหตุผลเดียวที่ฉันใช้รางที่นี่คือเพราะมันทำให้เรามี Gemfile ที่สร้างไว้ล่วงหน้าให้เล่นด้วย แอปนี้ไม่ทำอะไรเลย

`$ rails new myapp
$ cd myapp
`

ดาวน์โหลดไฟล์ .gem

คำสั่งบันเดิลนี้จะดาวน์โหลดไฟล์ .gem ทั้งหมดที่อ้างอิงโดย Gemfile.lock และใส่ไว้ใน /vendor/cache

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

สร้างไฟล์ 'เซิร์ฟเวอร์'

หากต้องการนำไดเร็กทอรีของไฟล์ .gem และเตรียมให้พร้อมสำหรับการให้บริการ คุณเรียกใช้ gem generate_index .

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

วางทุกอย่างออนไลน์

ตอนนี้ฉันจะไม่แนะนำสิ่งนี้ในการผลิต แต่...

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

แก้ไข Gemfile และอัปเดตบันเดิลของคุณ

อัปเดตบรรทัด "ต้นทาง" เพื่อชี้ไปที่โฮสต์ใหม่ของคุณแทน rubygems

`# Gemfile

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

เย็น! มันดึงอัญมณีออกจากดรอปบ็อกซ์ของฉัน

`$ 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)
`

โบนัส:อัญมณีส่วนตัวสามารถป้องกันได้ด้วยการตรวจสอบสิทธิ์พื้นฐานของ HTTP

เพียงแค่ทำให้ gemfile ของคุณมีลักษณะดังนี้:

`# Gemfile

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

ทางเลือก

วิธีนี้ใช้ไม่ได้ผลสำหรับคุณหรือไม่ มีโซลูชันโฮสติ้งอัญมณีเชิงพาณิชย์ฟรีบางรายการที่จะมอบเสียงระฆังและนกหวีดให้คุณอีกสองสามรายการ

Geminabox เป็นแอปพลิเคชันโอเพ่นซอร์สที่ช่วยขจัดการทำงานของบรรทัดคำสั่งจำนวนมาก

Gemfury เป็นบริษัทโฮสติ้งอัญมณีส่วนตัว ฉันเคยใช้มันเพื่อโฮสต์อัญมณีที่เป็นกรรมสิทธิ์สำหรับลูกค้า ติดตั้งง่ายและไม่เคยมีปัญหา