rsync все файлы удаленной машины через SSH без пользователя root?


68

У меня есть эта команда для резервного копирования удаленной машины. Проблема в том, что мне нужны права root для чтения и копирования всех файлов. У меня нет root-пользователя, включенного по соображениям безопасности, и я использую sudoUbuntu. Нужна ли мне какая-нибудь крутая труба или что-то для этого?

rsync -chavzP --stats user@192.168.1.2:/ /media/backupdisk/myserverbackup/

3
Просто используйте rootучетную запись в первую очередь. sudoособенно в сочетании с NOPASSWDрекомендациями в комментариях, на самом деле не улучшает безопасность вашей машины.
— Мартин фон Виттих

Ответы:


89

Я бы порекомендовал вам просто использовать учетную запись root. Если вы установите его так:

  • Настройте sshd_configна целевой машине PermitRootLogin without-password.
  • Используйте ssh-keygenна машине, которая извлекает резервную копию, для создания закрытого ключа SSH (только если у вас еще нет ключа SSH). Не устанавливайте парольную фразу. Google учебник, если вам нужны детали для этого, должно быть много.
  • Добавьте содержимое /root/.ssh/id_rsa.pubрезервной машины к /root/.ssh/authorized_keysвашей целевой машине.
  • Теперь ваш резервный компьютер имеет root-доступ к целевому компьютеру без использования аутентификации по паролю.

тогда полученная установка должна быть довольно безопасной.


sudo, особенно в сочетании с NOPASSWDрекомендациями в комментариях, не имеет никаких преимуществ по сравнению с использованием только учетной записи root. Например, это предложение:

добавьте следующее в ваш /etc/sudoersфайл:rsyncuser ALL= NOPASSWD:/usr/bin/rsync

по сути, дает rsyncuserправа root в любом случае. Ты спрашиваешь:

@MartinvonWittich Легко получить полноценную корневую оболочку, потому что rsyncвыполняется с sudo? Пройдите, пожалуйста.

Ну просто. С рекомендуемой конфигурацией, rsyncuserтеперь может работать rsyncот имени пользователя root даже без запроса пароля. rsyncэто очень мощный инструмент для работы с файлами, поэтому теперь у rsyncuserнего есть очень мощный инструмент для работы с файлами с правами root. Поиск способа использовать это занял у меня всего несколько минут (протестировано на Ubuntu 13.04, требуется dash, bashне работает):

martin@martin ~ % sudo rsync --perms --chmod u+s /bin/dash /bin/rootdash
martin@martin ~ % rootdash
# whoami
root
# touch /etc/evil
# tail -n1 /etc/shadow
dnsmasq:*:15942:0:99999:7:::

Как видите, я создал себе корневую оболочку; whoamiопределяет мою учетную запись как root, я могу создавать файлы /etc, и я могу читать из /etc/shadow. Мой эксплойт состоял в том, чтобы установить бит setuid в dashдвоичном файле; это заставляет Linux всегда запускать этот двоичный файл с разрешениями владельца, в данном случае root.

Наличие настоящего корня не [рекомендуется] по уважительным причинам. - Redanimalwar 15 часов назад

Нет, неуклюже работать с учетной записью root в ситуациях, когда это абсолютно уместно, не по уважительным причинам. Это просто еще одна форма программирования грузового культа - вы на самом деле не понимаете концепции, лежащей в основе sudo vs root, вы просто слепо применяете убеждение «root is bad, sudo is good», потому что вы где-то читали это.

С одной стороны, бывают ситуации, когда sudoопределенно подходящий инструмент для работы. Например, когда вы в интерактивном режиме работаете над графическим рабочим столом Linux, скажем, Ubuntu, тогда необходимость в использовании sudoвполне подходит в тех редких случаях, когда вам иногда требуется доступ с правами root. Ubuntu преднамеренно имеет отключенную корневую учетную запись и вынуждает вас использовать ее sudoпо умолчанию, чтобы запретить пользователям просто всегда использовать корневую учетную запись для входа в систему. Если пользователь просто хочет использовать, например, веб-браузер, то вход в систему от имени пользователя root будет опасным и, следовательно, отсутствие учетной записи root по умолчанию не позволяет глупым людям делать это.

