Recently, I discovered that SSH of my VPS server is constantly battered as follows.

Apr 06 11:15:14 abastro-personal-arm sshd[102702]: Unable to negotiate with 218.92.0.201 port 53768: no matching key exchange method found. Their offer: diffie>
Apr 06 11:30:29 abastro-personal-arm sshd[102786]: Unable to negotiate with 218.92.0.207 port 18464: no matching key exchange method found. Their offer: diffie>
Apr 06 11:45:36 abastro-personal-arm sshd[102881]: Unable to negotiate with 218.92.0.209 port 59634: no matching key exchange method found. Their offer: diffie>
Apr 06 12:01:02 abastro-personal-arm sshd[103019]: Unable to negotiate with 218.92.0.203 port 16976: no matching key exchange method found. Their offer: diffie>
Apr 06 12:05:49 abastro-personal-arm sshd[103066]: Unable to negotiate with 218.92.0.212 port 49130: no matching key exchange method found. Their offer: diffie>
Apr 06 12:07:09 abastro-personal-arm sshd[103077]: Connection closed by 162.142.125.122 port 56110 [preauth]
Apr 06 12:12:18 abastro-personal-arm sshd[103154]: Connection closed by 45.79.181.223 port 22064 [preauth]
Apr 06 12:12:19 abastro-personal-arm sshd[103156]: Connection closed by 45.79.181.223 port 22078 [preauth]
Apr 06 12:12:20 abastro-personal-arm sshd[103158]: Connection closed by 45.79.181.223 port 22112 [preauth]
Apr 06 12:21:26 abastro-personal-arm sshd[103253]: Connection closed by 118.25.174.89 port 36334 [preauth]
Apr 06 12:23:39 abastro-personal-arm sshd[103282]: Unable to negotiate with 218.92.0.252 port 59622: no matching key exchange method found. Their offer: diffie>
Apr 06 12:26:38 abastro-personal-arm sshd[103312]: Connection closed by 92.118.39.73 port 44400
Apr 06 12:32:22 abastro-personal-arm sshd[103373]: Unable to negotiate with 218.92.0.203 port 57092: no matching key exchange method found. Their offer: diffie>
Apr 06 12:49:48 abastro-personal-arm sshd[103556]: error: maximum authentication attempts exceeded for root from 98.22.89.155 port 53675 ssh2 [preauth]
Apr 06 12:49:48 abastro-personal-arm sshd[103556]: Disconnecting authenticating user root 98.22.89.155 port 53675: Too many authentication failures [preauth]
Apr 06 12:49:51 abastro-personal-arm sshd[103558]: error: maximum authentication attempts exceeded for root from 98.22.89.155 port 53775 ssh2 [preauth]
Apr 06 12:49:51 abastro-personal-arm sshd[103558]: Disconnecting authenticating user root 98.22.89.155 port 53775: Too many authentication failures [preauth]
Apr 06 12:49:53 abastro-personal-arm sshd[103561]: error: maximum authentication attempts exceeded for root from 98.22.89.155 port 53829 ssh2 [preauth]
Apr 06 12:49:53 abastro-personal-arm sshd[103561]: Disconnecting authenticating user root 98.22.89.155 port 53829: Too many authentication failures [preauth]
Apr 06 12:49:54 abastro-personal-arm sshd[103563]: Connection closed by 98.22.89.155 port 53862 [preauth]
Apr 06 12:50:41 abastro-personal-arm sshd[103576]: Invalid user  from 75.12.134.50 port 36312
Apr 06 12:54:26 abastro-personal-arm sshd[103621]: Connection closed by 165.140.237.71 port 54236
Apr 06 13:01:26 abastro-personal-arm sshd[103702]: Connection closed by 193.32.162.132 port 33380
Apr 06 13:03:40 abastro-personal-arm sshd[103724]: Unable to negotiate with 218.92.0.204 port 60446: no matching key exchange method found. Their offer: diffie>
Apr 06 13:11:49 abastro-personal-arm sshd[103815]: Received disconnect from 165.140.237.71 port 50952:11:  [preauth]
Apr 06 13:11:49 abastro-personal-arm sshd[103815]: Disconnected from authenticating user root 165.140.237.71 port 50952 [preauth]
Apr 06 13:19:08 abastro-personal-arm sshd[103897]: Unable to negotiate with 218.92.0.208 port 59274: no matching key exchange method found. Their offer: diffie>
Apr 06 13:33:36 abastro-personal-arm sshd[104066]: Received disconnect from 165.140.237.71 port 50738:11:  [preauth]
Apr 06 13:33:36 abastro-personal-arm sshd[104066]: Disconnected from authenticating user ubuntu 165.140.237.71 port 50738 [preauth]
Apr 06 13:34:50 abastro-personal-arm sshd[104079]: Unable to negotiate with 218.92.0.204 port 44816: no matching key exchange method found. Their offer: diffie>
Apr 06 13:50:32 abastro-personal-arm sshd[104249]: Unable to negotiate with 218.92.0.206 port 27286: no matching key exchange method found. Their offer: diffie>
Apr 06 13:51:58 abastro-personal-arm sshd[104261]: Received disconnect from 165.140.237.71 port 50528:11:  [preauth]
Apr 06 13:51:58 abastro-personal-arm sshd[104261]: Disconnected from authenticating user root 165.140.237.71 port 50528 [preauth]
Apr 06 14:01:25 abastro-personal-arm sshd[104351]: Invalid user  from 65.49.1.29 port 18519
Apr 06 14:01:28 abastro-personal-arm sshd[104351]: Connection closed by invalid user  65.49.1.29 port 18519 [preauth]

