Tailscaleロゴ

tailnetポリシーファイルの構文リファレンス

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

Tailscaleのアクセス制御ルール(ACLグラントなど)は、human JSON(HuJSON)で記述されるtailnetポリシーファイル内に記述します。

tailnetポリシーファイルには、以下のトップレベルセクションがあります。

tailnetポリシーファイルのトップレベルセクション
セクション キー タイプ 用途
グラント grants アクセス制御 オプションのルートフィルタリングを備えた、ネットワークレベルおよびアプリケーションレベルのアクセス制御ポリシーを作成します。アクセス制御ポリシーにはグラントを優先してください。
ACL acls アクセス制御 ネットワークレベルのアクセス制御ポリシーを作成します。
SSH ssh アクセス制御 誰がTailscale SSHを利用できるかを指定します。
自動承認 autoApprovers 自動化 サブネットルーター、Exit Node、アプリコネクタをアドバタイズする際の承認プロセスを、誰がバイパスできるかを指定します。
ノード属性 nodeAttrs 属性 デバイスとユーザーに追加の属性を適用します。
デバイスポスチャポリシー postures 属性 アクセス制御ポリシーでターゲットにする、デバイスポスチャルールを定義します。
タグオーナー tagOwners ターゲット tailnet内のデバイスに、誰がどのタグを割り当てられるかを定義します。
グループ groups ターゲット アクセス制御ポリシーやその他の定義でターゲットにする、ユーザー・デバイス・サブネットの名前付きグループを定義します。
ホスト hosts ターゲット デバイスとサブネットの名前付きエイリアスを定義します。
IPセット ipsets ターゲット アクセス制御ポリシーやその他の定義でターゲットにする、名前付きネットワークセグメントを定義します。
テスト tests テスト 変更されるべきではないアクセス制御ポリシー(ACLとネットワークレベルのグラント)についてアサーションを行うテストを記述します。
SSHテスト sshTests テスト 変更されるべきではないTailscale SSHについてアサーションを行うテストを記述します。

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

グラント

グラントは、アクセス制御に対する新しく、より強力なアプローチです。
ACLでできることをすべて行えるうえに、さらに多くのことができます。
宛先デバイスと通信する際、デバイスやユーザーの集合に対してアプリケーション層のケイパビリティを付与できます。
また、従来のネットワーク層のケイパビリティも引き続き定義できます。
例えば、グラントルールを使って、あるユーザーグループにサーバーの8443ポートへのアクセスを許可すると同時に、そのサーバー上で編集できるファイルを定義することができます。

グラントシステムは、ネットワーク層とアプリケーション層のケイパビリティを、共通の構文に統合します。
その結果、リソースへのアクセスに対して、より高い柔軟性ときめ細かな制御を提供します。
各グラントに必要なのは、送信元(source)と宛先(destination)のみです。
Tailscaleはデフォルト拒否(deny-by-default)のアプローチを採用しているため、各グラントには暗黙的なacceptアクションが伴います。

ACL

Tailscaleは現在、次世代のアクセス制御ポリシー構文であるグラントを使って、リソースへのアクセスを保護しています。
グラントは、従来のACLのすべての機能に加えて、追加の機能を提供します。

ACLは今後も無期限に動作し続けます。Tailscaleは、この第1世代の構文のサポートを製品から削除することはありません。
ただし、ACLには新機能が追加されないため、Tailscaleはグラントへの移行と、すべての新しいtailnetポリシーファイルの構成でグラントを使用することを推奨しています。

aclsセクションには、tailnetのアクセスルールを列挙します。各ルールは、送信元の集合から宛先の集合へのアクセスを許可します。

アクセスルールでは、グループタグを使って、あらかじめ定義したユーザーの集合にアクセスを許可したり、ノードにサービスロールアカウントを割り当てたりできます。
グループとタグを組み合わせることで、強力なロールベースアクセス制御(RBAC)ポリシーを構築できます。

Tailscaleは、すべてのACLを自動的に、送信元IPアドレスから宛先IPアドレスとポートへのトラフィックを許可する、より低レベルのルールに変換します。

次の例は、actionsrcprotodstを含むアクセスルールを示しています。

{
  "action": "accept",
  "src": [ <list-of-sources> ],
  "proto": "tcp", // オプション
  "dst": [ <list-of-destinations> ],
}

tailnetポリシーのaclセクションは、レガシーフィールドのusersportsもサポートしていますが、(usersの代わりに)src、(portsの代わりに)dstを使うことがベストプラクティスです。

action

Tailscaleのアクセスルールは、デフォルトでアクセスを拒否します。
そのため、指定できるactionacceptのみです。
acceptは、送信元(src)から宛先(dst)へのトラフィックを許可します。

src

srcフィールドは、ルールが適用される送信元のリストを指定します。リスト内の各要素には、以下のいずれかを指定できます。

srcフィールドで指定できるタイプ
タイプ 説明
Any * tailnet内のTailscaleデバイス、承認済みのすべてのサブネット、autogroup:sharedから発信されるすべてのトラフィックです。非Tailscaleデバイスから発信されるトラフィックは(承認済みルートでない限り)許可されません。
User shreya@example.com 指定したユーザーのすべてのデバイスを含みます。
Group group:<group-name> 指定したグループ内のすべてのユーザーを含みます。
Tailscale IP 100.100.123.123 指定したTailscale IPを持つデバイスのみを含みます。IPv6アドレスは[1:2:3::4]:80という形式にする必要があります。
Subnet CIDR Range 192.168.1.0/24 指定したサブネット内の任意のIPアドレスを含みます。
Host my-host hostsセクションのTailscale IPアドレスまたはCIDRを含みます。
Tag tag:production 指定したタグを持つすべてのデバイスを含みます。
Autogroup autogroup:<role|property> 同じプロパティまたはロールを持つユーザー、宛先、ユーザー名のデバイスを含みます。
Autogroup (all) autogroup:danger-all tailnet外のデバイスを含む、すべての送信元を選択する特別なオートグループです。

