前回 に続き Twingate ネタです。
Twingate では CI/CD 向けの Headless Client が利用できます。
Linux Headless Mode | Docs | Twingate
CUI で使えるということで試してみます。
GUI同様特に詰まらず、簡単に導入できました。
事前準備
Headless mode requires a Service Key
まず、Service Key が必要になります。 払い出しの方法は公式ドキュメントに記載があります。
Web UI での操作は上記ドキュメント参照です。
今回は API を利用して作成します。
API実行には tg-cli (v0.0.53) を使用しました。
尚、Terraform の Twingate Provider は、現時点で service 関連はサポートしていないようです。
サービスの作成
例として、"test" サービスに2つのリソースを付与して作成します。
# Usage: tg service create <name> [resourceNamesOrIds...] $ tg service create "test" '1.example.com' '2.example.com' [SUCCESS] New service named 'test' created with id '***' with added resources '1.example.com: *****==' '2.example.com: *****=='
作成したサービスの確認
$ tg service list ┌──────────────────────────────────────────────────────────────────────┬────────────┬───────────┬───────────┬───────────────────────────────────────────────────────┬────────────────┐ │ id │ name │ createdAt │ updatedAt │ resources │ keysTotalCount │ ├──────────────────────────────────────────────────────────────────────┼────────────┼───────────┼───────────┼───────────────────────────────────────────────────────┼────────────────┤ │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx │ test │ 10/15/22 │ 10/15/22 │ 1.example.com, 2.example.co.... │ 0 │ └──────────────────────────────────────────────────────────────────────┴────────────┴───────────┴───────────┴───────────────────────────────────────────────────────┴────────────────┘
list コマンドで取得できる id
をキーの作成時に使用します。
WebUI 上でもTeam 配下に "test" Service が作成された事を確認できます。
URL に id が入っています。
キーの作成
"test" サービスにキーを追加します。
# Usage: tg service key_create <serviceAccountId> <keyName> <expirationTimeInDays> $ tg service key_create "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" "tmp_key" "1" [SUCCESS] Created key 'tmp_key: XXXXX==' at service 'test: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' with token object: {"version": "1", "network": "subdomain.twingate.com", "service_account_id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----", "key_id": "XXXXX", "expires_at": "YYYY-MM-DDTHH:MM:SS+00:00", "login_path": "/api/v2/headless_node/login"}
出力される JSON 文字列が Headless Client で使用する Service Key になります。 後から確認はできないので忘れずに保存しておきます。
WebUI 上でも Service Key が作成された事を確認できます。
Headless Client インストール
試した環境は Ubuntu 20.04.5 LTS (Focal Fossa) です。
$ curl https://binaries.twingate.com/client/linux/install.sh | sudo bash
作成した Service Key を /etc/twingate/ 配下に置き、 setup を実行します。
$ ls /etc/twingate/service_key.json /etc/twingate/service_key.json $ sudo twingate setup --headless /etc/twingate/service_key.json Twingate Setup 1.0.68.54158 | 0.136.0 Setup is complete.
正常にインストールできており、 Service Key が正しければ online
になります。
$ sudo twingate start Starting Twingate service in headless mode Twingate has been started Waiting for status... online
Service Key の内容が正しくない場合などは起動に失敗します。
$ sudo twingate start Starting Twingate service in headless mode Twingate has been started Waiting for status... not-running
動作確認
IPアドレス制限があり通常は 403 を返却する URL に対しアクセスしてみると、Headless Client が起動している際は拒否されず正常に接続できることが確認できました。
- offline の状態
$ sudo twingate status not-running $ curl -Ls -o /dev/null https://1.example.com -w '%{http_code}\n' 403
- online の状態
$ sudo twingate status online $ curl -Ls -o /dev/null https://1.example.com -w '%{http_code}\n' 200
Service Key を Revoke・Delete した場合、 Headless Client の起動が行えなくなります。
Headless Client が online の状態で、Revoke・Delete した場合、 Headless Client が終了するまでは接続可能でした。(どこかのタイミングで不可になるかもしれませんが、試した範囲では可能でした。)
ログ
- For live review of logs, the Linux Client runs as a systemd service with logs retrievable via journalctl. Below is an example command:
sudo journalctl -u twingate --since "1 hour ago"
- If journalctl is not installed, the logs will be stored under /var/log/twingated.log. This occasionally is seen when running the Linux Client on a container in headless mode.
上記記事の通りですが、試した環境では syslog に吐かれていました。
プロセスとしては twingated
, twingate-cli
があるようです。
2022/11/11 追記
Service Key は請求対象です。
アクティブユーザと同じ扱いになり、 Service Key を利用してリソース接続を行うと課金対象になります。
プランによっては 1ユーザで複数デバイス利用できますが、 Headless Client はデバイスとしての利用にはならず、別のユーザとしてカウントされます。
(ドキュメント上で記載が見つけられなかったのでサポートに確認しました。)