SSH с фильтрацией на основе MAC-адресов с использованием iptables — рекомендуется?

SSH с фильтрацией на основе MAC-адресов с использованием iptables — рекомендуется?

У меня есть сервер во внутренней сети (вход туда через VPN), с которого я захожу на сервер через SSH с аутентификацией по открытому/закрытому ключу OpenSSH. С точки зрения безопасности я хочу привязать MAC-адреса моих трех используемых клиентов через iptablesна сервере, чтобы только эти клиенты могли войти с него.

iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT
iptables -A INPUT -p tcp --destination-port 22 -j DROP

Однако, рекомендуется ли делать это таким образом? Какие другие (лучшие) методы я могу использовать, чтобы привязать вход SSH к используемым клиентам?

(Если кто-то хочет запросить 2FA, к сожалению, 2FA не является потенциальным решением.)

Спасибо.

решение1

Я предполагаю, что вы хотите запретить вашему SSH-серверу принимать соединения от ненадежных хостов, даже если они предоставляют действительные учетные данные пользователя. Это правильно?

Возможным решением для привязки аутентификации открытого ключа пользователя к выбранным клиентским хостам является аутентификация на основе хоста. Настроив аутентификацию на основе хоста и определив AuthenticationMethodsпараметр в /etc/ssh/sshd_configлибо:

AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password

Или:

AuthenticationMethods hostbased,publickey

Это даст указание демону SSH запрашивать у клиентов аутентификацию хостов, с которых они подключаются, перед проверкой ключей или паролей пользователей. Первая альтернатива допускает аутентификацию на основе пароля, тогда как вторая ограничивает ее только открытыми ключами. Поскольку аутентификация на основе хоста основана на парах ключей, сервер SSH сможет аутентифицировать клиентов с динамическими IP-адресами.


Далее следуют полные инструкции. Документация о том, как SSH выполняет аутентификацию на основе хоста, написана вssh(1)man-страница. Обратите внимание, как SSH идентифицирует пользователей, и проверьте, применимо ли это к вашему случаю.

Аутентификация на основе хоста работает следующим образом: если машина, с которой пользователь входит в систему, указана в списке /etc/hosts.equivили /etc/ssh/shosts.equivна удаленной машине, иимена пользователей одинаковы с обеих сторон, или если файлы ~/.rhostsили ~/.shostsсуществуют в домашнем каталоге пользователя на удаленной машине исодержать строку, содержащую имя клиентской машины и имя пользователя на этой машине, пользователь рассматривается для входа. Кроме того, сервер должен иметь возможность проверить ключ хоста клиента для разрешения входа. Этот метод аутентификации закрывает дыры в безопасности из-за подмены IP, подмены DNS и подмены маршрутизации. [Примечание для администратора: /etc/hosts.equiv, ~/.rhosts, и протокол rlogin/rsh в целом изначально небезопасны и должны быть отключены, если требуется безопасность.]

Чтобы включить аутентификацию на основе хоста в OpenSSH:

  • Установите следующие значения параметров в/etc/ssh/sshd_config:
# /etc/ssh/sshd_config

HostbasedAuthentication yes
IgnoreUserKnownHosts yes
IgnoreRhosts yes

# AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
AuthenticationMethods hostbased,publickey
  • Для выполнения аутентификации на основе хоста вы можете доверять информации об имени хоста, предоставленной клиентами, установив HostbasedUsesNameFromPacketOnly yesпараметр/etc/ssh/sshd_config:
# /etc/ssh/sshd_config

HostbasedUsesNameFromPacketOnly yes
  • Или, в качестве альтернативы, вы можете настроить демон SSH для идентификации имен хостов путем разрешения IP-адресов клиентов, используя информацию, хранящуюся либо в /etc/hostsфайле, либо в записях PTR на DNS-сервере сети:
# /etc/ssh/sshd_config

HostbasedUsesNameFromPacketOnly no
UseDNS yes
# /etc/ssh/shosts.equiv

ssh-client-alpha
ssh-client-bravo
ssh-client-charlie
  • Список открытых ключей авторизованных хостов в /etc/ssh/ssh_known_hostsфайле. Удобный способ сделать это — черезssh-keyscan:
[root@ssh-server ~]# ssh-keyscan ssh-client-alpha >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-bravo >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-charlie >> /etc/ssh/ssh_known_hosts

После настройки сервера OpenSSH для приема запросов аутентификации на основе хоста клиенты также должны быть настроены для запроса аутентификации на основе хоста:

  • Установите следующие значения параметров в/etc/ssh/ssh_config:
# /etc/ssh/ssh_config

Host *
    HostbasedAuthentication yes
    EnableSSHKeySign yes
  • Убедитесь, что биты SUID/SGID вssh-keysignисполняемый файл предоставляет разрешение на чтение файлов закрытого ключа хоста:
[root@ssh-client-alpha ~]# find /usr -name ssh-keysign -ls
 16517300    616 -r-xr-sr-x   1  root     ssh_keys   630344 Feb  4 16:01 /usr/libexec/openssh/ssh-keysign

[root@ssh-client-alpha ~]# ls -l /etc/ssh/ssh_host_*key
-rw-r----- 1 root ssh_keys  480 Apr 13 06:51 /etc/ssh/ssh_host_ecdsa_key
-rw-r----- 1 root ssh_keys  387 Apr 13 06:51 /etc/ssh/ssh_host_ed25519_key
-rw-r----- 1 root ssh_keys 2578 Apr 13 06:51 /etc/ssh/ssh_host_rsa_key

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