С другой стороны, существуют ситуации, подобные вашей, когда автоматизированному сценарию требуются права суперпользователя для чего-либо, например, для создания резервной копии. Теперь использование sudoдля обхода корневой учетной записи не только бессмысленно, но и опасно: на первый взгляд rsyncuserвыглядит как обычная непривилегированная учетная запись. Но, как я уже объяснил, злоумышленнику будет очень легко получить полный root-доступ, если он уже получил rsyncuserдоступ. По сути, теперь у вас есть дополнительная учетная запись root, которая совсем не похожа на учетную запись root, что не очень хорошо.


2
Хорошее объяснение. Может ли другая причина использования sudo over root быть в ситуации, когда несколько человек имеют роли sysadmin на сервере? Таким образом, каждый может использовать свои собственные ключи SSH вместо общего доступа к ключу SSH root?
— Натан Уотсон-Хей,

2
@ NathanS.Watson-Haigh, вы можете просто вставить все ключи SSH /root/.ssh/authorized_keysили даже создать несколько корневых учетных записей с разными домами, чтобы у каждого пользователя была своя оболочка, дом и .ssh/authorized_keys:)
— Martin von Wittich

2
Вы можете ограничить использование ключей ssh ​​только определенными командами. Определенно хорошая идея, так как если вы что-то автоматизируете, вы, вероятно, будете делать эти ssh-ключи без какой-либо парольной фразы или, по крайней мере, чтобы они были доступны во время работы машины. (имеется в виду, что root на этой машине предоставляет доступ к root на других машинах.)
— Peter Cordes

2
Опасения Мартина по поводу использования корня sudo действительны, но, похоже, их можно уменьшить, указав точные параметры rsync в файле sudoers. Согласно справочной странице sudoers (5) в Ubuntu: «Если Cmnd имеет связанные аргументы командной строки, то аргументы в Cmnd должны точно соответствовать аргументам, заданным пользователем в командной строке (или совпадать с подстановочными знаками, если они есть) «. Если в файле sudoers указана точная команда rsync с точными параметрами (включая источник и место назначения), то, похоже, это должно быть безопасно.

4
Одно соображение, не затронутое ранее: sshdобычно не регистрируется, какой авторизованный ключ использовался для подключения к учетной записи, поэтому, если вы подключитесь как bobтогда sudo, вы получите лучший контрольный журнал, чем при rootнепосредственном подключении bobс помощью ключа.
— Coderer

71

Используйте --rsync-pathопцию, чтобы заставить удаленную rsyncкоманду работать с sudoпривилегиями. Ваша команда должна быть, например:

rsync -chavzP --rsync-path="sudo rsync" --stats user@192.168.1.2:/ .

Если sudoвас попросят ввести пароль, вам следует избегать его, либо используя NOPASSWDпривилегию с удаленной учетной записью пользователя (бессмысленно для root, может иметь смысл в других случаях использования), либо если вы не хотите этого делать:

  • Убедитесь, что опция tty_ticketsотключена для пользователя, которого вы используете, запустив, например, sudo visudo -f /etc/sudoers.d/local-rsync и введя:

    Defaults:your.username.for.rsync !tty_tickets
    
  • Убедитесь, что эта опция requirettyотключена для пользователя, которого вы используете - по умолчанию она может быть отключена. Метод такой же, как и выше.

  • Заполните sudoпароль на удаленной машине, запустив, например, ssh -t user@192.168.1.2 sudo


1
@scai запрашиваемый пароль, скорее всего, sudoпароль, а не sshпароль
— umläute

2
@redanimalwar позволяет вашему пользователю sudo /usr/bin/rsyncбез запроса пароля; проверьте, man sudoersкак это сделать; Вы можете создать дополнительного резервного пользователя для этого.
— umläute

5
Чтобы разрешить sudo /usr/bin/rsyncзапуск без указания пароля, добавьте в /etc/sudoersфайл следующее: rsyncuser ALL= NOPASSWD:/usr/bin/rsyncЭто позволит пользователю rsyncuser (как уже упоминалось выше, лучше создать отдельного пользователя резервной копии) с нужным именем пользователя.
— M_dk

4
@M_dk теперь по rsyncсути всегда имеет права root; вероятно, очень легко получить полноценную корневую оболочку в этом аккаунте. Я думаю, что лучше всего использовать реальную учетную запись root.
— Мартин фон Виттих

