Layer 1of 5
誰が使えるか
API トークン
senca_ で始まる 32 バイトの乱数です。サーバーには SHA-256 のハッシュ値だけを保存し、照合は処理時間から中身を推測されない方法(定数時間の比較)で行います。トークンの値が返るのは、作成したときだけです。
8 種類の権限
stream:read・stream:write・publish・subscribe・recording:read・recording:delete・tenant:admin・node:admin の 8 種類です。ほかのトークンには、自分が持っている権限しか与えられません。
テナント
どのテナントの操作かは、認証の情報から決まります。要求の本文に書いた値は使いません。ほかのテナントの資源を指定すると、404 が返ります。
JWT
自社の認証の仕組みが発行した JWT を使えます。検証には、手元に置いた JWKS(公開鍵の一覧)を使います。使える署名の方式は EdDSA・ES256・RS256(2048 ビット以上)で、none と HS 系は使えません。
最初の管理者トークン
初めて起動したときに作り、パーミッション 0600 のファイルに書き出します。既定のパスワードはありません。
Layer 2of 5
何を見せるか
ストリームキー
sk_ で始まる乱数です。ハッシュ値だけを保存します。再発行すると、古い鍵は使えなくなります。WHIP では、期限付きの publish 権限のトークンをキーの代わりに使えます。
署名付きの再生 URL
HMAC-SHA256 の署名と期限(既定 300 秒)が付いた URL です。期限が切れたものや署名が合わないものは 403 になります。ライブ、VOD、RTMP・RTSP での再生、WHEP、MoQ で使います。
ルームの参加トークン
Ed25519 で署名した、JWT と互換のあるトークンです(既定の有効期間は 600 秒)。参加してよいかを自社のサーバーに問い合わせる Webhook も使えます。
エンドツーエンド暗号化のルーム
エンドツーエンドで暗号化したルームでは、サーバーが中身を処理する操作(合成・字幕・静止画など)を 422 で断ります。
Layer 3of 5
何を守るか
シークレットの暗号化
AES-256-GCM で暗号化して保存し、API からは読み出せません。テナントと ID を暗号に結び付けているので、暗号文を別の資源へ移しても復号できません。
クラスターの鍵
クラスターシークレットから HKDF-SHA256 で作った鍵で、データを暗号化する鍵を包み、全ノードへ複製します。コントロールプレーンのデータを写しただけでは、シークレットを復号できません。
秘密をログに出さない
ストリームキー・トークン・API キーは、ログ・エラーの応答・監査ログに出しません。二重実行を防ぐために保存しておく応答からも取り除きます。
データディレクトリ
鍵とトークンのファイルは 0600 にします。control/ のディレクトリは、起動するたびに 0700 にします。
Layer 4of 5
どこへつなぐか
外部への接続の制限
取りに行く入力(pull)・送信・字幕・クラウド連携・Webhook の宛先は、名前を IP アドレスに変換した後で確かめます。ループバック、リンクローカル(クラウドのメタデータのアドレスを含む)、プライベートアドレスへは、許可した範囲にだけつなぎます。
ノード間の mTLS
Raft と中継の通信を、クラスター用の認証局の証明書で互いに確かめ合う TLS にできます。ノードの認証には、クラスターシークレットも使います。
HTTPS・RTMPS・QUIC
TLS 1.3 で受け付けます。使える鍵は ECDSA P-256・RSA・Ed25519 です。
Layer 5of 5
壊れたときに
コーデックの隔離
外部のコーデックのライブラリは別のプロセスで動かし、seccomp-BPF でネットワーク・プログラムの実行・ptrace などを禁止します。Landlock で /dev 以外への書き込みを禁止し、rlimit で使える資源を制限します。
異常の切り離し
別プロセスが異常終了したり、応答しなくなったり、おかしな結果を返したりしても、失敗するのはその処理だけで、別プロセスは起動し直されます。ノード本体は止まりません。
厳密な読み取り
信頼できない入力(RTMP・TS・MP4・HTTP・SDP・RTP など)を読み取るとき、異常終了(panic)、終わらない処理、際限のないメモリの確保が起きたら、脆弱性として扱います。
要求の数の上限
IP アドレスごと・トークンごとの要求の数、認証に失敗した回数、新しい接続の数に上限を設けています。上限を超えると 429 を返します。
監査ログ
状態を変える操作について、誰が(トークン ID や JWT の sub)・いつ・何に対して行ったかを、1 行に 1 つの JSON で記録します。
使う前に知っておきたいこと
- 通信の方式は、SENCA 自身で実装しています。TLS・DTLS・SRTP・SRT の暗号化と、QUIC の接続の手順・データを暗号化して運ぶ部分が SENCA の実装です。暗号の計算には、検証されたライブラリを使っています。
- 署名付き URL は、知っている人なら期限まで使えます。URL を視聴者ごとに結び付けたり、取り消したりする仕組みはありません。期限は短くし、必要になるたびに発行してください。
- 再生 URL の署名に使う鍵は、コントロールプレーンのデータに入っています。データディレクトリとバックアップは、専用のユーザーで動かすなどして守ってください。
- 修正は、最新の版に対して行います。古い版への修正の取り込みや、対応までの時間は保証していません。最新の版に上げてお使いください。
脆弱性の報告
公開の issue には書かず、
非公開でお知らせください。
GitHub の非公開の脆弱性報告(Private vulnerability reporting)をお使いください。報告の内容は、報告した方と開発者にだけ見えます。実際のストリームキーやトークンは書かず、別の文字に置き換えてください。
設定の詳しい手順は、ドキュメントのセキュリティのページにあります。