オプションでsrcPostureフィールドを含めることで、デバイスポスチャの条件に一致するデバイスのみに、srcをさらに制限できます。

proto

protoフィールドはオプションのフィールドで、ルールが適用されるプロトコルを指定するために使用できます。プロトコルを指定しない場合、アクセスルールはすべてのTCPおよびUDPトラフィックに適用されます。

protoには、IANA IPプロトコル番号1255(例: "16")、またはサポートされている名前付きエイリアスのいずれかを指定できます。

protoの名前付きエイリアス
プロトコル proto IANAプロトコル番号
Internet Group Management(IGMP)igmp2
IPv4 encapsulationipv4ip-in-ip4
Transmission Control(TCP)tcp6
Exterior Gateway Protocol(EGP)egp8
Any private interior gatewayigp9
User Datagram(UDP)udp17
Generic Routing Encapsulation(GRE)gre47
Encap Security Payload(ESP)esp50
Authentication Header(AH)ah51
Stream Control Transmission Protocol(SCTP)sctp132

protoフィールドに関する注意事項です。

dst

dstフィールドは、ルールが適用される宛先のリストを指定します。リスト内の各要素は、<host>:<ports>という形式で、hostと1つ以上のportsを指定します。

hostには、以下のいずれかのタイプを指定できます。

dstフィールドのhostで指定できるタイプ
タイプ 説明
Any*制限なしに、任意の宛先を含みます。
Usershreya@example.com指定したユーザーとして現在サインインしているすべてのデバイスを含みます。
Groupgroup:<group-name>指定したグループ内のすべてのユーザーを含みます。
Tailscale IP address100.100.123.123指定したTailscale IPアドレスを持つデバイスのみを含みます。
Hostsexample-host-namehostsセクションのTailscale IPアドレスを含みます。
Subnet CIDR Range192.168.1.0/24指定したサブネット内の任意のIPアドレスを含みます。
Tagstag:<tag-name>指定したタグを持つすべてのデバイスを含みます。
Exit Node経由でのインターネットアクセスautogroup:internetExit Node経由でインターネットにアクセスできるデバイスを含みます。
自分自身のデバイスautogroup:selfユーザー自身のデバイスを選択します。autogroup:selfは特別なオートグループセレクターで、srcセレクターのautogroup:<role>group:<name>、または個々のユーザーと組み合わせることで、ユーザー自身のデバイスから、そのユーザー自身の他のデバイスへのアクセスを許可できます。
tailnetデバイスautogroup:membertailnetの直接メンバー(共有ユーザーではない)であるユーザーのデバイスを含みます。
Adminデバイスautogroup:adminAdminであるユーザーのデバイスを含みます。
Network adminデバイスautogroup:network-adminNetwork adminであるユーザーのデバイスを含みます。
IT adminデバイスautogroup:it-adminIT adminであるユーザーのデバイスを含みます。
Billing adminデバイスautogroup:billing-adminBilling adminであるユーザーのデバイスを含みます。
Auditorデバイスautogroup:auditorAuditorであるユーザーのデバイスを含みます。
Ownerデバイスautogroup:ownertailnetのOwnerであるユーザーのデバイスを含みます。
IPセットipset:<ip-set-name>IPセット内のすべてのターゲットを含みます。

portsフィールドには、以下のいずれかのタイプを指定できます。

portsフィールドで指定できるタイプ
タイプ 説明
Any任意のポート番号を含みます。*
Single単一のポート番号を含みます。22
Multipleカンマで区切られた2つ以上のポート番号を含みます。80,443
Rangeポート番号の範囲を含みます。1000-2000

サブネットルーターとExit Node

ACLはルートの検出を制限しません。デバイスがサブネットルーターである場合、そのサブネットとは独立して、そのデバイスへのアクセスを制限できます。デバイスがExit Nodeである場合、そのパブリックIPアドレスとは独立して、そのデバイスへのアクセスを制限できます。

サブネットへのアクセスを制限するには、そのルートへのアクセスを許可するACLが存在しないことを確認します。
これは、誤ってアクセスを許可するルールがあった場合に失敗するテストを使って強制できます。
次の例は、not-allowed@example.com198.51.100.7:22へのアクセスを許可されている場合に失敗するテストを示しています。

"tests": [
  {
    "src": "not-allowed@example.com",
    "accept": ["192.0.2.100:22"], // Tailscale IPへのアクセスを許可
    "deny": ["198.51.100.7:22"], // サブネットへのアクセスを許可しない
  }
],

autogroup:internetへのアクセス権を持つデバイスのみが、Exit Nodeを使用できます。
それ以外のデバイス(autogroup:internetへのアクセス権を持たないデバイス)は、Exit Nodeを使用できません。
これは、誤ってパブリックアドレスへのアクセスを許可するルールがあった場合に失敗するテストを使って強制できます。
次のテスト例は、not-allowed@example.com198.51.100.8:22にアクセスできる場合に失敗します。

