Skip to content

Wszystko o WordPressie, tworzeniu stron — i nie tylko

🔓 Jak uzyskać uprawnienia root w WinSCP: konfiguracja sudo do przesyłania plików

🔓 Jak uzyskać uprawnienia root w WinSCP: konfiguracja sudo do przesyłania plików

Łączą się Państwo z serwerem jako zwykły użytkownik, wchodzą do /etc/nginx i otrzymują „Permission denied". Pliki konfiguracyjne, katalogi systemowe, logi, wszystko to jest zamknięte dla konta bez uprawnień root. Natomiast bezpośrednie logowanie na root przez SSH jest na większości serwerów wyłączone ze względów bezpieczeństwa.

WinSCP, wygodny menedżer plików dla Windows, domyślnie działa w sesji SFTP z uprawnieniami użytkownika, na którego się Państwo zalogowali. Protokół SFTP nie potrafi zażądać podniesienia uprawnień „w locie", jak w terminalu: nie jest interaktywny w momencie uzgadniania połączenia i nie może wyświetlić okna do wpisania hasła sudo.

Poniżej cztery działające sposoby, aby zmusić WinSCP do pracy z uprawnieniami superużytkownika, od najprostszego do „mistrzowskiego". Każdy został sprawdzony na Ubuntu, Debianie i CentOS. Proszę wybrać ten, który najlepiej pasuje do Państwa infrastruktury.

💡 Szybki przegląd:

  • ➡️ Problem: WinSCP domyślnie nie daje uprawnień root, nawet jeśli użytkownik ma sudo.
  • Główna metoda: Podmiana polecenia uruchomienia serwera SFTP w ustawieniach witryny WinSCP, szybko i punktowo.
  • 🔄 Alternatywa: Przełączenie na protokół SCP z poleceniem sudo su - jako powłoką.
  • ⚙️ Zaawansowane: Edycja sshd_config na serwerze, globalne rozwiązanie dla wszystkich połączeń.

Krok 1: Polecenie uruchomienia serwera SFTP, metoda główna

Najpopularniejszy i najbardziej elegancki sposób na uzyskanie uprawnień root w WinSCP to zmuszenie go do uruchamiania serwera SFTP od razu w imieniu superużytkownika. Robi się to poprzez podmianę polecenia uruchomienia w ustawieniach konkretnego połączenia. Serwer nie jest przy tym rekonfigurowany, rozwiązanie działa punktowo.

Okno konfiguracji serwera SFTP w WinSCP

Instrukcja krok po kroku:

  • Proszę uruchomić WinSCP i otworzyć menedżera witryn.
  • Proszę wybrać odpowiednie połączenie i kliknąć Edytuj.
  • Proszę kliknąć Zaawansowane… na dole okna.
  • W lewym menu proszę przejść do sekcji Środowisko → SFTP.
  • W polu „Serwer SFTP" zamiast wartości „Domyślny" proszę wpisać polecenie:
1sudo /usr/lib/openssh/sftp-server

W przypadku starszych dystrybucji ścieżka może być inna. Typowe lokalizacje sftp-server:

Dystrybucja

Ścieżka do sftp-server

Ubuntu / Debian (aktualne)

/usr/lib/openssh/sftp-server

Ubuntu / Debian (starsze)

/usr/lib/sftp-server

CentOS / RHEL / Fedora

/usr/libexec/openssh/sftp-server

Amazon Linux

/usr/libexec/openssh/sftp-server

Dokładną ścieżkę na swoim serwerze można sprawdzić przez terminal: cat /etc/ssh/sshd_config | grep Subsystem. To polecenie pokaże, którego pliku binarnego używa sam serwer SSH.

System uruchomi podsystem przesyłania plików od razu z uprawnieniami root. Aby jednak zadziałało to bez błędu, Państwa użytkownik musi wykonywać sudo bez pytania o hasło, o tym w następnym kroku.


Krok 2: Konfiguracja sudoers, zezwalamy na sudo bez hasła

