私のシステム(Ubuntu Server 18.04、それが重要な場合)には2つのサーバーがあります。それらはNginxリバースプロキシの背後にあります(つまり、service.mywebsite.com
へのアクセスは内部で127.0.0.1:servicePort
へのリクエストをプロキシします)。
ユーザーの認証とアクセストークンの生成を担当するサーバーが1つあります。基本的には、他のサーバー(同じサブドメイン)と共有されるクライアントブラウザーに「認証トークン」Cookieを保存します。 (これをauthenticator
と呼びましょう)
私の他のサーバーは、その更新トークンに基づいてサービスを提供する必要があります。 (これをservice
と呼びましょう)
私が想像したのは、オーセンティケーターをシンプルなTCPソケットに接続するサービスです。サービスはユーザーの「認証トークン」をオーセンティケーターに送信し、「そうです、このユーザーはmyUserName、サービスを使用する権限があります ')。
質問1:私が(サービスとして)127.0.0.1(認証システム)に接続しているという単純な事実は、その答えが何であれ信頼できるほど十分なものですか?
質問2:TCP認証システムとサービスの間で通信するためのより簡単で安全な方法はありますか?(同じシステムにとどまり、異なるはずです)実行可能ファイル)
TCPソケットの反対側のIPアドレスが127.0.0.1であることがわかっている場合、これは、システム管理者がこの特定の接続をリダイレクトするようにファイアウォールを設定したか、または反対側TCPソケットは同じマシン上で実行されるプロセスです。したがって、サーバーマシン全体を信頼する場合は、127.0.0.1を信頼できます。ただし、=を使用しないことには利点があります。 TCPソケット、多層防御のため。
Localhostチェックの実装方法には注意が必要です。 Localhostは、そうでない日まで127.0.0.1です。たとえば、デフォルトでIPv6を使用する一部のライブラリのバージョンに切り替えた場合、または何らかの形式の転送プロキシをミックスに追加して、異なるマシンまたはコンテナ上の2つのサービス。プロキシの使用を開始する場合は、注意してください 正しい場所で確認してください 。そしてもちろん、同じマシン上で怪しげな可能性のある他のものをホストしないように注意する必要があります(VMとコンテナーの時代にはなぜそうするのでしょうか)。
同じマシンと話していることを知っていても、同じマシン上のsomeプロセスが接続の反対側にあることがわかります。それが正しいプロセスであるとは言いません。通常の操作では、おそらく両方のプロセスが実行されています。しかし、DoS攻撃によりメモリ不足が発生した後に1つのプロセスがクラッシュするなど、何か問題が発生した場合、ポートは解放され、別のプロセスが待機します。また、いつでも、ローカルプロセスは実行中のサーバーに接続できます。これには、攻撃者が一部のプロセスをローカルで実行できる必要がありますが、それ以外の場合はあまり実行できない特権のないプロセスである可能性があります。したがって、127.0.0.1に依存することには脆弱性はありませんが、権限昇格の余地があります。
できます。代わりにUnixソケットを使用してください。 UnixとTCPソケットは、接続またはリッスンするアドレスを指定することを除いて同じように機能するため、コードを大幅に変更する必要はありません。Unixソケットは、アクセス権を持つか、または親のスーパーバイザーであり、他に接続することはできません。Unixソケットを使用すると、ソケットのもう一方の端が同じマシンで実行されているだけでなく、予期されたプロセスであることが保証されます。同じマシンで実行されているすべての違反ではなく、認証サービスまたはメインサービスのセキュリティ違反に対して脆弱です。
127.0.0.1を介した通信は、別のIPCメカニズムですが、既存のプロトコルを再利用するメカニズムと考えることができます。共有メモリやUNIXドメインソケットまたはパイプと同様に、これは無数の方法の1つです。 1つのシステムで2つのプロセスが通信できます。システムのプロセスが侵害されていないことが信頼できる場合は、127.0.0.1を経由する接続を「盲目的に」信頼できます。