"tests": [
  {
    "src": "not-allowed@example.com",
    "accept": ["192.0.2.100:22"], // Tailscale IPへのアクセスを許可
    "deny": ["198.51.100.8:22"], // パブリックIPへのアクセスを許可しない
  }
],

ACLを使って特定のExit Nodeの使用を制限することはできません。更新情報については、issue #1567を参照してください。

4via6にはIPv4ではなくIPv6が必要

4via6サブネットルーターの背後にあるリソースをターゲットにするアクセス制御ルールを記述する際は、宛先としてIPv4アドレスではなく、IPv6のCIDRまたはアドレスを使用してください。

IPv6のCIDRを取得するには、tailscale debug viaを使用します。

Taildropの優先順位

Taildropを使うと、ACLでアクセスを制限している場合でも、自分がログインしているデバイス間でファイルを共有できます。

ユーザーを参照する

ユーザーは、すべてのプランで利用できます。

アクセスルールの送信元(src)と宛先(dst)フィールドには、ユーザーを指定できます。
ユーザーを指定するには、そのユーザーのTailscaleへのサインイン方法に応じて、以下のいずれかの形式を使用します。

ユーザーの指定形式
フォーマット 説明
username@example.comユーザーがメールアドレスでTailscaleにサインインする場合に使用します。alice@example.com
username@githubユーザーがGitHubアカウントでTailscaleにサインインする場合に使用します。alice@github
username@passkeyユーザーがPasskeyでTailscaleにサインインする場合に使用します。alice@passkey

グループを使うと、ユーザーの集合を参照できます。グループを使うと、ロールベースのアクセス制御を定義できます。グループには複数の種類があります。

オートグループ

オートグループは、すべてのプランで利用できます。

オートグループは、同じプロパティを持つユーザー、宛先、ユーザー名を自動的に含める特別なグループです。

オートグループ一覧
許可 オートグループ 説明 プランごとの利用可否
dstとしてautogroup:internettailnet内の任意のExit Node経由で、任意のユーザーにアクセスを許可するために使用します。すべてのプランで利用可能
dstとしてautogroup:self送信元と同じユーザーとして認証されている任意のユーザーにアクセスを許可するために使用します。タグには適用されません。すべてのプランで利用可能
srcdsttagOwnerautoApproverとしてautogroup:ownertailnetのOwnerにアクセスを許可するために使用します。すべてのプランで利用可能
srcdsttagOwnerautoApproverとしてautogroup:adminAdminロールを持つ任意のユーザーにアクセスを許可するために使用します。すべてのプランで利用可能
srcdsttagOwnerautoApproverとしてautogroup:membertailnetの直接メンバー(招待された全ユーザーを含む)である任意のユーザーにアクセスを許可するために使用します。共有デバイスのユーザーは含まれません。すべてのプランで利用可能
srcdsttagOwnerautoApproverとしてautogroup:taggedタグ付けされたデバイスである任意のユーザーにアクセスを許可するために使用します。すべてのプランで利用可能
srcdsttagOwnerautoApproverとしてautogroup:auditorAuditorロールを持つ任意のユーザーにアクセスを許可するために使用します。Standard、Premium、Enterpriseプランで利用可能
srcdsttagOwnerautoApproverとしてautogroup:billing-adminBilling adminロールを持つ任意のユーザーにアクセスを許可するために使用します。Standard、Premium、Enterpriseプランで利用可能
srcdsttagOwnerautoApproverとしてautogroup:it-adminIT adminロールを持つ任意のユーザーにアクセスを許可するために使用します。Standard、Premium、Enterpriseプランで利用可能
srcdsttagOwnerautoApproverとしてautogroup:network-adminNetwork adminロールを持つ任意のユーザーにアクセスを許可するために使用します。Standard、Premium、Enterpriseプランで利用可能
srcdsttagOwnerautoApproverとしてuser:*@<domain>指定したドメインのログインを持ち、tailnetの直接メンバー(招待された全ユーザーを含む)である任意のユーザーにアクセスを許可するために使用します。共有デバイスのユーザーは含まれません。すべてのプランで利用可能
srcとしてautogroup:sharedネットワークへの共有招待を承諾した任意のユーザーにアクセスを許可するために使用します。これにより、事前にメールアドレスを知らなくてもルールを記述できます。すべてのプランで利用可能
SSHユーザーとしてautogroup:nonrootrootではない任意のユーザーにTailscale SSHアクセスを許可するために使用します。すべてのプランで利用可能
SSHユーザーとしてlocalpart:*@<domain>ユーザーのログインのlocal-partと一致する名前を持つユーザーに、Tailscale SSHアクセスを許可するために使用します。PremiumおよびEnterpriseプランで利用可能

autogroup:selfは、ユーザー所有のデバイスにのみ適用されます。タグ付きデバイスには適用されません。autogroup:selfautogroup:taggedを同時に使用することはできません。

レガシーなオートグループであるautogroup:membersは今後も動作しますが、代わりにautogroup:memberを使うことがベストプラクティスです。autogroup:memberautogroup:membersを同じtailnetポリシーファイル内で併用することはできません。

次のsshルールの例は、すべてのユーザーに、自分が所有するデバイスへの(root以外としての)Tailscale SSHアクセスを許可します。

