Powrót do bloga

Przegląd SSH – serwery, klienci i klucze SSH

Przegląd SSH – serwery, klienci i klucze SSH

Jeśli chodzi o zdalne przetwarzanie danych, SSH jest jednym z najpopularniejszych i najbezpieczniejszych protokołów. SSH to kryptograficzny protokół sieciowy, który ustanawia bezpieczne połączenie ze zdalnymi urządzeniami. Po połączeniu ze zdalnym urządzeniem użytkownik może uruchamiać polecenia w zdalnej powłoce. SSH jest najczęściej stosowany wśród administratorów sieciowych i systemowych.

Ten przewodnik w formie ściągawki przedstawia omówienie SSH, kilka typowych sposobów łączenia się za pomocą SSH oraz różne konfiguracje SSH.

Omówienie SSH

SSH to akronim od Secure Shell. Niektórzy określają SSH również jako Secure Socket Shell. SSH to najpopularniejszy sposób uzyskiwania dostępu do zdalnego serwera. Podczas łączenia się ze zdalnym systemem za pomocą SSH łączysz się z istniejącym kontem. Po połączeniu uzyskasz dostęp do sesji powłoki. Wszystkie uruchamiane polecenia będą wykonywane na zdalnej maszynie, a ich wynik będzie wyświetlany na Twoim lokalnym terminalu.

Połączenie SSH działa w modelu klient-serwer. Zdalny system musi mieć uruchomionego demona SSH, aby akceptować zdalne połączenia SSH. Demon SSH nasłuchuje na określonych portach, uwierzytelnia żądania połączeń i generuje odpowiednie środowisko po spełnieniu warunków.

Na potrzeby tego przewodnika skonfigurowaliśmy dwa serwery Ubuntu. Główny serwer zostanie skonfigurowany do łączenia się z serwerem pomocniczym. Serwer pomocniczy zostanie skonfigurowany tak, aby akceptować połączenia SSH z głównego serwera. Te adresy IP serwerów będą używane w całym przewodniku:

  • Główny: 31.171.250.121

  • Pomocniczy: 31.171.250.130

Na początek możesz zapoznać się z naszymi szczegółowymi przewodnikami na temat tego, jak używać SSH do łączenia się ze zdalnym serwerem w Ubuntu oraz jak skonfigurować serwer Linux do korzystania z uwierzytelniania opartego na kluczach SSH. A teraz zacznijmy!

Uwierzytelnianie SSH

Istnieją dwa główne typy uwierzytelniania SSH. Tradycyjna metoda polega na użyciu hasła. Jest ona mniej bezpieczna i zdecydowanie niezalecana. Druga metoda to klucze SSH. Klucze SSH oferują bardzo wysoki poziom bezpieczeństwa i są zdecydowanie zalecane.

Choć uwierzytelnianie hasłem jest prostsze do zrozumienia i skonfigurowania, łatwo je złamać. Na przykład zautomatyzowane boty mogą użyć metody brute force, aby włamać się do systemu. Klucze SSH to klucze kryptograficzne. Każdy klucz składa się z dwóch części – klucza prywatnego i klucza publicznego. Klucz publiczny można udostępniać w dowolnym miejscu bez obaw. Jednak klucz prywatny musi pozostać chroniony.

Aby używać kluczy SSH jako metody uwierzytelniania, zdalny system musi mieć zainstalowaną kopię klucza publicznego. Kopie kluczy prywatnych i publicznych powinny być również zainstalowane w systemie lokalnym. Domyślnie klucze publiczne są wymienione w następującym pliku. Każdy unikalny użytkownik ma unikalną kopię tego pliku:

Oto jak działa proces uwierzytelniania:

  • System kliencki wysyła żądanie połączenia do systemu zdalnego. Przesyła również informację, którego klucza SSH użyć.

  • System zdalny sprawdza, czy klucz publiczny znajduje się na liście w authorized_keys.

  • Jeśli klucz istnieje, generowany jest losowy ciąg znaków i szyfrowany przy użyciu klucza publicznego. Zaszyfrowana wiadomość może zostać odszyfrowana wyłącznie przy użyciu klucza prywatnego.

  • Po otrzymaniu ciągu znaków klient go odszyfruje.

  • Po połączeniu ciągu znaków i wcześniej wynegocjowanego identyfikatora sesji generowany jest skrót MD5. Klient wysyła skrót MD5 do systemu zdalnego.

  • Zdalny system zna losowy ciąg znaków oraz identyfikator sesji. Jeśli skrót MD5 się zgadza, połączenie zostaje zezwolone.

