web-dev-qa-db-ja.com

Raspberry Pi上のWebサーバーへのポート転送

私は最近、比較的シンプルな スマートクリスマスツリー を作成しました。これは、Raspberry Pi Zero W電源LEDストリップです。

IFTTT webhooksを介してそれを制御するために、軽量のflask Raspberry Pi上のサーバー-さまざまなアニメーション/パターンのいくつかのエンドポイントを持つ特定のポート次に、ホームルーターで、Raspberry Piで起動したflaskサーバーへのポート転送を構成しました。

現在、flask APIは完全に開いていますが、使用するには、IPアドレスとポート値を知っている必要があります。

この特定の場合のセキュリティに関するリスクはもちろん最小限ですが、このホームオートメーションセットアップのセキュリティを向上させる一般的な方法は何ですか? Apacheのような本格的なWebサーバーを使用する必要がありますか?

IFTTTのレシピとflaskサーバーのみが知ることになるCookieに少なくとも「秘密の」鍵が必要であると考えていました。デバイスのリソースが限られているため、パフォーマンスは&セキュリティは慎重にバランスを取る必要があります。

3
alecxe

問題は、重要でないタスクを伴うサーバーへのオープンアクセスが少ないことです。問題は、このサーバーがおそらくより重要なシステムと同じネットワークに配置されていることです(ホームルーターがネットワークの分離を提供しない限り、ほとんどはそうではありません)。したがって、攻撃者がこの重要でないサーバーにハッキングした場合、彼はあなたの重要なネットワーク全体にアクセスできます。

これを困難にする方法はいくつかあります。

  • ホームルーターがネットワークの分離を提供する場合、このサーバーをシステムの他の部分とは別のネットワークに配置します。これについて オンラインで多くの情報 があります。
  • なんらかの認証を要求して、サーバーへのアクセスを制限します。これは、ユーザー名とパスワードを使用したプレーンテキスト認証、一部の秘密認証トークン、またはHTTPSが使用されている場合のクライアント証明書である可能性があります。ここで使用するものは、サーバーにアクセスする方法に大きく依存します(任意のシステムからのWebブラウザー、特定のシステムからのWebブラウザー、モバイルアプリ...)。 IFTTTの場合は、可能性について here を参照してください。
  • 誰もトラフィックを傍受できないようにし、プレーンテキスト認証をキャプチャしたり、HTTPSを使用してトラフィックを変更したりできないようにします。
  • 攻撃者がAPIへの認証済みアクセスを取得した場合でも、適切なプログラミング手法を使用し、以下で説明するようにセットアップを強化することで、APIをさらに悪用できないことを確認してください。
  • 任意のユーザー制御パラメーターを使用してシェルコマンドを直接呼び出すことはできません。つまり、パラメーターをサーバー内の特定の値に制限し(クライアントを信頼しないでください)、任意の値が可能な場合はパラメーターを無害化します。
  • サーバーをrootとして実行するのではなく、低い特権を持つユーザーとして実行してください。ハードウェアを制御するルート権限が必要な場合は、小さな安全なAPIを使用して別のローカルサービスを作成し、外部から到達可能なWebサービスと通信できるようにします( 権限分離 を参照)。
  • 理想的には、いくつかの追加のサンドボックスを追加します。つまり、コンテナー、chroot、seccompなどを使用して、サーバーから抜け出しにくくします。たとえば、コンテナを使用してネットワークアクセスを制限することもできるため、攻撃者はWebサービスへの侵入に成功しても内部ネットワークにアクセスできません。
  • 最小限のソフトウェアのみをインストールし、このソフトウェアとカーネルを最新の状態に保つことにより、OSを強化します。残念ながら、Linuxでは特権エスカレーション攻撃が依然として一般的であるため、攻撃者がWebサービスに侵入して低い特権のアクセス権を持つと、ルートを取得できる可能性があります。システムを最新の状態に保つと、これははるかに困難になります。
6
Steffen Ullrich