การพูดนานน่าเบื่อ + screencast แสดงวิธีการโฮสต์อัญมณีของคุณเอง
เลิกกันเถอะ อัญมณีนั้นยอดเยี่ยม และ RubyGems.org เป็นบริการที่ยอดเยี่ยม
...แต่ช่วงหลังนี้ฉันรู้สึกไม่สบายใจทุกครั้งที่เพิ่มอัญมณีใหม่ลงในแอป ยิ่งฉันคิดเกี่ยวกับมันมากเท่าไหร่ ก็ยิ่งดูเหมือนว่าวิธีที่เราใช้อัญมณีไม่ได้เป็นเพียงข้อบกพร่อง มันคือหายนะที่รออยู่
วิศวกรรมสังคม FTW
เมื่อไม่กี่วันก่อนที่ RubyNation เบ็น สมิธได้พูดคุยอย่างยอดเยี่ยมเรื่อง Hacking With Gems
ไม่แฮ็ค เปิด อัญมณี แต่ใช้อัญมณีเป็นวิธีการแฮก...เป็นเวกเตอร์โจมตี
เขาทำการทดลองที่ยอดเยี่ยม
หากคุณอยู่ที่การประชุม คุณอาจเห็นกองการ์ดที่พิมพ์อย่างสวยงามอยู่ติดกับสติกเกอร์ GitHub และสินค้าอื่นๆ
การ์ดพูดอย่างหนึ่งว่า gem install rubynation
. และผู้เข้าร่วมประมาณ 10% ก็ทำได้
สิ่งที่เพชรไม่ได้ทำ
อัญมณีทำสิ่งที่มีประโยชน์บางอย่าง แต่สิ่งที่ไม่ได้ทำนั้นน่าสนใจกว่า
มันไม่ได้:
-
ขโมยข้อมูลประจำตัว 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
น่าเสียดายที่ฉันต้องอยู่ในโลกแห่งความเป็นจริงอันเก่าแก่ที่มีกลิ่นเหม็น วิธีเดียวที่จะควบคุมอัญมณีของคุณได้อย่างแท้จริงคือทำ
-
ตรวจสอบรหัสสำหรับการทรยศหักหลัง
-
โฮสต์อัญมณีด้วยตัวคุณเอง
โชคดีที่การโฮสต์อัญมณีของคุณเองนั้นเป็นเรื่องง่าย ฉันจะแสดงให้คุณเห็นวิธีการ
วิธีการโฮสต์อัญมณีของคุณเอง
ไม่ใช่เวทมนตร์
“เซิร์ฟเวอร์” อัญมณีเป็นเพียงไฟล์เดียวบนเว็บ คุณสามารถโฮสต์ได้ทุกที่ แม้แต่ใน 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:[email protected]/'
`
ทางเลือก
วิธีนี้ใช้ไม่ได้ผลสำหรับคุณหรือไม่ มีโซลูชันโฮสติ้งอัญมณีเชิงพาณิชย์ฟรีบางรายการที่จะมอบเสียงระฆังและนกหวีดให้คุณอีกสองสามรายการ
Geminabox เป็นแอปพลิเคชันโอเพ่นซอร์สที่ช่วยขจัดการทำงานของบรรทัดคำสั่งจำนวนมาก
Gemfury เป็นบริษัทโฮสติ้งอัญมณีส่วนตัว ฉันเคยใช้มันเพื่อโฮสต์อัญมณีที่เป็นกรรมสิทธิ์สำหรับลูกค้า ติดตั้งง่ายและไม่เคยมีปัญหา