В плане безопасности мне на ум приходят три дополнительных метода.
A: использовать аутентификацию с открытым ключом
Чтобы повысить безопасность, вы можете настроить свой SSH-сервер на использование аутентификации с открытым ключом. То есть, в дополнение к надежному паролю или вместо него, соединение будет открыто, только если клиент SSH предоставит закрытый ключ, который соответствует открытому ключу на сервере. Даже если злоумышленник может каким-то образом получить открытый ключ, он не сможет восстановить из этого закрытый ключ.
Однако это не скроет ваш порт от сканеров портов.
B: использовать другой порт
Кроме того, я приобрел хороший опыт с точки зрения меньшего числа сканирований портов при настройке сервера SSH для прослушивания порта, отличного от 22.
Соответствующая опция конфигурации по умолчанию в /etc/ssh/sshd_config
:
Port 22
Вы можете изменить это, скажем, 54322:
Port 54322
Не забудьте перезапустить сервер SSH впоследствии; в зависимости от Linux на вашем Raspberry, это может быть один из
# service sshd restart
# systemctl restart sshd
(Знак #
, если не в файле, должен обозначать корневую подсказку здесь, в моих примерах.)
Не волнуйтесь, ваш текущий сеанс SSH останется активным. Возможно, стоит попробовать открыть второй сеанс SSH с портом 54322, чтобы проверить, работает ли вход в систему.
Запомни
- установите ваш SSH-клиент на новый порт
- если применимо, перенаправьте новый порт вашего интернет-роутера на Raspberry Pi
C: закройте порт и откройте его только по вашему запросу
Если вы действительно не хотите показывать "Интернет", что у вас открыт этот порт, взгляните на демонов стука портов, например, knockd
. Эти программы прослушивают (закрытые) порты, определенные вами, и после последовательности стука, также определенной вами, открывают другой порт, например, ваш порт SSH.
С мобильного телефона или ноутбука вы запускаете последовательность стуков, и демон стука на вашем Raspberry Pi открывает ваш SSH-порт, который вообще не был виден.
Более подробно, стук портов добавит строку в вашу конфигурацию iptables
. Эта линия откроет порт на вашем Raspberry. Это также означает, что порт SSH должен быть закрыт iptables
раньше. А это значит, что вы не можете войти через SSH.
Пример knockd.conf
может выглядеть так:
[openclosessh]
sequence = 1000,2020,3015,65432
seq_timeout = 15
tcpflags = syn
start_command = /usr/local/bin/knockd-open.sh %IP%
cmd_timeout = 30
stop_command = /usr/local/bin/knockd-close.sh %IP%
Кроме того, не забудьте перенаправить порты, которые должны быть сбиты, с вашего интернет-маршрутизатора на Raspberry.
Соответствующие сценарии открытия / закрытия могут выглядеть так:
#!/bin/bash
# /usr/local/bin/knockd-open.sh
# adds two lines at the top of iptables which allow all incoming and outgoing traffic on tcp port 54322
iptables -I INPUT -s $1 -p tcp --dport 54322 -j ACCEPT
iptables -I OUTPUT -d $1 -p tcp --sport 54322 -j ACCEPT
а также
#!/bin/bash
# /usr/local/bin/knockd-close.sh
# deletes those two lines again
iptables -D INPUT -s $1 -p tcp --dport 54322 -j ACCEPT
iptables -D OUTPUT -d $1 -p tcp --sport 54322 -j ACCEPT
Не забудьте сделать оба скрипта исполняемыми с помощью chmod +x /usr/local/bin/knockd*
. Кроме того, вы должны запустить и включить службу knockd с одним из
# service knockd start && update-rc.d knockd enable
# systemctl start knockd && systemctl enable knockd
Особенно, если вы используете стук на удаленном компьютере, к которому у вас нет доступа к консоли, вы можете использовать atd
для автоматического отзыва любых изменений и / или перезагрузки Raspberry в случае ошибок конфигурации.
Поскольку iptables не будет автоматически сохраняться при перезагрузке, например, вы можете быть пользователем root (через su
) и
# at now + 5 minutes
> reboot
> (hit ctrl-d)
# ./script-which-closes-iptables.sh
Пример ./script-which-closes-iptables.sh
может выглядеть так (не забудьте сделать его исполняемым с помощью chmod +x
)
#!/bin/bash
# allow everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# allow only related or established incoming ssh sessions
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -m tcp --dport 54322 -j ACCEPT
# allow outgoing related or established ssh sessions
iptables -A OUTPUT -p tcp -m state --state RELATED,ESTABLISHED -m tcp --sport 54322 -j ACCEPT
# allow everything on the loopback interface
iptables -A OUTPUT -o lo -j ACCEPT
# drop everything else in and out
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Если ваш сеанс SSH умирает, Raspberry перезагрузится через 5 минут. Если ваш SSH-сеанс все еще активен, отмените ожидающую перезагрузку с помощью
# atq
15 reboot
# atrm 15
Если ваш сеанс SSH все еще активен, попробуйте войти через второй сеанс SSH. Это не должно работать. Затем используйте свой мобильный телефон и выбейте порты, которые вы настроили в /etc/knockd.conf
. После этого повторите попытку входа через второй сеанс SSH. На этот раз это должно сработать.
Затем вы можете сделать так, чтобы ваши iptables сохранялись после перезагрузки. В вашей системе вам, возможно, придется установить пакет через
# apt-get install iptables-persistent
Сохраните свои iptables с
# iptables-save > /etc/iptables/iptables-rules
и включите службу iptables с
# systemctl enable iptables