アプリケーションケイパビリティ
最終検証日:
翻訳: 竹洞 陽一郎
アプリケーションケイパビリティ(一般に「アプリケーションケイパビリティ(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コマンド、LocalAPI、tailscale serveのアプリケーションケイパビリティヘッダー、またはGoアプリケーションにTailscaleを組み込むためのtsnetGoライブラリから読み取れます。
要件と制約
Tailscaleのグラントにおけるアプリケーションケイパビリティは、いくつかの技術的要件に準拠する必要があり、特定の制約が課されます。
このセクションでは、tailnetポリシーにおけるアプリケーションケイパビリティに適用される、検証ルール、送信元と宛先の制約、命名要件について説明します。
- すべてのグラントルールには、
ipまたはappフィールド(あるいはその両方)を指定する必要があります。これらのフィールドの少なくとも1つが存在している必要があります。 - ケイパビリティ名を空にすることはできません。
アプリケーションケイパビリティで使用できる送信元と宛先には、特定の制約が適用されます。
- 宛先として
autogroup:selfを使用する場合、権限の対応関係を正しく保つため、送信元は個々のユーザー、グループ、またはロールベースのオートグループ(autogroup:member、autogroup:admin、autogroup:ownerなど)である必要があります。 - 宛先の制約として、
autogroup:sharedやautogroup:danger-allをケイパビリティの宛先として使用することはできません。 - アプリケーションのグラントは、
autogroup:internetを宛先にすることはできず、またautogroup:adminのような管理系のオートグループを宛先として使用することもできません。
ケイパビリティ名は、適切な整理と競合の防止のため、特定の形式に従う必要があります。
- 形式は、
example.com/cap/custom-appのように、{domain}/{path}というパターンに従う必要があります。 tailscale.comとtailscale.ioドメイン配下のケイパビリティは、製品で使用できるアプリケーションケイパビリティを開発する際に、Tailscaleが使用するために予約されています。- 自身のアプリケーション向けにカスタムケイパビリティを作成する場合は、組み込みのケイパビリティやサードパーティ統合との潜在的な競合を避けるため、自身が管理するドメインを使用してください。
Tailscaleの組み込みケイパビリティ
Tailscaleは、Tailscale製品やコミュニティプロジェクトにおける特定の機能を有効にする、さまざまな組み込みケイパビリティを提供しています。
このセクションでは、Tailscaleが提供するすべての標準ケイパビリティについて、その目的、構成オプションを説明し、ポリシーファイルでの使用例を紹介します。
Taildrive
Taildriveは、デバイス同士でディレクトリ全体を共有・アクセスできるようにすることで、Tailscaleのファイル共有機能を拡張します。
そのケイパビリティ(tailscale.com/cap/drive、tailscale.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ケイパビリティの構成オプションには、以下が含まれます。
recorders: セッションを記録するデバイスを指定する、タグの配列。enforceRecorder: レコーダーが利用できない場合に接続を失敗させるかどうかを決定する、真偽値。impersonate: Kubernetesのなりすまし(impersonation)構成を定義するオブジェクト。
このケイパビリティには、2つの重要な実装上の詳細があります。
- 1つのルールにつき、レコーダータグは1つのみ使用できます。
- レコーダータグは、ポリシー内で定義されている必要があります。
"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つの主要なパラメーターを中心とします。
action: 許可される操作("get"、"put"、"info"、"activate"、"delete")の配列。secret: ワイルドカードをサポートするシークレットパスのパターン(例:"dev/*"、"prod/db/creds")の配列。
パスパターンは柔軟なワイルドカードをサポートしており、シークレットを論理的にグループ化し、適切な粒度で権限を割り当てられます。
グループごとに異なる権限レベルを設定でき、シークレット管理に最小権限のアプローチを取り入れられます。
"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
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ポリシーファイルを管理することもできます。
ビジュアルエディタの使い方については、ビジュアルエディタリファレンスを参照してください。
カスタムケイパビリティ
tsnet、tailscale whoisCLIコマンド、tailscale serveのアプリケーションケイパビリティヘッダー、またはLocalAPIを使ってTailscaleと統合することで、自身のアプリケーション向けにカスタムのアプリケーションケイパビリティを作成できます。
カスタムケイパビリティを使うと、ネットワークレベルのアクセス制御を超えて、自身のアプリケーション向けの権限を定義でき、ユーザーがネットワークアクセスを得た後、アプリ内で実行できる操作を正確に指定できます。
Tailscaleは、アプリケーションケイパビリティを自身のアプリケーションに統合する方法として、4つのアプローチを提供しています。
tsnetは、GoアプリケーションにTailscaleを組み込めるGoライブラリです。アプリケーションは、組み込みのHTTPS証明書管理機能を備えたTailscale IPアドレスとホスト名を受け取ります。ソリューション全体が単一のバイナリとしてデプロイされるため、専用のネットワークアイデンティティを必要とするマイクロサービスや社内ツールに最適です。tsnetを使うと、tailnet内でアプリケーションにリクエストを送るデバイスに付与されたケイパビリティを読み取れます。- LocalAPIは、あらゆるプログラミング言語のアプリケーションに適しています。アプリケーションは、ホストが持つTailscaleクライアントを使ってアプリケーションケイパビリティを問い合わせることができ、Tailscale機能を追加するためのアーキテクチャの変更を最小限に抑えられます。
tailscale whoisは、tailnet内の任意のデバイスについて、アプリケーションケイパビリティのデータを提供します。デバッグ用途では、tailscale whoisCLIコマンドを使うのが最適です。アプリケーションケイパビリティを扱うコードを書く場合は、通常、アプリケーションケイパビリティのデータを取得するにはLocalAPIへの問い合わせの方が適しています。tailscale serveを使うと、Webサイトなど、tailnet内のデバイス上で動作するアプリケーションを、tailnetの他のメンバーに共有できます。他のデバイスがそのアプリケーションに接続すると、Serveはそのケイパビリティをリクエストヘッダーでアプリケーションに転送できます。
複数のケイパビリティを使った完全な例
複数のケイパビリティが包括的なポリシーの中でどのように連携するかを示すために、このセクションでは、さまざまなユーザーグループとリソース向けの多様なケイパビリティを組み込んだ、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)に限定的にアクセスできると述べていますが、上記のコード例にはtagOwnersでtag:grafanaが定義されているのみで、これに対応するgrantsのエントリは含まれていません。原文自体にこの不整合があるため、翻訳でもそのまま反映しています。