Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 20 Mar 2010 19:27:44 -0600
From:      "Peter" <fbsdq@peterk.org>
To:        "Leonidas Tsampros" <ltsampros@upnet.gr>
Cc:        Jamie Griffin <jamie@fantomatic.co.uk>, freebsd-questions@freebsd.org
Subject:   Re: securing sshd
Message-ID:  <45c7a5dcf32819443b68c881ddde9135.squirrel@pop.pknet.net>
In-Reply-To: <87wrx69b1l.fsf@upnet.gr>
References:  <201003201318.o2KDIcIt001241@fix.fantomatic.co.uk> <87wrx69b1l.fsf@upnet.gr>

next in thread | previous in thread | raw e-mail | index | archive | help
> Jamie Griffin <Jamie@fantomatic.co.uk> writes:
>
>> Hello
>>
>> I've been reading up on securing sshd after being bombarded with
>> attempted logins.
>>
>> The steps i've taken so far to make things more secure are:
>>
>> * changed the encryption method for passwords in /etc/login.conf from
>> md5 to blowfish and changed all the passwords to ridiculously obscure
>> ones (at least as obscure as I could think of).
>>
>> * changed /etc/ttys secure entries to insecure to prevent root logins on
>> the console
>>
>>   (the above are not really sshd specific i know.)
>>
>> * Disabled root login by ssh in /etc/ssh/sshd_config
>>
>> * Set myself as the only user able to login by ssh
>>
>> * Disabled password logins completely, and to only allow public key
>> authentication
>>
>> * Changed the default ssh port from 22 to something much higher
>>
>> I'm the only user that will ever need to log into the machine. I
>> wondered, does this setup seem ok and are there any other methods used
>> by anyone on list that might help me to secure remote logins even
>> further?
>
> Hi,
>
> I'm using the following pf snippet in order to "protect" myself and my
> system's logs against brute force attemps on sshd:
>
> #
> # Block them all
> #
> block log quick from <bruteforce_ssh>
>
> #
> # connection rate the incoming ssh connections and fill the bruteforce
> # table
> #
> pass in log inet proto tcp from any to any port = 22 \
>      flags S/SA keep state \
>      (max-src-conn 10, max-src-conn-rate 5/4, \
>      overload <bruteforce_ssh> flush global)
>
> For more information on how this works, take a look at pf.conf(5).
>
> I don't know if it's complete (or even good practice), but a) I think it
> works for me and b) it does not depend on a port-provided solution.
>
>> Thanks for any help.
>>
>> Jamie

On the same line, portknocking with pf:

.
..
...
# Table for allowed IPs
#  [gets auto populated via portknocking]
table <portknock_ssh> persist
.
..
...
block #default block policy
# Allow everyone to hit 'any' on port '1234' - pf proxies tcp connection
#  [if not using 'synproxy', the connection is never established to
#    'overload' the rule]
#  5 attempts in 15 seconds
pass in log quick proto tcp from any to any port {1234} synproxy state \
  (max-src-conn-rate 5/15, overload <portknock_ssh>)

#Allow IPs that have been 'overload'ed into the portknock_ssh table
pass in log quick proto tcp from {<portknock_ssh>} to any port {ssh}
.
..
...

Although ssh is blocked from all except some trusted IPs, you can still
always have access, just have to knock first.

]Peter[


Then put a crontab on a per needed basis to expire all IPs in that table
that have not been referenced in 60 seconds:

*     *    *    *     * /sbin/pfctl -vt portknock_ssh -T expire 60

All established sessions will be kept alive, all new sessions will need to
portknock after the IP is cleared from table




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?45c7a5dcf32819443b68c881ddde9135.squirrel>