Tailscaleロゴ

アプリケーションケイパビリティ

最終検証日:
翻訳: 竹洞 陽一郎

アプリケーションケイパビリティ(一般に「アプリケーションケイパビリティ(app capabilities)」と呼ばれます)は、Tailscaleのアクセス制御システムを、従来のネットワークトラフィックルールの枠を超えて拡張します。
標準的なグラントが、特定のポートとプロトコルでどのデバイス同士が通信できるかを制御するのに対し、アプリケーションケイパビリティは、より上位のアプリケーション層で動作する特定の機能に対して、きめ細かな権限を提供します。
これにより、デバイスが確立できるネットワーク接続だけでなく、実行できる操作そのものを正確に制御できます。

アプリケーションケイパビリティは、tailnetポリシーファイルgrantsセクション内に、appフィールドを使って記述します。
各ケイパビリティは、tailnet内のデバイス間で有効にできる、特定の権限や機能を表します。
このドキュメントでは、アプリケーションケイパビリティの仕組み、要件と制約について説明し、Tailscaleの組み込みケイパビリティすべてについて、実践的な例とともに詳しく解説します。

ノード属性とグラントのアプリケーションケイパビリティは、どちらもデバイスにケイパビリティを付与でき、同じappマップが両方に現れます。
あるケイパビリティを(デバイス側か接続側かの)どちらに属させるべきかを判断するには、ノード属性 vs. グラントのアプリケーションケイパビリティを参照してください。

アプリケーションケイパビリティの仕組み

このセクションでは、フォーマットや処理を含む、アプリケーションケイパビリティの中核的な仕組みについて説明します。

アプリケーションケイパビリティは、グラントルールのappマップ内で定義します。
グラント自体は、どの送信元デバイス(src)がどの宛先デバイス(dst)にアクセスできるかを定義し、appマップは、その接続に対して付与する具体的なケイパビリティを定義します。
各ケイパビリティは、通常domain.com/cap/featureという形式の、ドメイン名の規則に従います。
各ケイパビリティに関連付けられる値は、JSONオブジェクトの配列であり、それぞれにそのケイパビリティ固有の構成オプションが含まれます。

グラント内の基本構造:

"grants": [
  {
    "src": ["user@example.com", "group:engineering"],
    "dst": ["tag:server"],
    "app": {
      "capability.name/string": [
        { /* 構成オブジェクト1 */ },
        { /* 構成オブジェクト2 */ }
      ],
    }
  }
]

ビジュアルポリシーエディタを使ってtailnetポリシーファイルを管理することもできます。
ビジュアルエディタの使い方については、ビジュアルエディタリファレンスを参照してください。

宛先で動作するアプリケーション内で、付与されたケイパビリティを活用するには、送信元デバイスのケイパビリティを、CLIのtailscale whoisコマンド、LocalAPItailscale serveアプリケーションケイパビリティヘッダー、またはGoアプリケーションにTailscaleを組み込むためのtsnetGoライブラリから読み取れます。

要件と制約

Tailscaleのグラントにおけるアプリケーションケイパビリティは、いくつかの技術的要件に準拠する必要があり、特定の制約が課されます。
このセクションでは、tailnetポリシーにおけるアプリケーションケイパビリティに適用される、検証ルール、送信元と宛先の制約、命名要件について説明します。

アプリケーションケイパビリティで使用できる送信元と宛先には、特定の制約が適用されます。

ケイパビリティ名は、適切な整理と競合の防止のため、特定の形式に従う必要があります。

Tailscaleの組み込みケイパビリティ

Tailscaleは、Tailscale製品やコミュニティプロジェクトにおける特定の機能を有効にする、さまざまな組み込みケイパビリティを提供しています。
このセクションでは、Tailscaleが提供するすべての標準ケイパビリティについて、その目的、構成オプションを説明し、ポリシーファイルでの使用例を紹介します。

Taildrive

Taildriveは、デバイス同士でディレクトリ全体を共有・アクセスできるようにすることで、Tailscaleのファイル共有機能を拡張します。
そのケイパビリティ(tailscale.com/cap/drivetailscale.com/cap/drive-sharer)は、誰が共有ディレクトリの読み書きを行えるかを正確に制御します。

sharesパラメーターは、共有名の配列、またはすべての共有を表す"*"を受け付けます。
accessパラメーターは、アクセスが読み取り専用("ro")か読み書き可能("rw")かを決定します。
drive-sharerケイパビリティは送信元デバイスに自動的に追加され、ポリシー管理が簡素化されます。
管理者は、共有ごとに異なるアクセスレベルを指定でき、"*"を使うと、対象デバイス上のすべての共有へのアクセスが許可されます。

