Protokół SCP (Secure Copy Protocol) to sieciowy standard transmisji danych służący do bezpiecznego kopiowania plików między lokalnym komputerem a zdalnym serwerem z wykorzystaniem szyfrowanego tunelu SSH. Mechanizm ten gwarantuje poufność przesyłanych informacji poprzez blokowanie możliwości podsłuchu ruchu sieciowego na porcie 22. To stara, ale sprawdzona metoda transferu. Działa prosto z wiersza poleceń. Nie wymaga instalowania dodatkowych agentów na serwerach.
Pamiętam doskonale wdrożenie w serwerowni na Mokotowie pod koniec zeszłego roku. Przerzucaliśmy z zespołem gigabajty logów z uszkodzonej macierzy na zapasowy sprzęt. Prawdę mówiąc, graficzne interfejsy i protokoły FTP poddały się po kilku minutach mielenia danych. My po prostu odpaliliśmy terminal, wpisaliśmy jedną linijkę z komendą SCP i poszliśmy na kawę. Transfer przeszedł bez zająknięcia. Systemy oparte na Linuksie mają ten protokół wbudowany od dekad. Administratorzy ufają mu bezgranicznie.
Jak dokładnie działa protokół SCP pod spodem?
Zasada działania opiera się na architekturze klient-serwer. Inicjujesz połączenie ze swojego terminala wpisując polecenie. Twój komputer kontaktuje się z demonem sshd działającym na maszynie docelowej. Negocjują parametry szyfrowania. Wymieniają klucze publiczne. To jest ten moment, w którym terminal pyta cię o akceptację odcisku palca nowego hosta. Jeśli wszystko się zgadza, powstaje hermetyczny tunel. Przez ten tunel system operacyjny pcha paczki danych.
Zastanawiacie się zresztą, dlaczego to na produkcji tak wyje na testach po drodze? Sam się nad tym borykałem dzisiaj u siebie we wtorek. Narzut na szyfrowanie potrafi mocno obciążyć procesor. Każdy pojedynczy bit przesyłanego archiwum musi zostać zaszyfrowany po stronie nadawcy, przesłany przez sieć i odszyfrowany po stronie odbiorcy. Starsze procesory bez instrukcji AES-NI dławią się przy gigabitowych łączach.
Oto co dokładnie dzieje się w tle:
- Program lokalny wykonuje proces potomny wywołując klienta SSH. Ten nawiązuje sesję. Uwierzytelnia użytkownika. Następnie na zdalnym serwerze odpalana jest komenda scp w specjalnym, ukrytym trybie serwera. Czeka na instrukcje.
- Oba końce zaczynają gadać własnym dialektem.
- Zaczyna się transfer blokowy.
- Po zakończeniu kopiowania procesu tunel jest gwałtownie zamykany zrzucając sesję do zera
Dlaczego SCP korzysta z SSH i portu 22?
Protokół sam w sobie nie ma absolutnie żadnych mechanizmów kryptograficznych. Został zaprojektowany jako nakładka na RCP (Remote Copy Protocol), który przesyłał wszystko czystym tekstem. Twórcy zamiast wymyślać koło na nowo, po prostu wepchnęli strumień danych w istniejący i bezpieczny protokół Secure Shell. SSH domyślnie nasłuchuje na porcie 22. Większość firewalli na świecie ma ten port otwarty dla ruchu administracyjnego.
Bez mała prawie sto procent firm hostingowych udostępnia ten port klientom. Daje to ogromną wygodę. Zmieniliśmy te zasady na robocie niedawno, przenosząc port na 2222 by odciąć chińskie boty skanujące sieć. To powszechna praktyka. Wystarczy podać odpowiednią flagę w poleceniu, żeby wskazać niestandardowy port. Czysta inżynieria.
Jak skopiować plik z Windowsa na serwer Linux używając SCP?
Kiedyś wymagało to instalacji zewnętrznych programów typu PuTTY. Teraz Windows 10 i Windows 11 mają wbudowanego klienta OpenSSH. Otwierasz wiersz poleceń (cmd) lub PowerShell. Wpisujesz polecenie z odpowiednimi argumentami. Składnia jest banalnie prosta. Najpierw podajesz to co chcesz skopiować, a potem miejsce docelowe.
Przykładowe wywołania transferu plików:
- Kopiowanie pojedynczego pliku konfiguracyjnego na serwer produkcyjny. Używasz komendy:
scp config.json [email protected]:/var/www/app/. System poprosi o hasło użytkownika admin. Po jego wpisaniu plik ląduje w docelowym katalogu. - Pobieranie logów z serwera na dysk lokalny C.
A co jeśli chcesz przenieść cały folder z milionem małych obrazków? Używasz flagi rekursywnej. Piszesz scp -r folderek/ user@serwer:/dane/. Bądź jednak ostrożny. Protokół ten bardzo słabo radzi sobie z setkami tysięcy drobnych plików. Narzut na otwieranie i zamykanie deskryptorów dla każdego pliku z osobna sprawia, że transfer wlecze się niemiłosiernie. To jest bez mała najgorsza opcja z wszystkich.
Czym różni się SCP od rsync i SFTP?
Wielu początkujących administratorów myli te trzy narzędzia. Wszystkie opierają się na SSH. Wszystkie szyfrują ruch. Mają jednak zupełnie inne przeznaczenie. SCP jest najprostszy. Działa zero-jedynkowo. Nadpisuje pliki docelowe bez pytania o zgodę. Nie potrafi wznawiać zerwanych połączeń.
Rsync to kombajn. Analizuje różnice między katalogiem źródłowym a docelowym. Przesyła tylko zmienione fragmenty plików. My na produkcji używamy rsynca do codziennych backupów baz danych. Oszczędza to terabajty transferu. SFTP z kolei to pełnoprawny system plików działający przez sieć. Pozwala na listowanie katalogów, kasowanie plików i zmianę uprawnień w locie.
| Funkcja | SCP | Rsync | SFTP |
| Wznawianie transferu | Brak | Tak (flaga –partial) | Tak (w zależności od klienta) |
| Szybkość przesyłu | Wysoka | Średnia (duży narzut na kalkulację sum kontrolnych) | Średnia |
| Transfer tylko zmian (Delta) | Nie | Tak | Nie |
| Interaktywna powłoka | Nie | Nie | Tak |
Jak wygenerować klucze SSH dla SCP żeby nie wpisywać hasła?
Wpisywanie hasła za każdym razem doprowadza do SZAŁU. Szczególnie gdy automatyzujesz procesy skryptami bashowymi. Skrypt nie wpisze hasła z klawiatury. Musisz skonfigurować uwierzytelnianie oparte na kryptografii asymetrycznej. Generujesz parę kluczy: prywatny i publiczny. Klucz prywatny trzymasz u siebie na dysku jak największą świętość. Klucz publiczny wysyłasz na serwer docelowy.
Procedura wygląda następująco. Wpisujesz w terminalu ssh-keygen -t ed25519. Wybierasz ten algorytm bo jest szybki i bezpieczny. System tworzy dwa pliki w ukrytym katalogu .ssh. Następnie używasz polecenia ssh-copy-id user@adres_serwera. Od tego momentu serwer wpuszcza cię po cichu. SCP przestaje prosić o poświadczenia. Skrypty backupowe zaczynają działać w pełni automatycznie w tle.
Jakie są najczęstsze błędy podczas transferu przez SCP?
Zawsze coś idzie nie tak. Zazwyczaj winne są uprawnienia do plików w Linuksie. Próbujesz wrzucić plik do katalogu /etc/ logując się jako zwykły użytkownik. Otrzymujesz natychmiast komunikat „Permission denied”. Musisz wrzucić plik do swojego katalogu domowego, zalogować się po SSH, podnieść uprawnienia przez sudo i dopiero przenieść plik we właściwe miejsce komendą mv.
Inny klasyk to „Host key verification failed”. Zdarza się to, gdy serwer docelowy został przeinstalowany. Jego kryptograficzny odcisk palca uległ zmianie. Twój lokalny komputer panikuje. Myśli, że ktoś wykonuje atak Man-in-the-Middle. Musisz ręcznie usunąć starą linię z pliku known_hosts na swoim dysku. Dopiero wtedy system pozwoli ci nawiązać nowe połączenie i zaakceptować nowy klucz. Takie zabezpieczenie ratuje przed poważnymi włamaniami.
Czy protokół SCP jest nadal bezpieczny w tym roku?
Samo szyfrowanie zapewnia SSH. O to nie musisz się martwić. Twórcy pakietu OpenSSH od dłuższego czasu oznaczają jednak protokół SCP jako przestarzały. W kodzie historycznych implementacji wykryto kilka niuansów pozwalających złośliwym serwerom na modyfikację ścieżek docelowych. Z tego powodu w najnowszych dystrybucjach Linuksa polecenie scp pod spodem używa tak naprawdę protokołu SFTP do wykonania transferu.
Prawdę mówiąc, nikt na ten moment do końca nie wie, czy za dwa lata OpenSSH całkowicie to wytnie z kodu źródłowego. Na razie komenda działa. Administratorzy mają ją we krwi. Składnia jest zbyt wygodna by z niej rezygnować u podstaw w codziennej pracy z serwerami w chmurze obliczeniowej.
Otwórz swój terminal. Zaloguj się na dowolną maszynę wirtualną. Spróbuj przerzucić plik tekstowy na pulpit. Zobaczysz, jak szybko i bezpośrednio można zarządzać danymi bez obciążających system interfejsów okienkowych. Przerzuć się całkowicie na klucze Ed25519, zablokuj logowanie hasłem w pliku konfiguracyjnym serwera i przestań martwić się o bezpieczeństwo portu 22.
Najczęściej zadawane pytania (FAQ)
- Co to jest protokół SCP?
SCP (Secure Copy Protocol) to narzędzie wiersza poleceń do bezpiecznego przesyłania plików między komputerami w sieci. Wykorzystuje protokół SSH do szyfrowania danych i uwierzytelniania, co zapobiega podsłuchiwaniu transferu. - Jaki port wykorzystuje SCP?
Domyślnie SCP korzysta z portu 22, czyli dokładnie tego samego portu, na którym nasłuchuje usługa SSH. Można go zmienić za pomocą flagi -P (wielkie P) w wywołaniu komendy. - Jak skopiować cały katalog przez SCP?
Aby skopiować cały folder wraz z jego zawartością, należy użyć flagi -r (rekursywnie). Przykład:scp -r lokalny_folder uzytkownik@serwer:/sciezka/docelowa/ - Czym różni się SCP od SFTP?
SCP służy do jednorazowego, bezpośredniego kopiowania plików. SFTP to interaktywny system plików, który pozwala na przeglądanie katalogów, usuwanie plików i wznawianie przerwanych transferów. Oba szyfrują dane przez SSH. - Dlaczego dostaję błąd Permission denied przy SCP?
Błąd ten oznacza, że użytkownik, na którego logujesz się po stronie serwera docelowego, nie ma praw zapisu w wybranym katalogu. Należy zmienić ścieżkę docelową na katalog domowy użytkownika lub poprawić uprawnienia na serwerze. - Czy można używać SCP w Windowsie?
Tak, nowoczesne wersje Windows 10 i Windows 11 mają wbudowanego klienta OpenSSH. Komendę scp można wywołać natywnie z poziomu wiersza poleceń (cmd) lub PowerShell.
Bibliografia
1. OpenSSH – https://www.openssh.com
2. Internet Engineering Task Force – https://www.ietf.org
3. The Linux Kernel Archives – https://kernel.org
4. Microsoft Learn – https://learn.microsoft.com
5. Wydawnictwo Naukowe PWN – https://pwn.pl
