Я хочу ограничить вход в систему root ssh со всех IP-адресов, кроме одного.
У меня создалось впечатление, что мне просто нужно было добавить это в /etc/pam.d/sshd:
account required pam_access.so
и это в /etc/security/access.conf:
-:root:ALL EXCEPT IPADDRESS
но, похоже, это не работает.
В / etc / ssh / sshd_config
# Disable Root login
PermitRootLogin no
#
# [ . . . ]
#
# At the end of the file, add:
#
# Allow Root Login via Key from Admin Bastion
Match Address 10.9.8.7
PermitRootLogin without-password
Зачем вообще разрешать root-доступ по ssh? Согласно закону Мерфи, когда вам понадобится root-доступ, вы будете находиться вдали от утвержденного IP-адреса.
Это только мое мнение, но лучший подход к этому - войти в систему как обычный пользователь, а затем выполнить su как root. Чтобы получить доступ к root, кому-то понадобится ваш пароль пользователя и пароль root. Таким образом, ваша учетная запись обычного пользователя должна быть в группе администратора или колеса в зависимости от того, какой дистрибутив Linux вы используете.
РЕДАКТИРОВАТЬ: для еще более улучшенной безопасности разрешите только предварительную аутентификацию с общим ключом для подключения ssh. Это может быть палкой о двух концах, если вы не работаете на компьютере с необходимым секретным ключом.
Я предполагаю, что это RHEL 5+, и у него есть эта проблема. Те же шаги будут работать для RHEL 4. Уловка, чтобы заставить эту работу на RHEL 5, - это добавить требуемую учетную запись pam_access.so
в /etc/pam.d/sshd на 2-й или 3-й строке. Если вы просто добавите его внизу, это не сработает.
В результате /etc/pam.d/sshd будет выглядеть как ..
# cat /etc/pam.d/sshd
#% PAM-1.0
auth включает system-auth
необходим аккаунт pam_nologin.so
необходим аккаунт pam_access.so
учетная запись включает системную аутентификацию
пароль включает system-auth
сеанс необязательный pam_keyinit.so принудительно отозвать
сеанс включает системную аутентификацию
требуется сеанс pam_loginuid.so
Для создания резервных копий и т. Д. Может потребоваться строгий root-доступ, но это может быть очень опасно. К счастью, прямой root-доступ может быть немного защищен с помощью ssh-ключей и файла authorized_keys.
Прежде всего, разрешите вход root в sshd_config, но разрешите ему выполнять только предопределенный набор команд: положить PermitRootLogin forced-commands-only
в / etc / ssh / sshd_config или в другое место, где хранится ваша конфигурация sshd. Это отключает аутентификацию по паролю для root, заставляет его использовать ssh-ключи и даже тогда разрешает только те команды, которые вы определили.
Затем войдите в систему своего клиента, который должен иметь этот прямой root-доступ, и создайте там новый ключ ssh: ssh-keygen -t rsa
. Сделайте этот ключ беспарольным, если это необходимо для скриптов.
Затем скопируйте этот недавно созданный ключ ssh на свой сервер с помощью ssh-copy-id -i ~/.ssh/id_rsa.pub root@yourserver
(если вход в систему root все еще включен), если нет, просто скопируйте содержимое ~ / .ssh / id_rsa.pub в /root/.ssh/authorized_keys
файл.
Теперь предположим, что вашему клиенту нужно запустить /root/bin/startup_skynet.sh
как root через ssh. Ваш существующий файл authorized_keys на этом этапе выглядит примерно так:
ssh-rsa FASBFAFfasdföjasfABGVEAGUPEGDJfsadnö2314235dfbösadköjsdfösdklf==
Измените его на
no-pty,no-X11-forwarding,no-agent-forwarding,no-port-forwarding,command="/root/bin/startup_skynet.sh" ssh-rsa FASBFAFfasdföjasfABGVEAGUPEGDJfsadnö2314235dfbösadköjsdfösdklf==
и сохраните его.
Затем попробуйте выполнить от своего клиента что-то вроде ssh root@myserver ls
- это должно потерпеть неудачу. Затем продолжайте и выполняйте ssh root@myserver /root/bin/startup_skynet.sh
- теперь это должно работать.
Таким образом, прямой вход в систему с правами root может быть намного более безопасным. Поскольку безопасность - это многоуровневая вещь, которую нельзя обеспечить ни одной функцией, вы все равно можете сделать больше. Если у вас есть ограниченное подмножество пользователей, которым необходимо подключиться, вы также можете использовать AllowUsers
параметр в sshd_config, чтобы разрешить соединение с предопределенного набора IP-адресов, что-то вроде AllowUsers root@192.168.1.2 root@192.168.1.3 johndoe
разрешил бы root от 192.168.1.2 и 192.168.1.3 и johndoe отовсюду.
ты пробовал :
-: ALL EXCEPT root:your_ip_address
?
Вы пробовали две строчки:
+:root:<your_ip>
-:root:ALL
Вы ищете AllowUsers в файл sshd_config (обычно находится в / etc / ssh /). А именно:
AllowUsers root@10.200.0.1
Это позволит только root входить в систему с IP 10.200.0.1 - настройка по умолчанию разрешена для всех пользователей со всех хостов ...
Единственный недостаток, который я вижу, это если вы делать использовать AllowUsers, тогда вам нужно будет перечислить все пользователей, которым вам необходим доступ - что определенно будет затруднительно для управления с достаточно большим списком пользователей (например, если они были извлечены из LDAP или другого каталога).
Это должно быть возможно в некоторой степени обойти как вариант делает разрешить использование шаблонов подстановочных знаков, согласно странице руководства:
За этим ключевым словом может следовать список шаблонов имен пользователей, разделенных пробелами. Если указано, вход в систему разрешен только для имен пользователей, соответствующих одному из шаблонов. '*' и '?' могут использоваться как подстановочные знаки в шаблонах. Действительны только имена пользователей; числовой идентификатор пользователя не распознается. По умолчанию вход разрешен для всех пользователей. Если шаблон имеет вид USER @ HOST, тогда USER и HOST проверяются отдельно, ограничивая вход в систему для определенных пользователей с определенных хостов.
Тем не менее, YMMV может быть довольно ограничительным. Надеюсь это поможет.
Я бы посоветовал вам использовать Match
особенность в sshd_config
, и сопоставить с IP (или подсетью).
Это позволит вам также указать разрешенные функции. Например: вы можете сказать, что только пользователи из «внутреннего» набора подсетей могут использовать PasswordAuthentication
(и это AllowRoot
может поступать только с одного / небольшого диапазона IP-адресов, для которых это требуется).
Также обратите внимание, что аутентификация с использованием открытого ключа не проходит через PAM, поэтому pam_access не будет работать для вас, если вы используете аутентификацию с открытым ключом.
посмотрите /etc/hosts.allow и /etc/hosts.deny
Устанавливать
PermitRootLogin without-password
в sshd_config, а затем вставьте открытый ключ с разрешенной машины в authorized_keys2 в целевой системе.
Если вы не знаете, как это сделать - в «разрешенной системе» сделайте это как root (примите значения по умолчанию и не устанавливайте пароль):
# ssh-keygen -t rsa -b 2048 # scp /root/.ssh/id_rsa.pub targetsystem:/tmp
В «целевой» системе выполните:
cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys2 rm -f /tmp/id_rsa.pub
В качестве альтернативы вы можете установить пароль на ключ ssh. Это простое решение, которое запрещает авторизацию пользователя root на основе пароля для входа в систему, вместо этого для доступа к нему используется открытый ключ только из «разрешенной» системы.
Умы подобны парашютам, потому что вы потеряли свой не значит, что вы одолжите мой ...
Я люблю дискуссии о безопасности, все думают, что их путь - единственный. Вот что вы делаете: сделайте шаг назад, посмотрите на свою инфраструктуру, рассмотрите точки доступа, а затем создайте модель, обеспечивающую достаточную безопасность, чтобы вам не приходилось слишком сильно об этом беспокоиться.
При этом мое мнение ниже:
входить в систему как root откровенно глупо. Для этого просто нет причин ... так что не делайте этого. Для пользователей с достаточными привилегиями sudo для root убедитесь, что ваша система настроена должным образом. Парольная аутентификация, отключите, используйте только SSH-ключи.
С доверенных хостов, ограниченное количество адресов / 32 для входа в систему, поскольку ваша учетная запись пользователя не должна требовать ничего, кроме вашего ключа ssh ... с ненадежных хостов используйте двухфакторную аутентификацию. Имя пользователя / пароль ... + 6-8 смена номера каждые 30 секунд ...
ПРИМЕЧАНИЕ. Эту конфигурацию можно выполнить, установив в sshd_config:
PermitRootLogin no
PasswordAuthentication no
Обратите внимание на Google-Authenticator, его очень легко установить и настроить, и он отлично справляется со своей задачей. Подобно RSA или любой другой двухфакторной настройке, у Google есть приложение для Android и iPhone, так что его легко настроить. А при подключении с ненадежных хостов пароли будут разрешены, если двухфакторная аутентификация настроена правильно.