TCP(たとえば、ツイストによる非同期メッセージングプロトコルを使用)によって相互に対話するシステム上で実行されているいくつかのプロセスがあります。
process1 <=====> broker <=====> process2
TCPソケットlocalhost:port)をリッスンするLinuxホストで実行されている1つのサーバーインスタンス(ブローカー)があります。 TCP(twistedにより提供)を介してソケットを使用してブローカーインスタンスにクエリを実行する同じホスト)ブローカーはハードウェアセキュリティモジュール(HSM)にアクセスできます。
私は現在、この設計のセキュリティ面について考えています。ホストに直接物理的にアクセスできる盗聴者が、このホスト上のクライアントとブローカーの間のTCPトラフィックを傍受する可能性はありますか?機密データが転送される場合があるため、ホスト上のプロセスとブローカー間の通信を保護したい。
これはどのように行うことができますか?プライベートシークレットの保存には常に問題があります。ブローカーはHSMにアクセスできるので問題ありませんが、ブローカーと対話するクライアントプロセスは問題ありません。ホストに物理的にアクセスできる攻撃者の秘密を隠すことは難しい。プロセスとブローカー間の認証/暗号化はどのように実現できますか?
あなたが私の問題を理解し、私を助けてくれることを願っています!
編集:SSL/TLSはオーバーヘッドが高く、プライベートシークレットの安全なストレージの問題もあるため、良いアプローチとは言えません。
マシン上のプロセス間通信を制限したい場合は、TCPを廃止し、代わりにUnixドメインソケットを使用することをお勧めします。 UnixドメインソケットはTCP(双方向ソケット)とまったく同じ方法で使用できますが、TCPポートをリッスンする代わりにソケットファイルを作成します。標準のファイルシステム権限を使用して、ソケットファイルの権限を制御できます。 TwistedはUnixドメインソケットをサポートしています。
本当にTCPを使用する必要がある場合は、 暗号化なしのSSL を使用できます。デフォルトでは、eSSL暗号とaNULL認証はOpenSSLでは許可されていませんが、明示的に要求することができます。私は個人的にこれをお勧めしません。
また、プロセスが一部のTCPポートに接続する方法を制限する iptableルール を定義する運があるかもしれません。
しかし全体として、マシンへの無制限のルート/物理アクセス権を持つユーザーから身を守ることは無駄な努力であり、同じマシン内でのプロセス間通信の暗号化はかなりばかげていますが、それはかなり無害です。
Localhostトラフィックのリッスンは、WindowsおよびLinuxでも可能です。
Linuxではtcpdump -i lo
。
少なくとも特別なアルゴリズムで通信をエンコードすることを検討し、ブローカーのプロセスがダンプ、デバッグ、またはリバースエンジニアリングされるのを防ぐことも検討してください。
これらのプロセス間の通信は、システムへの特権アクセスを持つ攻撃者によって常に傍受される可能性があります。
ボックスへのrootアクセスを使用すると、攻撃者はシステムを所有し、実装するすべてのもの(大部分)を回避できます。暗号化されたトラフィック?暗号化キーを処理する関数をフックしたり、プロセスメモリをダンプしたりできます。アンチリバースエンジニアリングは可能ですが、十分なスキルを持つ人であればいつでも回避できます。これを行うより効果的で安全な方法は、カーネルレベルでプロセスのセキュリティを強化するLKMを作成することです。これは、カーネルプログラミングのかなりの経験を必要とし、非常に正しく行うことは困難です(私は不可能と言ってもいいですか?!)-検討すべきことですが、誰かが常に抜け穴を見つけるでしょう。
また、root以外のユーザーは、パケットを盗聴するために必要なrawソケットを作成できません(つまり、攻撃者はプロセス間の通信を傍受するためにシステムへのrootアクセスを必要とします)。
すでにシステムを所有している攻撃者からシステムの情報を保護することは簡単な作業ではありません。上記の情報へのアクセスを困難にすることはできますが、完全に保護することはできません。