<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shin Kusanagi</title>
    <description>The latest articles on DEV Community by Shin Kusanagi (@shin_kusanagi_00b968c7c1d).</description>
    <link>https://dev.to/shin_kusanagi_00b968c7c1d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4241833%2F97db3008-11c9-4d71-b791-1039367288d4.JPEG</url>
      <title>DEV Community: Shin Kusanagi</title>
      <link>https://dev.to/shin_kusanagi_00b968c7c1d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shin_kusanagi_00b968c7c1d"/>
    <language>en</language>
    <item>
      <title>Self-hosting a zero-trust network on one server with Lantern DSSE</title>
      <dc:creator>Shin Kusanagi</dc:creator>
      <pubDate>Thu, 12 Nov 2026 22:55:24 +0000</pubDate>
      <link>https://dev.to/shin_kusanagi_00b968c7c1d/self-hosting-a-zero-trust-network-on-one-server-with-lantern-dsse-2ho8</link>
      <guid>https://dev.to/shin_kusanagi_00b968c7c1d/self-hosting-a-zero-trust-network-on-one-server-with-lantern-dsse-2ho8</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/lantern-networks/dsse-core" rel="noopener noreferrer"&gt;Lantern DSSE&lt;/a&gt; is an open-source (Apache-2.0), self-hosted zero-trust network: ZTNA and a secure web gateway that you run on your own servers. This post installs the 0.4.2 release on a single Linux server and connects a Windows PC to it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lantern DSSE is an experimental release.&lt;/strong&gt; The single-server layout below is for trying it out: if that server stops, everything stops. Do not use it in production.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Lantern DSSE does
&lt;/h2&gt;

&lt;p&gt;It grew out of work on ransomware defense: if a device is compromised, which internal systems can it reach, and what can it send out?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Internal traffic.&lt;/strong&gt; Observe which internal connections devices make, then limit each device to the applications it needs. Applications are reached through connectors that dial out to the Edge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Out-of-band authentication with your IdP.&lt;/strong&gt; For the internal destinations you mark, a connection such as SSH, RDP or SMB is held while the user signs in to your identity provider (OIDC) in a browser, and continues only after that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outbound traffic.&lt;/strong&gt; Sites are allowed or denied by rule, and every decision is logged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TLS inspection.&lt;/strong&gt; For the traffic you choose, the Edge decrypts TLS with your organization's own certificate authority.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same applies to AI agents. Prompts and guardrails shape what an agent tries to do, not what it can reach. We think the most dependable control is to decide access to each resource from an authenticated identity, outside the agent, and to log every decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we are building
&lt;/h2&gt;

