This is a continuation of my other post

I now have homeassistant, immich, and authentik docker containers exposed to the open internet. Homeassistant has built in 2FA and authentik is being used as the authentication for immich which supports 2FA. I went ahead and blocked connections from every country except for my own via cloudlfare (I’m aware this does almost nothing but I feel better about it).

At the moment, if my machine became compromised, I wouldn’t know. How do I monitor these docker containers? What’s a good way to block IPs based on failed login attempts? Is there a tool that could alert me if my machine was compromised? Any recommendations?

EDIT: Oh, and if you have any recommendations for settings I should change in the cloudflare dashboard, that would be great too; there’s a ton of options in there and a lot of them are defaulted to “off”

  • foggy@lemmy.world
    link
    fedilink
    English
    arrow-up
    5
    ·
    edit-2
    2 months ago

    Auth portal for VPN tunnell -> Authelia -> fail2ban -> VLAN with services only.

    ELK stack monitors the LAN. (Including VLAN)

    Keep that VLAN segmented. You’re good unless you’re a DOGE employee, then I’d recommend quite a bit more security.

    • a_fancy_kiwi@lemmy.worldOP
      link
      fedilink
      English
      arrow-up
      1
      ·
      2 months ago

      I’ve seen a bunch of people recommend Authelia. Do you mind if I ask why you went with it over other software? I only went with authentik because I found a tutorial on it first

  • q7mJI7tk1@lemmy.world
    link
    fedilink
    English
    arrow-up
    4
    ·
    edit-2
    2 months ago

    So among my services I self host, a few need to be publicly accessible for work. For those I wish to remain private, Caddy only allows private IP ranges, plus then Authelia as auth which is set to 30 days. There is then the login of each service behind Authelia as well. It’s as good as it needs to be for my needs.

    If I were only self hosting private services, then as others have said, I would put all access through a VPN.

    Edit: I should add that of course the private services are then only accessed via VPN to the router (part of the private IP ranges). Caddy as reverse proxy also obfuscates the subdomain names I use.

    • a_fancy_kiwi@lemmy.worldOP
      link
      fedilink
      English
      arrow-up
      1
      ·
      2 months ago

      Caddy only allows private IP ranges

      Do you mind telling me more about this? How does that work; a VPN?

      • q7mJI7tk1@lemmy.world
        link
        fedilink
        English
        arrow-up
        1
        ·
        edit-2
        2 months ago

        Sure, so I use Caddy as a reverse proxy for all my subdomains, the public ones direct straight to whatever service(s) are on IP:port etc, then the private ones only allow private IP ranges of which one is my VPN subnet, therefore only allowing LAN and VPN access. I then also have a section for each of the private subdomains with Authelia authentication which is omitted here in the caddyfile example:

        (allowed) {
        	@allowed client_ip 192.168.1.0/24 192.168.10.0/24 192.168.20.0/28
        }
        
        sub.domain.com {
        	import allowed
        	handle @allowed {
        		reverse_proxy 192.168.80.8:8080
        	}
        
        	handle {
        		abort
        	}
        }
        
  • 𞋴𝛂𝛋𝛆@lemmy.world
    link
    fedilink
    English
    arrow-up
    3
    ·
    2 months ago

    I’ve half ass thought about this but never have tried to actually self host. If you have access to all devices, why not just use your own self signed certificates to encrypt everything and require the certificate for all connections? Then there is never a way to log in or connect right? The only reason for any authentication is to make it possible to use any connection to dial into your server. So is that a bug or a feature. Maybe I’m missing something fundamental in this abstract concept that someone will tell me?

    • a_fancy_kiwi@lemmy.worldOP
      link
      fedilink
      English
      arrow-up
      4
      ·
      2 months ago

      If you have access to all devices, why not just use your own self signed certificates to encrypt everything and require the certificate for all connections?

      Sounds like you are describing a VPN. I was using that setup before but small stuff like immich album sharing via a link won’t work properly. Also, having to ensure a vpn is on and connected is a little to much to ask of my partner; they would turn it off and forget about it and then ask why their app wasn’t working :/

      • 𞋴𝛂𝛋𝛆@lemmy.world
        link
        fedilink
        English
        arrow-up
        2
        ·
        2 months ago

        I mean more like a self signed TLS certificate with your own host manually set in the browser. Then only make the TLS port available, or something like that. If you have access to both(all) devices, you should be able to fully encrypt by bruit force and without registering the certificate with anyone. That is what I do with AI at home.

        • peregus@lemmy.world
          link
          fedilink
          English
          arrow-up
          3
          ·
          2 months ago

          I don’t know much about certificates, but doesn’t that just alert the browser that the certificate is not trusted and you can decide if keep going or not?

          • 𞋴𝛂𝛋𝛆@lemmy.world
            link
            fedilink
            English
            arrow-up
            1
            ·
            2 months ago

            Sorta, you have to install your certificate authority into the browser and it might complain about verifying that but it will still connect with the encryption.

            • peregus@lemmy.world
              link
              fedilink
              English
              arrow-up
              2
              ·
              2 months ago

              No no, what I meant is that if I connect to your server without the certificate installed don’t I just get the warning and I can still get through?

              • 𞋴𝛂𝛋𝛆@lemmy.world
                link
                fedilink
                English
                arrow-up
                1
                ·
                2 months ago

                Not unless an http port is open too. If the only port is https, you have to have the certificate. Like with my AI stuff it acts like the host is down if I try to connect with http. You have to have the certificate to decrypt anything at all from the host.

                • greyfox@lemmy.world
                  link
                  fedilink
                  English
                  arrow-up
                  2
                  ·
                  2 months ago

                  If you are just using a self signed server certificate anyone can connect to your services. Many browsers/applications will fail to connect or give a warning but it can be easily bypassed.

                  Unless you are talking about mutual TLS authentication (aka mTLS or two way ssl). With mutual TLS in addition to the server key+cert you also have a client key+cert for your client. And you setup your web server/reverse proxy to only allow connections from clients that can prove they have that client key.

                  So in the context of this thread mTLS is a great way to protect your externally exposed services. Mutual TLS should be just as strong of a protection as a VPN, and in fact many VPNs use mutual TLS to authenticate clients (i.e. if you have an OpenVPN file with certs in it instead of a pre-shared key). So they are doing the exact same thing. Why not skip all of the extra VPN steps and setup mTLS directly to your services.

                  mTLS prevents any web requests from getting through before the client has authenticated, but it can be a little complicated to setup. In reality basic auth at the reverse proxy and a sufficiently strong password is just as good, and is much easier to setup/use.

                  Here are a couple of relevant links for nginx. Traefik and many other reverse proxies can do the same.

                  How To Implement Two Way SSL With Nginx

                  Apply Mutual TLS over kubernetes/nginx ingress controller

        • a_fancy_kiwi@lemmy.worldOP
          link
          fedilink
          English
          arrow-up
          2
          ·
          2 months ago

          oh, my mistake. tbh, I don’t know enough about it but I’m interested. Why set up a TLS cert for AI at home? How is that benefiting you and your setup?

          I’ve seen some people set up SSL certs for self hosted services and not make them publicly available but I didn’t get around to seeing why they were doing it

      • peregus@lemmy.world
        link
        fedilink
        English
        arrow-up
        1
        ·
        2 months ago

        Beside the fact that you would like to understand if you’ve done everything properly (that’s good, but I can’t help you here), a VPN on a smartphone can be always active. Mine is always on and I’ve never noticed any battery problem. If you prefer something simpler there’s Tailscale.

        • a_fancy_kiwi@lemmy.worldOP
          link
          fedilink
          English
          arrow-up
          2
          ·
          edit-2
          2 months ago

          If it were only me using the apps, I’d be using a VPN. Over the years, I’ve used OpenVPN, Wireguard, and now Tailscale. In my experience, they work like 99% of the time. That last 1% though is weird connection issues; usually when switching between WiFi and cellular (or vice versa) but sometimes it’s my server or ISP and I have to turn the VPN off and back on to troubleshoot. During those rare times, my partner will either turn off the VPN and forget to turn it back on or they will forget about the VPN completely and not be able to use their phone. Ideally, I’d like to set something up that doesn’t require any potential troubleshooting on their part so I can avoid hearing “why can’t we just use Google photos?” or “what’s wrong with Google home?” 😓

  • krash@lemmy.ml
    link
    fedilink
    English
    arrow-up
    3
    ·
    2 months ago

    I’ve tried different approaches with fail2ban, crowdsec, VPNs, etc. What I settled on is to divide the data of my services in two categories: confidential and “I can live with it leaking”.

    The ones that host confidential data is behind a VPN and has some basic monitoring on them.

    The ones that are out in the public are behind a WAF from cloudflare with pretty restrictive rules.

    Yes, cloudflare suck etc., but the value of stopping potential attacks before they reach your services is hard to match.

    Just keep in mind: you need layers of different security measures to protect your services (such as backups, control of network traffic, monitoring and detection, and so on).

    • a_fancy_kiwi@lemmy.worldOP
      link
      fedilink
      English
      arrow-up
      2
      ·
      2 months ago

      has some basic monitoring on them.

      What monitoring software are you using?

      I feel like the other measures you talked about (backups, condom of network traffic, etc) I’m doing ok on. Its really just the monitoring where I’m stuck. There’s so many options

      • krash@lemmy.ml
        link
        fedilink
        English
        arrow-up
        1
        ·
        2 months ago

        There are so many monitoring tools with various degrees of complicated setup / configuration or the amount of information you get. And honestly, I’ve looked into various tools: checkmk, monit, Prometheus… And realised that I rarely look into that information anyway. Of all “fancy” tools, I liked the ease of Netdata to set up and the amount of information that you get. However, beware that their in the process to make their free / homelad offering worse. I’ve been eyeing beszel and don’t forget CLI based tools that are avaible such as atop, btop, htop or glances.

        If you want to delve deeper into the rabbit hole of monitoring, I can recommend you to read this article below: https://matduggan.com/were-all-doing-metrics-wrong/

  • just_another_person@lemmy.world
    link
    fedilink
    English
    arrow-up
    3
    arrow-down
    2
    ·
    2 months ago

    Why? Not every service is meant to be exposed to the open internet. Immich is the only one of what you listed that makes sense to have out in the open.

    • a_fancy_kiwi@lemmy.worldOP
      link
      fedilink
      English
      arrow-up
      3
      arrow-down
      1
      ·
      2 months ago

      I’ve been playing around with the voice assistant stuff in homeassistant and it seemingly needs a public url to get all the features. I could be wrong about that though?

      I put authentik in front of immich to handle authentication so that I would need need a 2FA code

      • just_another_person@lemmy.world
        link
        fedilink
        English
        arrow-up
        2
        ·
        2 months ago

        Most definitely does not need a public URL for Assist in HA. Not sure where you read that.

        It sounds like you need a VPN to your internal services if you’re concerned about security.

        • a_fancy_kiwi@lemmy.worldOP
          link
          fedilink
          English
          arrow-up
          1
          ·
          2 months ago

          Most definitely does not need a public URL for Assist in HA. Not sure where you read that.

          You’re probably right. At one point, I had a subscription to homeassistant cloud a few years back to use a google nest speaker at the time. I was just going off that I guess. I’ll do some testing and will probably put it back behind tailscale. thanks for the heads up

          It sounds like you need a VPN to your internal services if you’re concerned about security.

          I’m more so concerned that I set something up incorrectly and would like to be made aware of it in the event someone else noticed