Klucze SSH

W tym przewodniku klucz SSH będzie głównym elementem uwierzytelniania. Dlatego ta sekcja skupi się na tym, jak pracować z kluczami SSH.

  • Generowanie pary kluczy SSH

Domyślnie system Linux nie ma zainstalowanego klucza SSH. Jednak system może zawierać klucze SSH wygenerowane/zainstalowane wcześniej. Zakładając, że nie ma wcześniejszego klucza SSH, musimy wygenerować nową parę kluczy SSH: publiczny i prywatny. SSH obsługuje wiele algorytmów kryptograficznych do generowania kluczy SSH, na przykład RSA, DSA, ECDSA i EdDSA. RSA jest domyślnym i preferowanym algorytmem.

  • Generowanie zwykłej pary kluczy RSA

Aby wygenerować parę kluczy SSH, uruchom następujące polecenie:

SSH Keygen

Monit zapyta Cię, gdzie zapisać parę kluczy. Jak wspomniano, będzie to para kluczy RSA. Jeśli nie zostanie wprowadzona żadna wartość, SSH zapisze ją w domyślnej lokalizacji /home/demo/.ssh/id_rsa.

Kolejnym krokiem jest wprowadzenie hasła. Zaleca się użycie hasła. Długość hasła jest dowolna. Dodaje ono dodatkową warstwę bezpieczeństwa. Jednak SSH pozwala na generowanie kluczy bez żadnego hasła. Po prostu naciśnij Enter, jeśli chcesz uzyskać klucze bez hasła.

Końcowy wynik dostarcza następujących kluczowych informacji:

  1. Lokalizacja klucza prywatnego ( /root/.ssh/id_rsa). Nigdy nie należy go udostępniać.

  2. Lokalizacja klucza publicznego ( /root/.ssh/id_rsa.pub). Można go bezpiecznie udostępnić każdemu.

  3. Odcisk palca klucza.

  4. Losowy obraz klucza. Chodzi o to, że w przypadku naruszenia bezpieczeństwa kluczy, prawdopodobnie będzie można to zauważyć, dostrzegając jakąkolwiek zmianę w obrazie klucza.

  • Generowanie pary kluczy RSA o innej liczbie bitów

Domyślnie klucze SSH mają 2048 bitów. Ze względów bezpieczeństwa uważa się to za wystarczające. Możemy jednak ręcznie określić inną liczbę bitów. Im wyższa wartość bitowa, tym silniejszy jest klucz.

Uruchom następujące polecenie, aby wygenerować parę kluczy SSH o długości 4096 bitów. Większość serwerów obsługuje 4096-bitowe klucze SSH. Jeśli klucz jest zbyt duży, może nie zostać zaakceptowany ze względu na ochronę przed atakami DDoS:

SSH Keygen with bitsPonieważ wygenerowaliśmy już parę kluczy, SSH zapyta, czy nadpisać poprzednią. Reszta procesu jest taka sama, jak w przypadku generowania zwykłej pary kluczy.

  • Zmiana hasła klucza prywatnego

Możemy zmienić hasło klucza prywatnego. Proces ten wymaga znajomości obecnego hasła. Aby zmienić hasło, uruchom następujące polecenie:

SSH Keygen Password Change

Polecenie poprosi o podanie lokalizacji klucza prywatnego. Naciśnij Enter, jeśli klucz jest przechowywany w domyślnej lokalizacji. Wprowadź aktualne hasło. Jeśli zostanie zaakceptowane, możesz wskazać nowe.

  • Wyświetlanie odcisku palca klucza SSH

Każda para kluczy SSH posiada wspólny odcisk kryptograficzny. Odcisk ten może być użyty do identyfikacji unikalnych kluczy. Może to być przydatne w wielu sytuacjach. Uruchom następujące polecenie, aby sprawdzić odcisk palca klucza SSH:

SSH Key Fingerprint

Wprowadź lokalizację klucza. Naciśnij Enter, jeśli klucz jest przechowywany w domyślnej lokalizacji.

Kopiowanie klucza publicznego

