Article:

Teleportとは

teleportは一言で説明するのが難しいのですが、次世代の踏み台サーバーのようなアプリケーションです。 IDとパスワードだけの認証だけではなく、二要素認証に加えてGithubでのサインインなど様々な認証方法を取って、 ユーザーにsshを始めその他のwebアプリケーション、Kubernetes、Database、Remotedesktopへのアクセスを許可することができます。

特に、自宅サーバーの文脈では、IDとpassだけでログインできるのは怖いので公開鍵認証を用いてsshを開けている人が多いと思いますが、 出先のPCからちょっとアクセスしたいとか、新しい端末を追加するたびに鍵を登録するとか、結構面倒ですよね。

Teleportを使うとID/Passよりも強固な認証が使える上、webUIでsshのコンソールが開けたり、かなりいい感じです(雑)。

そんなTeleportですが、TeleportはClusterと呼ぶいわゆる認可サーバーと、アクセスされる側のサーバーの集団とか、 さらにはCluster同士での認可情報の受け渡しなどできることが盛りだくさんで、とにかく一旦イジってみないと雰囲気がつかみにくい感じなんですよね。

というわけで簡単にお試しできるようなdocker-composeファイルを作成したので、使い方などを加えてご紹介します。

Docker-compoesでセットアップ

こちらのGithubレポジトリになります。 https://github.com/totegamma/docker-teleport-test

これを使うと、認可などを行う代表的なノード(proxy)が1つと、ssh接続されるだけのぶら下がりノードが2つ生成されます。 それぞれのサーバーにguestという名前のユーザーもついでに作っています。

結構シンプルなので簡単に説明しちゃうと、各々のcontext (proxy/, node/)の中に入っているteleport.yamlが設定ファイルです。

ほぼほぼデフォルトで書き出される物で、ホスト名をちょこっと変えたり、子ノード側で不要なサービス(authとか)を切ったりだけしてあります。

dockerfileでは公式のteleportのインストール手順を自動化しているだけですね。pproxy側はCMDを指定して、コンテナが立ち上がったら自動的にteleportを起動するようにしています。

ユーザーの追加

proxyノードにアタッチします。 ユーザーの追加は次のコマンドで行います。

1
tctl users add admin --roles access,auditor,editor --logins root,guest

この例ではadminユーザーを、access, auditor, editorの3つの役職で、なおかつrootユーザーかguestユーザーとしてログイン可能という設定で作っています。

実行例:

1
2
3
4
5
6
root@<proxy node>:/# tctl users add admin --roles access,auditor,editor --logins root,guest
User "admin" has been created but requires a password. Share this URL with the user to complete user setup, link is valid for 1h:
https://localhost:3080/web/invite/f930bf6a714bfae9601a0e2d9d9106e7

NOTE: Make sure localhost:3080 points at a Teleport proxy which users can access.
root@<proxy node>:/#

すると、アカウント作成用のURLが吐き出されます。proxy-nodeはノード名をlocalhostに設定しておいたので、https://localhost:3080のリンクが吐き出されています。 個のリンクをクリックしてページを開いてみます。(SSLの設定をしていないので自己署名証明書が変わりに使われます。テストのため、ブラウザの警告を無視してアクセスします。)

するとサインアップ画面が表示されました!2FAも登録してサインアップを完了させます。

teleport signup

トップページはこんな感じです。Serversにlocalhost(proxy-node)が表示されていますね!

teleport signup

右のCONNECTからユーザー名を選択してみましょう。webUIでSSHコンソールを開くことができます。

teleport signup

また、Activity>SessionRecordingsを開くと、セッションで行った動作がビデオで再生されます。(typoしている様子もバッチリ映ります…)

teleport signup

ほかにもいろんなことがWEBUIからできます!せっかくのテスト環境なので色々メチャメチャに弄っちゃいましょう。

組み込みロールについて

teleportはロールベースでアクセス権限の管理ができます。 ロールは自分でカスタマイズして作成することができますが、それはそれとして組み込みのロールが存在します(さっきadminアカウントを作るのに指定したaccess, auditor, editorがそうですね!)。 3つのロールはそれぞれ次のような説明になっています。

  • access: Access cluster resources
  • auditor: Review cluster events and replay sessions
  • editor: Edit cluster configuration

なんかあまりこの組み込みロールに関するドキュメントを見つけられなかったのですが、現在存在するロールについてはtctl get rolesで詳細を見れるのでそれがドキュメントですね(是非試してみてください)

端末からログインしてみよう

ローカルのPCから接続するためにはtshコマンドを使います。適宜インストールしてください。

んで、まずプロキシーに対してloginをします。また、証明書が信頼されてないので–insecureオプションをつけます。

実行してみるとこんな感じです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[totegamma@00:52].../teleport/proxy$ tsh login --proxy=localhost --insecure --user admin
Enter password for Teleport user admin:
Enter your OTP token:
446100
WARNING: You are using insecure connection to SSH proxy https://localhost:3080
> Profile URL:        https://localhost:3080
  Logged in as:       admin
  Cluster:            localhost
  Roles:              access, auditor, editor
  Logins:             root
  Kubernetes:         enabled
  Valid until:        2022-07-04 12:52:41 +0900 JST [valid for 12h0m0s]
  Extensions:         permit-agent-forwarding, permit-port-forwarding, permit-pty

[totegamma@00:52].../teleport/proxy$ tsh clusters
Cluster Name Status Cluster Type Selected
------------ ------ ------------ --------
localhost    online root         *

[totegamma@00:52].../teleport/proxy$ tsh ls
Node Name Address        Labels
--------- -------------- --------------------------------------
localhost 127.0.0.1:3022 hostname=43bf3e5220aa,level=restricted

[totegamma@00:52].../teleport/proxy$

ついでに、tsh clustersでログインしたクラスターの情報が、 tsh lsでアクセス可能なリソースの一覧が見れます。

ちゃんとlocalhostのサーバーが表示されていますね。

ではsshアクセスしてみましょう。 tsh sshコマンドでできます。

1
2
3
4
5
6
7
[totegamma@00:58].../teleport/proxy$ tsh ssh root@localhost
root@43bf3e5220aa:~# whoami
root
root@43bf3e5220aa:~#
logout
the connection was closed on the remote side on  04 Jul 22 01:02 JST
[totegamma@01:02].../teleport/proxy$

ログインできました!ヤッタネ。

他のノードを接続してみる

配布しているdocker-composeファイルではメインのproxyノードの他に2つのプロセスを立てています。 それらもつなげちゃいましょう!とっても簡単です。

proxy-nodeでtctl tokens add --type=nodeをします。 そしたらjoin用のコマンドが吐き出されるので、joinさせたい別のdockerプロセスにアタッチして

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
root@<proxy-node>:/# tctl tokens add --type=node
The invite token: a368e560c87ee23e2ea451070e8fb1c3.
This token will expire in 60 minutes.

Run this on the new node to join the cluster:

> teleport start \
   --roles=node \
   --token=a368e560c87ee23e2ea451070e8fb1c3 \
   --ca-pin=sha256:d05fc24abc303b54cd7aea52988a4a5ad4796705db722a044820e41c48fa00d4 \
   --auth-server=192.168.58.10:3025

Please note:

  - This invitation token will expire in 60 minutes
  - 192.168.58.10:3025 must be reachable from the new node
root@<proxy-node>:/#

表示が増えました!

teleport signup

次…?

次はまずノードのSSL化をしたいですし、他にもgithubとの接続や、より詳細なアクセス管理などをしたいですね。 またわかったことがあったら記事にする予定です。