Skip to content

Все для WordPress, веб-розробки — і не тільки

🔓 Як отримати root-права в WinSCP: налаштування sudo для передачі файлів

🔓 Як отримати root-права в WinSCP: налаштування sudo для передачі файлів

Підключаєтеся до сервера під звичайним користувачем, заходите в /etc/nginx і отримуєте «Permission denied». Файли конфігурації, системні директорії, логи, усе це закрите від облікового запису без root-прав. А прямий вхід під root через SSH на більшості серверів вимкнено з міркувань безпеки.

WinSCP, зручний файловий менеджер для Windows, але за замовчуванням його SFTP-сесія працює з правами того користувача, під яким ви зайшли. Запросити підвищення привілеїв «на льоту», як у терміналі, протокол SFTP не вміє: він не інтерактивний у момент рукостискання і не може показати вікно для введення пароля sudo.

Нижче, чотири робочі способи змусити WinSCP працювати з правами суперкористувача, від найпростішого до «джедайського». Кожен перевірено на Ubuntu, Debian і CentOS. Оберіть той, який краще лягає на вашу інфраструктуру.

💡 Швидкий огляд:

  • ➡️ Проблема: WinSCP за замовчуванням не дає прав root, навіть якщо користувач має sudo.
  • Основний метод: Підміна команди запуску SFTP-сервера в налаштуваннях сайту WinSCP, швидко й точково.
  • 🔄 Альтернатива: Перемикання на протокол SCP із командою sudo su - як оболонкою.
  • ⚙️ Просунутий: Правка sshd_config на сервері, глобальне рішення для всіх підключень.

Шаг 1: Команда запуску SFTP-сервера, основний метод

Найпоширеніший і найелегантніший спосіб отримати root-права в WinSCP, змусити його запускати SFTP-сервер одразу від імені суперкористувача. Це робиться підміною команди запуску в налаштуваннях конкретного підключення. Сервер при цьому не переналаштовується, рішення працює точково.

Вікно налаштувань SFTP сервера в WinSCP

Покрокова інструкція:

  • Запустіть WinSCP і відкрийте менеджер сайтів.
  • Виберіть потрібне підключення та натисніть Редагувати.
  • Натисніть Просунуті… внизу вікна.
  • У лівому меню перейдіть до розділу Середовище → SFTP.
  • У полі «Сервер SFTP» замість значення «За замовчуванням» впишіть команду:
1sudo /usr/lib/openssh/sftp-server

Для старих дистрибутивів шлях може бути іншим. Типові розташування sftp-server:

Дистрибутив

Шлях до sftp-server

Ubuntu / Debian (актуальні)

/usr/lib/openssh/sftp-server

Ubuntu / Debian (старі)

/usr/lib/sftp-server

CentOS / RHEL / Fedora

/usr/libexec/openssh/sftp-server

Amazon Linux

/usr/libexec/openssh/sftp-server

Перевірити точний шлях на вашому сервері можна через термінал: cat /etc/ssh/sshd_config | grep Subsystem. Ця команда покаже, який бінарник використовує сам SSH-сервер.

Система запустить підсистему передавання файлів одразу з привілеями root. Але щоб це спрацювало без помилки, ваш користувач повинен виконувати sudo без запиту пароля, про це наступний крок.


Шаг 2: Налаштування sudoers, дозволяємо sudo без пароля

Оскільки SFTP-рукостискання не інтерактивне, WinSCP не має змоги показати вікно для введення пароля sudo. Сервер просто розірве з’єднання з помилкою, якщо пароль запитується. Рішення, додати користувачеві право на виконання потрібної команди без пароля через файл /etc/sudoers.

Редагування файлу sudoers через visudo

Що робити:

  • Підключіться до сервера через SSH (через PuTTY або вбудований термінал WinSCP).
  • Відкрийте редактор sudoers командою sudo visudo. Ніколи не редагуйте /etc/sudoers напряму, помилка синтаксису заблокує sudo для всієї системи, а visudo перевіряє синтаксис перед збереженням.
  • Додайте в кінець файлу рядок (замініть username на ваш логін):
1username ALL=(ALL) NOPASSWD: ALL

Це дає користувачеві повний доступ без пароля. Безпечніший варіант, обмежити дозвіл лише командою запуску SFTP-сервера:

1username ALL=NOPASSWD: /usr/lib/openssh/sftp-server

Якщо на сервері кілька адміністраторів із різними логінами, вузьке налаштування знижує ризик: навіть у разі компрометації облікового запису зловмисник не отримає root на все, а лише на запуск SFTP.

