SSH: различия между версиями
(корректировка комманды) |
|||
Строка 157: | Строка 157: | ||
== Настройка входа по одноразовому паролю == | == Настройка входа по одноразовому паролю == | ||
Вход по ключу | Вход по ключу — это, конечно хорошо (особенно если ключ ещё и защищён паролем), однако при входе из общественного места может не быть возможности использовать ключ (запрещено использовать свои флешки). А если такая возможность есть, то не факт, что ваш ключ не будет скопирован, а его пароль перехвачен во время ввода. В общем ключ — это просто более надёжный пароль: его тоже можно украсть и потом невозбранно использовать для входа под вашей учётной записью. | ||
Для общественных мест хочется такую технологию входа, чтобы потенциальная компрометация ''всех'' учётных данных не дала возможности злоумышленнику войти в систему. И такая технология есть | Для общественных мест хочется иметь такую технологию входа, чтобы потенциальная компрометация ''всех'' учётных данных не дала возможности злоумышленнику войти в систему. И такая технология есть — это [http://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%BD%D0%BE%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B9_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C одноразовые пароли]. Подробнее о том, как это работает можно прочитать в [http://habrahabr.ru/post/154229/ этой статье]. Для вас же их использование будут означать, что при входе в систему, помимо пароля, нужно будет вводить некий числовой код, который будет каждый раз разным. | ||
{{Note|На время настройки, для того, чтобы не заблокировать доступ к серверу, откройте второй сеанс SSH.}} | |||
В качестве инфраструктуры для одноразовых паролей мы возьмём [https://code.google.com/p/google-authenticator/ Google Authenticator], ибо всё необходимое уже есть в репозиториях. | |||
'''Шаг 1.''' Установить пакеты: {{pkg|libpam-google-authenticator}} и {{pkg|libqrencode4}} ({{pkg|libqrencode}} в [[p8]]): | |||
<syntaxhighlight lang="bash"># apt-get install libpam-google-authenticator libqrencode4</syntaxhighlight> | |||
'''Шаг 2.''' Создать необходимые файлы у пользователя, который будет входить с одноразовым паролем. Для этого под учётной записью пользователя выполнить команду: | |||
<syntaxhighlight lang="bash">$ google-authenticator</syntaxhighlight> | |||
Будут заданы следующие вопросы: | Будут заданы следующие вопросы: | ||
* Сделать токены | * Сделать токены основанными на времени? — y; | ||
* | * Если установлен пакет {{pkg|libqrencode4}}, будет показан QR-код. В приложении Google Authenticator на телефоне нужно создать новый аккаунт и отсканировать код (если QR-код слишком велик для сканирования, можно использовать URL-ссылку над QR-кодом, чтобы получить уменьшенную версию). Если библиотека не установлена, нужно вручную ввести секретный ключ. В результате будет сгенерирован текущий одноразовый пароль; | ||
на телефоне нужно создать новый аккаунт и | * Обновить файл {{path|~/.google_authenticator}}? — y; | ||
* Обновить файл ~/.google_authenticator? | * Запретить использование одного кода несколько раз — y; | ||
* Запретить использование одного кода несколько раз | * Расширить время действия кода с 1,5 минут до 4? — n; | ||
* Расширить время действия кода с 1,5 минут до 4? | * Запретить попытки входа чаще, чем 3 раза за 30 сек? — y. | ||
* Запретить попытки входа чаще, чем 3 раза за 30 сек? | Всё, настройка для пользователя закончена. | ||
Всё, настройка для пользователя закончена. | |||
{{Note|Следует сохранить секретный ключ, код подтверждения и коды восстановления в надежном месте, например в диспетчере паролей. Коды восстановления — это единственный способ восстановить доступ, если, например, потерян доступ к приложению TOTP.}} | |||
'''Шаг 3.''' Настроить OpenSSH для поддержки этого типа аутентификации. Для этого в файле {{path|/etc/openssh/sshd_config}} включить опцию (пароли типа «запрос-ответ»): | |||
<syntaxhighlight lang="ini">ChallengeResponseAuthentication yes</syntaxhighlight> | |||
Перезагрузить файлы конфигурации OpenSSH: | |||
<syntaxhighlight lang="bash"># service sshd reload</syntaxhighlight> | |||
'''Шаг 4.''' Настроить PAM для комбинирования пользовательских паролей и PIN-кодов, генерируемых Google Authenticator. Для этого необходимо внести правки в соответствующие настройки PAM ({{path|/etc/pam.d/sshd}}). Обычно рекомендуют просто добавить гугловый пам в начало файла. В нашем случае это не заработает. Проблема в том, что модуль pam_userpass не хочет нормально работать в паре с гуглом. Если просто добавить гугл в {{path|/etc/pam.d/sshd}}, то независимо от порядка следования модулей, будет выводиться только запрос на одноразовый пароль и всегда будет access denied. | |||
Однако, не смотря на название, userpass не проверяет логин/пароль, он просто запрашивает их и сохраняет внутри стека pam. А проверяет их pam_tcb (см. {{cmd|man pam_tcb}}), причём он и сам умеет запрашивать пароль! | |||
Решение очень простое — удалить userpass, вставить на его место tcb без параметра use_first_pass. После этих манипуляций файл {{path|/etc/pam.d/sshd}} должен выглядеть так: | |||
<syntaxhighlight lang="ini">#auth required pam_userpass.so | |||
auth required pam_tcb.so shadow fork prefix=$2y$ count=8 nullok | |||
auth required pam_google_authenticator.so echo_verification_code nullok | |||
#auth include common-login-use_first_pass | |||
account include common-login | |||
password include common-login | |||
session include common-login | |||
</syntaxhighlight> | |||
{{Note|Параметр ''echo_verification_code'' включает отображение цифр одноразового кода при их вводе. Параметр ''nullok'' разрешает вход без одноразового кода для тех пользователей, у которых не настроен Google Authenticator.}} | |||
Порядок следования модулей auth важен, при таком как в примере, сначала запрашивается пароль, затем одноразовый код: | |||
<syntaxhighlight lang="bash">$ ssh user@192.168.0.122 | |||
(user@192.168.0.122) Password: | |||
(user@192.168.0.122) Verification code: 956946 | |||
Last login: Tue Feb 14 21:40:25 2023 from 192.168.0.102</syntaxhighlight> | |||
Так невозможно понять, что именно неверно, и это хорошо для безопасности. Если необходимо, чтобы авторизация завершалась сразу, замените required на requisite у pam_tcb. | |||
{{Note| Чтобы включить авторизацию по ключу SSH в качестве одного фактора и одноразовый код в качестве второго, нужно указать SSH, какие факторы использовать. Для этого в файл {{path|/etc/openssh/sshd_config}} нужно добавить строку: | |||
<syntaxhighlight lang="ini">AuthenticationMethods publickey,password publickey,keyboard-interactive</syntaxhighlight> | |||
Эта строка сообщает SSH, что для аутентификации нужно использовать ключ SSH и либо пароль, либо код подтверждения (или все три). | |||
Перезагрузить файлы конфигурации OpenSSH: | |||
<syntaxhighlight lang="bash"># service sshd reload</syntaxhighlight> | |||
Чтобы не запрашивался пароль пользователя, следует в файле {{path|/etc/pam.d/sshd}} закомментировать строку с pam_tcb. | |||
Пример подключения с использованием ключа и одноразового пароля: | |||
<syntaxhighlight lang="bash">$ ssh -i .ssh/mykey 'test@192.168.0.122' | |||
Enter passphrase for key '.ssh/mykey': | |||
(test@192.168.0.122) Verification code: 984977 | |||
Last login: Wed Feb 15 12:21:35 2023 from 192.168.0.102</syntaxhighlight> | |||
}} | |||
== Ссылки == | == Ссылки == |
Версия от 13:45, 15 февраля 2023
Создание и настройка входа через ssh
Рассматривается вопрос создания ключа пользователя и настройки для авторизации на сервере в ssh через ключ. Предполагается что ssh-сервер запущен и имеет настройки, принятые по умолчанию в ALT Linux.
Введение
ssh (secure shell) — программа для входа на удалённую машину и выполнения на ней команд.
Создание ключа
В ssh используется асимметричное шифрование, соответственно используется пара из закрытого и открытого ключа. Для создания ключа на компьютере пользователя нужно выполнить
$ ssh-keygen -t ed25519
На вопрос о файле для сохранения ключа нажать Enter (по умолчанию). Далее будет задан вопрос о пароле к ключу. Пароль нужно указать.
В каталоге ~/.ssh появляются файлы
- id_ed25519 — секретный ключ
- id_ed25519.pub — публичный ключ
Настройка входа (на сервере)
Для того, чтобы пользователь мог авторизоваться в системе через ssh-ключ, нужно в файл ~/.ssh/authorized_keys добавить содержимое файла id_ed25519.pub. Если пользователь будет один входить под этой учётной записью, файл id_ed25519.pub можно просто скопировать, назвав authorized_keys. Также можно воспользоваться утилитой ssh-copy-id, если копировать вручную не хочется: ssh-copy-id -i <путь до ключа>id_ed25519.pub user@host
Данные изменения проводятся в каталоге пользователя на сервере.
-rw------- authorized_keys -rw-r--r-- config
и на каталог
drwx------ .ssh
принадлежать файлы должны пользователю и его группе.
Пользователям XFCE может потребоваться включить явный запуск ssh-agent, чтобы его использовать:
$ xfconf-query -c xfce4-session -p /startup/ssh-agent/type -s "ssh-agent" -t string -n
Изменение вступит в силу после перелогина.
Проверка того, что ключ работает:
$ ssh-add $ ssh другая_машина
При подключении не должен запрашиваться пароль.
Использование
$ ssh user@host.name
Конфигурационный файл (у пользователя)
Для удобства в файле ~/.ssh/config можно указать сокращение
Host myserv HostName host.name
и вызывать просто как
$ ssh myserv
Можно добавить ещё настроек:
Host myserv ... User user Protocol 2 Port 2213 ForwardX11 yes ForwardAgent yes Compression yes
Чтобы не указывать пароль каждый раз при обращении к серверу, можно запустить
$ ssh-add
Будет спрошен пароль и расшифрованный ключ запомнится на время вашего сеанса. Это сработает если запущен ssh-agent (в ALT Linux он запускается автоматически при графическом входе в систему).
Настройка сервера
Инструкция по установке и настройке сервера ssh для администратора
Нужно установить пакет openssh-server, включить автоматический запуск при загрузке системы:
# chkconfig sshd on
В файле /etc/openssh/sshd_config укажите строку AllowUsers с перечислением пользователей, имеющих право подключаться к системе (также существует опция AllowGroups); например:
AllowUsers guest test best
А также для исключения возможности подбора паролей локальных пользователей рекомендуется выключить аутентификацию по паролю (обратите внимание: создать, разложить и проверить их следует заранее):
# control sshd-password-auth disabled
Для вступления настроек в силу:
# service sshd reload
LDAP
Чтобы sshd мог пускать пользователей из LDAP, нужно выполнить
# control system-auth ldap
Управление сессиями
PAM session management в openssh той версии, которая находится в Сизифе и дистрибутивах, использует privilege separation и потому исполняется с правами пользователя, а не root. Как следствие,
- pam_mktemp не сможет создать подкаталог в /tmp/.private/ с нужными правами, если его там нет;
- pam_mkhomedir не сможет создать подкаталог с нужными правами, если его там нет;
- pam_limits не сможет увеличить лимиты сверх тех, что есть у процесса openssh.
В качестве объезда можно помещать эти модули в PAM account management.
Полезные советы
Предотвращение брутфорс-атак
- Можно пересадить sshd на нестандартный порт
- Целесообразно ограничить число «ожидающих» соединений, когда пароль еще не введен. Для этого, в файле /etc/openssh/sshd_config укажите строку
MaxStartups 2:70:10
В этом случае у вас будут разрешены только 2 «ожидающих» соединения, и каждое следующее будет сброшено с вероятностью 70 %
- Для особо изощрённой защиты можно использовать knock.
- Можно ограничить число попыток средствами iptables:
iptables -A INPUT -p TCP --syn --dport 22 -m recent --name ssh_rate_limit --set iptables -A INPUT -p TCP --syn --dport 22 -m recent --name ssh_rate_limit --update --seconds 60 --hitcount 4 -j LOG iptables -A INPUT -p TCP --syn --dport 22 -m recent --name ssh_rate_limit --update --seconds 60 --hitcount 4 -j DROP
Для оптимизации этого дела настроятельно рекомендуется завести цель LOGDROP.
- Настроить fail2ban:
В файл /etc/fail2ban/jail.d/customisation.local записать
[sshd] enabled = true filter = sshd logpath = /var/log/auth/messages maxretry = 3
В файле /etc/openssh/sshd_config параметру UseDNS задать значение no.
- Либо настроить sshutout, см. описание.
Смена порта у сервера
По умолчанию протокол ssh использует 22 порт, но для предотвращения попыток входа всяких ботов по 22 порту, можно сменить этот порт на любой, не используемый на сервере
Для этого надо в Файле /etc/openssh/sshd_config задать "нестандартный" порт
...
Port 2213
...
Настройка второго sshd
Копируем /etc/init.d/sshd и указываем через -f другой конфигурационный файл? Практика показывает, что надо менять весь набор: копировать /etc/init.d/sshd, /etc/sysconfig/sshd; (факультативно делать ссылки или копировать сам sshd, /etc/pam.d/sshd); изменять посредством /etc/sysconfig/sshd переменные PIDFILE, LOCKFILE, EXTRAOPTIONS.
Копирование ключа на сервер
Если вам нужно добавить на сервер, куда вы имеете доступ, чей-то ключ, используйте
$ ssh-copy-id
Например:
$ ssh-copy-id -i friends_pub_key myserver
Cisco IOS и SSH 6.6p1
Ошибка при подключении: SSH2 0: Client DH key range mismatch with max built-in DH key on server!
в ~/.ssh/config (что бы не переопределять глобально у остальных пользователей) добавить:
Host 192.168.1.* KexAlgorithms diffie-hellman-group14-sha1,curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,\ diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
т.е. diffie-hellman-group14-sha1 - на первое место.
Настройка входа по одноразовому паролю
Вход по ключу — это, конечно хорошо (особенно если ключ ещё и защищён паролем), однако при входе из общественного места может не быть возможности использовать ключ (запрещено использовать свои флешки). А если такая возможность есть, то не факт, что ваш ключ не будет скопирован, а его пароль перехвачен во время ввода. В общем ключ — это просто более надёжный пароль: его тоже можно украсть и потом невозбранно использовать для входа под вашей учётной записью.
Для общественных мест хочется иметь такую технологию входа, чтобы потенциальная компрометация всех учётных данных не дала возможности злоумышленнику войти в систему. И такая технология есть — это одноразовые пароли. Подробнее о том, как это работает можно прочитать в этой статье. Для вас же их использование будут означать, что при входе в систему, помимо пароля, нужно будет вводить некий числовой код, который будет каждый раз разным.
В качестве инфраструктуры для одноразовых паролей мы возьмём Google Authenticator, ибо всё необходимое уже есть в репозиториях.
Шаг 1. Установить пакеты: libpam-google-authenticator и libqrencode4 (libqrencode в p8):
# apt-get install libpam-google-authenticator libqrencode4
Шаг 2. Создать необходимые файлы у пользователя, который будет входить с одноразовым паролем. Для этого под учётной записью пользователя выполнить команду:
$ google-authenticator
Будут заданы следующие вопросы:
- Сделать токены основанными на времени? — y;
- Если установлен пакет libqrencode4, будет показан QR-код. В приложении Google Authenticator на телефоне нужно создать новый аккаунт и отсканировать код (если QR-код слишком велик для сканирования, можно использовать URL-ссылку над QR-кодом, чтобы получить уменьшенную версию). Если библиотека не установлена, нужно вручную ввести секретный ключ. В результате будет сгенерирован текущий одноразовый пароль;
- Обновить файл ~/.google_authenticator? — y;
- Запретить использование одного кода несколько раз — y;
- Расширить время действия кода с 1,5 минут до 4? — n;
- Запретить попытки входа чаще, чем 3 раза за 30 сек? — y.
Всё, настройка для пользователя закончена.
Шаг 3. Настроить OpenSSH для поддержки этого типа аутентификации. Для этого в файле /etc/openssh/sshd_config включить опцию (пароли типа «запрос-ответ»):
ChallengeResponseAuthentication yes
Перезагрузить файлы конфигурации OpenSSH:
# service sshd reload
Шаг 4. Настроить PAM для комбинирования пользовательских паролей и PIN-кодов, генерируемых Google Authenticator. Для этого необходимо внести правки в соответствующие настройки PAM (/etc/pam.d/sshd). Обычно рекомендуют просто добавить гугловый пам в начало файла. В нашем случае это не заработает. Проблема в том, что модуль pam_userpass не хочет нормально работать в паре с гуглом. Если просто добавить гугл в /etc/pam.d/sshd, то независимо от порядка следования модулей, будет выводиться только запрос на одноразовый пароль и всегда будет access denied.
Однако, не смотря на название, userpass не проверяет логин/пароль, он просто запрашивает их и сохраняет внутри стека pam. А проверяет их pam_tcb (см. man pam_tcb), причём он и сам умеет запрашивать пароль!
Решение очень простое — удалить userpass, вставить на его место tcb без параметра use_first_pass. После этих манипуляций файл /etc/pam.d/sshd должен выглядеть так:
#auth required pam_userpass.so
auth required pam_tcb.so shadow fork prefix=$2y$ count=8 nullok
auth required pam_google_authenticator.so echo_verification_code nullok
#auth include common-login-use_first_pass
account include common-login
password include common-login
session include common-login
Порядок следования модулей auth важен, при таком как в примере, сначала запрашивается пароль, затем одноразовый код:
$ ssh user@192.168.0.122
(user@192.168.0.122) Password:
(user@192.168.0.122) Verification code: 956946
Last login: Tue Feb 14 21:40:25 2023 from 192.168.0.102
Так невозможно понять, что именно неверно, и это хорошо для безопасности. Если необходимо, чтобы авторизация завершалась сразу, замените required на requisite у pam_tcb.
AuthenticationMethods publickey,password publickey,keyboard-interactive
Эта строка сообщает SSH, что для аутентификации нужно использовать ключ SSH и либо пароль, либо код подтверждения (или все три).
Перезагрузить файлы конфигурации OpenSSH:
# service sshd reload
Чтобы не запрашивался пароль пользователя, следует в файле /etc/pam.d/sshd закомментировать строку с pam_tcb.
Пример подключения с использованием ключа и одноразового пароля:
$ ssh -i .ssh/mykey 'test@192.168.0.122'
Enter passphrase for key '.ssh/mykey':
(test@192.168.0.122) Verification code: 984977
Last login: Wed Feb 15 12:21:35 2023 from 192.168.0.102
Ссылки
- Документация ALM2.4
- Настройка сервера SSH (теория и практика)
- Настройка SSH в cygwin
- Автоматизация системного администрирования с помощью ssh и scp
- Защита с помощью SSH ключей
- Довольно интересные трюки (в основном по работе с большим количеством систем, в том числе через одну из них)
- http://www.linux.com/article.pl?sid=05/09/15/1655234
- http://fail2ban.sourceforge.net/
- http://www.csc.liv.ac.uk/~greg/sshdfilter/
- http://tychoish.com/rhizome/9-awesome-ssh-tricks/
- https://wiki.archlinux.org/index.php/Secure_Shell