Para kluczy SSH jest gotowa do zabezpieczania połączeń zdalnych. Aby system zdalny zaakceptował klucz SSH do uwierzytelniania, musi posiadać kopię klucza publicznego. Istnieje wiele sposobów na skopiowanie klucza publicznego na serwer zdalny.

  • Użycie ssh-copy-id

Narzędzie ssh-copy-id jest dostarczane jako część pakietu OpenSSH. Jest to domyślny sposób kopiowania klucza publicznego SSH. Jest proste i łatwe w użyciu. Uruchom następujące polecenie, aby przesłać kopię klucza publicznego:

SSH Copy ID

Do zakończenia procesu wymagane jest hasło do konta użytkownika zdalnego. Jeśli operacja się powiedzie, zostanie wyświetlony komunikat o sukcesie.

  • Użycie połączenia SSH

Jeśli użycie narzędzia ssh-copy-id nie jest możliwe, ale serwer główny może połączyć się z serwerem pomocniczym za pomocą SSH, możemy użyć innej sztuczki do skopiowania klucza. Polega ona na przesłaniu zawartości klucza publicznego potokiem przez polecenie SSH na stronę zdalną. Pamiętaj, że jeśli katalog ~/.ssh nie istnieje w systemie zdalnym, może to nie zadziałać:

SSH Copy

  • Kopiowanie ręczne

Jeśli połączenie zdalne nie wchodzi w grę, jedynym pozostałym procesem jest ręczne dodanie klucza publicznego do serwera zdalnego. Najpierw pobierz zawartość klucza publicznego:

Na serwerze zdalnym umieść klucz w odpowiedniej lokalizacji:

Korzystanie z SSH

Po ustawieniu klucza publicznego jesteśmy gotowi do użycia SSH w celu nawiązania połączenia zdalnego.

  • Łączenie z systemem zdalnym

Pierwszym krokiem jest nauka łączenia się z systemem zdalnym za pomocą SSH. Zakłada to, że zarówno system lokalny, jak i zdalny zezwalają na ruch SSH. Aby połączyć się ze zdalnym systemem, wpisz następujące polecenie:

SSH Login Without User

Aby połączyć się jako konkretny użytkownik na serwerze zdalnym, użyj zamiast tego następującej struktury:

SSH Login with User

Jeśli łączysz się z serwerem po raz pierwszy, SSH może wyświetlić ostrzeżenie. Wpisz yes, aby kontynuować połączenie. Jeśli konto zdalne jest chronione hasłem, musisz wprowadzić hasło. Jeśli klucz SSH jest chroniony hasłem (passphrase), również musisz je wprowadzić.

  • Łączenie z innym portem

Domyślnie SSH działa na porcie 22. Klient SSH przyjmie domyślną wartość portu podczas łączenia się z systemem zdalnym. Jeśli jednak system zdalny nasłuchuje ruchu SSH na innym porcie, to nie zadziała. W takiej sytuacji musimy ręcznie zadeklarować numer portu. Aby zadeklarować konkretny port, użyj -p flagi:

Ręczne deklarowanie portu za każdym razem jest nieefektywne. Możemy zmienić domyślną wartość portu na stałe. Aby to zrobić, otwórz plik konfiguracyjny SSH. Jeśli plik nie istnieje, poniższe polecenie go utworzy:

Następnie dodaj następujące linie:

  • Uruchamianie poleceń na zdalnym serwerze

Po nawiązaniu połączenia każde polecenie uruchomione w lokalnym terminalu zostanie przesłane do zdalnego serwera. Wszelkie wygenerowane dane wyjściowe zostaną odesłane do lokalnego terminala.

Jeśli do uruchomienia jest tylko jedno polecenie, możemy je wykonać bez pełnego logowania przez SSH. Możemy po prostu zadeklarować polecenie po instrukcji połączenia SSH:

  • Dodawanie klucza do agenta SSH

Jeśli klucz SSH jest zabezpieczony hasłem (passphrase), przy każdym połączeniu ze zdalnym systemem trzeba będzie je wprowadzić. Wielokrotne powtarzanie tego jest nieefektywne. Możemy pozwolić, aby zajął się tym agent SSH. Jest to małe narzędzie, które przechowuje klucz prywatny po wprowadzeniu hasła. Klucz prywatny będzie dostępny podczas sesji terminala. Aby uruchomić agenta SSH, wykonaj następujące polecenie:

SSH Agent

Program działa w tle. Jedyne, co musisz zrobić, to dodać swój klucz prywatny do agenta. Uruchom następujące polecenie:

