piping server を使った公開サーバーのlisten案
以下のような方法で行ける?
サーバーがランダムパスを生成してGET
サーバーが固定パス(公開)に上記のランダムパスをPOSTして受け取るクライアントを待つ
クライアントが固定パスをGETしてランダムパスを取得
その後はクライアントがランダムパス2を生成してGET待ちしつつランダムパス1にランダムパス2をPOSTして双方向接続
ふりだしに戻る
問題点
サーバーの固定パスがGETされてからサーバーが固定パスにPOSTし直すまでの間に攻撃者がそのパスにPOSTすることでMitMやDoS(と言っていいのか?)ができる
MitMのやり方
自分がそのパスにPOSTしてしまってサーバーと同じ振舞いをすればよい
DoSのやり方
自分がそのパスにPOSTしてしまって何も返さないとそのパスを占領できる
クライアント側でタイムアウトを設定すればサーバー側の接続を切れる?
これに対する対抗案
URLに対してAPIトークンを発行して、そのURLへのPOSTには Authorization ヘッダーを付けないといけないようにする
POST /secure-url で {"path": "/secure/randomstring", "token": "Bearer aaaa"}みたいなのを発行する
トークンをどう生成するか?
適当にランダム生成して KVS (や RDBMS である必要はないが RDBMS) にでも入れておく
ステート持つのだるい
JWTトークンを発行する
ステートレスではある (piping server 側は署名用の JWT の鍵を1つだけ持っておけばいい)
期限切れていいのか?
公開鍵認証をして、URLを公開鍵、Authorizationヘッダーは秘密鍵でタイムスタンプかなんかを署名した結果にする
これが一番うまいやり方な気がする
MitM対策だけならクライアント側に公開鍵の検証を任せれば現行の piping server でできる