Kasm Workspaces を Linode で動かし、ブラウザー上でリモートデスクトップ環境を手に入れる

Kasm Workspaces を Linode で動かす例を紹介します。インストールしてからアプリケーションの起動を体感するまで一時間もかからないと思います。Linode はアウトバウンドのトラフィックコストがインスタンスに一定量含まれており、リモートデスクトップサービスのようにクラウドからクライアントに大量のネットワークを消費する場合、コストメリットがあります。

# Kasm Workspaces とは

Kasm Workspaces はコンテナ化されたストリーミングプラットフォームであり、ブラウザーベースの Desktop as a Service です。利用できるアプリケーションはコンテナで提供され拡張性が高いです。また、セキュアな配信、ゼロトラスト、かつ独立したワークスペースを提供できます。


![kasm-desktop-image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/c41d1731-2325-63ee-a0c2-bce3af6d0c7b.jpeg)

Kasm Technologies 社の Web ページにある動画を見てイメージを掴んでください。

https://www.kasmweb.com/

## KasmVNC
Kasm Workspaces を提供する Kasm Technologies 社はコアとなる VNC 技術を KasmVNC としてオープンソースで提供しています。

https://www.kasmweb.com/kasmvnc

VNCの名前がついていますが、ストリーミングについては最新の技術を使い、かつセキュアに配信できることを目的としています。最新のブラウザーに対応し、ネイティブなクライアントアプリケーションは不要です。よって、マルチデバイス化も容易となります。


## 構成
シングルサーバーのアーキテクチャは下図になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/fff75862-0799-d0f9-114d-bc51333be850.png)
シングルサーバー構成でインストールされるテクノロジースタックです。
![single-server-install.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/78b563a6-2e19-8668-fc1d-3992d3ceaaef.jpeg)


この後詳細にインストールを説明するのはシングルサーバー構成ですが、スケーラブルな構成を取ることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/92fb9f93-15cf-2da6-5632-bb344344934c.png)

また、DoD と NIST のガイダンスにも遵守するようドキュメント類も豊富に用意されています。

https://www.kasmweb.com/docs/latest/security.html


# インストールで参考にした情報

Linode の YouTube チャネルの手順通り実施すれば簡単に設定できます。この後で、実際に利用したコマンドなどを説明します。

https://www.youtube.com/watch?v=N2Afy_ARkMo

作業時間のほとんどはコンテナイメージをダウンロードする待ち時間です。Ubuntu 22.04 LTS を選択すれば全く問題なく進みます。まだ正式にサポートされていない Ubuntu 22.10 でも、数カ所手作業でトラブルシューティングしたら動きました。

日本語の紹介ページもあります。

https://www.linode.com/ja/content/kasm-workspaces-streams-apps-in-the-browser-as-easy-as-opening-apps-on-your-desktop/

::: note warn
フリーで使える Community Edition では同時接続数 5 までしか許されていません。
:::

# 適切な Linode インスタンスの選択
Kasm Workspaces の Document ページでは、最小要件は 2 Core, 4GB Memory, 50GB (SSD) となっています。

https://www.kasmweb.com/docs/latest/install/system_requirements.html#resource-requirements



今回、OS は Ubuntu 22.04 LTS を選びます。
![Ubuntu-22.04LTS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/713efb54-3da9-1193-b693-3bfc25c62042.jpeg)

:::note info 
Ubuntu 22.04 LTS は  US Federal Government and Department of Defense でもガイドラインが出て採用されているバージョンとなっています。
:::

Kasm が提供するドキュメントも参照ください。

https://www.kasmweb.com/docs/latest/security/operating_system.html

動作確認するのに 4GB メモリでも十分ですが、今回は 16GB メモリのプランを選びます。

![linode-config-type.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/5769a4d9-da4e-cd1e-f458-5bc3c8ed2c9f.jpeg)


# Kasm Workspaces のインストール
Linode が立ち上がったら、ssh でログインします。今回はスキップしますが、本番環境では以下のページのようにセキュアな設定をしてください。

https://qiita.com/tarooishi/items/5f8ec51323eeed919818

最初に環境のアップデートをします。
```
apt update && apt upgrade
```
その後、リブートしましょう。
```
reboot now
```
再起動したら、再度 ssh でログインします。その後、必要なソフトウエアをダウンロードします。まず kasm Workspaces のサイトのトップページにアクセスします。

https://www.kasmweb.com/

