{"id":3216,"date":"2023-01-10T09:17:40","date_gmt":"2023-01-10T14:17:40","guid":{"rendered":"https:\/\/dft.wiki\/?p=3216"},"modified":"2026-06-08T17:13:59","modified_gmt":"2026-06-08T21:13:59","slug":"personal-desktop-as-a-service-with-kasm-workspaces","status":"publish","type":"post","link":"https:\/\/dft.wiki\/?p=3216","title":{"rendered":"Desktop as a Service (DaaS) with Kasm Workspaces"},"content":{"rendered":"<p><strong>Kasm Workspaces<\/strong> (KW) is a web-native open-source &#8220;Container Streaming Platform&#8221; [<a href=\"https:\/\/www.kasmweb.com\/community-edition\">Link<\/a>]. What does that really mean?<\/p>\n<p>KW uses Docker to run ephemeral sessions of applications and desktops, streaming them encrypted (no VPN required) to any web browser.<\/p>\n<p>Behind the scenes, KW provides enterprise-class orchestration, data loss prevention, and web streaming technology out of the box. See more features and technical details in the official documentation [<a href=\"https:\/\/kasmweb.com\/docs\/latest\/index.html\">Link<\/a>].<\/p>\n<p>System requirements:<\/p>\n<ul>\n<li><strong>4 vCPU<\/strong> (the minimum is 2, but not practical)<\/li>\n<li><strong>8GB<\/strong> of RAM (the minimum is 4, but it is not enough for desktops)<\/li>\n<li><strong>100GB<\/strong> of Storage (the documentation says 50GB, but the installation refuses to proceed)<\/li>\n<li>Operating system (amd64\/arm64):\n<ul>\n<li>Debian 9+ \/ Ubuntu 18.04+ \/ RaspberryPi OS 10+ (Debian-based)<\/li>\n<li>CentOS 7+ \/ Oracle Linux 7+ (RHEL-based)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>Note:<\/strong> Do not use the bare minimum for real usage, as it will cause problems and the experience will not be satisfactory.<\/p>\n<hr \/>\n<p><strong>INSTALLING KASM SINGLE-SERVER<\/strong><\/p>\n<p>After installing Debian or Ubuntu, prepare the system:<\/p>\n<pre>sudo apt update &amp;&amp; sudo apt upgrade -y\r\nsudo reboot<\/pre>\n<p>If prompted for a new kernel installation, allow it to proceed.<\/p>\n<p>Downloading and installing (<span style=\"text-decoration: underline;\">replace the version with the latest available<\/span>):<\/p>\n<pre>wget https:\/\/kasm-static-content.s3.amazonaws.com\/kasm_release_<strong>1.17.0.7f020d<\/strong>.tar.gz\r\ntar -xf kasm_release_*.tar.gz &amp;&amp; cd kasm_release\/\r\nsudo .\/install.sh<\/pre>\n<p>It is highly recommended to have a SWAP partition or file. Just accept, and the installation will proceed with creating one.<\/p>\n<p>The installation may end with the following output. Take note of all newly generated credentials, as they will not be shown again:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3224\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-24-59.png\" alt=\"\" width=\"330\" height=\"689\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-24-59.png 330w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-24-59-144x300.png 144w\" sizes=\"auto, (max-width: 330px) 100vw, 330px\" \/><\/p>\n<hr \/>\n<p><strong>INSTALLING KASM MULTI-SERVER<\/strong><\/p>\n<p>(pending)<\/p>\n<hr \/>\n<p><strong>ACCESSING THE KW DASHBOARD<\/strong><\/p>\n<p>Navigate to your server&#8217;s address: <strong>https:\/\/10.10.10.10\/<\/strong><\/p>\n<p>A self-signed certificate is already installed, but for Internet access it is recommended (though not required) to place a public certificate on a reverse proxy server to act as a shield.<\/p>\n<ul>\n<li>Admin Dashboard<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3225\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-32-41.png\" alt=\"\" width=\"951\" height=\"807\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-32-41.png 951w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-32-41-300x255.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-32-41-768x652.png 768w\" sizes=\"auto, (max-width: 951px) 100vw, 951px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3226\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-33-50.png\" alt=\"\" width=\"632\" height=\"1033\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-33-50.png 632w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-33-50-184x300.png 184w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-33-50-626x1024.png 626w\" sizes=\"auto, (max-width: 632px) 100vw, 632px\" \/><\/p>\n<ul>\n<li>User Dashboard<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3227\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-34-38.png\" alt=\"\" width=\"947\" height=\"1125\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-34-38.png 947w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-34-38-253x300.png 253w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-34-38-862x1024.png 862w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-34-38-768x912.png 768w\" sizes=\"auto, (max-width: 947px) 100vw, 947px\" \/><\/p>\n<p>Clicking to launch any session will prompt:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3228\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-36-07.png\" alt=\"\" width=\"361\" height=\"334\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-36-07.png 361w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-36-07-300x278.png 300w\" sizes=\"auto, (max-width: 361px) 100vw, 361px\" \/><\/p>\n<p>In a new tab, I opened the first session and ran a basic fingerprinting test on a free test site:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3229\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-41-14.png\" alt=\"\" width=\"1020\" height=\"893\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-41-14.png 1020w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-41-14-300x263.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-41-14-768x672.png 768w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/p>\n<p>As you can see, it reveals very little about the operating system and browser.<\/p>\n<p><strong>IMPORTANT:<\/strong> Do not consider this tool a complete anonymity platform unless you are using the Tor Browser.<\/p>\n<p>Back on the main tab, the running session appears as a thumbnail and can be resumed, minimized, or terminated at any time.<\/p>\n<p>The same test was performed under another session, this time using the Tor Browser:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3230\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-47-58.png\" alt=\"\" width=\"1020\" height=\"893\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-47-58.png 1020w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-47-58-300x263.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-47-58-768x672.png 768w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/p>\n<p>Unsurprisingly, it does a much better job of hiding identifiable information:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3231\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-49-41.png\" alt=\"\" width=\"1020\" height=\"893\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-49-41.png 1020w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-49-41-300x263.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-49-41-768x672.png 768w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/p>\n<p>All sessions include a left-side menu to assist with interaction over the customized web VNC session:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3233\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-52-26.png\" alt=\"\" width=\"236\" height=\"406\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-52-26.png 236w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-52-26-174x300.png 174w\" sizes=\"auto, (max-width: 236px) 100vw, 236px\" \/><\/p>\n<p>Back on the main tab (dashboard), active sessions are shown with a countdown timer, and will self-terminate after 60 minutes of inactivity:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3234\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2023-01-10-08-54-04.png\" alt=\"\" width=\"176\" height=\"93\" \/><\/p>\n<p><strong>Note:<\/strong> All sessions are ephemeral and no data persists after termination. This is by design. If you need to retain applications, extensions, or data, this may not be the right tool. That said, custom images can be created for specific application needs, and connecting to a network share or cloud drive can cover most data retention requirements.<\/p>\n<hr \/>\n<p><strong>UPDATED UI<\/strong><\/p>\n<p>The new UI is much cleaner but offers the same features. Here is how it looks on a fresh installation in 2024.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4436\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-42-05.png\" alt=\"\" width=\"1914\" height=\"949\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-42-05.png 1914w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-42-05-300x149.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-42-05-1024x508.png 1024w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-42-05-768x381.png 768w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-42-05-1536x762.png 1536w\" sizes=\"auto, (max-width: 1914px) 100vw, 1914px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4437\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-41-53.png\" alt=\"\" width=\"1914\" height=\"949\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-41-53.png 1914w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-41-53-300x149.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-41-53-1024x508.png 1024w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-41-53-768x381.png 768w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2023\/01\/Screenshot-from-2024-09-19-09-41-53-1536x762.png 1536w\" sizes=\"auto, (max-width: 1914px) 100vw, 1914px\" \/><\/p>\n<hr \/>\n<p><strong>MOREOVER<\/strong><\/p>\n<p>Kasm Workspaces goes well beyond the demonstrated features, including:<\/p>\n<ul>\n<li>Multi-server load distribution in single or multi-zone setups,<\/li>\n<li>User and group management with support for LDAP, SAML, OpenID, and 2FA,<\/li>\n<li>Reporting, logging, web filtering, and more,<\/li>\n<li>GPU pass-through acceleration,<\/li>\n<li>Session staging, casting, and sharing,<\/li>\n<li>Optional native persistent data and profiles, Tailscale compatibility, and much more.<\/li>\n<\/ul>\n<p>Mapping a path from the server&#8217;s file system into the container. <strong>Admin &gt; Workspaces &gt; Edit &gt; Volume Mappings (JSON)<\/strong>:<\/p>\n<pre>{\r\n  \"\/server\/path\": {\r\n    \"bind\": \"\/container\/path\",\r\n    \"mode\": \"rw\",\r\n    \"uid\": 1000,\r\n    \"gid\": 1000,\r\n    \"required\": true,\r\n    \"skip_check\": false\r\n  }\r\n}<\/pre>\n<p>Overriding container configuration. <strong>Admin &gt; Workspaces &gt; Edit &gt; Docker Run Config Override (JSON)<\/strong>:<\/p>\n<pre>{\r\n  \"hostname\": \"kasm\",\r\n  \"user\": \"root\"\r\n}<\/pre>\n<p>Execute a command on launch to allow <code>kasm_user<\/code> to use sudo without a password:<\/p>\n<pre><span class=\"p\">{<\/span>\r\n<span class=\"nt\">  \"first_launch\"<\/span><span class=\"p\">:{<\/span>\r\n    <span class=\"nt\">\"user\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"root\"<\/span><span class=\"p\">,<\/span>\r\n<span class=\"nt\">    \"cmd\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"bash -c 'echo \\\"kasm-user  ALL=(ALL) NOPASSWD: ALL\\\" &gt;&gt; \/etc\/sudoers' ; apt update\"<\/span>\r\n<span class=\"p\">  }<\/span>\r\n<span class=\"p\">}<\/span><\/pre>\n<hr \/>\n<p><strong>BONUS<\/strong><\/p>\n<p>Kasm Workspaces can be installed in an LXC (Linux Container) in Proxmox. This nested setup lets you make the most of your home lab resources.<\/p>\n<p><strong>Notes \/ Tips<\/strong><\/p>\n<ul>\n<li>When creating the CT, <span style=\"text-decoration: underline;\">uncheck<\/span> the box that marks the container as &#8220;<strong>unprivileged<\/strong>&#8220;,<\/li>\n<li>Edit the container settings at <strong>Options &gt; Features<\/strong> and <span style=\"text-decoration: underline;\">check<\/span> the &#8220;<strong>nesting<\/strong>&#8221; box,<\/li>\n<li>Containers run as the <code>root<\/code> user, so <code>install.sh<\/code> and <code>install_dependencies.sh<\/code> must be manually edited to remove all occurrences of <code>sudo<\/code>, or the installation will fail.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Kasm Workspaces (KW) is a web-native open-source &#8220;Container Streaming Platform&#8221; [Link]. What does that really [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,6],"tags":[],"class_list":["post-3216","post","type-post","status-publish","format-standard","hentry","category-linux","category-raspberry-pi"],"_links":{"self":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/3216","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3216"}],"version-history":[{"count":18,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/3216\/revisions"}],"predecessor-version":[{"id":5659,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/3216\/revisions\/5659"}],"wp:attachment":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3216"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3216"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}