SSH Add

Wprowadź hasło (passphrase), aby zakończyć operację.

  • Przekazywanie poświadczeń SSH

Możemy również skonfigurować SSH tak, aby łączyć się z jednego serwera na drugi bez użycia hasła. Może to być bardzo wydajne, szczególnie przy pracy z wieloma zdalnymi serwerami. Aby to osiągnąć, musimy przekazać poświadczenia SSH. Przekazywanie poświadczeń SSH wymaga, aby zdalny serwer był skonfigurowany do akceptowania połączeń z lokalnej maszyny/serwera. Następnie wystarczy połączyć się z pierwszym serwerem za pomocą -A flagi. Przekazuje ona Twoje poświadczenia do serwerów na czas bieżącej sesji:

Konfiguracje serwera zdalnego

Ta sekcja zawiera niektóre z typowych konfiguracji po stronie serwera, które pomogą poprawić czas reakcji serwera i bezpieczeństwo połączeń.

  • Wyłączanie uwierzytelniania hasłem

Jeśli klucze SSH są skonfigurowane, a połączenie SSH działa zgodnie z oczekiwaniami, można bezpiecznie wyłączyć uwierzytelnianie hasłem. Poniższa konfiguracja sprawi, że system przestanie pytać o hasło, gdy jakikolwiek użytkownik połączy się przez SSH. Na serwerze zdalnym otwórz plik sshd_config z uprawnieniami root/sudo :

Następnie wyszukaj wpis PasswordAuthentication. Jeśli linia jest zakomentowana, odkomentuj ją. Zmień wartość na no:

Password Authentication Change

Zapisz plik i zamknij edytor. Aby zmiany weszły w życie, zrestartuj usługę SSH:

Jeśli system to CentOS/Fedora, użyj zamiast tego następującego polecenia:

  • Zmiana portu SSH

Jak wspomniano wcześniej, SSH używa portu 22 do wymiany ruchu SSH. Jednak według niektórych administratorów systemów lepiej jest przypisać inny port dla SSH. Może to pomóc w ochronie przed automatycznymi botami zalewającymi port. Aby zmienić port, na którym nasłuchuje SSH, otwórz plik sshd_config :

Wyszukaj wpis Port. Jeśli jest zakomentowany, odkomentuj go. Następnie zmień wartość na inną. Wartość portu to bezznakowa 16-bitowa liczba całkowita (0-65535):

SSH Port Change

Zapisz plik i zamknij edytor. Aby wdrożyć zmianę, zrestartuj demona SSH:

W systemie CentOS/Fedora uruchom zamiast tego następujące polecenie:

  • Ograniczenie użytkowników

Możemy skonfigurować, które konta użytkowników mogą łączyć się za pomocą SSH. Wiąże się to również z modyfikacją pliku sshd_config. Otwórz plik z uprawnieniami sudo/root:

Wyszukaj wpis AllowUsers. Dodaj dozwolonych użytkowników:

User Limitation

Zapisz plik i zamknij edytor. Zrestartuj demona SSH, aby zmiany weszły w życie:

W systemie CentOS/Fedora uruchom zamiast tego następujące polecenie:

  • Ograniczenie grup

Podobnie jak w przypadku ograniczenia użytkowników, możemy również określić, która grupa użytkowników może łączyć się z systemem za pomocą SSH. Otwórz plik sshd_config:

Użyj wpisu AllowGroups, aby dodać określoną grupę użytkowników, która może korzystać z SSH:

Allow User Groups

Zapisz plik i zamknij edytor. Zrestartuj demona SSH, aby zmiany weszły w życie:

W przypadku CentOS/Fedora uruchom zamiast tego następujące polecenie:

Pamiętaj, że jeśli jakikolwiek użytkownik zostanie dodany do grupy użytkowników lub z niej usunięty, należy zrestartować demona SSH. W przeciwnym razie zmiany w grupie nie wejdą w życie.

  • Wyłączenie logowania jako root

Jeśli masz dostęp do użytkownika z uprawnieniami sudo, zaleca się wyłączenie logowania jako root przez SSH. Otwórz plik sshd_config:

Zmień wartość wpisu PermitRootLogin na no:

Disable Root Login

Zapisz plik i zamknij edytor. Zrestartuj demona SSH, aby zmiana weszła w życie:

W systemie CentOS/Fedora uruchom zamiast tego następujące polecenie:

  • Przekazywanie ekranu aplikacji X

Demon SSH może również przekazywać ekran aplikacji X z serwera do klienta. Aby to jednak działało, system zdalny musi mieć skonfigurowany system okien X (X Window System). Funkcja ta musi być również włączona w konfiguracji SSH. Otwórz plik konfiguracyjny SSH:

Zmień wartość dyrektywy X11Forwarding na yes:

X11 Forwarding

Zapisz plik i zamknij edytor. Uruchom ponownie demona SSH, aby zmiany weszły w życie:

W systemach CentOS/Fedora uruchom zamiast tego następujące polecenie:

Konfiguracje klienta

W tej sekcji zapoznasz się z kilkoma popularnymi konfiguracjami klienta SSH.

  • Informacje o połączeniu specyficzne dla serwera

W systemie lokalnym możemy zdefiniować szczegóły połączenia zdalnego. Wszystkie informacje są przechowywane w pliku konfiguracyjnym znajdującym się w ~/.ssh/config:

Każdy blok systemu zdalnego jest oznaczony słowem kluczowym Host, po którym następuje alias. Tutaj znajdują się wszystkie dyrektywy specyficzne dla danego systemu. Podczas łączenia się z systemem zdalnym SSH zastosuje je automatycznie. Pełne, szczegółowe wyjaśnienie konfiguracji można znaleźć na stronie podręcznika man:

SSH Manual

Wpis dla połączenia zdalnego będzie miał następującą strukturę:

  • Limit czasu połączenia

Może się zdarzyć, że zostaniesz rozłączony z sesji SSH, zanim zdążysz wykonać jakąkolwiek akcję. Jeśli klient nie wysyła żadnych pakietów do zdalnego serwera, po pewnym czasie połączenie zostaje przerwane. Aby uniknąć takich sytuacji, możemy skonfigurować lokalnego klienta tak, aby co jakiś czas wysyłał pakiet podtrzymujący połączenie.

Otwórz lokalny plik konfiguracyjny:

Pod wpisem połączenia zdalnego dodaj dyrektywę ServerAliveInterval, a po niej interwał pakietów w sekundach:

Server Alive Interval

Zapisz plik i zamknij edytor.

  • Wyłączanie sprawdzania hosta

Domyślnie przy każdej próbie połączenia z nowym serwerem klient SSH zgłasza odcisk palca zdalnego demona SSH. Jest to przydatna funkcja do weryfikacji autentyczności hosta. Jeśli złośliwy podmiot spróbuje podszyć się pod zdalny host, pojawi się on jako nowy serwer.

Wyłączenie tej funkcji może stanowić ogromne ryzyko dla bezpieczeństwa. Ogólnie zaleca się pozostawienie tej opcji włączonej. Jednak w pewnych sytuacjach wyłączenie sprawdzania hosta może być wygodne. Otwórz plik konfiguracyjny:

W sekcji hosta zdalnego dodaj następujące dyrektywy:

Disabling Host Checking

Pierwsza dyrektywa wyłączy automatyczne dodawanie nowych hostów do listy znanych hostów, przechowywanej w pliku known_hosts. Druga dyrektywa służy do tego, aby nie ostrzegać o żadnych zmianach. Zapisz plik i zamknij edytor.

  • Multipleksowanie SSH przez pojedyncze połączenie TCP

Czasami nawiązanie połączenia TCP może wymagać sporo czasu. Jeśli konieczne jest nawiązanie wielu połączeń z tą samą maszyną, świetną funkcją, z której można skorzystać, jest multipleksowanie. Multipleksowanie SSH umożliwia korzystanie z tego samego połączenia TCP dla wielu sesji SSH. Zmniejsza to obciążenie wymagane do ustanowienia nowych sesji. Pomocne może być również ograniczenie liczby połączeń.

Możemy ręcznie ustawić połączenie multipleksowe lub pozwolić SSH na korzystanie z niego, gdy tylko jest dostępne. Tutaj skonfigurujemy SSH tak, aby podążało tą drugą ścieżką. Otwórz plik konfiguracyjny SSH:

Dodaj definicję hosta z maską (wildcard) na samej górze pliku. Zapewni to, że kolejny zestaw dyrektyw zostanie zastosowany do wszystkich połączeń zdalnych. Dodaj następujące dyrektywy:

Multiplexing SSH