Resources から Downloads のページに行きます。
![kasm-resource-download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/047422b2-cde2-7682-2fee-186d1e5d3bcf.jpeg)

Kasm Workspaces のページの Downloads のリンクをコピーします。
![Screen Shot 2023-01-24 at 7.09.21 PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/a916d66e-d400-6f9a-25ff-8e41b3579b18.jpeg)

次に、Linode のターミナルに戻り、作業ディレクトリとして /tmp を選択します。
```
cd /tmp
```
先程、Kasm Workspaces の Downloads ページでコピーした URL を wget します。
```
wget https://kasm-static-content.s3.amazonaws.com/kasm_release_1.12.0.d4fd8a.tar.gz
```
ファイルがダウンロードされていることを確認します。
```
localhost:/tmp# ls -l
total 16996
-rw-r--r-- 1 root root 17376477 Nov 23 21:48 kasm_release_1.12.0.d4fd8a.tar.gz
```
tar ファイルを解凍します。
```
localhost:/tmp# tar -xf kasm_release_1.12.0.d4fd8a.tar.gz
localhost:/tmp# ls -l
total 17000
drwxr-xr-x 8 root root     4096 Jan 24 10:10 kasm_release
-rw-r--r-- 1 root root 17376477 Nov 23 21:48 kasm_release_1.12.0.d4fd8a.tar.gz
```
Kasm はインストールが簡単で、スクリプトファイルを動かすだけで多くの作業を実施してくれます。
```
localhost:/tmp# bash kasm_release/install.sh
```

スクリプトの終了まで数十分かかります。インストールが完成すると、Kasm Workspaces に必要なクレデンシャル情報が表示されます。この情報は漏れないように保管してください。ログイン時に必要となります。
![kasm-installl-credential.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/7838bba3-6814-6102-9dad-c5d27a839297.jpeg)

次に Kasm Workspaces にアクセスするために Linode インスタンスの IP もしくはドメイン名を確認します。Cloud Manager にログインし、Linode インスタンスの Network タブから  IP アドレスもしくは Reverse DNS にドメイン名を確認します。
![linode-ip-address.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/654e9f0a-ef6c-ab62-0bac-76d6a0e3108f.jpeg)
ドメイン名の表示です。
![linode-domainame.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/95f3cc41-1425-362f-f509-997c521e1cc2.jpeg)

以下はドメイン名を使って、ブラウザーからアクセスしたときの TLS 証明書の警告です。まだ、TLS 証明書の設定をしていないため、ホスト名マッチが合っていないので HTTPS でアクセスしたときに警告がでています。Let's Encrypt を使えば簡単に設定できますが、今回はスキップします。警告に対して自己責任でアクセスするようにブラウザーに指示します。
![kasm-ssl-cert-warning-go.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/5e83fc56-1cf3-5b4b-24d5-2280c846d085.jpeg)

::: note warn
Kasm Workspaces の環境作成が終了したら、是非証明書の設定をしてください。下記ページが参考になります。
:::

https://qiita.com/bh17/items/fb1c515ae67261824209

ブラウザで次のようなトップ画面が表示されます。
![kasm-first-view.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/27d69608-777f-198d-16fa-2888d0131c7e.jpeg)

ログイン表示画面に先程メモした admin@kasm.local ユーザーとパスワードを入力してログインします。
![kasm-admin-login.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/72f5eea6-0e96-2e40-9f7a-e0511b6a177c.jpeg)

次のように Admin 画面が表示されます。以下は、少し触った後の画面です。
![kasm-admin-view.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/9e5fdab2-34d8-54b9-936a-1e725dfdffd5.jpeg)

WORKSPACES をクリックした画面です。様々なアプリケーションが表示され、クリックするとそのアプリケーションのデスクトップが表示されます。
![kasm-admin-workspace.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/f65a6227-539f-b5ba-0c43-fa0369848ba8.jpeg)
以下は、terminal を選択した画面です。
![kasm-terminal.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/e3d8fe62-e4b4-187d-995e-65c8bc71470d.jpeg)

以下は、 Chrome を選択し、その中で www.linode.com を閲覧している例です。
![kasm-chrome-linode.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/926fe9bb-008f-1a50-4e17-d42c4694ee68.jpeg)

# Docker イメージ
Kasm Workspaces はデスクトップ環境で利用できるアプリケーションを Docker イメージで提供しています。

https://www.kasmweb.com/docs/latest/guide/custom_images.html

