Ограничить доступ SSH для определенных клиентов по IP-адресу

Ограничить доступ SSH для определенных клиентов по IP-адресу

Как разрешить определенному набору частных IP-адресов входить через SSH-вход (пару ключей RSA) на сервер Linux?

решение1

Вы можете ограничить, какие хосты могут подключаться, настроивTCP-обертки или фильтрация сетевого трафика (брандмауэр) с использованиемiptables. Если вы хотите использовать разные методы аутентификации в зависимости от IP-адреса клиента, настройте вместо этого демон SSH (вариант 3).

Вариант 1: Фильтрация с помощью IPTABLES

Правила Iptables оцениваются по порядку, до первого совпадения.

Например, чтобы разрешить трафик из сети 192.168.0.0/24 и в противном случае сбросить трафик (на порт 22). Правило DROPне требуется, если ваша политика iptables по умолчанию настроена на DROP.

iptables -A INPUT -p tcp --dport 22 --source 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

Вы можете добавить больше правил перед правилом сброса, чтобы соответствовать большему количеству сетей/хостов. Если у вас много сетей или адресов хостов, вам следует использоватьipsetмодуль. Также естьiprangeмодуль, позволяющий использовать любой произвольный диапазон IP-адресов.

Iptables не сохраняются при перезагрузках. Вам нужно настроить какой-то механизм для восстановления iptables при загрузке.

iptablesприменяются только к трафику IPv4. Системы, которые имеют ssh, прослушивающий адрес IPv6, необходимую настройку можно выполнить с помощью ip6tables.

Вариант 2: использование TCP-оболочек

Примечание: эта опция может отсутствовать в современных дистрибутивах, поскольку поддержка tcpwrappers была удалена изOpenSSH 6.7

Вы также можете настроить, какие хосты могут подключаться с помощью TCP-оболочек. С TCP-оболочками, в дополнение к IP-адресам, вы также можете использовать имена хостов в правилах.

По умолчанию запрещается всем хостам.

/etc/hosts.deny:

sshd : ALL

Затем перечислите разрешенные хосты в hosts.allow. Например, чтобы разрешить сеть192.168.0.0/24илокальный хост.

/etc/hosts.allow:

sshd : 192.168.0.0/24
sshd : 127.0.0.1
sshd : [::1]

Вариант 3: Конфигурация демона SSH

Вы можете настроить демон ssh в sshd_config для использования различных методов аутентификации в зависимости от адреса клиента/имени хоста. Если вы хотите только заблокировать подключение других хостов, вам следует использовать iptables или TCP-обертки.

Сначала удалите методы аутентификации по умолчанию:

PasswordAuthentication no
PubkeyAuthentication no

Затем добавьте желаемые методы аутентификации после a Match Addressв конце файла. Размещение Matchв конце файла важно, так как все строки конфигурации после него размещаются внутри условного блока до следующей Matchстроки. Например:

Match Address 127.0.0.*
    PubkeyAuthentication yes

Другие клиенты по-прежнему смогут подключаться, но вход в систему будет невозможен из-за отсутствия доступных методов аутентификации.

Аргументы соответствия и допустимые параметры условной конфигурации задокументированы в Страница руководства sshd_config. Шаблоны соответствия задокументированы вСтраница руководства ssh_config.

решение2

Вот дополнительная конфигурация для демона SSH, расширяющая предыдущий ответ:

  • Добавить фильтрацию пользователей с помощью AllowUsersпараметра в sshd_configфайле:

    AllowUsers [email protected].* [email protected].* otherid1 otherid2
    

    Это позволяетДжон Доуиадмин2только из 192.168.1.*адресов идругойid1,другойid2откуда угодно.

  • Ограничить ключ ssh или ключ на основе ca набором адресов в .ssh/authorized_keysфайле домашнего каталога указанного пользователя:

    from="192.168.1.*,192.168.2.*" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABA...etc...mnMo7n1DD useralias
    

    В этом примере открытый ключ для useralias будет действителен только с указанных адресов.

решение3

Если вы не против установки UFW (Uncomplicated FireWall):

sudo ufw allow from 192.168.1.0/24 to any port 22

Редактировать: Как уже упоминалось ранее, хорошей практикой является аутентификация только с использованием ключей вместо паролей, что можно сделать путем редактирования/etc/ssh/sshd_config:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

решение4

Если вы используете SSH CA для аутентификации клиента, вы можете указать эту source-addressопцию при подписании сертификатов:

ssh-keygen -s ca_privkey -O source-address=172.16.0.0/16 id_rsa.pub
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Сертификат id_rsa-cert.pubможно использовать для входа на хосты только с 172.16.0.0/16адресов (даже 127.0.0.1если вы не укажете и это).

man 1 ssh-keygenхороший документ, если вам нужны более подробные сведения.

Связанный контент