Pierwsza dyrektywa nakazuje SSH automatyczne korzystanie z multipleksowania, gdy tylko jest ono dostępne. Druga dyrektywa określa ścieżkę do gniazda kontrolnego (control socket). Gniazdo to zostanie utworzone po ustanowieniu pierwszej sesji. Kolejne sesje będą korzystać z tego gniazda.

Ostatnia dyrektywa nakazuje SSH uruchomienie początkowego połączenia nadrzędnego (master) w tle. Oznacza to również, że połączenia TCP zostaną automatycznie przerwane sekundę po zakończeniu ostatniej sesji SSH. Następnie utwórz katalog zadeklarowany w pliku konfiguracyjnym:

Na koniec multipleksowanie powinno być aktywne.

Sekwencje sterujące SSH

Po nawiązaniu połączenia istnieją sposoby na kontrolowanie zachowania połączenia za pomocą sekwencji sterujących.

  • Wymuszanie rozłączenia

Utknąłeś w sesji SSH? Sesje SSH są zazwyczaj zarządzane przez serwer. Jeśli serwer ma problemy, utknięcie w martwej sesji SSH może być frustrujące. Na szczęście OpenSSH oferuje przydatne opcje sterowania do zarządzania stanem połączenia po stronie klienta.

Naciśnij Enter kilka razy. Następnie wprowadź następujące polecenie:

Forcing Disconnects

Tutaj, ~ to znak sterujący. Po uruchomieniu tego polecenia z poziomu klienta połączenie powinno zostać natychmiast zamknięte.

  • Sesja SSH w tle

Możemy również przenieść sesję SSH do tła. Po przeniesieniu do tła powrócisz do normalnej sesji powłoki. Po zakończeniu pracy możesz ponownie wrócić do powłoki SSH. Pamiętaj, że musisz mieć odpowiednią konfigurację limitu czasu (timeout), aby uniknąć rozłączenia, gdy sesja SSH pozostaje w tle. Aby przenieść sesję SSH do tła, wprowadź znak sterujący, a następnie Ctrl + Z:

SSH Background Session

Jeśli było to Twoje ostatnie zadanie w tle, możesz je reaktywować za pomocą następującego polecenia:

Jeśli istnieje wiele zadań w tle, możemy je zidentyfikować na podstawie listy zadań:

Jobs

Aby przenieść docelowe zadanie na pierwszy plan, odczytaj wartość zadania z pierwszej kolumny. Następnie uruchom następujące polecenie:

Job Foreground

  • Zmiana konfiguracji przekierowania portów

Korzystając z mechanizmu sterowania, możemy na bieżąco zmieniać reguły przekierowania portów. Po nawiązaniu połączenia możemy tworzyć lub usuwać reguły przekierowania portów. Jest to część interfejsu wiersza poleceń SSH.

Aby uzyskać dostęp do interfejsu wiersza poleceń SSH, uruchom polecenie:

SSH Command Line Interface

Aby wyświetlić listę dostępnych opcji, wprowadź następujące polecenie:

Jeśli dane wyjściowe są zbyt skąpe, spróbuj zwiększyć poziom szczegółowości za pomocą następującego polecenia sterującego:

Teraz ponownie uruchom polecenie -h:

SSH Command Line Help

Jak wyjaśniają dane wyjściowe, wdrożenie dowolnego przekierowania portów za pomocą prostego polecenia jest całkiem łatwe. Na przykład tunel można również zamknąć za pomocą polecenia kill, oznaczonego przez K na liście poleceń.

Podsumowanie

Z SSH można się zetknąć bardzo często. Dlatego nauka SSH jest niezwykle przydatna. Nasz kompleksowy przegląd SSH obejmuje najważniejsze konfiguracje SSH, które użytkownicy muszą znać, aby korzystać z SSH na co dzień. Po ich opanowaniu powinieneś być w stanie pracować z niemal wszystkimi konfiguracjami serwerów SSH.

Udanego korzystania z komputera!

author

Pranay Kapgate

Autor · CloudSigma

Preslav Dobrev jest projektantem kreatywnym w CloudSigma, skupiającym się na spójnej tożsamości biznesowej przy wykorzystaniu tradycyjnych i innowacyjnych kanałów marketingowych. Biegle łączy wizję artystyczną ze strategicznym marketingiem, tworząc wywierające wpływ narracje marki.

Komentarze

Brak komentarzy. Bądź pierwszy.