"ssh": [
  {
    // すべてのユーザーは、自分自身のデバイスへ、root以外としてSSH接続できます
    "action": "accept",
    "src": ["autogroup:member"],
    "dst": ["autogroup:self"],
    "users": ["autogroup:nonroot"]
  },
]

デフォルトのACLでは、sshルールはdstフィールドにautogroup:selfを、usersフィールドにautogroup:nonrootを使用します。
dstフィールドをautogroup:selfから、ACLタグのような別の宛先に変更する場合は、usersフィールドのautogroup:nonrootも置き換えることを検討してください。
usersフィールドからautogroup:nonrootを削除しないと、src設定で許可された誰もが、dstデバイス上の任意のroot以外のユーザーとしてSSH接続できてしまいます。

ドメインベースのオートグループ

一部のオートグループには、特定のドメイン名が含まれます。例えば、user:*@example.comlocalpart:*@example.comです。
これらのオートグループには、tailnetのメンバーであり、かつログインがそのオートグループのドメインに含まれるユーザーが含まれます。
例えば、example.comというtailnetがuser:*@altostrat.comというオートグループを使用する場合、このグループには、example.comtailnetのメンバーのうち、@altostrat.comのユーザー(laura@altostrat.comなど)としてログインするすべてのユーザーが含まれます。

オートグループで使用するドメインには、以下の制約が適用されます。

グループ

グループは、すべてのプランで利用できます。ただし、tailnetでサポートされるグループの数は、プランによって異なります。詳しくは、料金ページを参照してください。

groupsセクションを使うと、ユーザーのグループを作成でき、アクセスルールの中で(ユーザーを個別に列挙する代わりに)使用できます。
グループのメンバーシップに加えた変更は、そのグループを参照するすべてのルールに反映されます。

次の例は、engineeringグループとsalesグループを作成する方法を示しています。

"groups": {
  "group:engineering": [
    "dave@example.com",
    "laura@example.com",
  ],
  "group:sales": [
    "brad@example.com",
    "alice@example.com",
  ],
},

すべてのグループ名は、接頭辞group:で始まる必要があります。
各グループメンバーは、上記のユーザーのセクションで説明したとおり、完全なメールアドレスで指定します。
グループメンバーシップがわかりにくくなるリスクを避けるため、グループの中に別のグループを含めることはできません。

ユーザーのグループメンバーシップは、上記のgroups定義の例のようにtailnetポリシーファイルを編集するか、管理コンソールのUsersページから直接、追加・削除できます。

Usersページからユーザーのグループメンバーシップを編集する

Usersページからユーザーのグループメンバーシップを編集するには、Owner、Admin、Network adminのいずれかである必要があります。

  1. 管理コンソールのUsersページを開きます。
  2. 名前でユーザーを見つけます。
  3. 省略記号(…)アイコンのメニューを選択し、Edit group membershipを選択します。
  4. Edit group membershipダイアログで、以下の操作を行います。
    1. グループを追加するには、Add to a groupを選択し、追加するグループを選択します。
    2. グループを削除するには、削除したいグループの横にあるXを選択します。
  5. ユーザーのグループの編集が完了したら、Saveを選択します。

同期グループ

アイデンティティプロバイダーでグループを作成し、ユーザー・グループプロビジョニングを使って、Tailscaleのアクセス制御ポリシーと同期できます。

アイデンティティプロバイダーで使用しているのと同じ、人間が読める形式のグループ名を使って、tailnetポリシーファイル内のグループを参照できます。
次の例は、security-teamグループのアクセスを管理するアクセスルールを示しています。

{
  "grants": [
    {
      "src": ["group:security-team@example.com"],
      "dst": ["tag:logging"],
      "ip": ["*"]
    }
  ],
  "tagOwners": {
    "tag:logging": ["group:security-team@example.com"]
  }
}

編集できるのは、tailnetポリシーファイルで定義されたグループのみです。
System for Cross-domain Identity Management(SCIM)連携から同期されたグループや、tailnetのオートグループも使用できますが、これらを編集することはできません。

複数のデバイスを参照する

タグホストを使って、デバイスの集合に対するアクセスルールを定義できます。
タグを使うと、サービスごとに異なるアクセスルールを持たせる、ロールベースのアクセス制御を定義できます。
ホストを使うと、IPアドレスへの参照に基づく制御を定義できます。

タグ

タグは、すべてのプランで利用できます。

tailnetポリシーファイルのtagsという表現は、人間ではないデバイスをグループ化するタグを作成するためのものです。作成したタグは、ACL内でこれらのデバイスを選択するために使用できます。

ACLでタグを使用する前に、tailnetポリシーファイルのtagOwnersセクションで、そのタグを定義する必要があります。
デバイスにタグを付けるには、そのデバイス上で、そのタグとして認証します。

ホスト

ホストは、すべてのプランで利用できます。

hostsセクションを使うと、IPアドレスまたはCIDR範囲に対して、人間が読みやすい名前を定義できます。

次の例は、2つのホスト定義を示しています。1つは単一のIPアドレス用、もう1つはCIDR範囲用です。

"hosts": {
  "example-host-1": "198.51.100.100",
  "example-network-1": "198.51.100.0/24",
},

人間が読みやすいホスト名には、文字@を含めることはできません。

デバイスポスチャポリシー

デバイスポスチャポリシーは、すべてのプランで利用できます。

posturesセクションを使うと、特定のアクセスルールの一部として、デバイスが満たすべきデバイスポスチャ管理ルールの集合を定義できます。