今回のインストールでは以下のイメージが見えます。
```
localhost:~# docker images
REPOSITORY                     TAG         IMAGE ID       CREATED         SIZE
postgres                       12-alpine   2b840024c973   2 weeks ago     237MB
kasmweb/vivaldi                1.12.0      3f0bed091267   7 weeks ago     2.62GB
kasmweb/ubuntu-focal-desktop   1.12.0      1d80eec2ae28   7 weeks ago     7.08GB
kasmweb/centos-7-desktop       1.12.0      fa2529cbcf44   7 weeks ago     3.64GB
kasmweb/chromium               1.12.0      1fceb96df8f1   7 weeks ago     2.53GB
kasmweb/tor-browser            1.12.0      2e4baba94ab3   7 weeks ago     2.51GB
kasmweb/firefox                1.12.0      f7a4cbb4a83c   7 weeks ago     2.48GB
kasmweb/chrome                 1.12.0      760f7664bd94   7 weeks ago     2.57GB
kasmweb/vs-code                1.12.0      f061ccbeb9e8   7 weeks ago     2.64GB
kasmweb/terminal               1.12.0      bbea423e8362   7 weeks ago     2.72GB
kasmweb/edge                   1.12.0      e5e1590b020e   7 weeks ago     2.75GB
kasmweb/brave                  1.12.0      a7c7f6dffc02   7 weeks ago     2.59GB
kasmweb/thunderbird            1.12.0      b34f80191856   7 weeks ago     2.47GB
kasmweb/zoom                   1.12.0      74f4bf5a54c0   7 weeks ago     2.75GB
kasmweb/libre-office           1.12.0      ee0411f694eb   7 weeks ago     3.28GB
kasmweb/vlc                    1.12.0      ab7aa323b23a   7 weeks ago     2.32GB
kasmweb/telegram               1.12.0      ecbf616718c9   7 weeks ago     2.38GB
kasmweb/sublime-text           1.12.0      9c1197305cda   7 weeks ago     2.28GB
kasmweb/teams                  1.12.0      21a5c3673fc1   7 weeks ago     2.53GB
kasmweb/signal                 1.12.0      f2b4b6ac924b   7 weeks ago     2.67GB
kasmweb/remmina                1.12.0      c14c9140ef4b   7 weeks ago     2.24GB
kasmweb/only-office            1.12.0      bf5c5d4a704e   7 weeks ago     3.1GB
kasmweb/insomnia               1.12.0      566a415371b6   7 weeks ago     2.63GB
kasmweb/gimp                   1.12.0      a2cb5e9170c4   7 weeks ago     2.33GB
kasmweb/filezilla              1.12.0      a4b2dd06cbea   7 weeks ago     2.26GB
kasmweb/discord                1.12.0      25f208eedd51   7 weeks ago     2.42GB
kasmweb/kasm-guac              1.12.0      31d58d34e81d   2 months ago    483MB
kasmweb/share                  1.12.0      12e334524f0e   2 months ago    171MB
kasmweb/agent                  1.12.0      bdb9655e9f42   2 months ago    161MB
kasmweb/api                    1.12.0      06cd165a8b8f   2 months ago    348MB
kasmweb/manager                1.12.0      3583b08011b2   2 months ago    294MB
redis                          5-alpine    7558bc54e8a2   2 months ago    22.9MB
kasmweb/nginx                  latest      95cbbc869690   15 months ago   25.3MB
hello-world                    latest      feb5d9fea6a5   16 months ago   13.3kB
```
コンテナの情報は admin@kasm.local でログインしたときに Admin 画面の Workspace から見えます。
![kasm-admin-workspace-highlight.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/a002d14b-a8d7-62e8-8892-189adbf21137.jpeg)

# Kasm Workspaces の利用者が使える機能
様々な機能がありますが、パーシステント設定、音声、ファイルのアップロードとダウンロード、クリップボード、IME について簡単に紹介します。
## パーシステント設定
Kasm Workspaces で起動されたアプリケーションは起動する度にリフレッシュされた新しい環境になります。もし、常時利用する開発環境として、アプリケーション内部で設定した状態を保持させる場合は、パーシステント (Persistent Profile) 機能を使います。

先程紹介した Admin 画面の Workspace から、Terminal コンテナの設定をユーザー単位でパーシステントにする場合は、Persistent Profile Path を設定することでユーザーの環境が維持できます。
![persistent-profile-path.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/99e7a7ab-9ed8-a6cf-b83a-9a2fecc2e3be.jpeg)
設定の詳細についてはドキュメントを参照ください。

