rsync всі файли віддаленої машини через SSH без користувача root?


68

У мене є ця команда для резервного копіювання віддаленої машини. Проблема в тому, що мені потрібні права root для читання та копіювання всіх файлів. У мене не ввімкнено кореневого користувача з міркувань безпеки і я використовую sudoспосіб Ubuntu. Мені потрібні будуть круті трубопроводи чи щось для цього?

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

3
Просто використовуйте rootрахунок в першу чергу. sudo, особливо в поєднанні з NOPASSWDрекомендованим у коментарях, не дуже покращує безпеку вашої машини.
Мартін фон Віттіч

Відповіді:


88

Я рекомендую вам в першу чергу просто скористатися кореневим обліковим записом. Якщо ви налаштуєте його так:

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

то отримана установка повинна бути досить безпечною.


sudo, особливо в поєднанні з NOPASSWDрекомендованим у коментарях, не має жодних переваг для безпеки щодо простого використання кореневого акаунта. Наприклад, ця пропозиція:

додайте у /etc/sudoersфайл наступне :rsyncuser ALL= NOPASSWD:/usr/bin/rsync

по суті, дає rsyncuserкореневі дозволи в будь-якому випадку. Ви запитаєте:

@MartinvonWittich Легко отримати повну кореневу оболонку, оскільки rsyncвиконується за допомогою sudo? Пройдіться [м] е [через], що ласка.

Ну, просто. З рекомендованою конфігурацією rsyncuserтепер може працювати rsyncяк root, навіть не запитуючи пароль. rsyncє дуже потужним інструментом для управління файлами, тому тепер rsyncuserмає дуже потужний інструмент для управління файлами з кореневими правами. Пошук способу для цього знадобився мені всього за кілька хвилин (тестований на 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ідентифікує мій обліковий запис як корінь, я можу створювати файли /etc, з яких я можу читати /etc/shadow. Мій експлойт був встановити Setuid біт на dashдвійковий; це змушує Linux завжди виконувати цей двійковий файл з дозволами власника, в цьому випадку root.

Наявність справжнього кореня не є [рекомендується] з вагомих причин. - redanimalwar 15 годин тому

Ні, незграбно працює навколо кореневого облікового запису в ситуаціях, коли цілком доречно використовувати його не з поважних причин. Це просто ще одна форма програмування культового культу - ти насправді не розумієш поняття, що стоїть за кордоном sudo vs root, ти просто сліпо застосовуєш переконання «корінь поганий, судо хороший», бо ти десь це читав.

З одного боку, бувають ситуації, коли sudo, безумовно, є правильним інструментом для роботи. Наприклад, коли ви працюєте в інтерактивному режимі на графічному робочому столі Linux, скажімо, Ubuntu, тоді використання sudoцих функцій прекрасно в тих рідкісних випадках, коли вам іноді потрібен кореневий доступ. У Ubuntu навмисно є вимкнений кореневий обліковий запис і змушує вас використовувати sudoза замовчуванням, щоб користувачі не завжди використовували кореневий обліковий запис для входу. Коли користувач просто хоче використовувати, наприклад, веб-браузер, то вхід у систему як root було б небезпечною справою , а тому відсутність кореневого облікового запису за замовчуванням заважає дурним людям робити це.

З іншого боку, є такі ситуації, як ваша, коли автоматизований сценарій вимагає кореневих дозволів на щось, наприклад, для створення резервної копії. Зараз використовувати sudoдля роботи навколо кореневого облікового запису не тільки безглуздо, але й небезпечно: на перший погляд rsyncuserсхожий на звичайний непривілейований рахунок. Але, як я вже пояснював, зловмиснику було б дуже легко отримати повний кореневий доступ, якби він вже отримав rsyncuserдоступ. Тож по суті, тепер у вас є додатковий кореневий обліковий запис, який зовсім не схожий на кореневий рахунок, що не дуже добре.


2
Приємне пояснення. Чи може бути ще одна причина використання sudo over root у ситуації, коли кілька людей виконують ролі sysadmin на сервері? Таким чином, кожен може використовувати свої власні SSH ключі замість того, щоб ділити SSH ключ root?
Натан С. Уотсон-Хей

2
@ NathanS.Watson-Haigh ти можеш так само просто ввести всі SSH ключі /root/.ssh/authorized_keysабо навіть створити кілька кореневих облікових записів у різних будинках, щоб кожен користувач міг мати власну оболонку, дім і .ssh/authorized_keys:)
Мартін фон Віттіч