Ponieważ uzgadnianie połączenia SFTP nie jest interaktywne, WinSCP nie ma możliwości wyświetlenia okna do wpisania hasła sudo. Serwer po prostu zerwie połączenie z błędem, jeśli hasło jest wymagane. Rozwiązaniem jest dodanie użytkownikowi prawa do wykonania potrzebnego polecenia bez hasła poprzez plik /etc/sudoers.

Edycja pliku sudoers przez visudo

Co należy zrobić:

  • Proszę połączyć się z serwerem przez SSH (przez PuTTY lub wbudowany terminal WinSCP).
  • Proszę otworzyć edytor sudoers poleceniem sudo visudo. Nigdy nie należy edytować /etc/sudoers bezpośrednio, błąd składni zablokuje sudo dla całego systemu, a visudo sprawdza składnię przed zapisaniem.
  • Proszę dodać na końcu pliku wiersz (proszę zastąpić username swoim loginem):
1username ALL=(ALL) NOPASSWD: ALL

Daje to użytkownikowi pełny dostęp bez hasła. Bezpieczniejszy wariant to ograniczenie uprawnienia tylko do polecenia uruchomienia serwera SFTP:

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

Jeśli na serwerze jest kilku administratorów z różnymi loginami, wąskie ustawienie zmniejsza ryzyko: nawet w przypadku przejęcia konta, intruz nie uzyska root do wszystkiego, a jedynie do uruchomienia SFTP.

Proszę zwrócić uwagę: opcja requiretty w sudoers musi być wyłączona. We współczesnych implementacjach sudo-rs nie jest ona domyślnie obsługiwana, ale na starszych serwerach proszę sprawdzić i zakomentować wiersz Defaults requiretty, jeśli istnieje.


Krok 3: Przełączenie na protokół SCP, szybka alternatywa

Jeśli nie chcą się Państwo zajmować ścieżkami do sftp-server, można zmienić sam protokół przesyłania danych. WinSCP obsługuje SCP, starszy, ale niezawodny protokół, który łatwiej przejmuje ustawienia powłoki.

Konfiguracja protokołu SCP i powłoki w WinSCP

Jak się przełączyć:

  • W ustawieniach sesji WinSCP proszę zmienić File protocol z SFTP na SCP.
  • Proszę przejść do Advanced → SCP/Shell.
  • W polu Shell proszę wpisać: sudo su -

Podczas łączenia WinSCP wykona to polecenie natychmiast po zalogowaniu i przełączy sesję w tryb root.

SFTP

SCP

Uprawnienia root

Poprzez podmianę pliku binarnego serwera

Poprzez podmianę powłoki (sudo su -)

Szybkość

Wyższa, szczególnie przy dużej liczbie małych plików

Niższa

Wznawianie po przerwaniu

Jest

Nie ma

Niezawodność na starych systemach

Wymaga dokładnej ścieżki do pliku binarnego

Działa „od ręki"

Bezpieczeństwo

Można ograniczyć NOPASSWD do jednego polecenia

Potrzebne pełne sudo bez hasła

Metoda z SCP jest kompromisowa. Jest prostsza w konfiguracji, ale przegrywa z SFTP pod względem szybkości i możliwości wznawiania po przerwaniu. Przy jednorazowych poprawkach konfiguracji różnica jest niezauważalna. Do regularnego przesyłania setek plików lepiej skonfigurować metodę SFTP.


Krok 4: Globalna konfiguracja sshd_config, dla doświadczonych

To metoda dla administratorów, którzy chcą skonfigurować zachowanie serwera SSH centralnie. Sedno: zastąpić wiersz Subsystem sftp w /etc/ssh/sshd_config konstrukcją logiczną, która sama określa, czy użytkownik może wykonać sudo bez hasła, i uruchamia SFTP z odpowiednimi uprawnieniami.

Co zmieniamy:

Stary wiersz (zazwyczaj):

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

Nowy wiersz:

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

Jak to działa:

  • sudo -n true sprawdza, czy użytkownik może wykonać sudo bez hasła (flaga -n = non-interactive).
  • Jeśli tak (&&), serwer jest uruchamiany z uprawnieniami root.
  • Jeśli nie (||), serwer jest uruchamiany ze zwykłymi uprawnieniami użytkownika.

