Tailscaleロゴ

デバイスポスチャをジャストインタイムアクセスに使用する

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

ジャストインタイムアクセスは、PremiumプランとEnterpriseプランで利用できます。

ジャストインタイムアクセスで説明したとおり、Tailscaleは、Tailscaleネットワーク(tailnetと呼びます)内のリソースに対してジャストインタイム(JIT)アクセスを提供する方法をいくつか用意しています。

このトピックでは、有効期限付きのカスタムデバイスポスチャ属性をJITに使う方法を説明し、ユーザーがSlackを使って一時的なアクセスを申請できるSlackワークフローの例を紹介します。

デバイス属性には、省略可能なexpiryプロパティがあり、属性が失効する将来の時刻を設定できます。
設定すると、デバイス属性は指定した時刻に自動的に失効します。
これを利用して、custom:prodAccessのような属性を一定時間だけデバイスに割り当てることで、リソースへのジャストインタイムアクセスを提供できます。

Tailscale Slack Accessbot

Tailscale Access(英語)は、Tailscaleが開発したオープンソースのSlackワークフローアプリ(英語)の例です。
ユーザーはSlackを使って、組織内の他の人に、Tailscaleのリソースへの即時かつ期限付きのアクセスを申請できます。

Slack内で、ユーザーは「Request Tailscale Access」ショートカットを使ってTailscale Accessを呼び出せます。
すると、次の項目の入力を求められます。

SlackでのTailscale Accessのアクセス申請フォーム
SlackでのTailscale Accessのアクセス申請フォーム

アクセスを申請したSlackユーザーと一致するメールアドレスを持つユーザーが所有するTailscaleデバイスがある場合は、それらのデバイスの一覧が表示されます。
ユーザーには、tailnet内のすべてのデバイスの一覧も表示されます。

申請が送信されると、選択された承認者に通知が届き、承認者は申請を承認するか拒否するかを選択できます。
承認されると、ワークフローは選択されたデバイスに必要な属性を追加し、選択された時間に合わせて有効期限を設定します。

Accessbotの設定、デプロイ、開発の詳細な手順については、GitHubのtailscale/accessbotリポジトリ(英語)を参照してください。

有効期限付きのポスチャ属性API

Tailscale Slack Accessbotが要件に合わない場合は、有効期限付きのカスタムデバイスポスチャ属性を使って、組織向けに同様のツールを構築できます。
このセクションは、デバイスポスチャのトピックにあるポスチャ属性API(英語)を拡張したもので、属性の有効期限に関する追加情報を含んでいます。

APIでポスチャ属性を取得する

GET /api/v2/device/{deviceID}/attributes

指定したデバイスのすべてのポスチャ属性を取得します。
デバイスのポスチャ属性のキーと値のペアをすべて含むJSONオブジェクトを返します。

パラメータ

deviceID(URLパスで必須)

ポスチャ属性を取得するデバイスのIDです。

リクエストの例

curl "https://api.tailscale.com/api/v2/device/11055/attributes" \
-u "tskey-api-xxxxx:"

レスポンス

成功した場合、レスポンスは200です。
レスポンスボディは、ノードに割り当てられたすべてのポスチャ属性を含むJSONオブジェクトです。
属性の値は、文字列、数値、ブール値のいずれかです。

{
  "attributes": {
    "custom:myScore": 87,
    "custom:diskEncryption": true,
    "custom:myAttribute": "my_value",
    "node:os": "linux",
    "node:osVersion": "5.19.0-42-generic",
    "node:tsReleaseTrack": "stable",
    "node:tsVersion": "1.40.0",
    "node:tsAutoUpdate": false
  },
  "expiries": {
    "custom:myScore": "2024-04-23T18:25:43.511Z",
  }
}

APIでカスタムポスチャ属性を設定する

POST /api/v2/device/{deviceID}/attributes/{attributeKey}

指定したデバイスに、カスタムポスチャ属性を作成または更新します。
ユーザーが管理する属性はcustom名前空間に置く必要があり、属性キーの先頭にcustom:を付けてそれを示します。

パラメータ

deviceID(URLパスで必須)

カスタムポスチャ属性を設定するデバイスのIDです。

attributeKey(URLパスで必須)

設定するポスチャ属性の名前です。
先頭にcustom:を付ける必要があります。

キーの最大長は名前空間を含めて128文字で、使用できるのは英字、数字、アンダースコア、コロンのみです。

キーは大文字と小文字を区別します。
キーは一意である必要がありますが、一意性は大文字と小文字を区別せずに確認されます。
例えば、1つのtailnet内でcustom:MyAttributeとcustom:myattributeの両方を設定することはできません。

あるキーのすべての値は同じ型である必要があり、その型はそのキーに最初の値が書き込まれたときに決まります。
例えば、同じtailnet内で、custom:myattributeが、あるノードでは数値(87)、別のノードでは文字列("78")という値を持つことはできません。

ポスチャ属性のvalue(POSTボディで必須)
{
  "value": "foo"
}

値は、文字列、数値、ブール値のいずれかです。

文字列の値の最大長は255文字で、使用できるのは英字、数字、アンダースコア、ピリオドのみです。

数値の値は整数で、JSONで安全に扱える数値(最大253 - 1)である必要があります。

ポスチャ属性のexpiry(POSTボディで省略可能)
{
  "value": "foo",
  "expiry": "2024-04-23T18:25:43.511Z"
}

有効期限には、将来の任意の時刻を、RFC 3339形式の文字列で指定できます。
設定すると、デバイス属性は指定した時刻に自動的に削除されます。

ポスチャ属性のcomment(POSTボディで省略可能)
{
  "value": "foo",
  "expiry": "2024-04-23T18:25:43.511Z",
  "comment": "access needed to inspect logs on prod vm"
}

属性を追加した理由を示すために、コメントを付けられます。

リクエストの例

curl "https://api.tailscale.com/api/v2/device/11055/attributes/custom:my_attribute" \
-u "tskey-api-xxxxx:" \
--data-binary '{"value": "my_value", "expiry": "2024-04-23T18:25:43.511Z"}'

レスポンス

成功した場合、レスポンスは2xxです。
レスポンスボディは、現時点では空のJSONオブジェクトです。

原文:Use device posture for just-in-time access(Tailscale公式ドキュメント)