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

環境変数の保護

前回の記事「環境変数に関するRubyistのガイド」では、環境変数システムがどのように機能するかを示し、いくつかの一般的な神話を打ち破りました。しかし、ある有益な読者が指摘したように、セキュリティについてはあまり言及していませんでした。

秘密のAPIキーやその他の貴重な情報を保存するためにenvvarsを使用することが一般的になっているため、セキュリティへの影響を理解することが重要です。見てみましょう:

最悪のシナリオ

ハッカーがrootとして、またはWebアプリケーションを所有するユーザーとしてサーバーにアクセスしたと想像してみてください。その場合、高度に暗号化されていない他のすべてのものとともに、環境変数が危険にさらされます。

ここでの解決策は、ユーザーがサーバーにルートアクセスできないようにすることです。 :)

トロイの木馬

ドックのそばの路地で出会った人が、imagemagickの特別なスープバージョンをくれました。彼は、ストックimagemagickの2倍の速度で実行されると主張しています。

...だからあなたは誰もがすることをします。本番環境にインストールします。唯一の問題は、環境変数を盗むように設計されていることです。

ここでは、back-ticks構文を使用して、Rubyから「悪意のある」mogrifyコマンドを実行しています。次に、Mogrifyは環境変数を盗み、挑発的なメッセージを出力します。

環境変数の保護 環境変数は、親プロセス(irb)から子プロセス(mogrify)にコピーされます

これは実際には「ハック」ではありません。これが環境変数の仕組みです。それらは親プロセスから子プロセスにコピーされます。マルウェアを実行している場合、他のアプリと同じように環境変数を継承します。

これを行うには2つの方法があります:

  • 誰かがあなたのツールチェーンに悪意のあるソフトウェアをインストールするようにあなたを説得します

  • ツールチェーンの「良性」部分には脆弱性があり、環境変数を明らかにするために悪用されます。

本当の解決策は、これらのいずれかが発生するのを防ぐために積極的に取り組むことです。ただし、ENVを盗む盗賊がツールチェーンに侵入した場合に備えて、被害を制限するための予防措置があります。

環境のサニタイズ

Rubyからシェルアウトしてimagemagickまたはその他のプログラムを実行するときはいつでも、そのプログラムはアプリのENVのコピーを継承します。 ENVに秘密がある場合は、それも取得します。それらを取り除いていない限り。

システムメソッドにハッシュを渡すことで、新しいプロセスを作成するときに特定の環境変数をオーバーライドできます。

環境変数の保護 カスタム環境変数をRubyのシステムメソッドに渡す方法

シェルアウトするときに環境変数の送信を停止したい場合は、以下の例のようなことを行うことができます。ここでは、すべての値がnilに設定されていることを除いて、ENVをミラーリングするハッシュを作成します。きれいではありませんが、シェルコマンドを実行するときにすべてのenv変数を削除することがわかった唯一の方法です。

環境変数の保護 rubyからシェルコマンドを実行したときに環境変数の送信を停止する方法

お風呂の水で赤ちゃんを捨てないでください

継承は、ENV変数の最も便利な機能の1つです。

S3に書き込むコマンドを実行する必要があるとします。環境変数の継承とは、コマンドがRubyアプリのAPIキーをシームレスに共有できることを意味します。継承を許可しなかった場合、その能力は失われます。

永続性

すべてのプロセスには、プロセスが停止すると終了する独自の環境変数のセットがあります。 Rubyアプリで環境変数を設定できますが、そのアプリが終了するとすぐに消えます。

再起動後に環境変数を保持する必要がある場合は、どこかに保存する必要があります。それは通常、ファイルシステムのどこかにあります。

アプリのgitレポジトリを使用しないでください

githubの人たちは他の人たちと同じように正直だと思いますが、ソースコードにアクセスできるすべての人が、APIキーを取得して、10,000ドルのAWS請求書を実行できるようにしたいですか?

シークレットに.bashrcまたは.bash-profileを使用しないでください

シークレットを.bashrcなどのファイルに保存すると、そのユーザーとして実行するすべてのプログラムに環境変数として送信されます。これらのプログラムのほとんどは、あなたの秘密を知る必要はありません。では、なぜそれらを彼らに与えるのですか?

秘密を必要とするプロセスにのみ秘密を公開する

RailsアプリがHONEYBADGER_API_KEYを知る必要がある唯一のプロセスである場合は、そのプロセスでのみ利用できるようにすることをお勧めします。

Railsの起動時にロードされるファイルに環境変数を追加できるgemがいくつかあります。これらのenv変数は、Railsプロセスとその子プロセスでのみ使用できます。 Rubyist's Guide to Environment Variablesの下部に、figaroとdotenvの宝石に関するセクションがあります。

構成ファイルを保護する

構成ファイルから環境をロードする場合は、Webアプリを実行しているユーザーだけが読み取れるように、そのアクセス許可が設定されていることを確認する必要があります。

ここでは、設定ファイルを作成したユーザーだけが読み取りと書き込みを行えるようにしています。この場合、Railsアプリケーションを所有しているのは同じユーザーです:

環境変数の保護 構成ファイルを読み取る必要のあるユーザーのみが読み取れるようにする

githubにチェックインしていないため、サーバーにSSHで接続して手動で編集するか、Chefなどのツールを使用して管理する必要があります。

可能な場合は「ファイアウォール」を構築します

AWSの本当に素晴らしい点の1つは、非常にきめ細かいアクセス制御ポリシーを作成できることです。多くのサービスプロバイダーには、このような機能があります。

どういう意味ですか?これは、APIキーのセットを1つ持つことができ、S3の単一のバケットにアップロードできるのは誰でも許可することを意味します。個別のアクティビティに対して個別のキーペアを作成する必要があります。画像をアップロードするための1つのキーペア。データベースのバックアップ用にもう1つ。など。

このように操作することで、セキュリティ違反の被害を制限できます。


  1. Rubyで環境変数を使用する方法

    環境変数はキーと値のペアであり、次のようになります。 KEY=VALUE これらの変数を使用して、コンピューター内のすべてのプログラム間で構成オプションを共有します。 そのため、それらがどのように機能するか、およびENVを使用してRubyプログラムからそれらにアクセスする方法を学ぶことが重要です。 特別な変数。 環境変数の例 : デフォルトのエディターの構成 宝石の場所をRubyに伝える(GEM_PATH / GEM_HOME ) APIキーを、ソース管理(git)にコミットせずにアプリケーションに渡す オペレーティングシステムがバイナリファイル(Windowsでは.exe)を検

  2. Windows 10 で環境変数を設定する方法

    環境変数は、PC で実行されているプログラムを構成するために使用されるグローバル値です。技術的に聞こえますが、実際には、さまざまなアプリが接続するための共有構成ストアにすぎません。 環境変数は個々のユーザー アカウントに関連付けられているため、ユーザーごとに異なる構成を使用できます。また、Windows がインストールされているディレクトリを常に指す %windir% などのグローバル システム変数もあります (例:C:Windows)。この値をハードコーディングする代わりに、アプリは Windows ディレクトリにアクセスする必要があるときに %windir% を参照できます。 多く