1
Ответ, ни в коем случае не говоря о том, что echo "password" | somethingя на самом деле никогда не использовал это, и согласен с проблемами безопасности, связанными с разрешением sudoless выполнения rsync (также здесь не предлагается), плохой. Что tty_ticketsя на самом деле понятия не имею, кажется необходимым и проблемой безопасности. Это будет работать безопасно, ничего не настраивая, просто запустив sodo в ssh и затем выполнив команду, верно? Но так как я задал этот вопрос в целях написания сценариев, я полностью согласен с тем, что ssh без ключа на основе ключей является безопасным и правильным. Вместо этого я принял ответ Мартинса.
— Redanimalwar

17

Одним из простых способов сделать это является использование графической ssh-askpassпрограммы с sudoэтим, что позволяет обойти тот факт, что sudoон не подключен к терминалу и позволяет безопасно вводить пароль:

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  user@192.168.1.2:/ .

Конечно, ssh-askpassпрограмма должна быть установлена ​​в указанном месте, и вы должны запустить сеанс X на компьютере, на котором вы работаете. В программе есть несколько вариантов, ssh-askpassкоторые также должны работать (версии Gnome / KDE). Также графическая sudoзамена программы, как gksuили kdesudoдолжно также работать.


rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .не работает rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1], О, Ubuntu отправляет gnome-ssh-askpass, но это /usr/bin/ssh-askpassвместо /usr/lib/ssh/x11.... Так что сработало :)
— Питер Кордес

1
Это одно из лучших решений, так как оно не требует какой-либо реконфигурации на другом конце - просто нужно установить askpass и включить X forwarding, оба из которых должны быть довольно распространенными.
— Дэвид Гарднер

1
Работает как шарм после установки ssh-askpass. Мне просто нужно выяснить значение -chavzPe, было бы здорово изложить это как длинные варианты.
— krlmlr

Я попробовал это, но приглашение открывается на удаленном компьютере и не пересылается на локальный компьютер. X11Forwarding работает с ожидаемым запросом, который я проверял, xeyesиспользуя SSH.
— Джойс Бабу

7

Если у вашего пользователя уже есть привилегии sudo, которые защищены паролем, я бы оставил их как есть и добавил только раздел для использования rsync без пароля:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 

5

Я столкнулся с этой проблемой сегодня и решил ее без необходимости изменения файлов конфигурации или предоставления полномочий на уровне root для учетных записей пользователей. Моя особая установка состояла в том, что пользователь Aна машине fooдолжен был скопировать все пользовательские каталоги с fooкомпьютера на компьютер barв backupкаталоге, которым Aвладел пользователь . (Пользователь Aимеет права sudo на foo.)

Команда, которую я использовал, приведена ниже. Он был вызван пользователем Aв /homeкаталоге foo.

sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A"  * B:/home/backup

Это работает Rsync , как Судо так , чтобы все каталоги пользователей на fooможет быть доступна , но он говорит Rsync использовать SSH к машине доступа с barпомощью пользовательских Aучетных данных «s. Мои потребности немного отличались от приведенного выше вопроса, но это позволило мне быстро получить резервную копию всех пользовательских каталогов на конкретной машине, которой я управляю, без вреда для конфигурации системы.


2
Это великолепно. Я забыл про -iопцию ssh. Вы можете использовать, --rsync-path="sudo /usr/bin/rsync" если у вас есть sudo на машине bar. Это тогда делает чтение как root@fooи запись как root@bar, но передает через A@foo-> B@bar. Спасибо!
— ctbrown

Это не сохранит владельца (например, root), я прав?
— Андрис

3

Запуск rsync в качестве демона на целевой машине позволяет вам делать то, что вы хотите.


1
Я проголосовал за этот ответ, но было бы лучше с некоторыми пояснениями о том, как запустить демон rsynch и как вы его используете с правами root.
— Майк Липперт

rsync как демон не будет соответствовать этому случаю, потому что rsync будет отбрасывать права root даже при запуске от имени root, тогда не все файлы могут быть переданы.
— Teissler

2

Мое решение заключается в использовании, --rsync-path="sudo rsync"но он запрашивает пароль, обходной путь:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  user@192.168.1.2:/ .

1
Обычно не рекомендуется помещать пароли в одну строку в командной строке; например, они становятся видимыми в дереве процессов. Я иногда заменяю действительный пароль в этом типе оператора, $( cat my_password.txt )который немного лучше, но обычно предпочтительнее настроить разрешения на обоих концах и / или использовать ключи SSH таким образом, чтобы пароли не требовались в CLI
— JDS
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.