Зверніть увагу: опція requiretty у sudoers має бути вимкнена. У сучасних реалізаціях sudo-rs вона не підтримується за замовчуванням, але на старих серверах перевірте, закоментуйте рядок Defaults requiretty, якщо він є.


Шаг 3: Перемикання на протокол SCP, швидка альтернатива

Якщо возитися зі шляхами до sftp-server не хочеться, можна змінити сам протокол передавання даних. WinSCP підтримує SCP, старіший, але надійний протокол, який легше підхоплює налаштування оболонки.

Налаштування протоколу SCP та оболонки в WinSCP

Як перемкнутися:

  • У налаштуваннях сесії WinSCP змініть File protocol з SFTP на SCP.
  • Перейдіть до Advanced → SCP/Shell.
  • У полі Shell впишіть: sudo su -

Під час підключення WinSCP виконає цю команду одразу після входу й перемкне сесію в режим root.

SFTP

SCP

Права root

Через підміну бінарника сервера

Через підміну оболонки (sudo su -)

Швидкість

Вища, особливо на великій кількості дрібних файлів

Нижча

Дозавантаження після обриву

Є

Немає

Надійність на старих системах

Потребує точного шляху до бінарника

Працює «з коробки»

Безпека

Можна обмежити NOPASSWD однією командою

Потрібен повний безпарольний sudo

Метод зі SCP, компромісний. Він простіший у налаштуванні, але програє SFTP у швидкості та можливостях відновлення після обриву. Для разових правок конфігурацій різниця непомітна. Для регулярного передавання сотень файлів краще налаштувати SFTP-метод.


Шаг 4: Глобальне налаштування sshd_config, для досвідчених

Це метод для адміністраторів, які хочуть налаштувати поведінку SSH-сервера централізовано. Суть: замінити рядок Subsystem sftp у /etc/ssh/sshd_config на логічну конструкцію, яка сама визначає, чи може користувач виконати sudo без пароля, і запускає SFTP із відповідними правами.

Що міняємо:

Старий рядок (зазвичай):

1Subsystem sftp /usr/lib/openssh/sftp-server

Новий рядок:

1Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

Як це працює:

  • sudo -n true перевіряє, чи може користувач виконати sudo без пароля (прапорець -n = non-interactive).
  • Якщо так (&&), запускається сервер із правами root.
  • Якщо ні (||), сервер запускається зі звичайними правами користувача.

Після правки перезавантажте SSH-сервіс: sudo systemctl restart sshd.

Важливо: помилка в синтаксисі цього файлу повністю закриє доступ до сервера через SSH. Перед правкою переконайтеся, що у вас є другий термінал з активною сесією,, якщо щось піде не так, ви зможете відкотити зміни. І зробіть копію: cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.


Особливості хмарних серверів (AWS EC2, DigitalOcean)

Хмарні образи Linux часто мають попередньо встановлені налаштування sudoers, які можуть як спростити, так і ускладнити задачу.

Налаштування cloud-init для sudo в AWS EC2

AWS EC2 (Ubuntu):

Користувач ubuntu на образах Ubuntu 18.04 і новіших часто вже має потрібні права. Перевірте файл /etc/sudoers.d/90-cloud-init-users, там може вже бути рядок:

1ubuntu ALL=(ALL) NOPASSWD:ALL

Якщо він є, крок 2 можна пропустити. У налаштуваннях WinSCP використовуйте команду sudo /usr/lib/openssh/sftp-server.

AWS EC2 (Amazon Linux):

На Amazon Linux шлях до sftp-server відрізняється, /usr/libexec/openssh/sftp-server. Помилка в одній літері (lib замість libexec) дасть код помилки 127 (Command not found) і миттєвий розрив з’єднання.

DigitalOcean (Droplets Ubuntu):

На стандартних дроплетах DigitalOcean користувач root за замовчуванням увімкнений, але доступ лише за SSH-ключем. Якщо ви створили окремого користувача, налаштування sudoers аналогічне звичайному Ubuntu.

Загальна порада для хмари: перед тим як вписувати шлях у WinSCP, перевірте наявність файлу на сервері: ls -la /usr/lib/openssh/sftp-server (або аналог для вашого дистрибутива).


⁉️🤔 Часті питання

Чи потрібно вмикати прямий вхід під root для роботи WinSCP із sudo?

Ні. Весь сенс описаних методів, використовувати звичайний обліковий запис і тимчасово підвищувати права через sudo. Прямий вхід під root (PermitRootLogin yes) вважається поганою практикою безпеки: логи не покажуть, хто саме з адміністраторів виконав дію.

