Как разрешить определенному набору частных 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
хороший документ, если вам нужны более подробные сведения.