Od dłuższego czasu korzystam z hostingu wykupionego w amerykańskiej firmie DreamHost. Pomimo wielu negatywnych opinii, jakie znalazłem na różnych forach i blogach muszę powiedzieć, że jestem całkiem zadowolony ze świadczonych mi usług. W tym momencie przypominam sobie tylko jeden przypadek, kiedy nie miałem dostępu do danych przez około dziesięć minut. Dostęp do serwera poprzez SSH, SVN, możliwość tworzenia własnych serwerów MySQL, nielimitowane parametry konta - słowem cud, miód i orzeszki. Nie znaczy to jednak, że musisz rzucić swojego dotychczasowego dostawcę i przenieść się do DH, aż tak dobrze nie jest ;] Jednym z problemów, jakie napotkałem podczas korzystania z serwera było to, że tworząc konto FTP dla strony internetowej klienta nie mogłem uzyskać do niego [tego konta ;]] pełnego dostępu, inaczej niż przez zalogowanie się przy użyciu jego [tego klienta ;]] danych. W niniejszym wpisie chciałbym przedstawić rozwiązanie na jakie wpadłem podczas pracy.

W czym problem?

W tym, że tak, jak pisałem wyżej, aby uzyskać dostęp do danych użytkownika, potrzebuję dostępu do jego konta. Być może pukasz się teraz w czoło mówiąc coś w stylu: “to chyba jasne?!”, jednak nie do końca. ;] Sytuacja wygląda następująco - tworząc klientowi stronę internetową zakładam zwykle nowe konto z dostępem przez FTP. Wszystko jest ok, strona działa, klient jest zadowolony, czasem może wrzuci sobie coś na serwer bezpośrednio albo przez CMSa, ale jest to naprawdę mało wygodne. Wykonując po raz kolejny aktualizację kodu pomyślałem: “czy nie prościej byłoby zrobić po prostu svn export z poziomu SSH?”. Standardowo więc rozpocząłem proces szukania kolejnego usprawnienia.
Uprzedzam pytanie - to jest shared hosting, więc nie mam dostępu do demona FTP, nie mogę skonfigurować użytkownikom dostępu do wybranego katalogu a sobie do całości w tradycyjny sposób. Nie mam też dostępu do sudo i wielu innych przydatnych rzeczy - gdybym miał, to tego wpisu w ogóle by nie było, albo tytuł brzmiałby mniej więcej: “Konfigurowanie usługi FTP dla kont użytkowników na serwerach DreamHost”. ;]
Żeby nie wymyślać po raz kolejny koła zatrudniłem wujka Google do znalezienia istniejących już pomysłów na to, jak poradzić sobie z taką niedogodnością. Okazało się, że pytania o tego typu funkcjonalności pojawiały dosyć często się na różnych blogach i forach, także na samym forum DreamHostu, niestety poza zdawkowymi informacjami w stylu: “przepraszamy najmocniej, ale nie da się”, czy też “od tego są serwery dedykowane [w tym wypadku DreamHost Private Servers]“, nie znalazłem niczego interesującego tudzież wnoszącego cokolwiek nowego do tematu.

Pomyślałem, że zawsze jest jakieś rozwiązanie - w tej branży bardzo rzadko trafia się sytuacja, że czegoś “nie da” się zrobić, limitem jest tylko czas i czasem pieniądze. ;] Wróciłem wtedy do pracy, ale podczas pracy zdalnej przez SSH na serwerze w pewnym momencie “zostałem zmuszony” do wyświetlenia zawartości katalogu przez “ls -la”, żeby sprawdzić, czy na pewno mam w nim plik skryptu dla modułu mod_rewrite [plik .htaccess]. Zapatrzyłem się na wydrukowany na ekranie wynik i po chwili, jak na kreskówce,  zapaliła się “lampka” - no jasne, że się da!

Może potrzebujesz tylko uprawnień do wyświetlania?

