
У меня есть сервер во внутренней сети (вход туда через 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
файле. Создайте его вручную, если он не существует. Синтаксис файла почти такой же, как описано вчеловек хост.equiv(5), однакоДемон SSH не принимает пустые имена хостов.
# /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