2017-01-18 12 views
4

私は、スクラッチパッドとして動作する128 MBのフラッシュストレージを持つ小さな組み込みLinuxデバイスを持っています。このデバイスは、NGINX Webサーバーを実行します。ファームウェアの更新を行うために、システムは暗号化されたバイナリファイルをHTTPS POSTとしてNGINX経由でスクラッチパッドに受け取ります。その後、システムはファイルを解読し、更新を完了するために異なるQSPIフラッシュデバイスを点滅させる。OpenSSLバイナリをNGINXで復号化して復号化する(オンザフライで)

ファームウェアバイナリこのような装置の外部に暗号化されている:

openssl smime -encrypt -binary -aes-256-cbc -in plainfile.zip -out encrypted.zip.enc -outform DER yourSslCertificate.pem 

ファームウェアバイナリこのようなデバイスに、nginxのを介して受信された後、復号化される:

openssl smime -decrypt -binary -in encrypted.zip.enc -inform DER -out decrypted.zip -inkey private.key -passin pass:your_password 

私は思いバイナリがNGINXを介して(オンザフライで)受信されたときに復号化するのが本当に好きなので、フラッシュスクラッチパッドに復号化された形式で表示されます。

Googleでこれを行う既存のNGINXモジュールを見つけることができませんでした。どうすればこれを達成できますか?ありがとう。

+0

のような軽いfastcgiラッパーをnginxでどのように受け取ることができますか? – cnst

+0

NGINXがどのように動作するのか分かりませんが、この目的のためには、埋め込まれた環境で安全にファームウェアをアップデートすることができます。デバイスまたはOTA)では、異なるユースケースを使用しました。 –

+0

ファームウェアをクロスコンパイルした後、apを使用して生成された16進ファイルのハッシュ値を計算し、AESを使用してハッシュとファームウェアの両方をFTPサーバーに暗号化し、TCP/HTTPS新しいファームウェアを更新するために値をプロセッサリセットしてブートローダに入力すると、ファームウェアのハッシュ値を計算します。 –

答えて

3

まず、1つのことを理解する必要があります。 nginxはファイルを解読しますが、他のすべてのリクエストはブロックされます。そのため、nginxはCGIをサポートせず、FastCGIのみをサポートしています。これはあなたがシェルをexecしことができ、モジュール使用http://nginx.org/en/docs/http/ngx_http_perl_module.htmlhttps://github.com/openresty/lua-nginx-module

:それはあなたのためにOK(例えば、nginxのは、更新の目的でのみ使用される)場合

、あなたはPerlやLuaの拡張機能を使用することができます。

location /upload { 
    client_body_in_file_only clean; 
    perl 'sub { 
    my $r = shift; 
    if ($r->request_body_file) { 
     system("openssl smime -decrypt -binary -in ".$r->request_body_file." -inform DER -out /tmp/decrypted.zip -inkey private.key -passin pass:your_password"); 
    } 
    }'; 
} 

しかし、もっと良いのFastCGIを使用するには、次のPerlモジュール(未テスト)のためのhttps://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only

例 - アクセスアップロードされたファイルについてclient_body_in_file_onlyディレクティブを設定する必要があります。例えば、https://www.nginx.com/resources/wiki/start/topics/examples/fcgiwrap/

1

クライアントは各要求ではなく、中に送られているフルでそれらを送信することなく、HTTPリクエストの数を(開始Slowloris、として知られているApacheのような非イベントベースのサーバーに対して、広く知られている攻撃がありますnginxのようなイベントベースのアーキテクチャのために送受信するのに非常に安価な操作ですが、他のサーバでは非常に高価です)。

プロキシサーバーとして、nginxはそのような攻撃からバックエンドを保護します。確かに、保護は、特定の状況ではコストで来るかもしれない、と…_request_bufferingディレクティブをオフにすることができます。

何がだろう要求バッファリングを無効にしてから、pipe着信ファイルを直接に送りますそれが受信されると、。

stdinを指定するには、ファイル名の代わりに/dev/fd/0を使用できます(ツールに応じて、ファイル名の代わりに-を使用することもできます)。

関連する問題