グラントのトラブルシューティング
最終検証日:
翻訳: 竹洞 陽一郎
グラントは、Tailscaleネットワーク(tailnetと呼ばれます)における、ネットワーク層とアプリケーション層の両方のアクセス制御を定義する、Tailscaleの統一されたアプローチです。
このガイドでは、基本的な確認手法から複雑な認可シナリオの解決まで、グラントに関するよくある問題を診断・解決する方法を説明します。
グラントの問題を診断する
このセクションでは、グラントポリシーを検査し、ポリシーのコンパイルを確認し、Tailscaleのポリシーエンジンが特定のデバイスやユーザーにどのように権限を適用するかを調べるためのツールと方法について説明します。
これらの診断手法を使うことで、グラントに関するほとんどの問題の根本原因を特定できます。
tailnetポリシーファイルを保存する際、Tailscaleはgrantsセクションを含む構文を検証する点に注意してください。
構文エラーがある場合、保存できません。これは、管理コンソールのエディタ、GitOps、Terraform、およびAPIのいずれにも当てはまります。
また、定義されていないターゲット(グループなど)を参照している場合も、tailnetポリシーファイルを保存できません。
グラント設定を確認する
トラブルシューティングの最初のステップは、グラントがtailnetポリシーファイル内で正しく定義されていることを確認することです。
管理コンソールのAccess controlsページにあるPreview rulesタブを使うと、特定のユーザーやタグに対してルールがどのように適用されるかを確認できます。
これにより、ポリシー構成が意図したとおりに機能することを確認しやすくなります。
whoisでケイパビリティを検査する
特定のデバイスやユーザーに付与されたアプリケーション層のケイパビリティに関する問題を診断するには、tailscale whoisコマンドが非常に役立ちます。
このコマンドは、tailnetポリシーを通じて付与されたすべてのケイパビリティを含む、ノードに関する詳細情報を提供します。
ユーザーまたはデバイスのケイパビリティを検査するには、そのTailscale IPアドレスを使用します。
tailscale whois 100.100.123.123
出力には、以下が含まれます。
- デバイスまたはユーザーの基本情報。
- デバイスに関連付けられたネットワークアドレス。
- デバイスに付与されたすべてのケイパビリティの一覧。
出力のCapabilitiesセクションには特に注意してください。ここには、デバイスに付与されたすべてのアプリケーションケイパビリティが詳しく記載されています。
各ケイパビリティのリストには、完全な名前とパラメーターが含まれており、正しい権限が適用されているかを確認できます。
よくある問題を解決する
グラントに関する問題の多くは、基本的な構成の誤りや、グラントの仕組みに関する誤解に起因します。
このセクションでは、グラントを扱う際によく遭遇する問題について説明します。
セレクターの一致に関する問題
セレクターが、意図したターゲットに一致しない場合があります。
これは、グラント内のセレクターが、許可しようとしているデバイスやユーザーを正しく識別していない場合に発生します。
セレクターの一致に関するよくある問題には、以下があります。
- メールアドレスやドメイン名のスペルミス。
- 作成済みだが、どのデバイスにも適用されていないタグの使用。
- 作成済みだが、ユーザーが登録されていないグループ名の使用。
- グループ名に
group:、タグ名にtag:という接頭辞を付け忘れること。この種の構文エラーは、グループやタグと同じ名前のホストが存在しない限り、自動的に検出されます。
セレクターの一致に関する問題をトラブルシューティングするには、以下を行います。
- グラントで参照しているタグが、適切なデバイスに適用されていることを確認する。
- 特に特定のユーザーへのアクセスを許可している場合は、メールアドレスの誤字がないかを確認する。
tailscale statusを使って、デバイスに適用されているタグを確認する。このコマンドは、確認対象の各デバイス上で実行する必要があります。
autogroup:memberのようなオートグループを使用している場合は、各オートグループに含まれるデバイスを理解しておいてください。
例えば、autogroup:memberには、tailnetのメンバーであるすべてのユーザーが含まれますが、他のtailnetから共有されたデバイスは含まれません。
あまり一般的ではない、複雑な問題
基本的な構成の問題を超えて、特に高度なアクセス制御ポリシー(ポスチャチェック、ルートフィルタリング、カスタムのアプリケーションケイパビリティなど)を実装する場合、グラントに関するより複雑な問題に直面することがあります。
これらの問題を解決するには、多くの場合、Tailscaleのポリシーエンジンがグラントをどのように処理・適用するかについて、より深い理解が必要です。
viaフィールドのルーティングに関する問題
グラントのviaフィールドを使うと、特定の条件に基づいて、異なるルーター経由でリソースアクセスをセグメント化できます。
ただし、構成が誤っていると、ルーティングの失敗や予期しないトラフィックパスにつながることがあります。
viaルーティングに関するよくある問題には、以下があります。
- 送信元から到達できない
viaターゲットを指定している。 - 適切なサブネットルートがアドバタイズされていないサブネットルーターを
viaターゲットとして使用している。 - 適切に構成されていないアプリコネクタを
viaターゲットとして使用している。 - 承認されていないExit Nodeを
viaターゲットとして使用している。 - サブネットルート、アプリコネクタ、Exit Nodeへトラフィックをルーティングするつもりが、
viaフィールドが指定されていない。
viaルーティングの問題をトラブルシューティングするには、以下を行います。
tailscale statusを使って、viaフィールドで指定したデバイスが存在し、オンラインであることを確認する。viaデバイスが適切に構成されていることを確認する。- サブネットルーターの場合は、
tailscale status --routesを使ってサブネットルートがアドバタイズされていることを確認する。 - アプリコネクタの場合は、アプリコネクタが正しく構成されていることを確認する。
- Exit Nodeの場合は、そのExit Nodeが管理コンソールで承認されていることを確認する。
tailscale pingを使って、送信元デバイスからviaデバイスに到達できることを確認する。viaデバイス上のログを調べて、そのデバイス経由で宛先に到達できることを確認する。
正しいvia構成の例:
"grants": [
{
"src": ["group:eng"],
"dst": ["192.0.2.0/24"],
"ip": ["*"],
"via": ["tag:subnet-router"]
}
]
ビジュアルポリシーエディタを使ってtailnetポリシーファイルを管理することもできます。
ビジュアルエディタの使い方については、ビジュアルエディタリファレンスを参照してください。
この例では、tag:subnet-routerタグの付いたデバイスが存在し、オンラインであり、192.0.2.0/24サブネットルートをアドバタイズしていることを確認してください。
デバイスポスチャ検証の失敗
srcPostureフィールドを使うと、デバイスポスチャの条件に基づいてアクセスを制限できます。
デバイスポスチャに関するよくある問題には、以下があります。
- ポスチャチェックをサポートしていない、古いバージョンのTailscaleを実行しているデバイス。
- 制限が厳しすぎる、または満たすことが不可能なポスチャ条件。
- 構文エラーのある、誤って構成されたポスチャ条件。
- ポスチャチェックに必要な属性が不足しているデバイス。
デバイスポスチャの問題をトラブルシューティングするには、以下を行います。
- すべてのデバイスが最新バージョンのTailscaleクライアントを実行していることを確認する。
1.52.0より前のバージョンは、ポスチャチェックをサポートしていません。 - tailnetポリシーファイル内のポスチャ条件が正しいかを見直す。
tailscale status --selfを使って、ポスチャ検証でチェックされるデバイス属性を取得する。- まずは制限の緩いポスチャ条件でテストし、徐々に制限を厳しくしていく。
デバイスポスチャ検証の例:
"postures": {
"posture:latest": [
"node:tsVersion >= '1.42.0'",
"node:os == 'linux'"
]
},
"grants": [
{
"src": ["group:eng"],
"dst": ["tag:prod"],
"ip": ["*"]
"srcPosture": ["posture:latest"]
}
]
ビジュアルポリシーエディタを使ってtailnetポリシーファイルを管理することもできます。
ビジュアルエディタの使い方については、ビジュアルエディタリファレンスを参照してください。
デバイスがポスチャチェックに失敗する場合は、一時的にsrcPostureフィールドを削除して、ポスチャ条件なしでグラントが機能することを確認し、その後、条件を1つずつ戻して、問題のある条件を特定してください。
アプリケーションケイパビリティの統合に関する問題
アプリケーションケイパビリティをグラントと統合する際、アプリケーションがTailscaleクライアントから提供されるケイパビリティを正しく解釈しないと、問題が生じることがあります。
アプリケーションケイパビリティに関するよくある問題には、以下があります。
- アプリケーションがローカルのTailscaleクライアントにケイパビリティを問い合わせていない。
- ケイパビリティ名やパラメーター構造が間違っている。
- アプリケーションが、Tailscaleクライアントから返されたケイパビリティを誤って解釈している。
アプリケーションケイパビリティの問題をトラブルシューティングするには、以下を行います。
- アプリケーションがLocalAPIを使って、Tailscaleクライアントに正しくケイパビリティを問い合わせていることを確認する。これは、アプリケーションが
tsnetライブラリを使用していない場合にのみ必要です。 - ケイパビリティ名が、アプリケーションが期待する名前と完全に一致しているかを確認する。
- グラント内のパラメーターが、アプリケーションが期待するスキーマと一致しているかを確認する。
- まずは簡略化したケイパビリティパラメーターでテストし、その後、複雑さを加えていく。
正しいアプリケーションケイパビリティのグラントの例:
"grants": [
{
"src": ["group:eng"],
"dst": ["tag:tailsql"],
"ip": ["tcp:443"],
"app": {
"tailscale.com/cap/tailsql": [
{
"dataSrc": ["prod", "staging"]
}
]
}
}
]
ビジュアルポリシーエディタを使ってtailnetポリシーファイルを管理することもできます。
ビジュアルエディタの使い方については、ビジュアルエディタリファレンスを参照してください。
この例では、tag:tailsqlタグの付いたデバイス上で動作するアプリケーションが、tailscale.com/cap/tailsqlケイパビリティを正しくチェックし、dataSrcパラメーターを適切に解釈していることを確認してください。
予防策
このセクションでは、tailnetポリシーにおけるグラントの設計、実装、保守に関するベストプラクティスをまとめます。
これらの推奨事項に従うことで、問題を最小限に抑え、問題が発生した際のトラブルシューティングを効率化できます。
効果的なグラントの設計原則
- 最小権限: 各送信元・宛先のペアに必要な、最小限の権限のみを付与します。適切な場合は、
ipフィールドでポートとプロトコルを具体的に指定してください。 - 論理的なグルーピング: 関連するグラントをまとめて整理し、コメントでその目的を説明します。これにより、ポリシーファイルの可読性と保守性が向上します。
- 命名の標準化: グラントで参照するグループ、タグ、IPセットには、一貫した命名規則を使用します。これにより、誤字のリスクが減り、トラブルシューティングが容易になります。
- 段階的な改善: 最初は広範なグラントから始め、アクセス制御要件への理解が深まるにつれて、時間をかけて絞り込んでいきます。このアプローチでは、予期しない拒否が発生しにくくなります。
- 文書化: ポリシーファイル内にコメントを記述し、各グラントが存在する理由と、許可することを意図している内容を説明することで、グラントを文書化します。
これらの原則に従うことで、問題が発生しにくく、問題が起きた際にもトラブルシューティングしやすい、より保守しやすいポリシーファイルになります。
テスト戦略
グラントへの変更をデプロイする前に、以下のテスト戦略の利用を検討してください。
- テストケースを文書化する: 検証すべきすべての権限をカバーする、テストの集合をtailnetポリシーファイル内に作成します。
- アクセス制御ルールのプレビューを使用する: 管理コンソールのポリシーファイルエディタには、編集内容が実際のポリシーにどのような変更をもたらすかを示すプレビュー機能があります。変更を適用する前に、これを注意深く確認してください。
- 段階的なロールアウト: 大きな変更の場合は、tailnet全体に変更を適用する前に、一部のデバイスやユーザーへの段階的なロールアウトを検討してください。
デプロイ前に変更を十分にテストし、デプロイ後も問題を監視することで、ユーザーに影響が及ぶ前に問題を特定・解決できます。