Я пишу сценарий bash, который будет вызываться из cron для извлечения файла с удаленного сервера один раз в день. Я использую SSH, поэтому мне нужно автоматически вводить пароль, поскольку он работает без присмотра. Вот что я до сих пор придумал:
1: создать пару ключей DSA через ssh-keygen
2: скопируйте открытый ключ на удаленный сервер
3: настроить ssh-agent
иметь дело с ключевой парольной фразой
У меня вопрос: Все это нужно? Это самый простой / лучший подход? Это действительно простая задача, поэтому я хотел бы максимально упростить настройку, сохранив при этом разумный уровень безопасности.
Дополнительная информация:
-не запущен демон rsync
-обе машины - Ubuntu linux
Все, что вы делаете, будет небезопасным без использования ssh
и sshd
.
Канонический способ - использовать scp
или даже лучше, rsync
и ключ ssh без пароля.
В качестве альтернативы создайте ключ, используемый только для копирования, и на удаленном конце отредактируйте файл authorized_keys, чтобы он содержал только команду (ы), которые вам нужно запустить, и ключ, например:
# remote_server:/home/copyuser/.ssh/authorized_keys:
command="[...]" ssh-rsa KEY_HERE user@host
А также есть scponly
доступный. Если вы создаете пользователя, установите его оболочку в /etc/passwd
к /usr/bin/scponly
и им не будет разрешено входить в систему, но они будут копировать файлы туда и обратно в соответствии с обычными разрешениями.
Хотя я полагаю, ты мог используйте закрытый ключ, защищенный парольной фразой, что обычно не рекомендуется для процессов, которые предназначены для запуска через cron. Я бы рекомендовал пропустить парольную фразу, а затем убедиться, что у любой учетной записи пользователя, которую вы используете, только очень ограниченные привилегии в целевом поле. Пропустив кодовую фразу, вам не придется возиться с ssh-agent
.
Вот мои рекомендации:
Пример строки из удаленного файла authorized_keys:
no-pty,no-agent-forwarding,no-X11-forwarding,no-port-forwarding,command="rsync --server --sender -vlogDtprze.i --ignore-errors --numeric-ids --inplace . /path/on/destination/system" ssh-rsa SSH_KEY_STRING user@host"
Точную команду для ввода вы можете получить, запустив команду rsync, которую вы планируете использовать, а затем одновременно в удаленной системе выполните «ps awwlx | grep rsync».
ПРИМЕЧАНИЕ. Одна из распространенных проблем, с которыми я сталкиваюсь, заключается в том, что при запуске задания cron отсутствует SSH-ключ удаленного хоста, поэтому он пытается спросить, в порядке ли соединение. Убедитесь, что вы поместили ключ хоста SSH удаленной системы в / etc / ssh / ssh_known_hosts (возможно, просто скопируйте его из своего собственного файла ~ / .ssh / known_hosts после подключения). В качестве альтернативы вы можете выполнить «su - $ USER_CRONJOB_RUNS_AS», а затем вручную вызвать команду и убедиться, что она работает. Кроме того, это хорошо для проверки работы.
На шаге 1 (создание ключей), когда вас попросят перефразировать, вы должны сразу нажать Enter - у вас будет пара ключей без перефразирования, затем вы можете пропустить шаг 3 (настроить ssh-agent
).
С точки зрения безопасности, в этой настройке, если ваш ssh-клиент будет скомпрометирован, тогда ssh-сервер (с которого вы тянете) также станет открытым для злоумышленника (как не root, если вы не входите в систему как root). Это не большая проблема, и это довольно распространенный способ работы. Но старайтесь периодически делать обновления безопасности в своих системах Ubuntu.
Все, что проще, чем эта установка, будет иметь довольно низкий уровень безопасности.
Варианты, описанные Serverninja обеспечит вам более высокий уровень безопасности (лучшую изоляцию между клиентом и сервером), но эти настройки имеют большие накладные расходы на настройку и их труднее отлаживать.
После того, как вы настроите пару ключей без пароля (скопируйте ключ pub в ~ / .ssh / autorized_keys на сервере), rsync будет без каких-либо дополнительных опций, как ssh и scp.