Po edycji proszę zrestartować usługę SSH: sudo systemctl restart sshd.

Ważne: błąd w składni tego pliku całkowicie zamknie dostęp do serwera przez SSH. Przed edycją proszę upewnić się, że mają Państwo drugi terminal z aktywną sesją, jeśli coś pójdzie nie tak, będą mogli Państwo cofnąć zmiany. Proszę też zrobić kopię: cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.


Specyfika serwerów w chmurze (AWS EC2, DigitalOcean)

Obrazy Linuxa w chmurze często mają wstępnie ustawione konfiguracje sudoers, które mogą zarówno uprościć, jak i skomplikować zadanie.

Konfiguracja cloud-init dla sudo w AWS EC2

AWS EC2 (Ubuntu):

Użytkownik ubuntu na obrazach Ubuntu 18.04 i nowszych często ma już potrzebne uprawnienia. Proszę sprawdzić plik /etc/sudoers.d/90-cloud-init-users, może już tam być wiersz:

1ubuntu ALL=(ALL) NOPASSWD:ALL

Jeśli on istnieje, krok 2 można pominąć. W ustawieniach WinSCP proszę użyć polecenia sudo /usr/lib/openssh/sftp-server.

AWS EC2 (Amazon Linux):

Na Amazon Linux ścieżka do sftp-server jest inna: /usr/libexec/openssh/sftp-server. Błąd w jednej literze (lib zamiast libexec) da kod błędu 127 (Command not found) i natychmiastowe zerwanie połączenia.

DigitalOcean (Droplety Ubuntu):

Na standardowych dropletach DigitalOcean użytkownik root jest domyślnie włączony, ale dostęp jest tylko przez klucz SSH. Jeśli utworzyli Państwo osobnego użytkownika, konfiguracja sudoers jest analogiczna do zwykłego Ubuntu.

Ogólna porada dla chmury: przed wpisaniem ścieżki w WinSCP proszę sprawdzić obecność pliku na serwerze: ls -la /usr/lib/openssh/sftp-server (lub analogicznie dla Państwa dystrybucji).


⁉️🤔 Często zadawane pytania

Czy trzeba włączać bezpośrednie logowanie na root, aby WinSCP działał z sudo?

Nie. Cały sens opisanych metod to używanie zwykłego konta i tymczasowe podnoszenie uprawnień przez sudo. Bezpośrednie logowanie na root (PermitRootLogin yes) jest uważane za złą praktykę bezpieczeństwa: logi nie pokażą, który z administratorów wykonał daną czynność.

Dlaczego WinSCP wyświetla błąd „Command not found" po konfiguracji?

Najprawdopodobniej podano nieprawidłową ścieżkę do sftp-server. W różnych dystrybucjach znajduje się on w /usr/lib/, /usr/lib/openssh/ lub /usr/libexec/openssh/. Dokładną ścieżkę sprawdza się poleceniem cat /etc/ssh/sshd_config | grep Subsystem na serwerze.

Na ile bezpieczne jest NOPASSWD w sudoers?

To kompromis. Pełny dostęp ALL=(ALL) NOPASSWD:ALL obniża ochronę: jeśli intruz uzyska dostęp do użytkownika, uzyska też root. Ograniczenie do konkretnego polecenia (/usr/lib/openssh/sftp-server) jest znacznie bezpieczniejsze: osoba postronna nie będzie mogła przez to konto uruchomić niczego poza serwerem SFTP.

Czy działa to z innymi klientami, FileZilla, Cyberduck?

Zasada jest taka sama, ale konfiguracja się różni. W FileZilla nie ma wygodnego pola na polecenie serwera SFTP w interfejsie graficznym, potrzebna będzie edycja pliku konfiguracyjnego. Cyberduck obsługuje opcję „SFTP Server" w ustawieniach połączenia, analogicznie do WinSCP. WinSCP wygrywa wygodą właśnie w tym scenariuszu.