https://www.kasmweb.com/docs/latest/guide/persistent_data/persistent_profiles.html#persistent-profiles

上記例のように設定することで、ユーザーがログインした状態が Ubuntu のサーバー環境に保存されています。
```
localhost# pwd
/mnt/local/persistent_profile/kasm_Terminal/
localhost# ls
admin@kasm.local user@kasm.local
localhost# ls admin@kasm.local
aaa.txt  bbb.txt  Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Uploads  Videos
```
``admin@kasm.local`` で Kasm Workspaces にログインし、Terminal を動かしたときのホームディレクトリの構造が見えます。

また、パーシステントな状況ではなく、フレッシュな状態で使うことを、ユーザーに選択させることもできるので、とても使い勝手が良いです。以下は、Terminal アプリケーションを選択したときに表示される画面です。Persistent Profile 機能を使うか否かを選択できます。
![kasm-application-selection-nonpersistent.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/586013af-2f87-8542-c48c-af19b717c1af.jpeg)

## 音声
Kasm Workspaces では管理者がユーザーの権限を管理できます。例えば、音声をイネーブルにしていれば、ユーザーのセッションで音声の On/Off をブラウザーの画面に表示される操作機能（コントロールパネル）で操作できます。
![kasm-sound.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/16c698ca-8eee-3350-76df-4789daee72d2.jpeg)

YouTube を見ながら音声も聞けます。

## ファイルのアップロードとダウンロード
ファイルのアップロードとダウンロードもローカルコンピューターの間で簡単に操作できます。

![kasm-upload.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/89da93cf-8d9a-4c94-988c-cda810a4dd5a.jpeg)

## クリップボードへのコピー
ローカルホストと Kasm Workspace 内でのコピー＆ペーストもできるので、使い勝手が良いですね。
![kasm-clipbboard-cppy.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/b4a6f33e-1e0c-f835-e86d-1b6cf33886bf.jpeg)

## IME
Kasm Workspace で起動したアプリケーション上で IME (Input Method Editor) も使えるので日本語入力もできます。
![kasm-workspace-ime2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/31eefb24-4bb3-cb7a-839e-69a69f740697.jpeg)

Ubuntu Focal Desktop コンテナの中の Chrome で日本語入力で検索した例です。
![kasm-workspace-browser-ime.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/e72b3e28-a168-12dd-a27d-7205137854cf.jpeg)



# ユーザー管理とグループ管理
Kasm Workspaces は LDAP、SAML、OpenID にも対応しています。今回は、これらを使わない簡単なユーザー管理の例です。

ユーザー作成したあと、グループで権限管理ができます。グループを作成した後、Edit ではなく View から編集します。
![kasm-group-view.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/9a341231-b2eb-c832-27a1-ccc696323180.jpeg)

グループへのユーザーの割当ができます。
![kasm-group-user.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/45b82d50-f64f-1a2f-894e-c11323bca663.jpeg)

グループの権限を割り当てられます。
![kasm-group-setting.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/ab83a47c-8f8b-800a-4dcb-979d0a771d32.jpeg)

音声の設定をオフにした例です。
![kasm-group-setting-audio.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/044900bd-41ba-793f-76fe-fe03ba5d2f48.jpeg)


グループに利用するワークスペース（コンテナ）を割り当てられます。
![kasm-group-workspace.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/4ed6ab15-1e21-6404-3150-fbc83ddf754d.jpeg)

グループ ``browsers`` に、ユーザー ``nosound``、ワークスペース ``Chrome`` を割り当てたときのログイン画面です。
![kasm-group-onlychrome.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/fe63f0dd-23f6-0a8e-8271-d99289320e72.jpeg)

Chrome ブラウザーを立ち上げたときのコントロールパネルです。Admin で設定したように、クライアントは音声の設定ができないようになっています。
![kasm-nosound-workspace.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/6eeff39c-952e-053f-236f-e604be337462.jpeg)


# まとめ
Kasm Workspaces は Desktop as a Service に特化したソフトウエアです。Kasm Technologies 社からは、大規模ユーザーのケースや、セキュリティに敏感な組織への導入や、開発者向けのデスクトップサービスなど、たくさん情報をいただきました。Kasm Workspaces は内部で Docker を使いながら、エンドユーザーにはブラウザー経由で様々なアプリケーションにアクセスできる環境を提供しています。今回紹介した以外にも UI やコンテナのカスタマイズなど機能は豊富にあります。ドキュメント類も充実していますし、インストールも簡単ですので、一度お試しください。