"grants": [
  {
    "src": ["group:developers"],
    "dst": ["fileserver"],
    "app": {
      "tailscale.com/cap/drive": [
        {"shares": ["projects", "documentation"], "access": "rw"},
        {"shares": ["archives"], "access": "ro"}
      ]
    }
  }
]

ビジュアルポリシーエディタを使ってtailnetポリシーファイルを管理することもできます。
ビジュアルエディタの使い方については、ビジュアルエディタリファレンスを参照してください。

Tailscale Kubernetes Operator

TailscaleのKubernetesケイパビリティtailscale.com/cap/kubernetes)は、きめ細かな権限制御とオプションのセッション記録によって、Kubernetesクラスターへの安全なアクセスを提供します。
このOperatorは、tailnetポリシーを通じて強固なセキュリティを維持しながら、クラスター管理を効率化します。
このアプリケーションケイパビリティを使うと、誰がどのクラスターに、どのような権限でアクセスできるかを正確に定義でき、監査やコンプライアンスの目的で、オプションでセッション記録を強制することもできます。

Kubernetesケイパビリティの構成オプションには、以下が含まれます。

このケイパビリティには、2つの重要な実装上の詳細があります。

"grants": [
  {
    "src": ["group:devops"],
    "dst": ["tag:k8s-cluster"],
    "app": {
      "tailscale.com/cap/kubernetes": [
        {
          "recorders": ["tag:k8s-recorder"],
          "enforceRecorder": true,
          "impersonate": {
            "groups": ["system:masters"]
          }
        }
      ]
    }
  }
]

ビジュアルポリシーエディタを使ってtailnetポリシーファイルを管理することもできます。
ビジュアルエディタの使い方については、ビジュアルエディタリファレンスを参照してください。

setec

setecは、Tailscaleが保守し、自社の本番環境で使用しているオープンソースのシークレット管理ツールです。
これを使うと、tailnetのすべてのユーザーとアプリケーションにわたって、機密性の高い認証情報への安全なアクセスを提供できます。

シークレットケイパビリティ(tailscale.com/cap/secrets)は、どのデバイスやユーザーが、特定のシークレットやシークレットパスに対して、どの操作を実行できるかを正確に定義します。
これにより、組織全体で、APIキー、認証情報、証明書などの機密情報を、一元的かつ安全に管理できます。

シークレットケイパビリティの構成は、次の2つの主要なパラメーターを中心とします。

パスパターンは柔軟なワイルドカードをサポートしており、シークレットを論理的にグループ化し、適切な粒度で権限を割り当てられます。
グループごとに異なる権限レベルを設定でき、シークレット管理に最小権限のアプローチを取り入れられます。

"grants": [
  {
    "src": ["group:developers"],
    "dst": ["tag:app-servers"],
    "app": {
      "tailscale.com/cap/secrets": [
        {"action": ["get", "info"], "secret": ["dev/*"]}
      ]
    }
  },
  {
    "src": ["group:security"],
    "dst": ["tag:app-servers"],
    "app": {
      "tailscale.com/cap/secrets": [
        {"action": ["get", "put", "delete"], "secret": ["prod/api-keys/*"]}
      ]
    }
  }
]

ビジュアルポリシーエディタを使ってtailnetポリシーファイルを管理することもできます。
ビジュアルエディタの使い方については、ビジュアルエディタリファレンスを参照してください。

TailSQL

TailSQLは、tailnet内でホストできるSQLプレイグラウンドです。

TailSQLは、"main""self"のような、許可されたデータソースの配列という形式でsrcを定義する、アプリケーションケイパビリティ(tailscale.com/cap/tailsql)を必要とします。
これにより、権限を付与されたデバイスがクエリできるデータストアが決まり、tailnetの構成や状態に関する、機密性の高い可能性のある情報へのアクセスを制御できます。

"grants": [
  {
    "src": ["group:eng"],
    "dst": ["tag:tailsql"],
    "app": {
      "tailscale.com/cap/tailsql": [
        {"src": ["main", "self"]}
      ]
    }
  }
]

ビジュアルポリシーエディタを使ってtailnetポリシーファイルを管理することもできます。
ビジュアルエディタの使い方については、ビジュアルエディタリファレンスを参照してください。

Golinkは、tailnet内で使う内部リンク短縮・管理サービスであり、チームが頻繁にアクセスするURLに、覚えやすいショートカットを作成できます。

Golinkのアプリケーションケイパビリティ(tailscale.com/cap/golink)は、サービス内で昇格した管理者権限を持たせたいユーザーやデバイスに対して、adminパラメーターをtrueに設定することを想定しています。
ユーザーにGolinkへの基本的なアクセスを提供するだけであれば、アプリケーションケイパビリティを指定する必要はありません。