次の例は、posturesを使って、バージョン1.40以降のnodeを実行しているmacOSデバイスを選択する方法を示しています。

"postures": {
  "posture:latestMac": [
    "node:os IN ['macos']",
    "node:tsReleaseTrack == 'stable'",
    "node:tsVersion >= '1.40'",
  ],
},

各ポスチャは、接頭辞posture:に続けて名前を付け、ポスチャ属性とその許可される値の集合を、文字列のリストとして指定する必要があります。

詳しくは、デバイスポスチャ管理を参照してください。

タグオーナー

タグは、すべてのプランで利用できます。

tailnetポリシーファイルのtagOwnersセクションは、デバイスに割り当て可能なタグと、各タグの割り当てを許可されたユーザーのリストを定義します。

次の例は、以下のようなtagOwners定義を示しています。

"tagOwners": {
  "tag:webserver": [
    "group:engineering",
  ],
  "tag:secure-server": [
    "group:security-admins",
    "president@example.com",
  ],
  "tag:corp": [
    "autogroup:member",
  ],
}

すべてのタグ名は、接頭辞tag:で始まる必要があります。
タグオーナーには、(上記のユーザーのセクションで定義した)ユーザーの完全なログインメールアドレス、グループ名オートグループ、または別のタグを指定できます。

autogroup:adminには、[]という省略記法が使えます。つまり、以下は同等です。

"tag:monitoring": [
  "autogroup:admin",
],
"tag:monitoring": [],

autogroup:adminautogroup:network-adminのオートグループは、すべてのタグを割り当てられるため、[]は暗黙的に、autogroup:adminautogroup:network-adminのみにタグの割り当てを許可します。

自動承認

自動承認は、すべてのプランで利用できます。

tailnetポリシーファイルのautoApproversセクションは、管理コンソールからのさらなる承認なしに、特定のアクションを実行できるユーザーのリストを定義します。
Tailscaleの一部のアクションには、ダブルオプトインが必要です。すなわち、Adminが、Tailscaleを実行しているデバイス上と、Tailscale管理コンソールの両方で、そのアクションを有効にする必要があります。これには以下が含まれます。

ルートの場合、これにより自動承認の対象者は、指定したルートのサブネットもアドバタイズできるようになります。

以下のいずれかが発生すると、Tailscaleはルートのアドバタイズを停止します。

Tailscaleがルートのアドバタイズを停止してしまう事態を避けるには、タグを自動承認の対象として使うことを検討してください。

次の例は、alice@example.comengineeringグループのメンバー、およびfooタグの付いたデバイスに対して、192.0.2.0/24ルートを自動承認するautoApprovers定義を示しています。
また、barタグの付いたデバイスに対するExit Nodeのアドバタイズも自動承認します。

"autoApprovers": {
  "routes": {
    "192.0.2.0/24": ["group:engineering", "alice@example.com", "tag:foo"],
  },
  "exitNode": ["tag:bar"],
}

ルートまたはExit Nodeの自動承認の対象には、(上記のユーザーのセクションで定義した)ユーザーの完全なログインメールアドレス、グループ名、オートグループ、またはタグを指定できます。

自動承認ポリシーは、Tailscaleが最初にサブネットルートのアドバタイズを受け取った時にのみ適用されます。
自動承認の対象を追加・変更するためにtailnetポリシーファイルを更新しても、既存の未承認ルートが遡及的に承認されることはありません。
既存の未承認ルートに対して自動承認をトリガーするには、そのルートをサブネットルーターから削除し、再度アドバタイズしてください。

Tailscale SSH

Tailscale SSHのtailnetポリシーは、すべてのプランで利用できます。

tailnetポリシーファイルのsshセクションは、Tailscale SSHを利用できるユーザーとデバイスのリスト(およびSSHユーザー)を定義します。
接続を許可するには、tailnetポリシーファイルに、ネットワークアクセスとSSHアクセスの両方を許可するルールが含まれている必要があります。

  1. 送信元から宛先への、ポート22での接続を許可するアクセスルール。
  2. 送信元から宛先への接続と、指定したSSHユーザーを許可するSSHアクセスルール。Tailscale SSHは、これを使って認証済みのSSH接続にキーを配布します。

次の例は、送信元、宛先、SSHユーザーのリストに対して、20時間ごとの再認証を要求するssh定義を示しています。

{
  "action": "check", // "accept" または "check"
  "src": [ <list-of-sources> ],
  "dst": [ <list-of-destinations> ],
  "users": [ <list-of-ssh-users> ],
  "checkPeriod": "20h", // オプション、checkアクションの場合のみ有効。デフォルトは12h
  "acceptEnv": [ "GIT_EDITOR", "GIT_COMMITTER_*", "CUSTOM_VAR_V?" ], // オプション、クライアントからホストに転送できる環境変数を許可リスト化します
  "srcPosture": [ <list-of-posture-conditions> ], // オプション、ポスチャ条件のリストに一致する場合のみアクセスを許可します
},

action

接続を許可するか、追加のチェックを行うかを指定します。

src

送信元(接続の発信元)を指定します。アクセスルールの宛先(dst)として定義できるのは、自分自身、グループ、タグ、またはオートグループのみです。*、他のユーザー、IPアドレス、ホスト名は使用できません。

