web-dev-qa-db-ja.com

コーヒーショップでローカルWebアプリケーションを安全に開発するにはどうすればよいですか?

Webアプリケーションを開発しているときに、Djangoサイト、ローカルで実行し、通常 http:// localhost でアクセスする)としましょう。

Localhostはローカルでしかアクセスできないと思ったので、これは本質的に安全だと思いました。ただし、ローカルホストは実際にはローカルである必要がないため、自己署名HTTPS証明書を使用してローカルWebサーバー(Apache、Nginx ...)を実行しても役に立たないことがわかりました。

実証的なテストでは、複数のリゾルバが確認されています... localhostクエリをネットワークに送信します...その結果、「 https:// localhost 」にアクセスすると、たとえば、悪意のあるWiFiアクセスポイント(コーヒーショップなど)は、ネットワーク攻撃者に傍受され、選択したサイト(または証明書)にリダイレクトされる可能性があります。 (電子メールチェーン「 ベースライン要件の例外、セクション7.1.4.2.1 」。)

Webアプリケーションを開発している場合は、ローカルで実行し、ブラウザーからアクセスする必要があります。時々私はインターネット接続のある喫茶店でこれをする必要があります。 localhostでない場合、どのアクセスポイントを使用する必要がありますか?

一部のデスクトップアプリケーションも、他のポートでHTTP経由で自分自身を公開します(例: http:// localhost:9000 )。おそらく私も喫茶店でそれらにアクセスするべきではありませんか?

59
david.libremone

Localhostに対する安全な開発は、次のようにして行うことができます。

  • マシンがlocalhostをループバックアドレスに解決するように構成されている(注:localhostを別のアドレスに解決するようにホストファイルを変更することが可能です)
  • マシンがループバックインターフェイスを介してループバックアドレスをルーティングするように構成されている(ループバックアドレスを非ループバックインターフェイスにルーティングすることが可能)
  • 0.0.0.0ではなくループバックアドレスでリッスンするようにアプリケーションを構成します(多くのWebフレームワークはデフォルトで0.0.0.0でリッスンします。これはおそらく、開発中に信頼できないネットワークにサービスを予期せず公開する最も一般的な理由です)
  • プロキシを使用する場合、ブラウザはlocalhost/loopbackをプロキシ経由でルーティングしないように設定されています

つまり、かなり一般的なネットワーク構成です。

また、ネットワーク上の誰でもデータベースサーバーに直接接続できるようになるため、データベースサーバーが0.0.0.0にバインドしないように注意してください。ローカルサービスがリッスンしているポートとアドレスを正確に把握できるように、ファイアウォール構成を設定することをお勧めします。

指摘したリンクは、「localhost」という名前の証明書を発行する公的に信頼されたCAのコンテキストの下にあります。そのような証明書の受信者は証明書を使用して、いくつかの異常なネットワーク構成を持つ誰かの通信を傍受する可能性があるため、これはそのコンテキストでは安全ではありません。自分のマシンの構成を完全に制御していて、マシンに奇妙な構成がないことがわかっている場合、ループバックインターフェイスは安全です。

74
Lie Ryan

最初に、 http://127.0.0.1 を使用してDNSルックアップをバイパスできます。

次に、独自の自己署名CA証明書を作成し、localhostの証明書を作成して、安全に https:// localhost に接続します。攻撃者がその接続を傍受する方法はありません。

その結果、悪意のあるWiFiアクセスポイント(コーヒーショップなど)で " https:// localhost "にアクセスすると、ネットワーク攻撃者に傍受され、サイト(または彼らの選択の証明書)。

これは、電子メールスレッドのコンテキストに当てはまります。電子メールスレッドは、誰かがlocalhostの有効な証明書を信頼できるCAから取得できるかどうかに関するものです。これが可能であれば、そうです、他の誰かが偽装する可能性があります https:// localhost 。しかし、パブリックCAはlocalhostの証明書を発行することを許可されていません( ベースライン要件 、セクション7.1.4.2.1、次も参照してください Let's Encryptトラッカーに関するこのディスカッション =)。

これは不可能であるため、localhost証明書を発行した信頼できるのは、自分のプライベートCAだけです。

33
Sjoerd

この種のものを頻繁に使用している場合は、トラベルルーターを入手してみませんか?

小型のトラベルルーターを使用すると、独自のSSIDを使用して独自の内部ネットワークをセットアップし、暗号化を追加して、MACアドレスのみが許可されるようにカスタマイズされたホワイトリストをセットアップできます。

8
Dan Smith

Docker で開発する場合、(Dockerコンテナーで)Webアプリを起動すると、コンテナーは独自のIPアドレスを持ち、外部からアクセスできない場合があります。 Dockerによって割り当てられたように、あなただけが見ることができる特別なIPでそれにアクセスします。 http://172.17.0.2:9000

ホストの物理ネットワークインターフェースでウェブアプリにまたアクセスできるかどうかは、コンテナーの起動方法によって異なります。たとえば、 docker run コマンドは、 -p-P、または--exposeオプション を使用しない限り、ホストインターフェイスにバインドしません。

他の利点:

  • それ以外の場合、アプリはホストシステムから分離されます。
  • 他のシステムへの展開はより再現性があります。
5
z0r

ここではおそらくは実行可能なMITM攻撃ではありません。 UbuntuとDjangoを想定すると、攻撃者を陰謀する2つの大きな要因があります。

  • UbuntuのデフォルトのホストとDNS構成は、ハードコードされた設定を使用してlocalhostを解決します。 DNSクエリも実行しません。これは変更できます...しかし、代わりにしないでください:)

  • Djangoはデフォルトで127.0.0.1:8000にバインドします。完全にMitMにするには、攻撃者はDjangoによって提供されているトラフィックを傍受する必要がありますが、アクセス権がありません。

