Projekt FAIR – przyszłość repozytoriów WordPress?

avlab.pl 7 godzin temu
Zdjęcie: Projekt FAIR – przyszłość repozytoriów WordPress?


Niedawno ogłoszono start projektu FAIR Package Manager, którego celem jest umożliwienie pełnego działania witryn opartych o WordPress bez jednoczesnej konieczności dostępu do domen powiązanych z firmą Automattic (zarządzającą rozwojem tego systemu CMS oraz całą infrastrukturą, m.in. repozytorium wtyczek i motywów). Powstanie FAIR jest w dużym stopniu spowodowane decyzją CEO firmy Automattic o zablokowaniu dostępu do API WordPress.org dla WP Engine – popularnej platformy oferującej dedykowany hosting WordPress.

Trzeba przyznać, iż pełna zależność od jednego dostawcy jest ryzykowna, również w kontekście bezpieczeństwa. WordPress z powodzeniem można wdrożyć choćby w środowiskach bez dostępu do Internetu, natomiast wszelkie instalacje motywów czy wtyczek trzeba wtedy przeprowadzać „ręcznie” – poprzez upload plików ZIP w Kokpicie lub też poprzez skopiowanie wypakowanego folderu do odpowiedniej lokalizacji (wp-content/plugins, wp-content/themes). Dodatkowo wciąż możliwa jest automatyzacja wdrożeń i w tym podejściu wszelkie zmiany w logice działania czy obejmujące modyfikacje interfejsu graficznego są przechowywane w repozytorium Git i wdrażane na adekwatne środowiska z użyciem CI/CD.

Niestety nie jest to rozwiązanie dla wszystkich, bo proces przygotowania większości mniejszych stron (np. dla lokalnych przedsiębiorstw) nie wygląda zbyt profesjonalnie. Zwykle ogranicza się do przesłania katalogu z WordPress’em poprzez FTP, a następnie dostosowywaniu strony wyłącznie poprzez wizualne modyfikacje w Kokpicie.

Niezależnie od stopnia zaawansowania witryny istotnym elementem są aktualizacje. W sytuacji braku możliwości dostępu do serwisów api.wordpress.org i downloads.wordpress.org zwiększone zostaje ryzyko udanego ataku na naszą stronę internetową. Dla międzynarodowych korporacji, których witryny zostały przygotowane „na bazie” systemu WordPress, ewentualny atak oznacza poważne kłopoty wizerunkowe. Dlatego też powstanie FAIR powinno oceniać się raczej pozytywnie. Co więcej, repozytorium FAIR można wdrożyć także w ramach własnej infrastruktury, jednak wymaga to umiejętności programistycznych. Wtyczka ta będzie przydatna w zasadzie każdej sytuacji utraty dostępu do domen *.wordpress.org przy dowolnej skali złożoności naszej witryny.

Z perspektywy standardowego zastosowania należy skupić się na gotowej wtyczce do systemu WordPress. Wystarczy pobrać najnowsze wydanie (aktualnie to plik fair-plugin-0.2.0.zip) i przesłać archiwum ZIP na serwer.

W celach testowych skonfigurowałem lokalny serwer DNS i serwer WWW, w ramach którego zainstalowałem WordPress. Serwer z aplikacją miał ustawiony adres serwera DNS na adres uruchomionej instancji. Logowane były wszystkie zapytania. Nie jest zaskoczeniem fakt, iż WordPress komunikuje się z następującymi adresami:

  • api.wordpress.org
  • pl.wordpress.org
  • wordpress.org
  • downloads.wordpress.org

Dodatkowo po stronie klienta pobierane są awatary komentujących – WordPress posiada domyślny wpis „Hello, world!” zawierający przykładowy komentarz – z domeny

  • secure.gravatar.com

Efekt zablokowania powyższych domen na poziomie serwera DNS można było łatwo zauważyć np. przy próbie zainstalowania wtyczki.

Brak możliwości nawiązania połączenia do domen powiązanych z WordPress

Zmiany w DNS obejmują wszystkie hosty z tym konkretnie ustawionym serwerem, stąd wynika również problem z załadowaniem wspomnianego awatara przy komentarzu.

Błąd pobierania grafiki z secure.gravatar.com

Po zainstalowaniu i aktywacji wtyczki FAIR z pliku ZIP „problem” został rozwiązany.

Udane pobranie zdalnej zawartości w zakładce Dodaj wtyczkę

Działanie wtyczki opiera się na podmianie określonych domen, do których ruch jest inicjowany przez backend systemu WordPress (https://github.com/fairpm/fair-plugin/blob/main/inc/default-repo/namespace.php). Dla przykładu podczas przeglądania listy dostępnych motywów zrzuty ekranu prezentujące dany motyw pobierane są z api.aspirecloud.net. W przypadku secure.gravatar.com zmiana polega na zastosowaniu data:image (kodowanie grafiki w Base64 osadzone bezpośrednio w tagu <img>) – ma to postać pierwszej litery podanego w komentarzu imienia w kolorze białym na czarnym tle. Ciężko ocenić, czy taka forma będzie dobrze prezentować się na każdej stronie internetowej.

Zaznaczenia wymaga, iż opisywana wtyczka zastępuje wyłącznie odwołania do domen kontrolowanych przez Automattic. Motywy i wtyczki często korzystają ze zdalnych zasobów należących do autorów danego rozwiązania, np. przy okazji importowania tzw. demo prezentującego funkcje motywu na nieco bardziej rozbudowanej witrynie.

Niekiedy całkiem zasadną praktyką jest ograniczenie dostępu do Internetu (air-gapped environment) z najważniejszych serwerów, np. aplikacyjnych, baz danych czy pełniących rolę storage. najważniejsze jest wtedy dokładne określenie zasobów, do których dany komponent środowiska powinien mieć dostęp (repozytoria pakietów, zewnętrzne API itp.).

WordPress może działać w takim środowisku z użyciem proxy – ustawienie adresu i portu serwera proxy sprawi, iż wszelkie zapytania inicjowane przez system CMS będą kierowane na ten adres. Serwer aplikacyjny w tym scenariuszu nie musi posiadać dostępu do sieci Internet. Wymagana jest jedynie komunikacja do serwera proxy.

Do pliku wp-config.php wystarczy dodać:

Config::define( 'WP_PROXY_HOST', '192.168.1.101' ); Config::define( 'WP_PROXY_PORT', '8080' );

W WordPress istnieje pewna „przypadłość” – nie działa instalacja motywów i wtyczek, gdy ustawione jest proxy i jednocześnie serwer z WordPress nie rozwiązuje nazwy domeny, z której pobierane są zasoby.

Błąd pobierania wtyczki

Problem jest znany od co najmniej 3 lat, ale rozwiązanie wciąż nie zostało wdrożone. Samodzielnie można naprawić to drobną modyfikacją w pliku wp-includes/http.php.

if ( ! $same_host ) { if ( preg_match( '#^(([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)$#', $host ) ) { $ip = $host; } else { //$ip = gethostbyname( $host ); $ip = ""; //if ( $ip === $host ) { // Error condition for gethostbyname(). //return false; //} }

Instalacja powinna być wtedy w pełni możliwa.

Idź do oryginalnego materiału