アクセスルールを作成する時点で、IPアドレスやホスト名の所有権を保証することはできません。
セキュリティ対策として、Tailscaleはアクセスルールのdstフィールドでユーザー、IPアドレス、ホスト名を使用することを禁止しており、あるユーザーが意図せず他人のデバイスにアクセスしてしまう事態を防いでいます。
また、Tailscaleは、複数のユーザーが単一ユーザーのデバイスにアクセスできてしまうようなsrcdstの組み合わせも防止します。

autogroup:memberにアクセスを許可すると、宛先デバイスが共有されている場合、そのtailnetにデバイスを持たない外部の招待ユーザーにもアクセスが許可されます。

dst

宛先(接続先)を指定します。宛先には、タグ、(送信元がユーザーまたはグループのみを含む場合の)autogroup:self、または(送信元が同じ名前の単一ユーザーのみを含む場合の)単一の名前付きユーザーを指定できます。
このような制約がある理由は、送信元が同じユーザーが所有するデバイスでない限り、Tailscaleはユーザーが所有するデバイス上でTailscale SSHセッションを開始することを許可しないためです。

許可されるポートは22のみであるため、宛先にポートを指定することはできません。宛先として*を指定することもできません。

users

このポリシーは、すべてのプランで利用できます。

ホスト上で許可されるユーザー名の集合を指定します。Tailscaleは、ホスト上にすでに存在するユーザーアカウントのみを使用します。

checkPeriod

このポリシーは、PremiumおよびEnterpriseプランでのみ利用できます。

actioncheckの場合、checkPeriodは、チェックを要求するまでに接続を許可する期間を指定します。時間は分または時間で指定できます。指定できる時間は、最短1分、最長168時間(1週間)です。

acceptEnv

acceptEnvを使用するには、ホストがTailscale v1.76.0以降を実行している必要があります。

SendEnvまたはSetEnvを使ってクライアントがホストに送信できる、許可リストに登録された環境変数名の集合を指定します。

値には、ワイルドカード文字*?を含めることができます。*はゼロ文字以上に一致し、?は1文字に一致します。

acceptEnvの例

acceptEnvの一致例
acceptEnv 許可される 拒否される
*FOO_A FOO_B FOO_OTHER BAZ 
FOO_*FOO_A FOO_B FOO_OTHERBAZ
FOO_?FOO_A FOO_BFOO_OTHER BAZ
FOO_AFOO_AFOO_B FOO_OTHER BAZ

srcPosture

srcPostureフィールドは、ネットワークの送信元(src)をさらに制限するために使用できる、デバイスポスチャ条件の配列です。
例えば、srcPostureを使って、特定のバージョンのTailscaleクライアントを実行しているデバイスのみに、アクセスを制限できます。

評価の順序

Tailscaleは、SSHアクセスルールを、最も制限の厳しいポリシーから順に評価します。

例えば、ユーザーalice@example.comにあるリソースへのアクセスをacceptルールで許可するアクセスルールと、alice@example.comが所属するgroup:devopsに同じリソースへのアクセスをcheckルールで許可するルールの両方がある場合、checkルールが適用されます。

tailnetポリシーファイルを変更していないtailnetには、ユーザーが自分の所有するデバイスに、checkモードでアクセスできるデフォルトのSSHポリシーがあります。

許可される接続の種類は、以下のみです。

つまり、許可される最も広範なポリシーは、以下のようになります。

{
  "grants": [
    {
      "src": ["*"],
      "dst": ["*"],
      "ip": ["*"]
    }
  ],
  "ssh": [
    {
      "action": "accept",
      "src": ["autogroup:member"],
      "dst": ["autogroup:self"],
      "users": ["root", "autogroup:nonroot"]
    },
    {
      "action": "accept",
      "src": ["autogroup:member"],
      "dst": ["tag:prod"],
      "users": ["root", "autogroup:nonroot"]
    },
    {
      "action": "accept",
      "src": ["tag:logging"],
      "dst": ["tag:prod"],
      "users": ["root", "autogroup:nonroot"]
    }
  ]
}

ユーザーが自分自身のデバイスにのみ(root以外として)SSH接続できるようにするには、次のようにします。

{
  "grants": [
    {
      "src": ["*"],
      "dst": ["*"],
      "ip": ["*"]
    }
  ],
  "ssh": [
    {
      "action": "accept",
      "src": ["autogroup:member"],
      "dst": ["autogroup:self"],
      "users": ["autogroup:nonroot"]
    }
  ]
}

group:sreに、tag:prodタグの付いた本番環境のデバイスへのアクセスを許可するには、次のようにします。

{
  "groups": {
    "group:sre": ["alice@example.com", "bob@example.com"]
  },
  "grants": [
    {
      "src": ["group:sre"],
      "dst": ["tag:prod"],
      "ip": ["*"]
    }
  ],
  "ssh": [
    {
      "action": "accept",
      "src": ["group:sre"],
      "dst": ["tag:prod"],
      "users": ["ubuntu", "root"]
    }
  ],
  "tagOwners": {
    // group:sreのユーザーはtag:prodタグを適用できます
    "tag:prod": ["group:sre"]
  }
}

共有された、tag:devタグの付いた開発環境のデバイスへのアクセスをAliceに許可するには、次のようにします。

{
  "ssh": [
    {
      "action": "accept",
      "src": ["alice@example.com"],
      "dst": ["tag:dev"],
      "users": ["root", "alice"]
    },
  ]
}

ホストのユーザーとログインメールアドレスを一致させると便利な場合があります。例えば、dave@example.comが、ホストユーザーdaveとして認証できるようにすることができます。