As you can see, it is happening quite frequently, and I am worried one might break in at some point. Since SSH access guards users with root-access, it can be quite serious once penetrated. How do I harden against these kind of attacks? Because this is VPS, disabling SSH is a no-go (SSH is my only entry of access). Are there ways to stop some of these attackers?

As always, thanks in advance!

  • @tal@lemmy.today
    link
    fedilink
    English
    012 days ago

    If you use keys or strong passwords, it really shouldn’t be practical for someone to brute-force.

    You can make it more-obnoxious via all sorts of security-through-obscurity routes like portknocking or fail2ban or whatever, or disable direct root login via PermitRootLogin, but those aren’t very effective compared to just using strong credentials.

  • @cecilkorik@lemmy.ca
    link
    fedilink
    English
    012 days ago

    fail2ban is mandatory equipment for any ssh server accessible to the public especially on its default port. It’s highly configurable, but the default settings will do fine at making it statistically impossible for any user or password to be brute forced.

    • @cron@feddit.org
      link
      fedilink
      English
      012 days ago

      I don’t really get the love for fail2ban. Sure, it helps keep your logs clean, but with a solid SSH setup (root disabled, SSH keys enforced), I’m not bothered by the login attempts.

      • @sugar_in_your_tea@sh.itjust.works
        link
        fedilink
        English
        012 days ago

        You should be. Most of it’s noise, but if there’s a serious attack, you’ll appreciate clean logs.

        I think fail2ban is nice as like a third or fourth layer of defense. In order of my priorities:

        1. key-only login, root login completely disabled
        2. solid root password, and user privilege separation (have each service use its own user)
        3. geoip bans - if you never plan to support clients in a given region, block it at the firewall level (or better yet, whitelist the handful of regions you care about); I do this by port, so SSH gets a much more restricted set of allowed regions than HTTPS
        4. fail2ban - especially if you have a relatively large whitelist
        5. only access SSH over a Wireguard VPN - Wireguard doesn’t show up in port scans, and SSH can bind to the VPN host instead of 0.0.0.0, so the ability to login via SSH will be completely hidden

        If you’re not going to do 3-5, at least change the default SSH port to cut down on log noise.

  • Ace! _SL/S
    link
    fedilink
    English
    0
    edit-2
    12 days ago

    Like others said, disable password auth and setup auth keys instead.

    Bonus points for moving the ssh port, using fail2ban and also setting up a tarpit with something like endlessh.

    If you wanna go extreme use Wireguard to connect to your server and only allow ssh over wireguard in your firewall.

  • @CondorWonder@lemmy.ca
    link
    fedilink
    English
    012 days ago

    We can’t ever stop this kind of stuff, but with something like fail2ban you can set it up to block on too many failures.

    Really though - ensuring your system is kept up to date and uses strong passwords or use a SSH keys is the best defence. Blocking doesn’t prevent them from trying a few times. Moving SSH to a non standard port will stop most of the automated attacks but it won’t stop someone who is dedicated.

    • Lucy :3
      link
      fedilink
      English
      012 days ago

      Move SSH to non-standard port, make endlessh use the default port. Only use SSH keys. Only allow correct users (so eg. your user and git/forgejo). Use fail2ban to aggressively ban (redirect to default port, so 22) and report to abuseipdb everything that fails to authenticate first try (wrong user, password instead of key), has non-compatible ciphers (generally, only allow TLS1.3 etc.), or fails in any other way. Just be sure that if you accidentally get banned yourself (eg. Ctrl+C-ing during authentication), you can use another IP (eg. force v4) for connecting.

      • @cron@feddit.org
        link
        fedilink
        English
        012 days ago

        Nice list of suggestions, but implementing all of them feels a little over-the-top.

        • Lucy :3
          link
          fedilink
          English
          012 days ago

          Tbh, I myself still have SSH on port 22. Firstly, because I’m lazy, and secondly … yeah that’s it. I’m honestly just lazy. But spam bots trying office/cookie123 are not a real threat, and anyone trying to actually target me will either have somehow acquired my key + password, use one of the probably many security issues that exist in the dozen services I selfhost, social engineer me into doing something (not saying I’ve given out my (old) KeePass password once, but it could be, as love makes blind (I still love her)), or just smash my kneecaps until I give out everything.

    • @someacnt@sh.itjust.worksOP
      link
      fedilink
      English
      012 days ago

      Thanks, I will try fail2ban. I am using ED25519 for ssh keys, it seems like it’s the best defense on the ssh side. Do you happen to know why this kind of attack is so prevalent?

      • @WhyJiffie@sh.itjust.works
        link
        fedilink
        English
        011 days ago

        I’m not them, but among other reasons they are looking to build botnets (cryptomining, dosing, mass crawling), and they are searching for hosts with low security (or if you just made a mistake)

    • @JubilantJaguar@lemmy.world
      link
      fedilink
      English
      012 days ago

      This is the only answer you need to read. It’s a non-problem if you just do this, and there’s no reason not to do it.

  • @Dima@feddit.uk
    link
    fedilink
    English
    0
    edit-2
    12 days ago

    For security disable password authentication - use public key instead, disable root login via ssh - use sudo or su from another user.

    To reduce the number of attempts of others trying to get in change the ssh port and/or set-up fail2ban.

    You could also set a firewall rule to only allow ssh from your IP address, if you have a static address at home and only need access from there, or have a way to VPN into your home network. Make sure you have a static address if you do this though, you don’t want your IP to change and be left locked out of your server.

    • @sugar_in_your_tea@sh.itjust.works
      link
      fedilink
      English
      012 days ago

      You could also set a firewall rule to only allow ssh from your IP address

      You can also broaden this to a region. You may still want to access SSH from various places around your country (e.g. when visiting family or friends), but likely won’t ever need to from most of the rest of the world, so block everything except IPs from your region (or regions you care about, e.g. any VPSs you have).

      • @7toed@midwest.social
        link
        fedilink
        English
        0
        edit-2
        12 days ago

        No if you’re doing that, use a VPN through your firewall. Local traffic is a fair exception as this can only ever be a device on your network, but that depends on your threat model (as those local devices could be compromised). Opening to “your region’s” IP range opens you to a lot more than LAN access…

        • @sugar_in_your_tea@sh.itjust.works
          link
          fedilink
          English
          0
          edit-2
          12 days ago

          Sure. I’m just assuming that you’d want to access it from areas in your region, like at a friend or family member’s house, work, coffee shop, etc. This is especially true if you or one of them has DHCP from their ISP. You only really need to whitelist a handful of IP ranges to get most of the benefit of IP-based blocking and most of the convenience of not having a block.

          If you only ever truly need it at home, then sure, do that. In fact, for something like SSH, you could probably create a Wireguard endpoint that’s accessible almost anywhere and connect to that before logging in via SSH.

          My point is to not make it more restrictive than you need, otherwise it’ll just be frustrating and you’ll end up disabling whatever protections you have. You can get a lot of value with a broad ban on troublesome areas (e.g. I don’t visit most of the places OP has in their logs, so those would be banned), and then fine-tune the rest w/ something like fail2ban.

          I use my ISP’s firewall rule to whitelist regions I’m interested in, such as:

          • data centers where I have services
          • my town and my friends’ and families’ towns
          • the town near where I work

          I have different rules by port, so SSH is a lot more restricted than HTTP(s).

  • Waryle
    link
    fedilink
    English
    0
    edit-2
    12 days ago

    You can look up for:

    • Setting up max authentication attemps per connection -> slows up a lot brute force attacks. If your password is strong enough, that’s already a big step to secure your server.
    • Generate SSH Keys and disable password authentication -> do this only if you’re connecting through the same devices, because you won’t be able to connect from any device that has not being set up.
    • Set up Crowdsec -> it’s a service which scans logs and will block access to any suspicious IPs. It also relies on a crowdsourced list of I.P.s that are identified as threat and will preventively block them
    • @LlilL@lemm.ee
      link
      fedilink
      English
      012 days ago

      Is this an alternative/replacement to fail2ban or something you would use along with f2b?

      • @CausticFlames@sopuli.xyz
        link
        fedilink
        English
        012 days ago

        You could technically still use it alongside f2b, but in my experience Crowd-Sec seems to do a better job and can do the same things.

        • @LlilL@lemm.ee
          link
          fedilink
          English
          011 days ago

          Thank for that! You just turned a student onto a new tool to play with.

  • @hemmes@lemmy.world
    link
    fedilink
    English
    012 days ago

    What VPS are you using?

    You should be able to setup a firewall, blocking all access to the SSH port. Then setup a VPN so that only you can access via SSH after making your VPN connection.

    If you connect via a static IP, you can also create an ACL for the VPN connection just in case. You can set an ACL for the SSH port forward rule directly as well, but I don’t like that personally. I prefer keeping things behind the VPN.

    • @Voroxpete@sh.itjust.works
      link
      fedilink
      English
      012 days ago

      This is the correct answer. Never expose your SSH port on the public web, always use a VPN. Tailscale, Netmaker or Netbird make it piss easy to connect to your VPS securely, and because they all use NAT traversal you don’t have to open any ports in your firewall.

      Combine this with configuring UFW on the server (in addition to the firewall from the VPS provider - layered defence is king) and Fail2Ban. SSH keys are also a good idea. And of course disable root SSH just in case.

      With a multi-layered defence like this you will be functionally impervious to brute force attacks. And while each layer of protection may have an undiscovered exploit, it will be unlikely that there are exploits to bypass every layer simultaneously (Note for the pendants; I said “unlikely”, not “impossible”. No defence is perfect).

      • troed
        link
        fedilink
        012 days ago

        This is not “the correct answer”. There’s absolutely nothing wrong with “exposing” SSH.

          • @callcc@lemmy.world
            link
            fedilink
            English
            012 days ago

            Public ssh is completely fine as long as you use key based auth only and keep your sshd up to date. Stop spreading bullshit.

            • @Voroxpete@sh.itjust.works
              link
              fedilink
              English
              012 days ago

              A lot of things are “fine”, but the cost of adding Netbird to your VPS is effectively zero, whether counted in dollars, time, or convenience.

              Given the massive security benefits of using a VPN, and the lack of any meaningful downside to doing so, you’d be an idiot not to.

                • @sugar_in_your_tea@sh.itjust.works
                  link
                  fedilink
                  English
                  012 days ago

                  I don’t know about Netbird specifically, but adding a VPN does a few things:

                  • a port scan of your VPS/router won’t show an SSH or VPN port active - Wireguard only acknowledges packets if your key is valid (massively more useful than just changing the port)
                  • compromising both a VPN and SSH is difficult, you’d have to chain exploits together
                  • if your VPN is hosted by a separate service (e.g. something like Tailscale), it will be very unlikely to share vulnerabilities with your hosted SSH server
                • @suicidaleggroll@lemm.ee
                  link
                  fedilink
                  English
                  0
                  edit-2
                  12 days ago

                  Main reason is that if you don’t already have the right key, VPN doesn’t even respond, it’s just a black hole where all packets get dropped. SSH on the other hand will respond whether or not you have a password or a key, which lets the attacker know that there’s something there listening.

                  That’s not to say SSH is insecure, I think it’s fine to expose once you take some basic steps to lock it down, just answering the question.

              • @callcc@lemmy.world
                link
                fedilink
                English
                011 days ago

                I don’t agree about the point concerning cost. You have additional training, update, maintenance and config burden. This on top of the burdon of using the VPN on top of ssh.

              • @moonpiedumplings@programming.dev
                link
                fedilink
                English
                012 days ago

                This is moving the goal posts. You went from “ssh is not fine to expose” to “VPN’s add security”. While the second is true, it’s not what was being argued.

                Never expose your SSH port on the public web,

                Linux was designed as a multi user system. My college, Cal State Northridge, has an ssh server you can connect to, and put your site up. Many colleges continue to have a similar setup, and by putting stuff in your homedir you can have a website at no cost.

                There are plenty of usecases which involve exposing ssh to the public internet.

                And when it comes to raw vulnerabilities, ssh has had vastly less than stuff like apache httpd, which powers wordpress sites everywhere but has had so many path traversal and RCE vulns over the years.

                • @Voroxpete@sh.itjust.works
                  link
                  fedilink
                  English
                  012 days ago

                  We’re in selfhosted. If you have to bring up use cases that are in no way relevant to 99% of self hosters to justify your argument, you don’t have an argument.

          • troed
            link
            fedilink
            012 days ago

            Feel free to argue with facts. Hardening systems is my job.

  • slazer2au
    link
    fedilink
    English
    012 days ago

    I assume you have root login denied in your ssh config, other things would be having fail2ban and some geofencing (blocking IPs from countries you know you are never going to log in from).

  • Realitätsverlust
    link
    fedilink
    English
    012 days ago

    You don’t. This is normal. Ensure key-only auth, ensure you do not login directly as root, maybe install fail2ban and you’re good. Some people move the port to a nonstandard one, but that only helps with automated scanners not determined attackers.

    You could look into port-knocking if you want it really safe.

    • @suicidaleggroll@lemm.ee
      link
      fedilink
      English
      0
      edit-2
      12 days ago

      Some people move the port to a nonstandard one, but that only helps with automated scanners not determined attackers.

      While true, cleaning up your logs such that you can actually see a determined attacker rather than it just getting buried in the noise is still worthwhile.

  • @neidu3@sh.itjust.works
    link
    fedilink
    English
    0
    edit-2
    12 days ago

    I use fail2ban and a non-standard SSH port. 99% of this junk disappears if you run sshd on port 9.

    Also, disable password for login - Only use keys.

  • @csm10495@sh.itjust.works
    link
    fedilink
    English
    0
    edit-2
    12 days ago

    Bad eh security advice: use an alternative ssh port. Lots of actors try port 22 and other common alternatives. Much fewer will do a full port scan looking for an ssh server then try brute forcing.

  • enkers
    link
    fedilink
    English
    012 days ago

    I think VPN is the proper way to go about this, but another method is to do port knocking with fkwnop so your SSH port won’t respond until the host receives a magic packet.