本文へ移動
QKQuickKitEN
VPN・オーバーレイLOCALブラウザ内で処理入力に機密情報を含む可能性があります

Tailscale Grants マトリクス

Tailscale ポリシーの grants を送信元 × 宛先のマトリクスに整理し、複数ルールが同じ組に与える ip / app の権限を統合して表示します。

入力と主要な処理をブラウザ内で行い、その入力内容をQuickKitサーバーへ送信しない設計です。

実運用中の秘密情報を避け、可能ならダミー値やマスク済みデータを使用してください。 データ取扱いの詳細

サマリー

結果
grants 数—
送信元 / 宛先の組—
従来の acls 件数—
ポリシーの defaultSrcPosture—

    アクセスマトリクス

    アクセスマトリクス
    送信元宛先ipappルール別 (ip / app / srcPosture)

    未解決の参照

      仕組みと使い方

      Tailscale のポリシーファイルの grants ブロックを読み取り、送信元と宛先の組み合わせをマトリクスとして表示します。grants は acls に代わるアクセス表現で、2 つの異なるものを同時に運びます。ip はプロトコルとポートの権限、app は受け取る側のアプリケーションが解釈する名前付きのアプリケーション権限です。grants をルールの並びとして読むと重要な点が見えなくなります。同じ組が複数のルールに現れることがあり、最終的に許可される内容はそれらの和集合だからです。このツールは組ごとにその和集合を計算しますが、和集合だけでは安全な要約になりません。そのため、寄与した各ルールについて、そのルールの権限と posture を並べて表示します。posture 付きの tcp:22 と posture なしの tcp:443 で到達できる組は、両方のポートが無条件に開いている組ではないためです。grants には deny 形式がないため、マトリクスは構造上つねに加算的で、後続のルールが権限を取り消すことはありません。

      グループの送信元は同じファイル内の定義から展開します。ipset: の参照は同じファイルの ipsets ブロックと照合し、未定義のものは有効とみなさず打ち間違いとして報告します。アドレスの展開は行いません。tag:、autogroup:、svc: は種別のみ表示します。内容が coordination server 側にあるためです。svc: は Tailscale Service で、宛先専用のセレクタです。種別の分類のみを行い、送信元に使われている場合は有効でないものとして報告します。サービスの存在、advertisement、approval の状態は確認しません。

      srcPosture は破棄せず、寄与するルールごとに保持します。デバイス posture で制限された grant は、同じ tailnet のネイティブノードからの通信に対しては条件付きアクセスであり、無条件アクセスのように見えてはならないためです。grant の実効 posture は、自身が srcPosture を指定していればその値、指定していなければトップレベルの defaultSrcPosture です。したがって、posture を指定していない grant も、default が設定されたポリシーでは無条件ではありません。明示した srcPosture: [] は未指定とは異なり、Tailscale が grant を default から外す方法として説明しているため、posture 条件なしとして表示します。空でない srcPosture は default に追加されるのではなく、default を丸ごと置き換えます。srcPosture: null は未指定と空配列のどちらを意味するか Tailscale が定義していないため、エラーとして扱います。

      同じ組を複数の grant が対象にする場合は、ルールごとの posture をそのルールの権限と並べて表示します。実効 posture のない grant が同じ組を対象にしている場合はその旨を明示します。grants は加算的で deny 形式がないため、その grant が許可する内容は、条件付きの grant が同じ権限を許可していても(例: 両方に tcp:22、または条件付きの tcp:22 と条件なしの *)posture なしで到達できます。posture 条件はそれを指定した grant に付く条件であり、その組で最終的に許可されるアクセスの条件ではありません。条件のない grant がどれも許可しないものだけが、ネイティブノードからの通信に対して posture 条件を必要とします。各 grant が許可する内容はルール別の行で示し、権限単位の比較は行いません。posture の定義自体は postures ブロックにあり、ここでは評価しません。

      posture 条件が評価されるのは、同じ tailnet のネイティブな Tailscale ノードからの通信だけです。共有ノードや subnet router の背後にあるデバイスからの通信は posture で判定されず、IP ベースの条件(src、dst、プロトコルとポート)に一致すれば許可されます。送信元がそうした経路かどうかはファイルではなく tailnet 側の状態で決まるため、このツールでは判定しません。

      grants の宛先はコロンで分割せずそのまま扱います。ACL の宛先と異なりポートは ip 側にあるため、tag:prod は「tag という名前のホストのポート prod」ではなく、そのまま宛先です。app の権限は名前のみを表示し、値は表示しません。権限の値は受け取る側のアプリケーションだけが定義する自由形式のオブジェクトであり、ここで意味があるかのように表示するのは誤解を招くためです。ポリシーファイルは HuJSON なので、コメントと末尾カンマを受け付けます。

      アップロード、保存、ログ出力、URL への埋め込みは行わず、tailnet や API へも接続しないため、マトリクスはファイルの内容だけを反映し、実際のデバイス状態は反映しません。