Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

本番環境でRubyGems.orgを使用することに反対するケース

スクリード+独自の宝石をホストする方法を示すスクリーンキャスト

これを邪魔にならないようにしましょう。gemは素晴らしいですし、RubyGems.orgは素晴らしいサービスです。

...しかし、最近、アプリに新しい宝石を追加するたびに、気分が悪くなりました。考えれば考えるほど、宝石の使い方に欠陥があるだけではないようです。起こるのを待っている災害です。

ソーシャルエンジニアリングFTW

数日前のRubyNationで、BenSmithがHackingWithGemsという素晴らしい講演を行いました。

をハッキングしない 宝石ですが、ハッキングの方法として宝石を使用しています...攻撃ベクトルとして。

彼はクールな実験を行いました。

会議に参加している場合は、githubステッカーやその他の盗品の横にきれいに印刷されたカードのスタックが表示されているのを目にしたことでしょう。

カードには1つのことが書かれています:gem install rubynation 。そして、参加者の約10%がそうしました。

本番環境でRubyGems.orgを使用することに反対するケース

宝石がしなかったこと

宝石はいくつかの有用なことをしました。しかし、それがしなかったことはもっと面白かったです。

しませんでした:

  • gemcutterドットファイルからRubyGems.orgのクレデンシャルを盗む

  • プレーンテキストのパスワードをインターセプトして、rails/publicディレクトリに保存します

  • システムにシークレットSSHアカウントを追加する

しかし、それは可能性があります。信じられないかベンに聞いてください。

これはあなたを怖がらせるはずです

ただバックアップして、もう一度言いましょう。そうすれば、沈みます。

約25人(コンピュータープログラマー)が操作され、開発マシンで任意のコードが実行されました。ルートとして実行した人もいます。

私はこれらの人々を選ぶつもりはありません。これはRubyコミュニティの標準です。

なぜそれが起こったのですか?

人々は宝石を信頼しています。

  • 彼らは通常働くからです。

  • Railsは宝石だからです。

  • アーロン・パターソン、スティーブ・クラブニク、イェフダ・カッツなどの有名な人々がそれらを維持しているからです。

しかし、知らない人を信頼し始めると問題になります。

gem install rubynationと入力すると問題になります gem install railsと入力するよりもためらうことはありません 。

そして正直に言いましょう。誰がこれを少なくとも一度はしていませんか?私たちは怠惰で、宝石は簡単です。

Rubygems.orgのせいではありません

間違ったことをするのが非常に簡単になります。サーバーで信頼できないコードを実行するため。 変更について知らされていない サーバー上で実行されるコードで。

だからこそ、私たちは皆、本番環境での使用をやめることを提案しています。

ソリューション 署名だけでは不十分です

誰もが自分の宝石に署名する必要があります。しかし、署名だけでは不十分です。署名は、発行者の身元を確認するだけです。それらが善、悪、混沌とした中立であるかどうかはわかりません。

誰も救助に来ません

完璧な世界では、優れていることが知られている宝石のバージョンを配布する信頼できる組織があります。

それがあなたを間違った方法で揉むなら、Debianのような組織がLinuxのために同様のことをする方法を考えてください。それでもそれでもあなたが間違った方向に進んでいるのなら....あなたが私のブログを読んでいることを光栄に思います、ストールマンさん。

なぜ私は完璧な世界で言うのですか?ええと、他の選択肢はたくさんの仕事であり、私はむしろそれをしたくないからです。

... YCの希望者の1人がこれに参加できますか?

唯一のリアルオプション:DIY

残念ながら、私はこの臭い古い現実の世界に住まなければなりません。宝石を完全に制御する唯一の実際の方法は、次のことです。

  • 裏切りのコードを確認する

  • 自分で宝石をホストする

幸いなことに、独自の宝石をホストするのは簡単です。方法をお見せします。

独自のgemをホストする方法

本番環境でRubyGems.orgを使用することに反対するケース

魔法ではありません

宝石の「サーバー」は、Web上のフラットファイルの集まりです。 S3やドロップボックスでも、どこでもホストできます。

Railsアプリをテストベンチとして作成

ここでレールを使用している唯一の理由は、事前に作成されたGemfileで遊ぶことができるからです。このアプリは何もしません。

`$ rails new myapp
$ cd myapp
`

.gemファイルをダウンロード

このbundleコマンドは、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を編集して更新をバンドルする

「source」行を更新して、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)
`

ボーナス:プライベートgemはHTTP基本認証で保護できます

gemfileを次のように表示します:

`# Gemfile

source 'https://username:[email protected]/'
`
代替案

このアプローチはあなたのために機能しませんか?いくつかの無料の商用宝石ホスティングソリューションがあり、さらにいくつかのベルとホイッスルを提供します。

Geminaboxは、多くのコマンドライン作業を排除するオープンソースアプリケーションです。

Gemfuryはプライベートな宝石ホスティング会社です。私は過去にそれらを使用して、クライアントのためにいくつかの独自の宝石をホストしました。セットアップは簡単で、問題はありませんでした。


  1. Rubyのケースステートメントの多くの用途

    if / elsifを使用する必要があるときはいつでも 代わりにRubyのcaseステートメントを使用することを検討できるステートメント。この投稿では、いくつかの異なるユースケースと、それが実際に内部でどのように機能するかを学びます。 注:他のプログラミング言語では、これはスイッチとして知られています。 ステートメント。 Rubyのcaseステートメントのコンポーネント: キーワード 説明 ケース ケースステートメントの定義を開始します。使用する変数を取得します。 いつ 一致する可能性のあるすべての条件は1つのwhenステートメントです。 その他 一致

  2. 仕事に取り掛かる:Inbox Zero に対する事例

    数年前、同僚とメールの話題について話しました。彼女の受信トレイには何万通ものメールが入っていましたが、なぜそれを片付けなかったのかを説明する中で、彼女は良い点を挙げました。探しているものを検索するだけで済むのに、なぜメールの分類にすべてのエネルギーを注ぐのでしょうか? 受信トレイ ゼロは、多くの生産性オタクに好まれる概念です。定期的にメールの受信トレイを空にし、必要なメッセージをファイリングして残りを削除します。ここでのアイデアは、メッセージの永続的なホームではなく、電子メールの一時的な着陸場所として受信トレイを使用することです。これは優れたコンセプトであり、利点もありますが、ある意味、普通