Чому WinSCP видає помилку «Command not found» після налаштування?

Найімовірніше, вказано неправильний шлях до sftp-server. У різних дистрибутивах він лежить у /usr/lib/, /usr/lib/openssh/ або /usr/libexec/openssh/. Точний шлях перевіряється командою cat /etc/ssh/sshd_config | grep Subsystem на сервері.

Наскільки безпечний NOPASSWD у sudoers?

Це компроміс. Повний доступ ALL=(ALL) NOPASSWD:ALL знижує захист: якщо зловмисник отримає доступ до користувача, він отримає і root. Обмеження конкретною командою (/usr/lib/openssh/sftp-server) суттєво безпечніше: сторонній не зможе через цей обліковий запис запустити нічого, крім SFTP-сервера.

Чи працює це з іншими клієнтами, FileZilla, Cyberduck?

Принцип той самий, але налаштування відрізняється. У FileZilla немає зручного поля для команди SFTP-сервера в графічному інтерфейсі, знадобиться правка конфігураційного файлу. Cyberduck підтримує опцію «SFTP Server» у налаштуваннях підключення, аналогічно до WinSCP. WinSCP виграє за зручністю саме в цьому сценарії.

Що робити, якщо файли видно, але вони не редагуються?

Перевірте власника та права командою ls -la на сервері. Якщо ви налаштували SFTP-сервер через sudo, але з’єднання впало назад до звичайних прав, значить, sudo запитав пароль і не отримав відповіді. Перевірте ще раз налаштування NOPASSWD із кроку 2.

Чи можна просто змінити власника системних файлів на свого користувача?

Це «брудний» обхідний шлях. Системні служби очікують, що їхніми конфігураціями володіє root. Зміна власника (chown) або прав (chmod) на системних файлах може зламати сервіси. Краще витратити п’ять хвилин на налаштування sudo і працювати правильно.

У чому різниця між SCP і SFTP у контексті sudo?

SCP — це просто копіювання через SSH: воно легше перехоплює оболонку, тому для нього достатньо команди sudo su - у полі Shell. SFTP, повноцінна підсистема, що працює як окремий процес: для неї потрібен трюк із підміною бінарника. SFTP швидший і функціональніший, SCP, простіший у налаштуванні.

Чи видно дії в логах під час використання sudo через WinSCP?

Так. У /var/log/auth.log буде запис про те, що користувач username підвищив права через sudo. Це плюс: якщо адміністраторів кілька, логи показують, хто саме виконав операцію. У разі прямого входу під root такої прозорості немає.

Що робити, якщо sudo вимагає TTY, а WinSCP його не надає?

Перевірте /etc/sudoers на наявність опції Defaults requiretty. Якщо вона є, закоментуйте її (додайте # на початку рядка) або вимкніть для конкретного користувача: Defaults:username !requiretty. Сучасні реалізації sudo-rs цю опцію не підтримують, проблема актуальна лише для старих серверів.

Чи можна запустити SFTP від імені іншого користувача, не root?

Так. Команда sudo -u www-data /usr/lib/openssh/sftp-server запустить сесію від імені www-data — це зручно, коли потрібно правити файли сайту, не чіпаючи системні директорії. Права в sudoers для цього повинні містити опцію -u: username ALL=(www-data) NOPASSWD: /usr/lib/openssh/sftp-server.


Підсумковий вердикт: який метод обрати

Для щоденної роботи з сервером оптимальний перший метод, підміна команди SFTP-сервера в поєднанні з вузьким налаштуванням NOPASSWD лише на sftp-server. Він безпечний, не зачіпає глобальні налаштування й працює на всіх сучасних дистрибутивах.

  • Якщо у вас Ubuntu / Debian і ви готові витратити 5 хвилин на налаштування, беріть Крок 1 + Крок 2 і не повертайтеся до цього питання.
  • Якщо сервер старий і шлях до sftp-server не знаходиться, перемкніться на SCP (Крок 3): він пробачає неточності й працює практично скрізь.
  • Якщо адмініструєте десяток серверів і хочете єдиний стандарт, налаштуйте sshd_config (Крок 4) один раз через Ansible або вручну, але обов’язково з бекапом.

Почніть із перевірки: зайдіть на сервер через SSH і виконайте cat /etc/ssh/sshd_config | grep Subsystem. За хвилину ви вже знатимете точний шлях, і перший метод запрацює з першої спроби. А який спосіб передавання файлів використовуєте ви, діліться в коментарях.