Co zrobić, jeśli pliki są widoczne, ale nie można ich edytować?

Proszę sprawdzić właściciela i uprawnienia poleceniem ls -la na serwerze. Jeśli skonfigurowali Państwo serwer SFTP przez sudo, ale połączenie spadło z powrotem do zwykłych uprawnień, oznacza to, że sudo zażądał hasła i nie otrzymał odpowiedzi. Proszę jeszcze raz sprawdzić ustawienia NOPASSWD z kroku 2.

Czy można po prostu zmienić właściciela plików systemowych na swojego użytkownika?

To „brudne" obejście. Usługi systemowe oczekują, że ich konfiguracje należą do root. Zmiana właściciela (chown) lub uprawnień (chmod) na plikach systemowych może uszkodzić serwisy. Lepiej poświęcić pięć minut na konfigurację sudo i pracować poprawnie.

Jaka jest różnica między SCP a SFTP w kontekście sudo?

SCP to po prostu kopiowanie przez SSH: łatwiej przejmuje powłokę, dlatego wystarczy mu polecenie sudo su - w polu Shell. SFTP to pełnoprawny podsystem, działający jako osobny proces: dla niego potrzebny jest trik z podmianą pliku binarnego. SFTP jest szybszy i bardziej funkcjonalny, SCP jest prostszy w konfiguracji.

Czy działania są widoczne w logach podczas używania sudo przez WinSCP?

Tak. W /var/log/auth.log będzie zapis o tym, że użytkownik username podniósł uprawnienia przez sudo. To plus: jeśli administratorów jest kilku, logi pokazują, kto dokładnie wykonał operację. W przypadku bezpośredniego logowania na root takiej przejrzystości nie ma.

Co zrobić, jeśli sudo wymaga TTY, a WinSCP go nie dostarcza?

Proszę sprawdzić /etc/sudoers pod kątem opcji Defaults requiretty. Jeśli ona istnieje, proszę ją zakomentować (dodać # na początku wiersza) lub wyłączyć dla konkretnego użytkownika: Defaults:username !requiretty. Współczesne implementacje sudo-rs nie obsługują tej opcji, problem dotyczy tylko starych serwerów.

Czy można uruchomić SFTP w imieniu innego użytkownika, nie root?

Tak. Polecenie sudo -u www-data /usr/lib/openssh/sftp-server uruchomi sesję w imieniu www-data, jest to wygodne, gdy trzeba edytować pliki witryny, nie dotykając katalogów systemowych. Uprawnienia w sudoers muszą w tym celu zawierać opcję -u: username ALL=(www-data) NOPASSWD: /usr/lib/openssh/sftp-server.


Ostateczny werdykt: którą metodę wybrać

Do codziennej pracy z serwerem optymalna jest pierwsza metoda, podmiana polecenia serwera SFTP w połączeniu z wąskim ustawieniem NOPASSWD tylko na sftp-server. Jest bezpieczna, nie narusza globalnych ustawień i działa na wszystkich współczesnych dystrybucjach.

  • Jeśli mają Państwo Ubuntu / Debian i są gotowi poświęcić 5 minut na konfigurację, proszę wybrać Krok 1 + Krok 2 i nie wracać do tego tematu.
  • Jeśli serwer jest stary i nie można znaleźć ścieżki do sftp-server, proszę przełączyć się na SCP (Krok 3): wybacza on nieścisłości i działa praktycznie wszędzie.
  • Jeśli administrują Państwo kilkunastoma serwerami i chcą mieć jeden standard, proszę skonfigurować sshd_config (Krok 4) raz przez Ansible lub ręcznie, ale koniecznie z kopią zapasową.

Proszę zacząć od sprawdzenia: proszę zalogować się na serwer przez SSH i wykonać cat /etc/ssh/sshd_config | grep Subsystem. Za minutę będą już Państwo znać dokładną ścieżkę i pierwsza metoda zadziała za pierwszym razem. A jakiego sposobu przesyłania plików Państwo używają? Proszę podzielić się w komentarzach.