"grants": [
  {
    "src": ["group:managers"],
    "dst": ["tag:golink-server"],
    "app": {
      "tailscale.com/cap/golink": [{"admin": true}]
    }
  }
]

ビジュアルポリシーエディタを使ってtailnetポリシーファイルを管理することもできます。
ビジュアルエディタの使い方については、ビジュアルエディタリファレンスを参照してください。

カスタムケイパビリティ

tsnettailscale whoisCLIコマンド、tailscale serveのアプリケーションケイパビリティヘッダー、またはLocalAPIを使ってTailscaleと統合することで、自身のアプリケーション向けにカスタムのアプリケーションケイパビリティを作成できます。
カスタムケイパビリティを使うと、ネットワークレベルのアクセス制御を超えて、自身のアプリケーション向けの権限を定義でき、ユーザーがネットワークアクセスを得た後、アプリ内で実行できる操作を正確に指定できます。

Tailscaleは、アプリケーションケイパビリティを自身のアプリケーションに統合する方法として、4つのアプローチを提供しています。

複数のケイパビリティを使った完全な例

複数のケイパビリティが包括的なポリシーの中でどのように連携するかを示すために、このセクションでは、さまざまなユーザーグループとリソース向けの多様なケイパビリティを組み込んだ、tailnetポリシーファイルの完全な例を紹介します。

次の例は、複数のケイパビリティを組み合わせて完全なアクセス制御システムを構築する、より包括的なtailnetポリシーを示しています。
これは、特定の組織のニーズに合わせた高度な権限モデルを実装するために、異なるケイパビリティを組み合わせて使用する方法を示しています。

{
  "groups": {
    "group:engineers": ["alice@example.com", "bob@example.com"],
    "group:devops": ["charlie@example.com", "dave@example.com"],
    "group:analysts": ["eve@example.com"]
  },

  "tagOwners": {
    "tag:server": ["group:devops"],
    "tag:k8s-cluster": ["group:devops"],
    "tag:k8s-recorder": ["group:devops"],
    "tag:grafana": ["group:devops"]
  },

  "grants": [
    // エンジニアは互いにファイルを共有できます
    {
      "src": ["group:engineers"],
      "dst": ["group:engineers"],
      "app": {
        "tailscale.com/cap/drive": [{"shares": ["*"], "access": "rw"}]
      }
    },

    // DevOpsは記録付きでKubernetesクラスターにアクセスできます
    {
      "src": ["group:devops"],
      "dst": ["tag:k8s-cluster"],
      "app": {
        "tailscale.com/cap/kubernetes": [
          {
            "recorders": ["tag:k8s-recorder"],
            "enforceRecorder": true,
            "impersonate": {
              "groups": ["system:masters"]
            }
          }
        ]
      }
    },

    // エンジニアは開発環境のシークレットにアクセスできます
    {
      "src": ["group:engineers"],
      "dst": ["tag:server"],
      "app": {
        "tailscale.com/cap/secrets": [
          {"action": ["get", "info"], "secret": ["dev/*"]}
        ]
      }
    },

    // DevOpsはすべてのシークレットを管理できます
    {
      "src": ["group:devops"],
      "dst": ["tag:server"],
      "app": {
        "tailscale.com/cap/secrets": [
          {"action": ["get", "put", "info", "delete"], "secret": ["*"]}
        ]
      }
    }
  ]
}

ビジュアルポリシーエディタを使ってtailnetポリシーファイルを管理することもできます。
ビジュアルエディタの使い方については、ビジュアルエディタリファレンスを参照してください。

この例は、役割と責任に応じて、異なるグループに異なるケイパビリティを割り当てる方法を示しています。
エンジニアは互いにファイルを共有し、開発環境のシークレットにアクセスできます。
DevOps担当者は、必須のセッション記録付きのKubernetesクラスター管理や、シークレットの完全な管理を含む、より広範なアクセス権を持ちます。
アナリストは、Grafanaダッシュボードへの限定的な閲覧者(viewer)ロールでのアクセスのみを持ち、変更を加えることなく監視データにアクセスできます。
この階層化された権限のアプローチは、Tailscaleのアプリケーションケイパビリティの柔軟性と強力さを示しています。

原文のこの説明では、アナリスト(group:analysts)がGrafanaダッシュボード(tag:grafana)に限定的にアクセスできると述べていますが、上記のコード例にはtagOwnerstag:grafanaが定義されているのみで、これに対応するgrantsのエントリは含まれていません。原文自体にこの不整合があるため、翻訳でもそのまま反映しています。