2
Клавіші ssh можна обмежити лише дозволом певних команд. Безумовно, гарна ідея, оскільки якщо ви щось автоматизуєте, ви, ймовірно, будете робити ці ssh-ключі без будь-якої парольної фрази, або, принаймні, вони доступні весь час роботи машини. (мається на увазі, що корінь на цій машині надає доступ до кореня на інших машинах.)
Пітер Кордес

2
Занепокоєння Мартіна щодо використання коріння sudo справедливі, але, схоже, їх можна було б пом'якшити, вказавши точні параметри rsync у файлі sudoers. Відповідно до сторінки чоловіка sudoers (5) в Ubuntu: "Якщо Cmnd пов'язаний аргументами командного рядка, то аргументи в Cmnd повинні точно відповідати тим, які дано користувачем у командному рядку (або відповідати підстановкам, якщо такі є) . " Якщо файл sudoers вказує точну команду rsync з точними параметрами (включаючи джерело та призначення), то, здається, це повинно бути безпечним.

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

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я насправді ніколи цього не використовував, і погоджуюсь із проблемами безпеки, які виникають із дозволом бездоганного виконання rsync (тут також не пропонується) є поганим. Що tty_ticketsя тут насправді не маю, я маю на увазі потрібне питання безпеки. Це би надійно працювало, не підробляючи нічого, просто запустивши sodo на ssh і потім виконавши команду правильно? Але оскільки я задав це запитання для цілей сценарію, я повністю погоджуюся, що ключ, заснований на ssh без pw, - це захищеність і право. Натомість я прийняв відповідь Мартінса.
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
Це одне з кращих рішень, оскільки воно не потребує перенастроювання на іншому кінці - просто потрібен встановлений контрольний пропуск і ввімкнено переадресацію X, і те і інше має бути досить поширеним.
Девід Гарднер

1
Працює як шарм після установки ssh-askpass. Мені просто довелося шукати значення -chavzPe, було б чудово прописати це як довгі варіанти.
krlmlr

Я спробував це, але підказка відкривається на віддаленій машині і не пересилається на локальну машину. X11Forwarding працює очікуваним запитом, який я перевірив, xeyesвикористовуючи SSH.
Джойс Бабу

7

Якщо у вашого користувача вже є привілеї sudo, захищені паролем, я б зберігав їх як є і додаю лише строфу для використання rsync без пароля:

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

5

Я зіткнувся з цією проблемою сьогодні і вирішив її без необхідності зміни файлів конфігурації або надання дозволів кореневого рівня для облікових записів користувачів. Моя особлива настройка полягала в тому, що користувач 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 як sudo, щоб fooможна було отримати доступ до всіх каталогів користувачів, але воно вказує rsync використовувати ssh для доступу до машини barза допомогою облікових Aданих користувача. Мої потреби дещо відрізнялися від вищезазначеного питання, але це дозволило мені швидко отримати резервну копію всіх каталогів користувачів на певній машині, якою я керую, не торкаючись конфігурації системи.


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

Це не збереже власника (наприклад, root), я прав?
Андріс

3

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


1
Я відповів на цю відповідь, але було б краще з деяким поясненням того, як запустити демон rsynch і як ви використовуєте його з кореневим доступом.
Майк Ліпперт

rsync як демон не відповідатиме цьому випадку, оскільки rsync скидає права доступу root, навіть коли він запускається як root, то не всі файли можуть бути передані.
тейслер

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.