ログインドメインexample.comの任意のtailnetメンバーが、ログインメールアドレスのlocal-partと一致するユーザーとして、tag:prodタグの付いた本番環境のデバイスにアクセスできるようにするには、次のようにします。

{
  "grants": [
    {
      "src": ["user:*@example.com"],
      "dst": ["tag:prod"],
      "ip": ["*"]
    }
  ],
  "ssh": [
    {
      "action": "accept",
      "src": ["user:*@example.com"],
      "dst": ["tag:prod"],
      "users": ["localpart:*@example.com"]
    }
  ]
}

ノード属性

tailnetポリシーファイルのnodeAttrsセクションは、tailnet内の特定のデバイスに適用する追加の属性を定義します。

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

ノード属性の使い方の1つとして、tailnet内のデバイスごとに異なるNextDNS構成を設定することが挙げられます。
次の例は、my-kid@my-home.comtag:serverをターゲットに、nextdns:abc123nextdns:no-device-infoという属性を設定するnodeAttrs定義を示しています。

"nodeAttrs": [
  {
    "target": ["my-kid@my-home.com", "tag:server"],
    "attr": [
      "nextdns:abc123",
      "nextdns:no-device-info",
    ],
  },
],

target

属性が適用されるノード(デバイス)を指定します。
デバイスの選択には、タグ(tag:server)、ユーザー(alice@example.com)、グループ(group:kids)、または*を使用できます。

attr

それらのノード(デバイス)に適用する属性を指定します。

例えば、

次の例は、tailnetのメンバーが自分のノードでTailscale Funnelを使用できるようにします。

"nodeAttrs": [
  {
    "target": ["autogroup:member"],
    "attr":   ["funnel"],
  },
],

ネットワーク全体のポリシー設定を使う代わりに、nodeAttrsポリシーを使って、特定のデバイスに対してrandomize-client-port設定を有効にすることもできます。

"nodeAttrs": [
  {
    "target": ["tag:office-network", "group:sea-office"],
    "attr":   ["randomize-client-port"],
  },
],

app

これらのノード(デバイス)に適用する、アプリケーション層のケイパビリティを指定します。

次のノード属性定義の例は、example.comドメイン用にexample-connectorタグを構成します。

{
  "target": ["*"],
  "app": {
    "tailscale.com/app-connectors": [
      {
        "name": "example-app",
        "connectors": ["tag:example-connector"],
        "domains": ["example.com"],
        "routes": ["192.0.2.0/24"],
      },
    ],
  },
}

個々のアプリケーションは、<domainName>/<capabilityName>という形式で、ケイパビリティの名前を定義します。この例ではtailscale.com/app-connectorsを使用しています。

各ケイパビリティに関連付けられる値は、JSONオブジェクトの配列であり、それぞれにそのケイパビリティ固有の構成オプションが含まれます。

詳しくは、アプリコネクタの仕組みアプリコネクタ利用のベストプラクティスを参照してください。

テスト

テストは、すべてのプランで利用できます。

testsセクションを使うと、tailnetポリシーファイルが変更されるたびにチェックとして実行される、アクセス制御ポリシー(グラントとACL)についてのアサーションを記述できます。
アサーションが失敗すると、Tailscaleは更新されたtailnetポリシーファイルをエラーとともに拒否します。エラーメッセージには、失敗したテストが示されます。

テストを使うことで、重要な権限を誤って取り消したり、重要なシステムを露出させたりしないようにできます。

tests定義は、次のようになります。

"tests": [
  {
    "src": "dave@example.com",
    "srcPostureAttrs": {
      "node:os": "windows",
    },
    "proto": "tcp",
    "accept": ["example-host-1:22", "vega:80"],
    "deny": ["192.0.2.3:443"],
  },
],

src

テスト対象のユーザーアイデンティティを指定します。ユーザーのメールアドレスグループタグ、またはIPアドレスにマッピングされたホストを指定できます。
テストケースは、指定したアイデンティティで認証されたデバイスの視点で実行されます。

srcPostureAttrs

アクセスルール内のポスチャ条件を評価する際に使用するデバイスポスチャ属性を、キーと値のペアとして指定します。
このフィールドが必要なのは、アクセスルールにデバイスポスチャ条件が含まれる場合のみです。

proto

acceptルールとdenyルールに対するIPプロトコルを指定します。ACLルールのprotoフィールドと同様です。省略した場合、テストはTCPまたはUDPのいずれかのアクセスをチェックします。

Internet Control Message Protocol(ICMP)のアクセスをテストする場合は、"proto": "icmp"を設定し、ICMPはポートを使用しないため、宛先にはポート0を使用します。
次の例は、ユーザーalice@example.comtag:productionタグの付いたデバイスにpingできることをテストします。

"tests": [
  {
    "src": "alice@example.com",
    "proto": "icmp",
    "accept": ["tag:production:0"],
  },
],

acceptとdenyの宛先

許可または拒否する宛先を指定します。リスト内の各宛先はhost:portという形式であり、portは単一の数値のポート、hostには以下のいずれかを指定します。

