本番環境でRubyGems.orgを使用することに反対するケース
スクリード+独自の宝石をホストする方法を示すスクリーンキャスト
これを邪魔にならないようにしましょう。gemは素晴らしいですし、RubyGems.orgは素晴らしいサービスです。
...しかし、最近、アプリに新しい宝石を追加するたびに、気分が悪くなりました。考えれば考えるほど、宝石の使い方に欠陥があるだけではないようです。起こるのを待っている災害です。
数日前のRubyNationで、BenSmithがHackingWithGemsという素晴らしい講演を行いました。
をハッキングしない 宝石ですが、ハッキングの方法として宝石を使用しています...攻撃ベクトルとして。
彼はクールな実験を行いました。
会議に参加している場合は、githubステッカーやその他の盗品の横にきれいに印刷されたカードのスタックが表示されているのを目にしたことでしょう。
カードには1つのことが書かれています:gem install rubynation
。そして、参加者の約10%がそうしました。
宝石はいくつかの有用なことをしました。しかし、それがしなかったことはもっと面白かったです。
しませんでした:
-
gemcutterドットファイルからRubyGems.orgのクレデンシャルを盗む
-
プレーンテキストのパスワードをインターセプトして、rails/publicディレクトリに保存します
-
システムにシークレットSSHアカウントを追加する
しかし、それは可能性があります。信じられないかベンに聞いてください。
ただバックアップして、もう一度言いましょう。そうすれば、沈みます。
約25人(コンピュータープログラマー)が操作され、開発マシンで任意のコードが実行されました。ルートとして実行した人もいます。
私はこれらの人々を選ぶつもりはありません。これはRubyコミュニティの標準です。
なぜそれが起こったのですか?
人々は宝石を信頼しています。
-
彼らは通常働くからです。
-
Railsは宝石だからです。
-
アーロン・パターソン、スティーブ・クラブニク、イェフダ・カッツなどの有名な人々がそれらを維持しているからです。
しかし、知らない人を信頼し始めると問題になります。
gem install rubynation
と入力すると問題になります gem install rails
と入力するよりもためらうことはありません 。
そして正直に言いましょう。誰がこれを少なくとも一度はしていませんか?私たちは怠惰で、宝石は簡単です。
Rubygems.orgのせいではありません
間違ったことをするのが非常に簡単になります。サーバーで信頼できないコードを実行するため。 変更について知らされていない サーバー上で実行されるコードで。
だからこそ、私たちは皆、本番環境での使用をやめることを提案しています。
誰もが自分の宝石に署名する必要があります。しかし、署名だけでは不十分です。署名は、発行者の身元を確認するだけです。それらが善、悪、混沌とした中立であるかどうかはわかりません。
完璧な世界では、優れていることが知られている宝石のバージョンを配布する信頼できる組織があります。
それがあなたを間違った方法で揉むなら、Debianのような組織がLinuxのために同様のことをする方法を考えてください。それでもそれでもあなたが間違った方向に進んでいるのなら....あなたが私のブログを読んでいることを光栄に思います、ストールマンさん。
なぜ私は完璧な世界で言うのですか?ええと、他の選択肢はたくさんの仕事であり、私はむしろそれをしたくないからです。
... YCの希望者の1人がこれに参加できますか?
唯一のリアルオプション:DIY
残念ながら、私はこの臭い古い現実の世界に住まなければなりません。宝石を完全に制御する唯一の実際の方法は、次のことです。
-
裏切りのコードを確認する
-
自分で宝石をホストする
幸いなことに、独自の宝石をホストするのは簡単です。方法をお見せします。
宝石の「サーバー」は、Web上のフラットファイルの集まりです。 S3やドロップボックスでも、どこでもホストできます。
ここでレールを使用している唯一の理由は、事前に作成された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はプライベートな宝石ホスティング会社です。私は過去にそれらを使用して、クライアントのためにいくつかの独自の宝石をホストしました。セットアップは簡単で、問題はありませんでした。
-
Rubyのケースステートメントの多くの用途
if / elsifを使用する必要があるときはいつでも 代わりにRubyのcaseステートメントを使用することを検討できるステートメント。この投稿では、いくつかの異なるユースケースと、それが実際に内部でどのように機能するかを学びます。 注:他のプログラミング言語では、これはスイッチとして知られています。 ステートメント。 Rubyのcaseステートメントのコンポーネント: キーワード 説明 ケース ケースステートメントの定義を開始します。使用する変数を取得します。 いつ 一致する可能性のあるすべての条件は1つのwhenステートメントです。 その他 一致
-
仕事に取り掛かる:Inbox Zero に対する事例
数年前、同僚とメールの話題について話しました。彼女の受信トレイには何万通ものメールが入っていましたが、なぜそれを片付けなかったのかを説明する中で、彼女は良い点を挙げました。探しているものを検索するだけで済むのに、なぜメールの分類にすべてのエネルギーを注ぐのでしょうか? 受信トレイ ゼロは、多くの生産性オタクに好まれる概念です。定期的にメールの受信トレイを空にし、必要なメッセージをファイリングして残りを削除します。ここでのアイデアは、メッセージの永続的なホームではなく、電子メールの一時的な着陸場所として受信トレイを使用することです。これは優れたコンセプトであり、利点もありますが、ある意味、普通