とはいえ、Webセキュリティは複雑です。攻撃者があなたに何らかの影響を与えるために悪用する可能性のあることをしている可能性があります。

外部リソースは安全でなければなりません

私たちの多くは、サードパーティのCDNがホストするファイルを埋め込みます。 Jquery、Bootstrapなど。これらがhttp://または//の場合(開発サーバーはTLSを使用しないことに注意してください)、攻撃者がこれらのファイルをMITMし、ライブスクリプトをページに挿入する可能性があります。 。

インターネット接続から離れたローカルでの開発のために、すべてのものを自分でホストすることがあらゆる点で最善です。

クリックジャッキングとiframe技術

ローカルで実行されているサーバーにアクセスできないからといって、ブラウザーにサーバーにアクセスするように指示できなかったわけではありません。クロスオリジンセキュリティは、(おそらく)直接それを使って物事を行うのを止めますが、iframeに貼り付けることができます。これは一種の逆クリックジャックです。

ユーザーにとって、これはあなたのウェブサイトのように見えます。エンドですべてのURLをキャプチャして、フレームにフィードすることもできます。それが公開ウェブサイトである場合、彼らはあなたがクリックしているものを理解することもできます。

もちろん、既に Django-secure を使用していますね。私はそれをお勧めします。 1つの設定で、すべてのDjangoリクエストでX-Frame-Options: DENYヘッダーを送信し始めます。あるいは、同じことを行う Django-builtinオプション があります。 Django-secureをお勧めします。

悪意のあるネットワーク上のセキュリティはWebサーバー以上のものです

PostgreSQLなど、開発に使用しているデーモン以外にも、おそらく他のデーモンが実行されています。 SSHサーバー、ファイル共有サーバーなどを実行している可能性があり、家庭環境に慣れている場合は、 スキップされた脚の日 利便性のために弱いセキュリティを使用しています。

最も簡単なことは、すべての着信トラフィックをブロックすることです。既存のUFW構成がない場合は、次のように簡単です。

Sudo ufw enable
Sudo ufw default deny incoming
Sudo ufw default allow outgoing

それは再起動を持続します。家に帰って何かにアクセスしたい場合は、Sudo ufw disableでオフにするか、デフォルトを変更して特定のポートを明示的に開くことができます。

SSHポートを公開したままにするつもりなら、私は SSH設定の強化 に関する記事を書きました。 NSA食堂にいる場合を除いて、ほとんどの人があなたのシステムから遠ざけるはずです。

5
Oli

フォーラムが説明している問題は、実際にはあなたが心配している問題とは反対のものです。あなたは、ネットワーク上の他の誰かがlocalhostで提供されているものを見ることができるのではないかと心配しています。 それ問題は、ローカルホストで何が提供されているのかを確認しようとしているのではなく、ネットワーク上の他の誰かによって悪意のあるWebページが提供されていることです。

その問題は実際に設定するのはそれほど難しくありません。私はそれを起こしました偶然ここで仕事中。私たちはネットワーク機器やソフトウェアを作っているので、いろいろな実験の状態でネットワークを使った経験のある人はたくさんいます。誰かが誤って「localhost」をホスト名として設定し、それがActive Directoryに登録され、DNSのすべてのユーザーに提供されました。

コーヒーショップでは、Webアプリケーションが突然別のページになるため、これはそれほど難しくありません。 TLS証明書を使用している場合、有効な証明書はありません。

Webアプリケーションの詳細の漏洩が心配な場合は、外部ファイアウォールの関連する受信ポートをブロックするだけです。 Linuxでは、次のようにします。

/sbin/iptables -A INPUT -o eth0 -p tcp --dport 80 -j DROP
2
Karl Bielefeldt

Http(s)://127.0.0.1/でサイトにアクセスし、127.0.0.1 onlyをリッスンするようにアプリを構成すれば安全です。外部の誰かが聞く可能性がないため、暗号化は必要ありません。コンピューターの外に出ることは何もありません。コンピューター上のアプリは、アドレス魔女を介してコンピューター上のブラウザーと「会話」できません。コンピューターの外部では使用できません。

1
befree

Cloud9 ide、GitHubリポジトリ、Herokuを使用して、https経由でクラウド内のブラウザーでコーディング、ホスト、実行できます。キーロガーがインストールされているか、誰かが画面を見ている限り、その部屋の誰もあなたが何をしているかを検出できません。

0
Chris