• 1 Post
  • 86 Comments
Joined 2 years ago
cake
Cake day: April 30th, 2024

help-circle
  • I’m a little paranoid, so this is my security set up.

    SSH, blocked at firewall level, only allowing specific local IP to access port 22. Also authentication is done by key, with password disabled.

    Most services are local only and I access them through wireguard VPN when I’m outside my home.

    For services that need a domain name and be public facing, I use a reverse proxy, with the following protections:

    • Very restrictive geoIP block, only my country can access.
    • Restrictive rate limiting.
    • Crodwsec, with community lists, a pluging for open lists, community rules and my own very restrictive set of rules for banning attackers. (For instance as soon as the requested path contains “.env” that’s an instant ban, no second chances).
    • Monitoring through grafana.
    • Some complex services that need a valid tls handshake but I only want to use them myself have a setup when they are technically open to the net, to get let’s encrypt, but the server rejects every IP request but mine.

    Recently I also reduced some noise, surface attack, deleting the A register from my second level domain and using an obscured target for the CNAME records. I also want to delete the www subdomain as it gets a lot of uneeded noise.












  • I have many services that doesn’t “need” to be public, as public facing for one specific reason. TLS.

    A lot of the times android apps won’t connect to http directions, not even local ones, and require a proper https connection with a well known CA.

    For that I put the services behind a caddy reverse proxy to get a valid tls certificate.

    And them I do the trick, and basically on caddy reject any connection that’s not local. Thus, making the supposedly “public” site a practical “local” one.

    Once there I just connect through wireguard.






  • I’m in the process of building a monitoring system with grafana stack.

    Right now I have monitoring panels for some common metrics and logs. I am yet to set up alerts.

    The idea being that if something goes wrong some metric will grow up unexpectedly, for instance network traffic. And I would get a notification.

    What I’m still considering is what would I consider abnormal behavior, so I could set up the thresholds.


  • What do you want to expose, something static or dynamic?

    It would be a service you wrote or some stablish project?

    I would recommend running whichever service you want to expose through a reverse proxy, traefik or caddy. That way you have some sort of “chocking point” where you can control what’s going and it’s already handling some security for you.

    The service should be kept updated.

    Then you need a ips (intrusion prevention system). Most famous are fail2ban or crowdsec. You feed the ips the service logs and the reverse proxy logs, and ban ips that try to do something strange. I use crowdsec with a bunch of scenarios and their block lists.

    At the end you should only have a couple of ports open to the internet. Usually 80 and 443, and whichever port you use for the vpn, i recommend wireguard. So people should only connect to you via 80 or 443 and those ports should be binded to the reverse proxy. Everything else should never be able to enter your network.

    If you have all that and keep everything updated the attack surface becomes really small. You’ll get spam bots trying to probe for vulnerabilities but if you keep everything updated they won’t find anything.

    Depending on how many people you want to access your service you could also do some aggressive geoblocking, to reduce the number of bot attacks.

    The biggest risk here would be a vulnerability on the reverse proxy or the service you use. Keep an eye out for cve and update things regularly. If a vulnerability allows for remote code execution, then mitigation becomes almost impossible besides a good backup plan. If your vpn fails on you you are also fucked. But wireguard is pretty well secured. Bot scans shouldn’t even be able to know you have wg because pings and connections attempts fail silently without proper authentication.