acceptとdenyのhostで指定できるタイプ
タイプ 説明
Tailscale IP100.100.123.123指定したTailscale IPアドレスを持つデバイスを含みます。IPv6アドレスは[1:2:3::4]:80という形式にする必要があります。
Hostmy-hosthostsセクションのTailscale IPアドレスを含みます。
Usershreya@example.com指定したユーザーとしてサインインしているデバイスのTailscale IPアドレスを含みます。
Groupgroup:security@example.com指定したグループの代表メンバーとしてサインインしているデバイスのTailscale IPアドレスを含みます。
Tagtag:production指定したタグの付いたデバイスのTailscale IPアドレスを含みます。
Servicesvc:my-service指定したServiceに関連付けられたTailscaleの仮想IPアドレスを含みます。

サブネット範囲をテストするために、CIDR(サブネット)表記を使用することはできません。例えば、192.168.1.0/24は無効です。代わりに、個々のIPアドレスまたはホスト名を指定する必要があります。

srcの送信元、およびacceptdenyの宛先は、特定のエンティティを参照する必要があり、ワイルドカード*はサポートされません。例えば、acceptの宛先としてtags:*を指定することはできません。

レガシーなallowacceptの代わり)は、ACLで引き続き動作します。ただし、acceptを使用することがベストプラクティスです。

SSHテスト

SSHテストは、すべてのプランで利用できます。

sshTestsセクションを使うと、Tailscale SSHのアクセスルールについてのアサーションを記述できます。SSHテストは、ACLのテストと同様に機能します。

SSHテストは、tailnetポリシーファイルが変更された時に実行されます。アサーションが失敗すると、Tailscaleは失敗したテストの詳細を示すエラーとともに、更新されたtailnetポリシーファイルを拒否します。

次の例は、dave@example.comからexample-host-1への接続に対して、以下のテストを実行するsshTests定義を示しています。

"sshTests": [
  {
    "src": "dave@example.com",
    "dst": ["example-host-1"],
    "accept": ["dave"],
    "check": ["admin"],
    "deny": ["root"],
    "srcPostureAttrs": {
      "node:os": "windows",
    },
  },
],

src

SSH接続を試みているユーザーアイデンティティを指定します。ユーザーのメールアドレス、グループ、タグ、またはIPアドレスにマッピングされたホストを指定できます。
テストケースは、指定したアイデンティティで認証されたデバイスの視点で実行されます。

srcPostureAttrs

アクセスルール内のポスチャ条件を評価する際に使用するデバイスポスチャ属性を、キーと値のペアとして指定します。
このフィールドが必要なのは、アクセスルールにデバイスポスチャ条件が含まれる場合のみです。

dst

srcユーザーが接続する、1つ以上の宛先を指定します。ユーザーのメールアドレス、グループ、タグ、またはIPアドレスにマッピングされたホストを指定できます。

accept

追加のチェックを必要とせずに、dstホスト上で拒否する、0個・1個、またはそれ以上のユーザー名を指定します。actionのacceptを参照してください。

check

srcユーザーが追加のチェックに合格した場合に、dstホスト上で拒否する、0個・1個、またはそれ以上のユーザー名を指定します。actionのcheckを参照してください。

deny

どのような状況であっても、dstホスト上で拒否する、0個・1個、またはそれ以上のユーザー名を指定します。

IPセット

IPセットは、IPアドレスのグループを管理するための仕組みです。IPアドレス、CIDR、ホスト、オートグループ、他のIPセットの集合をカプセル化できます。
IPセットの主な利点は、複数のネットワーク部分を1つのコレクションにグループ化できることです。これにより、個々のIPアドレス、ホスト、サブネットではなく、そのコレクションに対してアクセス制御ポリシーを適用できます。

詳しくは、IPセットのドキュメントを参照してください。

ネットワークポリシーオプション

ネットワークポリシーオプションは、すべてのプランで利用できます。

アクセスルールに加えて、tailnetポリシーファイルには、特殊な用途向けのネットワーク全体のポリシー設定がいくつか含まれています。ほとんどのネットワークでは、これらを指定する必要はないはずです。

derpMap

derpMapセクションを使うと、ネットワークにカスタムDERPサーバーを追加でき、デバイスは必要に応じてこれをトラフィックのリレーに使用します。
このセクションを使って、Tailscale提供のDERPサーバーの使用を無効にすることもできます。例えば、企業のコンプライアンス要件を満たすために、tailnet提供のDERPサーバーを無効にしたい場合があります。
詳しくは、カスタムDERPサーバーの実行を参照してください。

disableIPv4

disableIPv4フィールドの代わりに、CGNATの競合で説明されているdisable-ipv4ノード属性を使用することを推奨します。

disableIPv4フィールドをtrueに設定すると、デバイスへのTailscale IPv4アドレスの割り当てが停止します。
IPv4を無効にすると、ネットワーク内のすべてのデバイスは、Tailscale IPv6アドレスのみを受け取ります。
IPv6をサポートしないデバイス(例えば、OSでIPv6が無効になっているシステム)には到達できなくなります。
このオプションは、100.64.0.0/10というキャリアグレードNATアドレス範囲を、既存の用途と競合させて使用しているユーザーを対象としています。

OneCGNATRoute

OneCGNATRouteフィールドは、Tailscaleクライアントが生成するルートを制御します。

Tailscaleクライアントには、以下のいずれかを持たせることができます。

OneCGNATRouteに指定できる値は、以下のとおりです。

randomizeClientPort

randomizeClientPortフィールドは、Tailscaleサポートに相談したうえで、一部のファイアウォールデバイスへの回避策としてのみ使用してください。

randomizeClientPortフィールドをtrueに設定すると、デバイスはデフォルトの静的ポート41641ではなく、WireGuardトラフィックにランダムなポートを使用します。