Zanim odpowiem na pytanie docelowe, polecam zastanowić się nad inną kwestią i rozważyć powyższe pytanie. Jeśli potrzebujesz tylko wygodnego przeglądania plików, a logowanie na konto użytkownika aby wprowadzić zmiany nie sprawi Ci problemu, istnieje inny, mniej inwazyjny sposób na osiągnięcie celu. Dowiązanie symboliczne [ang. symlink], bo tak mu na imię, to mechanizm działający bardzo podobnie do skrótów znanych z systemu Windows. Polega on na tym, że tworzymy “plik” wskazujący na dany zasób na dysku [inny plik lub katalog], który traktujemy tak, jak cel, do którego nas odnosi - znaczy to tyle, że możemy wykonać przykładowe polecenie:
cd [plik dowiązania symbolicznego]
a system przeniesie nas do katalogu, dokładnie tak samo, jakbyśmy wpisali:
cd [ścieżka do docelowego katalogu]
Dowiązania symboliczne tworzymy z wykorzystaniem narzędzia ln:
ln -s [ścieżka do zasobu docelowego] [nazwa dowiązania symbolicznego]
Wszelkie dodatkowe pytania rozwiewa dołączona strona manuala:
man ln
Wystarczy utworzyć symlinki do żądanych katalogów i voila!

Potrzebny mi pełny dostęp!

Docelowym rozwiązaniem jest odpowiednia modyfikacja uprawnień do zasobów użytkowników. Ze względu na to, że nie mają oni dostępu do serwera przez SSH, raz utworzony dostęp nie zostanie nam zabrany, co najwyżej będziemy musieli jeszcze raz wykonać odpowiedniego chmoda. ;] Domyślnie każdy plik / katalog ma atrybuty dostępu ustawione na 0755, czyli rwxr-xr-x, co oznacza pełny dostęp dla właściciela, ale bez praw zapisu dla grupy i innych, niezwiązanych z nią osób. Ze względu na to, że przy dodawaniu nowego użytkownika w panelu administracyjnym DreamHostu każdy z nich jest automatycznie dołączany do tej samej domyślnej unixowej grupy, do której sam jesteś przypisany, o ile niczego wcześniej nie modyfikowałeś, wystarczy dać sobie [czyli w tym wypadku grupie] uprawnienia do zapisu w całym drzewie. A więc:
chmod -R 0775 /home/[nazwa użytkownika]
Skrypt ten można wykonać z dowolnego katalogu, a nawet zautomatyzować, tworząc na początku tablicę nazw użytkowników i wykonując polecenie w pętli dla każdego z nich, bądź tworząc skrypt shellowy z listą odpowiednich poleceń.

Podsumowanie.

Wniosek nie będzie zbyt odkrywczy, powiem jedynie, że taka funkcjonalność naprawdę powinna być dostępna, bo w istotny sposób uprościłaby administrację kontem, a na dzień dzisiejszy nie znalazłem nawet sugestii w panelu administracyjnym postulującej jej wprowadzenie.

Ktoś być może zapyta, czy stosując moje rozwiązanie tworzymy lukę w bezpieczeństwie. Dobre pytanie. ;] Odpowiedź brzmi: nie sądzę, ponieważ konsultowałem je z moim kolegą, który trochę lepiej zna się na administrowaniu serwerami ode mnie. Jego zdaniem na tak skonfigurowanym serwerze jak te obsługujące shared hosting w DreamHoście nie stwarzamy zagrożenia. Z drugiej strony gdzie miałaby powstać ta luka? Udostępniamy zasoby jedynie w ramach grupy unixowej, do której należą wyłącznie użytkownicy przypisani do naszego konta, ci spoza nadal mają dostęp na poziomie r-x, więc nie ma problemu.

Oczywiście treść tego wpisu nie dotyczy jedynie serwerów DH, ja opisałem tylko swój przypadek. Wydaje mi się, że chwila namysłu i będziesz w stanie wprowadzić te zmiany także u siebie. Jeśli będziesz miał jakiekolwiek problemy, tylko czekam, żeby rozwiązać kolejny problem, więc pisz śmiało. ;]

Reklama. ;]

Jeśli chciałbyś zamówić hosting w DreamHoście, możesz skorzystać z kodu promocyjnego, który utworzyłem specjalnie dla Ciebie, czytelnika tego bloga. Wystarczy, że podczas rejestracji podasz kod “TOMASZKOWALCZYK” [wszystkie litery pisane kapitalikami], a dostaniesz 97 USD zniżki na opcję roczną lub dwuletnią. Ze względu na to, że np. opłata roczna to 119 USD, zapłacenie za cały rok 22 dolarów nie brzmi źle, co nie? ;]