Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

프로덕션 환경에서 RubyGems.org를 사용하지 않는 경우

자신의 보석을 호스팅하는 방법을 보여주는 대본 + 스크린캐스트

이 문제를 해결해 보겠습니다. 보석은 훌륭하고 RubyGems.org는 훌륭한 서비스입니다.

...하지만 최근에는 앱에 새로운 보석을 추가할 때마다 기분이 나쁩니다. 생각할수록 우리가 보석을 사용하는 방식에 결함이 있는 것만은 아닌 것 같습니다. 재난이 기다리고 있습니다.

사회 공학 FTW

며칠 전 RubyNation에서 Ben Smith는 Hacking With Gems라는 멋진 강연을 했습니다.

해킹하지 않음 보석이지만 보석을 해킹하는 방법으로...공격 벡터로 사용합니다.

그는 멋진 실험을 했습니다.

컨퍼런스에 참석했다면 github 스티커 및 기타 장식 옆에 멋지게 인쇄된 카드 더미를 보았을 것입니다.

카드에는 gem install rubynation이라는 한 가지가 있습니다. . 참석자의 약 10%가 참여했습니다.

프로덕션 환경에서 RubyGems.org를 사용하지 않는 경우

젬이 하지 않은 것

보석은 몇 가지 유용한 일을 했습니다. 하지만 그렇지 않은 것이 더 흥미로웠습니다.

그렇지 않았습니다:

  • gemcutter dotfile에서 RubyGems.org 자격 증명을 훔칩니다.

  • 일반 텍스트 비밀번호를 가로채서 rails /public 디렉토리에 저장합니다.

  • 시스템에 비밀 SSH 계정 추가

하지만 그럴 수 있습니다. 내 말을 믿지 않으면 Ben에게 물어보세요.

이것은 당신을 놀라게 할 것입니다

이 말을 다시 한 번 해 보겠습니다.

약 25명의 컴퓨터 프로그래머가 자신의 개발 시스템에서 임의의 코드를 실행하도록 조작되었습니다. 일부는 루트로 실행하기도 했습니다.

이 사람들을 선택하려는 것이 아닙니다. 이것은 Ruby 커뮤니티의 표준입니다.

왜 그런 일이 일어났습니까?

사람들은 보석을 신뢰합니다.

  • 그들은 일반적으로 일하기 때문입니다.

  • Rails는 보석이기 때문입니다.

  • Aaron Patterson, Steve Klabnik, Yehuda Katz와 같은 유명한 사람들이 이를 유지하고 있기 때문입니다.

하지만 모르는 사람을 신뢰하기 시작하면 문제가 됩니다.

gem install rubynation을 입력하면 문제가 됩니다. gem install rails를 입력하는 것보다 더 주저하지 마십시오. .

그리고 솔직해집시다. 누가 이것을 한 번 이상 해보지 않았습니까? 우리는 게으르고 보석은 쉽습니다.

Rubygems.org는 책임이 없습니다

잘못된 일을 하기가 매우 쉽습니다. 서버에서 신뢰할 수 없는 코드를 실행합니다. 변경사항에 대한 알림을 받지 않으려면 서버에서 실행되는 코드에서.

그렇기 때문에 프로덕션 환경에서 사용을 중단할 것을 제안하는 것입니다.

솔루션

서명이 충분하지 않습니다

모두 자신의 보석에 서명해야 합니다. 그러나 서명만으로는 충분하지 않습니다. 서명은 게시자의 신원만 확인합니다. 그들이 선한지, 악한지, 혼돈의 중립인지 알려주지 않습니다.

아무도 구조하러 오지 않습니다

완벽한 세상이라면 좋은 것으로 알려진 보석 버전을 배포하는 신뢰할 수 있는 조직이 있을 것입니다.

그것이 잘못된 방식으로 문지르면 Debian과 같은 조직이 Linux에 대해 유사한 작업을 수행하는 방법에 대해 생각해 보십시오. 그래도 잘못된 방법으로 문지르면....스톨먼 씨, 제 블로그를 읽어주셔서 영광입니다.

왜 완벽한 세상에서 말합니까? 글쎄요, 다른 대안은 작업량이 많기 때문에 하지 않는 것이 좋습니다.

...YC 희망자 중 한 명이 이 작업을 수행할 수 있습니까?

유일한 실제 옵션:DIY

불행히도 나는 이 냄새나고 오래된 현실 세계에서 살아야만 합니다. 보석을 완전히 제어할 수 있는 유일한 방법은 다음과 같습니다.

  • 반역에 대한 코드 검토

  • 직접 보석 호스팅

다행히도 자신의 보석을 호스팅하는 것은 쉽습니다. 방법을 알려드리겠습니다.

자신의 보석을 호스팅하는 방법

프로덕션 환경에서 RubyGems.org를 사용하지 않는 경우

마법이 아닙니다

gem "서버"는 웹상의 플랫 파일 묶음입니다. S3 또는 보관용 계정을 포함하여 어디서나 호스팅할 수 있습니다.

Rails 앱을 테스트벤치로 만들기

여기서 레일을 사용하는 유일한 이유는 미리 만들어진 Gemfile을 가지고 놀 수 있기 때문입니다. 이 앱은 아무것도 하지 않습니다.

`$ rails new myapp
$ cd myapp
`

.gem 파일 다운로드

이 번들러 명령은 Gemfile.lock에서 참조하는 모든 .gem 파일을 다운로드하여 /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 대신 새 호스트를 가리키도록 "source" 줄을 업데이트하십시오.

`# 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 기본 인증으로 비공개 gem을 보호할 수 있습니다.

gemfile을 다음과 같이 만들면 됩니다.

`# Gemfile

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

대안

이 접근 방식이 효과가 없습니까? 몇 가지 추가 기능을 제공하는 무료 및 상업용 보석 호스팅 솔루션이 있습니다.

Geminabox는 많은 명령줄 작업을 제거하는 오픈 소스 응용 프로그램입니다.

Gemfury는 개인 보석 호스팅 회사입니다. 나는 과거에 클라이언트를 위한 독점 보석을 호스팅하는 데 사용했습니다. 설정이 쉬웠고 문제가 없었습니다.