User Tools

Site Tools


computing:cockpit

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
computing:cockpit [2026/03/29 19:23] – oemb1905computing:cockpit [2026/10/10 03:05] (current) – oemb1905
Line 11: Line 11:
 ------------------------------------------- -------------------------------------------
  
-This tutorial covers how to set up Cockpit on Debian. The approach here assumes that Cockpit will be installed on bare metal being used in production, with only ssh exposed. This tutorial assumes you already have a sufficiently hardened and provisioned VPS/VM w/ a LAMP stack and some associated A/AAAA records ready to go. If not, go read [[http://example.com|Apache Survival]] first and come back. If you are ready to go, then this tutorial will cover:+=== Introduction === 
 +This tutorial covers how to set up Cockpit on Debian. The approach here assumes that Cockpit will be installed in one of two different ways:
  
-  * Unordered List ItemInstallation of Cockpit + Preferred Packages+  * Bare Metal - only ssh is open 
 +  * Virtual Machine - ssh and 80/443 are open for the reverse proxy 
 + 
 +In both scenarios, we use the apache location package to limit url requests to approved IPs. This tutorial assumes you already have a sufficiently hardened and provisioned VPS/VM w/ a LAMP stack and some associated A/AAAA records ready to go. If not, go read [[https://wiki.haacksnetworking.org/doku.php?id=computing:apachesurvival|Apache Survival]] first and come back. If you are ready to go, then this tutorial will cover: 
 + 
 +  * Installation of Cockpit + Preferred Packages
   * Setup of Apache Reverse Proxy; including setup for "with" and "without" 80/443 exposed/listening   * Setup of Apache Reverse Proxy; including setup for "with" and "without" 80/443 exposed/listening
   * Localhost w/ FoxyProxy   * Localhost w/ FoxyProxy
   * Official Cockpit Flatpak   * Official Cockpit Flatpak
  
-Introduction +=== Install Cockpit & Configure Apache ===
 Let's install cockpit and then create an apache virtual host for it. After that, we will cut the cert, then swap the vhost configs with the reverse proxy config. Let's enable TLS modules and headers. Let's install cockpit and then create an apache virtual host for it. After that, we will cut the cert, then swap the vhost configs with the reverse proxy config. Let's enable TLS modules and headers.
  
Line 34: Line 39:
 </code> </code>
  
-The cert is now built and domain.com should now show the "green lock" and have TLS enabled. If not, check your config and debug with ''sudo apache2ctl configtest'' and resolve that issue before proceeding. Once that's done and the page resolves with TLS, enable the proxy and swap the configs. +The cert is now built and ''domain.com'' should now have TLS enabled. If not, check your config and debug with ''sudo apache2ctl configtest'' and resolve that issue before proceeding. Once that's done and the page resolves with TLS, enable the proxy and swap the configs. 
  
   sudo a2enmod proxy_http   sudo a2enmod proxy_http
Line 40: Line 45:
   sudo a2enmod rewrite   sudo a2enmod rewrite
   sudo a2enmod proxy_wstunnel   sudo a2enmod proxy_wstunnel
 +  sudo a2enmod authz_host
   apache2ctl configtest   apache2ctl configtest
   systemctl reload apache2   systemctl reload apache2
      
-Open the ''domain.com.conf'' vhost in ''/etc/apache2/sites-enabled'' and change it to:+Now, we will go ahead and swap the default virtual hosts with the reverse proxy configurations. Open the ''domain.com.conf'' vhost in ''/etc/apache2/sites-enabled'' and change it to:
  
 <code> <code>
 <VirtualHost *:80> <VirtualHost *:80>
     ServerName domain.com     ServerName domain.com
 +    
 +    <Location />
 +        Require ip 96.40.208.144
 +        Require ip 2601:8c3:8684:a3f1::b2c
 +    </Location>
 +    
     RewriteEngine On     RewriteEngine On
     RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]     RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
Line 59: Line 71:
     <VirtualHost *:443>     <VirtualHost *:443>
         ServerName domain.com         ServerName domain.com
 +        
 +        <Location />
 +            Require ip 96.40.208.144
 +            Require ip 2601:8c3:8684:a3f1::b2c
 +        </Location>
 +        
         SSLCertificateFile /etc/letsencrypt/live/domain.com/fullchain.pem         SSLCertificateFile /etc/letsencrypt/live/domain.com/fullchain.pem
         SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem         SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem
Line 84: Line 102:
 </code> </code>
  
-These configs were built using the examples on Cockpit's documentation for reverse proxy configurations. Once they are built, make sure to configure Cockpit to trust the domain as an origin. Open ''sudo nano /etc/cockpit/cockpit.conf'' and drop in the following:+These configs were built using the examples on Cockpit's documentation for reverse proxy configurations. Make sure to edit the IPs above to IPs you actually have. Additionally, I recommend adding some more for a dedicated VPS, etc., and/or another backup server. You can always foxy proxy through ssh and SOCKS to access the host, so more IPs are safer and avoid you accidentally locking yourself out. Once they are built, make sure to configure Cockpit to trust the domain as an origin. Open ''sudo nano /etc/cockpit/cockpit.conf'' and drop in the following:
  
 <code> <code>
 [WebService] [WebService]
-Origins = https://domain.com wss://domain.com +Origins = https://domain.com https://domain.com:9090  
-ProtocolHeader = X-Forwarded-Proto+#wss://domain.com is needed on some setups 
 +#ProtocolHeader = X-Forwarded-Proto can be needed in filtered setups
 </code> </code>
  
-This instructs Cockpit's internal web socket system to trust the domain/origin and the web socket reverse proxy that we configured in apache. Restart the server or minimally restart cockpit+apache. Once they are restarted and their status healthy, navigate to ''domain.com'' in a browser and it should redirect to TLS and show the Cockpit landing page. If not, trace over the steps above and fix your work before proceeding. +This instructs Cockpit's internal web socket system to trust the domain/origin and the web socket reverse proxy that we configured in apache (since it differs from the listener on localhost). Restart the server or minimally restart cockpit+apache. Once they are restarted and their status healthy, navigate to ''domain.com'' in a browser and it should redirect to TLS and show the Cockpit landing page. If not, trace over the steps above and fix your work before proceeding. 
  
-Topic 2 - Access and Hardening+=== Discussion on Access to Cockpit ===
  
-There's a lot of debate about whether production servers that run virtualized services (VMs, containers, etc.) should be publicly exposed. The most common choice, however, is retaining ssh access and locking everything else down. That is, 80/443 will be closed. At first, this might seem counter-intuitive ... why would we close the ports for the reverse proxy we just set up? The answer is easy ... run everything through ssh! So, let's close down the host's ports:+There's a lot of debate about whether production servers that run virtualized services (VMs, containers, etc.) should be publicly exposed. Now, if you fully trust your server and Cockpit's web auth, no need to continue. For most folks, however, retaining ssh access and locking everything else down is usually the go to ... meaning that 80/443 will be closed. Additionally, as already shown above, we are letting the web server (apache) further restrict url requests with the location package. At first, this might seem like we are locking down the web server that we need to access the service, but/and we are actually tunneling through ssh instead. Additionally, the addition of TLS - while not adding any security benefit to the ssh tunnel - avoids the web browser barf you get on IPs, localhost endpoints, etc., and gives you an easy to remember domain. Okay, let's install ufw and open ssh and leave everything else closed.
  
   sudo apt install ufw   sudo apt install ufw
Line 102: Line 121:
   sudo ufw allow 22   sudo ufw allow 22
      
-Once that's done, let's edit our ''sudo crontab -e'' entry as follows:+Now that that is done, we need to make a special certbot entry in cron that uses a pre/post hook in order to briefly open port 80 for renewal and then close it again. To do that, let's edit our ''sudo crontab -e'' entry as follows:
  
   30 2 * * 1 certbot renew --apache --pre-hook "ufw allow 80/tcp" --post-hook "ufw delete allow 80/tcp" >> /var/log/le-renew.log 2>&1   30 2 * * 1 certbot renew --apache --pre-hook "ufw allow 80/tcp" --post-hook "ufw delete allow 80/tcp" >> /var/log/le-renew.log 2>&1
  
-This adjusted script briefly opens up 80 every 30 days to see if the cert needs renewal. After it checks, it closes the port back up. At this point, one might realize, what value is Let's Encrypt even providing here? If 80/443 are closed and you are running everything through ssh (setup forthcoming), then why Let's Encrypt? The answer is that it is very convenient to enter domain.com in a browser and have everything, including encryption/TLS, just work. Secondarily, if I end up leaving 80/443 open for some other service or maybe I make a mistake, etc., the public facing Cockpit instance will already be configured with TLS. To access the machine, let's ssh into it using the ''-D'' flag:+This adjusted script briefly opens up 80 every 30 days to see if the cert needs renewal. After it checks, it closes the port back up. At this point, one might realize, what value is Let's Encrypt even providing here? If 80/443 are closed and you are running everything through ssh. As I mentioned above, the addition of TLS removes browser complaints and provides an easy to remember domain for access, but/and, if I make a mistake or ufw fails, etc., then Cockpit faces the public with not only TLS, but with the location restrictions stated above. This ensures that Cockpit is triple protected: ssh tunnel, ufw, and apache locations. To access the Cockpit web interface, we first ssh into the host with the ''-D'' flag: 
 + 
 +  ssh -D 8090 root@domain.com  
 + 
 +Once you are logged in, configure your Firefox's network settings to use SOCKS5 proxy with localhost and port 8090. //Using 8090 or something non-standard is helpful as containers and/or other services might already be bound to 8080//. You can now enter domain.com into your browser and your Cockpit instance will just work. If you check from another location, it won't work because 80/443 are closed (or your IPs are not approved). It's using the reverse proxy but accessing it locally (via the ssh tunnel), which is automatically trusted by apache. If changing Firefox's network settings proves inconvenient or cumbersome, you can setup a proxy with the foxyproxy addon for Firefox: 
 + 
 +{{ :computing:screenshot_20261009_205620.png?direct&800 |}} 
 + 
 +Of course, you could have skipped the apache configuration entirely and just run the ssh proxy and accessed Cockpit via localhost:9090 and/or 127.0.0.1:9090 but then you have to edit Firefox's developer settings to allow "localhost hijacking" or Firefox will get confused over which 'local' host is intended? Especially with reverse proxies, some internal web service assets will be originating from localhost (since they are behind the reverse proxy lol) and thus Firefox gets confused. There are also associated security concerns. However, if you want to avoid the apache part and just ssh with SOCKS, set the following to true:
  
-  ssh -D 8080 root@domain.com+{{ :computing:screenshot_from_2026-03-29_13-28-00.png?direct |}}
  
-Once you are logged in, configure your Firefox's network settings to use SOCKS5 proxy with localhost and port 8080. You can now enter domain.com into your browser and your Cockpit instance will just work. If you check from elsewhere (other IPs), it won't work because 80/443 are closed. It's using the reverse proxy but accessing it locally (via the ssh tunnel), which is automatically trusted by apache. If changing Firefox's network settings proves inconvenient or cumbersome, you can setup a proxy with the foxyproxy addon for Firefox:+Set this value to true and you can then access Cockpit via localhost:9090 without any issues. Before doing this, however, be aware of the risks/dangers of this approach. Just search //localhost hijacking// if you need to read up on it. I personally use the reverse proxy with apache, which although overkill, also results in avoiding this flag / dev mode hack. Other solutions involve binding Cockpit to a local IP and then proxying into the host and accessing via that IP:9090, or simply using the Cockpit flatpak, which connects via ssh and runs the Cockpit web socketing system internally, and even allows folks to connect to instances without Cockpit installed and get that familiar form factor:
  
-{{ :computing:screenshot_from_2026-03-29_13-22-21.png?direct |}} +  * [[https://cockpit-project.org/faq.html|Using Cockpit ]]
  
 +In conclusion, this tutorial allows for secure web browser access with no browser barf or work arounds. The cert renews on schedule and briefly opens port 80 during that process. If something goes wrong, TLS is ready and secure if ufw or location packages fail. Additionally, since ssh is open by default, one can also simply use the official Cockpit flatpak. However, it's nice to not have to rely on the flatpak and this tutorial solves that. 
  
- --- //[[alerts@haacksnetworking.org|oemb1905]] 2025/02/15 14:32//+ --- //[[alerts@haacksnetworking.org|oemb1905]] 2026/10/10 02:57//
computing/cockpit.1774812182.txt.gz · Last modified: by oemb1905