&lt;p&gt;One server runs everything as containers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0miiyfnxxdogfthajfvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0miiyfnxxdogfthajfvj.png" alt="The single-server layout" width="799" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One Linux x86-64 server with Docker Engine and Compose v2. I used a 4 vCPU, 16 GiB instance in AWS Tokyo with Ubuntu 24.04. You do not need Go or the source.&lt;/li&gt;
&lt;li&gt;Port 443 open. Devices and administrators both come in through it.&lt;/li&gt;
&lt;li&gt;The deployment's names resolving to the server, through DNS or hosts files. I used hosts files.&lt;/li&gt;
&lt;li&gt;A Windows PC and the signed MSI from the &lt;a href="https://github.com/lantern-networks/dsse-core/releases/tag/v0.4.2-experimental" rel="noopener noreferrer"&gt;release&lt;/a&gt; (&lt;code&gt;DsseAgent-0.4.2-windows-x64.msi&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I did not limit port 443 by source address; the Console is protected by sign-in. Only SSH was limited to my own address.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Get the installer
&lt;/h2&gt;

&lt;p&gt;Download the installer and the release manifest. The installer reads which container images to run from the manifest.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;R&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://github.com/lantern-networks/dsse-core/releases/download/v0.4.2-experimental
curl -fLO &lt;span class="nv"&gt;$R&lt;/span&gt;/dsse-install-0.4.2-linux-amd64
curl -fLO &lt;span class="nv"&gt;$R&lt;/span&gt;/release-manifest.json
curl -fLO &lt;span class="nv"&gt;$R&lt;/span&gt;/SHA256SUMS
sha256sum -c --ignore-missing SHA256SUMS
sudo install -m 0755 dsse-install-0.4.2-linux-amd64 /usr/local/bin/dsse-install
sudo install -d -o &lt;span class="s2"&gt;"$USER"&lt;/span&gt; -g &lt;span class="s2"&gt;"$USER"&lt;/span&gt; -m 0755 /opt/dsse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Register the names
&lt;/h2&gt;

&lt;p&gt;Choose a name for the deployment (one you control; &lt;code&gt;example.test&lt;/code&gt; is a placeholder) and use the address the server actually has. The installer prints the line to add to the hosts file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'-up -deployment example.test -address 10.20.1.10 -admin-email admin@example.test
   -dir /opt/dsse/region-a -release-manifest release-manifest.json'&lt;/span&gt;
dsse-install &lt;span class="nv"&gt;$A&lt;/span&gt; -print-names &lt;span class="o"&gt;|&lt;/span&gt; sudo tee -a /etc/hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It prints one line: the address followed by eight names. On the administrator's PC and on the Windows PC, point the same names at the server's public address.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Install with one command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dsse-install &lt;span class="nv"&gt;$A&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installer runs six steps in order. For me it took about four minutes, including pulling the images.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Creates the deployment's certificate authorities, certificates and configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Starts the containers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Creates the first administrator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Restarts the control plane and the Edge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Turns on the authentication features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Checks the whole deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last step passes when nothing fails. I got 50 checks passed out of 51, with one not applicable because no customer organization existed yet. If a step fails, fix the cause and run the same command again: it skips the finished steps and continues.&lt;/p&gt;

&lt;p&gt;Three of the files it creates in &lt;code&gt;/opt/dsse/region-a&lt;/code&gt; are worth knowing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;admin-credentials.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The first administrator's password, the key for an authenticator app, and recovery codes. Readable only by its owner, and never printed to the screen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deployment-anchor.pem&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The certificate of this deployment's root authority. It holds no private key, so you can hand it out. Used on the administrator's PC in step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;authority/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The private keys of the authorities. Guard this above everything else&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;admin-credentials.txt&lt;/code&gt; has this shape, with some notes around it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  password        &amp;lt;the password&amp;gt;
  second factor   &amp;lt;the TOTP secret&amp;gt;
  recovery codes  &amp;lt;recovery codes, separated by spaces&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Line&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;password&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The password for signing in to the Console&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;second factor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The key you register in an authenticator app (in step 4). At sign-in you enter the six digits the app shows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;recovery codes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Entered instead of the six digits when the app is unavailable. Each code works once&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A layout with several servers is installed with the same &lt;code&gt;-up&lt;/code&gt; and a plan file; see the &lt;a href="https://github.com/lantern-networks/dsse-core/blob/v0.4.2-experimental/docs/deployment.md#run-the-order-with--up" rel="noopener noreferrer"&gt;deployment guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Create an organization in the Console
&lt;/h2&gt;

&lt;p&gt;Copy &lt;code&gt;/opt/dsse/region-a/deployment-anchor.pem&lt;/code&gt; from the server to the administrator's PC and trust it. On Windows, in an elevated PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nc"&gt;Get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;FileHash&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;\&lt;span class="n"&gt;deployment&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;   &lt;span class="c1"&gt;# must equal sha256sum on the server&lt;/span&gt;
&lt;span class="nc"&gt;Import&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Certificate&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;FilePath&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;\&lt;span class="n"&gt;deployment&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;CertStoreLocation&lt;/span&gt; &lt;span class="nc"&gt;Cert&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="nc"&gt;LocalMachine&lt;/span&gt;\&lt;span class="nc"&gt;Root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before signing in, register the &lt;code&gt;second factor&lt;/code&gt; value in an authenticator app on your phone (Google Authenticator, Microsoft Authenticator and so on):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the screen that adds an account by typing a key (in Google Authenticator, "Enter a setup key").&lt;/li&gt;
&lt;li&gt;Give the account a name you will recognize, for example the address you passed as &lt;code&gt;-admin-email&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Enter the &lt;code&gt;second factor&lt;/code&gt; value as the key (32 capital letters and digits), with the key type "time based".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When the app shows six digits that change every 30 seconds, it is registered. Sign-in fails if the phone's clock is far off.&lt;/p&gt;

&lt;p&gt;Open &lt;code&gt;https://console.region-a.&amp;lt;your deployment&amp;gt;/console.html&lt;/code&gt; in a browser and sign in with the &lt;code&gt;-admin-email&lt;/code&gt; address, the password from &lt;code&gt;admin-credentials.txt&lt;/code&gt;, and the six digits from the app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fko7eqhyojdozs1n1hae3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fko7eqhyojdozs1n1hae3.png" alt="Sign-in" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;tenant_default&lt;/code&gt; organization that already exists belongs to the operator. Create a customer organization (a tenant) for your devices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Under &lt;strong&gt;Tenants&lt;/strong&gt;, press &lt;strong&gt;+ Add tenant&lt;/strong&gt; and give it a display name. Leave &lt;strong&gt;Who runs it&lt;/strong&gt; at its default, &lt;strong&gt;We run it for them&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Manage&lt;/strong&gt; on that organization in the list. Inside it, under &lt;strong&gt;Certificates &amp;amp; PKI&lt;/strong&gt; → &lt;strong&gt;Certificates&lt;/strong&gt;, press &lt;strong&gt;Let this deployment issue them&lt;/strong&gt; for device identity and &lt;strong&gt;Let this deployment make one&lt;/strong&gt; for traffic inspection. In the dialog that appears first, press &lt;strong&gt;Ask for 20 minutes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Device configuration&lt;/strong&gt;, press &lt;strong&gt;Make the configuration&lt;/strong&gt;, then &lt;strong&gt;Download everything for one device&lt;/strong&gt; to get the set for Windows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmybxofk3vr2fpnszkd09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmybxofk3vr2fpnszkd09.png" alt="Tenants" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyd4gysovz2u4tasrme5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyd4gysovz2u4tasrme5j.png" alt="The inspection certificate" width="799" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F963txfssbrpwk5j5jjrp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F963txfssbrpwk5j5jjrp.png" alt="Device configuration" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The set contains the configuration (&lt;code&gt;install_profile.json&lt;/code&gt;), the key that verifies its signature (&lt;code&gt;profile_signing_key.txt&lt;/code&gt;) and a one-time enrolment token (&lt;code&gt;enrolment_token.txt&lt;/code&gt;). It does not contain the MSI: download &lt;code&gt;DsseAgent-0.4.2-windows-x64.msi&lt;/code&gt; from the release and put it in the same folder as &lt;code&gt;DsseAgent.msi&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Install on Windows
&lt;/h2&gt;

&lt;p&gt;Check the signatures of the MSI and the configuration first. &lt;code&gt;dsse-profileverify.exe&lt;/code&gt; checks the configuration; build it on Windows from a clone of the repository with &lt;code&gt;go build -o dsse-profileverify.exe ./cmd/dsse-profileverify&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nc"&gt;Get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;AuthenticodeSignature&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;\&lt;span class="nc"&gt;DsseAgent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;msi&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Format&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt; &lt;span class="nc"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;SignerCertificate&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;\&lt;span class="n"&gt;dsse&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;profileverify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt; &lt;span class="n"&gt;install_profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt; &lt;span class="n"&gt;profile_signing_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The MSI must be &lt;code&gt;Valid&lt;/code&gt; with the signer &lt;code&gt;LANTERN NETWORKS, INC.&lt;/code&gt;, and the configuration must report "signed by the pinned key" (it then prints the configuration itself, which holds certificates and public keys but no secret). In real use, the key reaches the device by a different route from the configuration.&lt;/p&gt;

&lt;p&gt;Install from an elevated PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$msi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Resolve&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;\&lt;span class="nc"&gt;DsseAgent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;msi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;
&lt;span class="nv"&gt;$config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Resolve&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;\&lt;span class="n"&gt;install_profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;
&lt;span class="nv"&gt;$token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Resolve&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;\&lt;span class="n"&gt;enrolment_token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;
&lt;span class="nv"&gt;$pin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Resolve&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;\&lt;span class="n"&gt;profile_signing_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;
&lt;span class="nv"&gt;$log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Join&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="nv"&gt;$PWD&lt;/span&gt; &lt;span class="s1"&gt;'install.log'&lt;/span&gt;
&lt;span class="nv"&gt;$p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Start&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;Process&lt;/span&gt; &lt;span class="n"&gt;msiexec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Wait&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;PassThru&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;ArgumentList&lt;/span&gt; &lt;span class="s2"&gt;"/i `"&lt;/span&gt;&lt;span class="nv"&gt;$msi&lt;/span&gt;&lt;span class="sb"&gt;`" /qn /l*v `&lt;/span&gt;&lt;span class="s2"&gt;"$log`"&lt;/span&gt; &lt;span class="no"&gt;CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`"$config`&lt;/span&gt;&lt;span class="s2"&gt;" TOKEN=`"&lt;/span&gt;&lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="sb"&gt;`" PIN=`&lt;/span&gt;&lt;span class="s2"&gt;"$pin`""
$p.ExitCode
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When it prints &lt;code&gt;0&lt;/code&gt;, start the agent. On its first start the device enrols in the organization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nc"&gt;Get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Service&lt;/span&gt; &lt;span class="nc"&gt;DsseSteer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;DsseWfp&lt;/span&gt;
&lt;span class="nc"&gt;Start&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Service&lt;/span&gt; &lt;span class="nc"&gt;DsseSteer&lt;/span&gt;
&lt;span class="nc"&gt;Get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;CimInstance&lt;/span&gt; &lt;span class="nc"&gt;Win32_Service&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;Filter&lt;/span&gt; &lt;span class="s2"&gt;"Name='DsseSteer'"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Select&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;StartMode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It takes about half a minute before traffic goes through DSSE. It is ready when &lt;code&gt;C:\Program Files\DSSE\dsse-steer.log&lt;/code&gt; shows &lt;code&gt;steer_capture backend=wfp armed=true&lt;/code&gt;. The device also appears under &lt;strong&gt;Devices&lt;/strong&gt; in the Console.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy3wswuo5saa0k7141o9u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy3wswuo5saa0k7141o9u.png" alt="The device in the Console" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Check allow and deny
&lt;/h2&gt;

&lt;p&gt;A new organization's &lt;strong&gt;Internet Access&lt;/strong&gt; starts with one rule that allows and inspects everything. The idea is to make the traffic visible first and narrow it from there.&lt;/p&gt;

&lt;p&gt;Add a rule that denies one site:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Under &lt;strong&gt;Groups &amp;amp; Services&lt;/strong&gt;, press &lt;strong&gt;+ Add server&lt;/strong&gt; and create the destination &lt;code&gt;example.org&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Internet Access&lt;/strong&gt;, create a rule with &lt;code&gt;example.org&lt;/code&gt; as the destination and &lt;strong&gt;Deny&lt;/strong&gt; as the access. Give it a priority lower than the first rule's 100, for example 20 (the lower number wins).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhcwnwzz11qj6p81hjucl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhcwnwzz11qj6p81hjucl.png" alt="Rules" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the PC's browser, an allowed site opens without a certificate warning, and the denied site shows a block page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi02nr8pohvbw7j4oysox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi02nr8pohvbw7j4oysox.png" alt="The block page" width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logs &amp;amp; Audit&lt;/strong&gt; records both the allowed and the denied requests, with the rule and the reason.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpijt64o0b7imzi2rohu6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpijt64o0b7imzi2rohu6.png" alt="Logs" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  If you try it
&lt;/h2&gt;

&lt;p&gt;If you try this in a lab, please tell us in an &lt;a href="https://github.com/lantern-networks/dsse-core/issues" rel="noopener noreferrer"&gt;issue&lt;/a&gt; which version and operating system you used, what you tried, and where a step or the behaviour differed from what you expected. Do not include tokens, private keys or personal information. A star on &lt;a href="https://github.com/lantern-networks/dsse-core" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; is appreciated.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>security</category>
      <category>selfhosted</category>
      <category>go</category>
    </item>
  </channel>
</rss>
