Ограничение доступа к SSH с динамическим IP-адресом

Я отключил PasswordAuthentication для SSH и использую общедоступный закрытый ключ для входа в систему. Однако много руководств (в частности, этот) я видел, предлагают только предоставить доступ SSH от моего конкретного IP-адреса.

/etc/ssh/sshd_config:
    AllowUsers deploy@(your-ip) deploy@(another-ip-if-any)

ufw allow from {your-ip} to any port 22
  • Есть ли любая точка в restrictring IP-адресом в sshd_config И добавление правила брандмауэра?

  • Принятие у меня есть динамический IP-адрес, затем такие правила, казалось бы бесполезным, поскольку я должен использовать консольный терминал поставщиков услуг хостинга, войти для укоренения для предоставления доступа от моего домашнего IP. В этом случае: каков предложенный маршрут?

1: Запретите все логины SSH, если я сначала не использую терминал поставщиков услуг хостинга, вхожу в систему корень для предоставления доступа от моего домашнего IP до SSH?

2: Сохраните порт SSH открытым и доверие общедоступному закрытому ключу для входа в систему.

3: Какие-либо другие предложения?

3
задан 8 February 2017 в 17:03

2 ответа

Ну, я сделал много рытья и ничего не нашел. Так, я настроил свой домашний компьютер с динамическим сервисом DNS и создал следующий сценарий удара, надо надеяться, это будет полезно для кого-то еще.

Инструкции:

  • Этот сценарий не характерен для SSH и является способом предоставить постоянный доступ хоста dynamnic к целевому порту с помощью ufw - не важный из того, какой сервис слушает на том порте. Так, использование порта 22 (по умолчанию) предоставило бы постоянный доступ от динамического хоста до SSH. Аналогично, Вы могли использовать этот сценарий для обеспечения постоянного доступа от динамического хоста до чего-то как FTP (порт 21).

  • Все, что требуется, изменяет RemoteHostName и PortNumber переменные наверху файла. Очевидно, эти RemoteHostName имя хоста, обеспеченное динамическим поставщиком DNS, и эти PortNumber порт, к которому мы предоставляем доступ.

  • , Если IP, который разрешен от RemoteHostName уже, существует в ufw с доступом к целевому порту, затем выходы сценария, как нет ничего для изменения.

  • , Если это не существует, затем все записи с числом целевого порта в ufw удалены, и новая запись затем добавляется с помощью обновленного IP-адреса и целевого порта. Короче говоря, сделайте не попытка использовать ufw для других правил, вовлекающих порт в сценарий, когда сценарий будет идти на всем протяжении их.

  • , Если этот сценарий называют задание крона или что-то, затем он должен в теории всегда держать IP-адрес в курсе в ufw.

  • сценарий производит следующее:

    1) Standard output: Could not resolve the IP address of the RemoveHostName XYZ
    2) Standard output: No change necessary as the IP address XYZ already has access to port XYZ.
    3) Standard output: Deleting old ufw rule: XYZ
    4) Standard output: Adding new ufw rule: XYZ
    5) Error output: Could not resolve the IP address of the RemoveHostName XYZ
    
  • отметьте, хотя, я не очень знаком со сценариями удара и столь же незнаком с регулярными выражениями. Таким образом, если Вы используете этот сценарий, делаете себе одолжение (и меня!) и взглянули по нему. Если Вы замечаете какие-либо ошибки, оставьте комментарий и или новый ответ.

Сценарий:

#!/bin/bash


##############################################################
#Variables
##############################################################    
RemoteHostName=someremotehost.dyndnsorsomething.com
PortNumber="22"


##############################################################
#Check if the dynamic IP address exists within ufw.
##############################################################
DynamicIPAddress=$(host $RemoteHostName | awk '/has address/ { print $4 }')
if [[ $DynamicIPAddress = "" ]]
then
    echo $(date -u -Iseconds): Could not resolve the IP address of the RemoveHostName $RemoteHostName >&2
    exit
fi

UFWRules=$(ufw status numbered)
REGEX=" $PortNumber (.*)ALLOW IN(.*)$DynamicIPAddress$"
while read -r line; do
    if [[ $line =~ $REGEX ]]
    then
        echo $(date -u -Iseconds): No change necessary as the IP address $DynamicIPAddress already has access to port $PortNumber.
        exit
    fi
done <<< "$UFWRules"


##############################################################
#Remove all entries with the given port number.
##############################################################
while true
do

    UFWRules=$(ufw status numbered)
    REGEX="(.*) $PortNumber (.*)ALLOW IN(.*)"
    Matched="No"
    while read -r line; do
        if [[ $line =~ $REGEX ]]
        then
            echo $(date -u -Iseconds): Deleting old ufw rule: $line
            RuleNumber=$(echo $line | (cut -d "[" -f2 | cut -d "]" -f1))
            ufw --force delete $RuleNumber
            Matched="Yes"
            break
        fi
    done <<< "$UFWRules"

    if [ $Matched = "No" ]
    then
        break
    fi

done


##############################################################
#Add in access from the dynamic IP address.
##############################################################
echo $(date -u -Iseconds): Adding new ufw rule: "ufw allow from $DynamicIPAddress to any port $PortNumber".
ufw allow from $DynamicIPAddress to any port $PortNumber
1
ответ дан 1 December 2019 в 17:31

При выполнении веб-сервера на том же хосте что означает, что PHP также, вероятно, установлен, то можно установить инструмент, который я записал, используйте и активно поддержите:

https://github.com/cubiclesoft/web-knocker-firewall-service /

Клиенты, которым нужен доступ SSH, выполняют клиентскую часть как системную службу на их предпочтительной ОС. Клиент сохраняет порт SSH сервера и любые другие резервируемые порты (например, POP3/IMAP) открытый с нечастыми, зашифрованными пакетами. Это - довольно хорошее решение "выпустил-забыл". У меня лично были нулевые проблемы с программным обеспечением, но Вы могли бы хотеть протестировать его на капельке DigitalOcean или подобном сервисе прежде, чем развернуть его на Вашей продуктивной среде. Порты сохранены открытыми в течение максимум 30 минут (значение по умолчанию), если пакеты обновления не отправляются (клиент делает попытку обновления каждые 10 минут по умолчанию), который позволяет, чтобы IP-адреса изменились с минимальным временем простоя. Когда порты открыты для IP-адреса, уведомления по электронной почте дополнительно отправляются в то, кто бы ни настроен для получения таких уведомлений.

цель состоит в том, чтобы существенно ограничить поверхность атаки путем закрытия чувствительного порта (портов) всем, у кого нет ключей шифрования для клиентов на динамическом дюйм/с, где установка сложной VPN не является опцией. Даже если взломщик волнует на том же разблокированном IP-адресе (например, ноутбук на WiFi кафе), они все еще должны пройти через SSH, но по крайней мере Россия, Китай и Северная Корея не могут даже видеть порт.

Между прочим, я не использую ufw. Это загрязняет iptables набором ненужных цепочек, делает правила iptables путем более сложный, чем они должны быть, и больше правил приравнивается к более медленной пакетной обработке через iptables. Я записал сообщение не слишком долго назад при записи изящных правил iptables:

http://cubicspot.blogspot.com/2016/06/elegant-iptables-rules-for-your-linux.html

Это является на самом деле намного легче использовать iptables непосредственно и является менее неловким, чем ufw, когда Вы можете хорошая паста копии, убрать rulesets. Плюс, Вы никогда не знаете, когда Вы застрянете на поле CentOS.

0
ответ дан 1 December 2019 в 17:31

Другие вопросы по тегам:

Похожие вопросы: