- 今日は今やっている研究の今後の色々を考えていた
- Apacheのvhostのような高集積マルチテナント環境において、1サーバに万のオーダで仮想ホストが収容される(メモリ32GB程度のサーバでもそれぐらい)ような状況で
- 仮想ホスト方式ではリクエストをプロセスで共有して処理するために、各ホストへのリクエスト単位でvethやmacvlanなどでIPアドレスを割り当てるのは性能面で難しい
- やろうとすると収容ホスト分(例えば10万個とか)のvethと名前空間を予め作っておいて、HTTPリクエスト単位で名前空間を都度割り当て/リリースする感じ(事前に作っておくコストが高い)
- あるいは、vethと名前空間の作成を都度行う(オーバヘッドが高い)
- ipアドレス数が万のオーダとかになってくると、ネットワークも複雑になる
- 既存のホスティング構成にシームレスに入れるのも難しい(ネットワーク構成を再構成しないといけない)
- vethやmacvlanの最大数はそれに伴うオーバヘッドは調べておく
- また、NAT環境ではIPアドレスを共有してしまうので、接続先でIPアドレスベースの認証はできなくなる
- プロセスのオーナはmod_process_securityやsuEXECなどで都度分離している
- なので、プロセス単位でネットワークを介したデータベースやミドルウェアと連携するようなアプリにおいて、通信元プロセスのオーナを通信先で利用して認証認可を行うのがtcpriv
- 接続元がホスティングなどを想定した場合に、接続元プロセスが脆弱性でのっとられるのは日常茶飯事なので、オーナをカーネルで付与して、接続元のユーザランドで詐称できないようにしている
- やろうとすると収容ホスト分(例えば10万個とか)のvethと名前空間を予め作っておいて、HTTPリクエスト単位で名前空間を都度割り当て/リリースする感じ(事前に作っておくコストが高い)
- また、別のコンテキストで、コンテナの中で複数のプロセスがある場合にも、IPアドレス単位よりもより粒度の細かい接続元プロセス単位で認証認可を通信先で行えることも特徴
- コンテナ内のとあるプロセスが脆弱性によってトークンを取得されたとしても、実際の通信元プロセスが別オーナであれば、そのオーナとトークンが一致しないと通信先のミドルウェアで認証を許可しないとかできる
- 今はこういう仕組みがないからオーナをそもそも分ける必要がないけど、システムコンテナ的にオーナを分けるとセキュリティ面で多層防御できるともいえる
- コンテナ内のとあるプロセスが脆弱性によってトークンを取得されたとしても、実際の通信元プロセスが別オーナであれば、そのオーナとトークンが一致しないと通信先のミドルウェアで認証を許可しないとかできる
- 仮想ホスト方式ではリクエストをプロセスで共有して処理するために、各ホストへのリクエスト単位でvethやmacvlanなどでIPアドレスを割り当てるのは性能面で難しい
- このtcprivの仕組の評価するときのポイントとして
- 背景はこちらのエントリ プロセスのオーナ情報をTCPオプションヘッダに書き込むに至った背景とアプローチの補足 - 人間とウェブの未来
- TLSとかのユーザランドのレイヤーでやっていない(接続元プロセスの脆弱性があること前提なので)ので、カーネルのパケット処理で実装しているが、それらのオーバーヘッドがどれぐらいか
- ユーザランドに識別子を持つアプローチは、脆弱性やその識別子が漏れたときに、別プロセスからの通信を認可してしまう点で差別化をしておく
- 機能面では過去にあったidentdと似ているが、identdは接続先から接続元に問い合わせをするのでNAT超えができないことや、認証に複数のセッションの通信とやり取りが発生するため性能が遅い
- 明らかにコストの高い認証認可と性能評価を比較する意味はあるか?なければ機能面での差でふるいにかけておくほうがよいかも?
- となると、データベースやWebサーバに対して、通信元と連携する際に認証認可でオーナを使った場合にどれぐらいオーバヘッドになるかを比較するだけで良い?
- proxysqlとかを挟んでそこで裏のデータベースのid/pass情報をひきつつ、proxysqlで接続元のオーナをid/passを比較するような構成がリアルシステムっぽいかも(ゆううき先生に聞く)
- こうすると、データベース側に手をいれなくても、間にproxyデプロイしたらシュッと適用できて便利(という話もゆううき先生に聞いた)
- 他に良い構成とか良い評価方法がありそうか検討(ゆううき先生に聞く)
- ウェブサーバの場合は適当にnginxで認証するようなアプリ(ngx_mrubyとかで軽量なもの)を作って、そこにオーナ情報を使う場合とそうでない場合を比較してベンチをかけるとか
- proxysqlとかを挟んでそこで裏のデータベースのid/pass情報をひきつつ、proxysqlで接続元のオーナをid/passを比較するような構成がリアルシステムっぽいかも(ゆううき先生に聞く)
- とにかく明日ゆううき先生に教えてもらう
- 今週はCOMPSAC2020のLive Streamingが毎日日本時間の23時からあるから、それに参加していく
- 久々にポケモン再開してマスボに上がっておいたけど、やっぱ楽しい!
- 子どもたちがガンプラにハマりだしたのでうれしい
- 今週末は焼き肉!