Jedną z najczęstszych najlepszych praktyk bezpieczeństwa w dzisiejszych czasach wydaje się być przenoszenie o wp-config.php
jeden katalog wyżej niż katalog główny vhosta . Nigdy tak naprawdę nie znalazłem dobrego wytłumaczenia tego, ale zakładam, że minimalizuje to ryzyko złośliwego lub zainfekowanego skryptu w katalogu głównym od odczytu hasła do bazy danych.
Ale nadal musisz pozwolić WordPressowi na dostęp, więc musisz rozwinąć, open_basedir
aby uwzględnić katalog powyżej katalogu głównego dokumentu. Czy to nie tylko pokonuje cały cel, a także potencjalnie naraża atakujące dzienniki serwera, kopie zapasowe itp.?
Czy też technika ta stara się tylko zapobiec sytuacji, w której wp-config.php
każdy http://example.com/wp-config.php
, kto o to poprosi, będzie wyświetlany jako zwykły tekst , zamiast być analizowanym przez silnik PHP? Wydaje się, że jest to bardzo rzadkie zdarzenie i nie przeważałoby to nad wadami narażania dzienników / kopii zapasowych / etc na żądania HTTP.
Może można przenieść go poza katalog główny dokumentu w niektórych konfiguracjach hostingu bez ujawniania innych plików, ale nie w innych konfiguracjach?
Wniosek: po wielu dyskusjach w tej sprawie pojawiły się dwie odpowiedzi, które moim zdaniem należy uznać za autorytatywne. Aaron Adams czyni dobrą sprawę na korzyść ruchu wp-config i chrisguitarguymakes dobrą sprawę przeciwko nim . Są to dwie odpowiedzi, które powinieneś przeczytać, jeśli jesteś nowy w wątku i nie chcesz czytać całej rzeczy. Inne odpowiedzi są zbędne lub niedokładne.
źródło
Odpowiedzi:
Krótka odpowiedź: tak
Odpowiedź na to pytanie jest jednoznaczna , a powiedzenie inaczej jest całkowicie nieodpowiedzialne .
Długa odpowiedź: przykład z prawdziwego świata
Pozwólcie, że podam bardzo prawdziwy przykład z mojego bardzo prawdziwego serwera, gdzie przeniesienie się
wp-config.php
poza katalog główny sieci web szczególnie uniemożliwiło przechwycenie jego zawartości .Błąd:
Spójrz na ten opis błędu w Plesku (naprawiony w 11.0.9 MU # 27):
Brzmi nieszkodliwie, prawda?
Oto co zrobiłem, aby uruchomić ten błąd:
site.staging.server.com
Dosite-staging.ssl.server.com
).Kiedy to zrobiłem, Plesk zresetował subdomenę do wartości domyślnych: wyświetlanie zawartości
~/httpdocs/
bez aktywnych tłumaczy (np. PHP).I nie zauważyłem. Przez tygodnie.
Wynik:
wp-config.php
katalogu głównym żądanie do/wp-config.php
pobrania pliku konfiguracyjnego WordPress.wp-config.php
zewnątrz korzenia internetowej, wniosek do/wp-config.php
pobrania całkowicie nieszkodliwy plik.wp-config.php
Nie można pobrać prawdziwego pliku.Jest zatem oczywiste, że wyprowadzenie się
wp-config.php
poza root root ma prawdziwe zalety bezpieczeństwa w prawdziwym świecie .Jak przenieść
wp-config.php
się w dowolne miejsce na serwerzeWordPress automatycznie wyszuka jeden katalog nad instalacją WordPressa, aby znaleźć
wp-config.php
plik, więc jeśli tam właśnie go przeniesiłeś, to gotowe!Ale co, jeśli przeniosłeś go gdzieś indziej? Łatwo. Utwórz nowy
wp-config.php
w katalogu WordPress za pomocą następującego kodu:(Pamiętaj, aby zmienić powyższą ścieżkę na rzeczywistą ścieżkę przeniesionego
wp-config.php
pliku).Jeśli napotkasz problem
open_basedir
, po prostu dodaj nową ścieżkę doopen_basedir
dyrektywy w konfiguracji PHP:Otóż to!
Oddzielanie argumentów przeciwnych
Każdy argument przemawiający za wyjściem
wp-config.php
poza katalog główny zależy od fałszywych założeń.Argument 1: Jeśli PHP jest wyłączone, są już włączone
FAŁSZ : Scenariusz, który opisuję powyżej, jest wynikiem błędnej konfiguracji, a nie wtargnięcia.
Argument 2: Przypadkowe wyłączenie PHP jest rzadkie, a zatem nieistotne
FALSE : Scenariusz, który opisuję powyżej, jest wynikiem błędu w wspólnym oprogramowaniu serwera, który wpływa na wspólną konfigurację serwera. Nie jest to rzadko „rzadkie” (a poza tym bezpieczeństwo oznacza martwienie się o rzadki scenariusz).
WTF : Zmiana hasła po włamaniu nie pomaga, jeśli poufne informacje zostały wykryte podczas włamania. Naprawdę, czy nadal uważamy, że WordPress jest używany tylko do zwykłego blogowania i że atakujący są zainteresowani tylko deflacją? Martwmy się o ochronę naszego serwera, a nie tylko przywracanie go po wejściu kogoś.
Argument 3: Odmowa dostępu
wp-config.php
jest wystarczająco dobraFAŁSZ : Wyobraź sobie domyślnych serwera dla wirtualnego hosta są: brak PHP, no
.htaccess
,allow from all
(prawie niezwykłe w środowisku produkcyjnym). Jeśli konfiguracja zostanie w jakiś sposób zresetowana podczas rutynowej operacji - na przykład aktualizacji panelu - wszystko powróci do stanu domyślnego, a użytkownik zostanie wykryty.Jeśli Twój model bezpieczeństwa zawiedzie, gdy ustawienia zostaną przypadkowo przywrócone do wartości domyślnych, potrzebujesz więcej zabezpieczeń.
WTF : Dlaczego ktoś miałby szczególnie polecać mniej warstw bezpieczeństwa? Drogie samochody mają nie tylko zamki; mają także alarmy, immobilizery i urządzenia śledzące GPS. Jeśli coś jest warte ochrony, zrób to dobrze.
Argument 4: Nieautoryzowany dostęp do
wp-config.php
to nic wielkiegoFALSE : Klucze uwierzytelniające i sole mogą być użyte w dowolnej liczbie potencjalnych ataków porwania.
WTF : Nawet jeśli poświadczenia bazy danych były jedyną rzeczą
wp-config.php
, powinieneś się bać atakującego.Argument 5: Przeniesienie
wp-config.php
poza główny katalog internetowy faktycznie sprawia, że serwer jest mniej bezpiecznyFALSE : Zakładając, że
wp-config.php
jest włączonyhttpdocs/
, po prostu przenieś go../phpdocs/
i ustaw,open_basedir
aby zawierał tylkohttpdocs/
iphpdocs/
. Na przykład:(Pamiętaj, aby zawsze dołączać katalog
/tmp/
użytkownikatmp/
, jeśli go masz).Wniosek: pliki konfiguracyjne zawsze powinny zawsze znajdować się poza katalogiem głównym
Jeśli zależy Ci na bezpieczeństwie, przeprowadzisz się
wp-config.php
poza swój katalog główny.źródło
wp-config.php
pozostaniesz bezpieczny. I jest to bardzo nieprawdopodobne - tak bardzo, że w zasadzie jest niemożliwe - że błąd spowodowałby arbitralne zresetowanie katalogu głównego do dokładnego katalogu, w którym został umieszczonywp-config.php
.wp-config.php
się w dowolne miejsce. Dodałem wskazówki do mojej odpowiedzi; polega po prostu na stworzeniu manekinawp-config.php
w katalogu WordPress z odniesieniem do położenia prawdziwego.Najważniejsze jest to, że
wp-config.php
zawiera pewne poufne informacje: nazwa użytkownika / hasło bazy danych itp.Pomysł: przenieś go poza katalog główny dokumentu i nie musisz się o nic martwić. Osoba atakująca nigdy nie będzie mogła uzyskać dostępu do tego pliku z zewnętrznego źródła.
Oto jednak pociecha:
wp-config.php
tak naprawdę nigdy nie drukuje niczego na ekranie. Definiuje tylko różne stałe, które są używane podczas instalacji WP. Dlatego jedynym sposobem, aby ktoś zobaczył zawartość tego pliku, jest obejście interpretera PHP na serwerach -.php
plik jest renderowany jako zwykły tekst. Jeśli tak się stanie, masz już kłopoty: mają bezpośredni dostęp do twojego serwera (i prawdopodobnie uprawnienia roota) i mogą robić, co chcą.Zamierzam powiedzieć, że nie ma korzyści z
wp-config
wychodzenia poza katalog główny dokumentu z perspektywy bezpieczeństwa - z powyższych powodów i tych:wp-config
aby uniemożliwić każdemu użytkownikowi bez wystarczających uprawnień odczytanie pliku, nawet jeśli uzyska (ograniczony) dostęp do twojego serwera przez SSH.wp-config.php
należy plik. Co ważniejsze, ten użytkownik bazy danych ma tylko uprawnienia do odczytu i zapisu w bazie danych instalacji WP i nic więcej - nie ma dostępu do udzielania uprawnień innym użytkownikom. Innymi słowy, jeśli osoba atakująca uzyska dostęp do bazy danych, wystarczy przywrócić dane z kopii zapasowej (patrz punkt 4) i zmienić użytkownika bazy danychwp-config
, prawdopodobnie pomieszał coś innego.wp-config
, a ponieważ jesteś ostrożny (patrz punkty 3 i 4), nie jest to wielka sprawa. Sole i takie można zmienić w dowolnym momencie. Jedyne, co się dzieje, to to, że unieważnia pliki cookie zalogowanych użytkowników.Dla mnie
wp-config
wyjście z korzenia dokumentu cuchnie bezpieczeństwem przez niejasność - co jest bardzo słabym człowiekiem.źródło
Myślę, że Max jest kompetentną odpowiedzią, a to jedna strona historii. WordPress Codex ma więcej porad :
Pamiętaj, że ustawienie uprawnień 400 lub 440 na wp-config.php może uniemożliwić wtyczkom zapisywanie lub modyfikowanie go. Prawdziwym przypadkiem byłoby na przykład buforowanie wtyczek (W3 Total Cache, WP Super Cache itp.) W takim przypadku wybrałbym 600 (domyślne uprawnienie do plików w
/home/user
katalogu).źródło
public_html
, przejściewp-config.php
poza katalog oznacza, że będzie on wpublic_html
katalogu. W takim przypadku musisz użyć reguł htaccess, aby odrzucić żądania HTTP do wp-config.php. (2) Jeśli WordPress jest zainstalowany bezpośrednio wpublic_html
katalogu, o jeden poziom wyżej => przeniesiesz go do/home/user
katalogu. W tym przypadku jesteś całkiem bezpieczny, ponieważ plik znajduje się poza katalogiem głównym dokumentu. Nadal możesz ustawić uprawnienia do pliku na 600 (lub nawet bardziej rygorystyczne 440 lub 400).Ktoś poprosił nas, żebyśmy zabłysnęli, a ja odpowiem tutaj.
Tak, izolacja pliku wp-config.php od katalogu głównego witryny ma zalety bezpieczeństwa.
1- Jeśli Twój program obsługi PHP zostanie uszkodzony lub zmodyfikowany w jakiś sposób, informacje DB nie zostaną ujawnione. I tak, widziałem to kilka razy na współdzielonych hostach podczas aktualizacji serwera. Tak, witryna zostanie zepsuta w tym okresie, ale hasła pozostaną nienaruszone.
2- Najlepsze praktyki zawsze zalecają izolowanie plików konfiguracyjnych od plików danych. Tak, trudno to zrobić za pomocą WordPress (lub dowolnej aplikacji internetowej), ale przeniesienie go w górę powoduje nieco izolacji.
3- Pamiętaj o wrażliwości na PHP-CGI, gdzie każdy może przekazać? -S do pliku i wyświetlić źródło. http://www.kb.cert.org/vuls/id/520827
Na koniec są to drobne szczegóły, ale pomagają zminimalizować ryzyko. Zwłaszcza jeśli jesteś we wspólnym środowisku, w którym każdy może uzyskać dostęp do twojej bazy danych (wszystko czego potrzebuje to użytkownik / przepustka).
Ale nie pozwól, aby małe rozproszenia (przedwczesne optymalizacje) znalazły się przed tym, co jest naprawdę konieczne, aby witryna była odpowiednio bezpieczna:
1 - Zawsze aktualizuj
2- Użyj silnych haseł
3- Ogranicz dostęp (poprzez uprawnienia). Mamy tutaj post na ten temat:
http://blog.sucuri.net/2012/08/wordpress-security-cutting-through-the-bs.html
dzięki,
źródło
Zdecydowanie tak.
Kiedy przenosisz wp-config.php poza katalog publiczny, zabezpieczysz go przed czytaniem za pomocą przeglądarki, gdy program obsługi php zostanie złośliwie (lub przypadkowo!) Zmieniony.
Odczytywanie loginu / hasła do bazy danych jest możliwe, gdy serwer jest prawie zainfekowany z winy słabego administratora. Nałóż na administratora grzywnę i uzyskaj lepiej utrzymany i bardziej niezawodny serwer. Chociaż może to być droższe.
źródło
open_basedir
zakresu?-rwx
dostępu do katalogów wyższych niż,public_html
więc nigdy się nie znałemopen_basedir
. Moje dzienniki znajdują się w osobnym katalogu, więc kopie zapasowe też. Myślę, że właśnie to mają wszyscy współdzieleni hosty.Chciałbym tylko wyjaśnić, ze względu na argument, że przeniesienie pliku wp_config.php niekoniecznie oznacza, że musisz przenieść go tylko do katalogu nadrzędnego. Załóżmy, że masz strukturę taką jak / root / html, gdzie html zawiera instalację WP i całą zawartość HTML. Zamiast przenieść wp_config.php do / root, możesz przenieść go do czegoś takiego jak / root / secure ... który znajduje się zarówno poza katalogiem html, jak również poza katalogiem głównym serwera. Oczywiście musisz upewnić się, że php może również działać w tym bezpiecznym folderze.
Ponieważ WP nie można skonfigurować do wyszukiwania wp_config.php w folderze rodzeństwa, takim jak / root / secure, musisz wykonać dodatkowy krok. Zostawiłem wp_config.php w / root / html i wyciąłem wrażliwe części (login bazy danych, sól, prefiks tabeli) i przeniosłem je do osobnego pliku o nazwie config.php. Następnie dodajesz
include
polecenie PHP do pliku wp_config.php, w następujący sposób:include('/home/content/path/to/root/secure/config.php');
Zasadniczo to zrobiłem w mojej konfiguracji. Teraz, na podstawie powyższej dyskusji, wciąż oceniam, czy jest to konieczne, czy nawet dobry pomysł. Chciałem tylko dodać, że powyższa konfiguracja jest możliwa. Nie ujawnia kopii zapasowych i innych plików głównych, a tak długo, jak bezpieczny folder nie ma własnego publicznego adresu URL, nie można go przeglądać.
Ponadto możesz ograniczyć dostęp do bezpiecznego folderu, tworząc tam plik .htaccess za pomocą:
źródło
open_basedir
dyrektywa zajmuje całe drzewa , tak aby uzyskać dostęp/root/secure
z/root/html
, trzeba ustawićopen_basedir
się/root
./root/httpdocs/config/accessible
, w którejhttpdocs
znajdują się dzienniki, kopie zapasowe itp .;config
przechowujewp-config.php
iaccessible
przechowuje WordPress i całą zawartość. Będziesz musiał zmodyfikować konfigurację vhost itp., Aby zmienić mapowanie katalogu głównego dokumentuaccessible
. Nie widzę jednak żadnej korzyści z samego odrzucenia żądań HTTP do wp-config w domyślnej konfiguracji.Istnieje wiele źle napisanych motywów i wtyczek, które pozwalają atatckerom wstrzykiwać kod (pamiętaj o problemie bezpieczeństwa z Timthumbem). Jeśli miałbym być atakującym, dlaczego powinienem szukać wp-config.php? Wystarczy wstrzyknąć ten kod:
Możesz spróbować ukryć swój wp-config.php. Tak długo, jak WordPress udostępnia wszystkie poufne informacje globalnie, ukrywanie pliku wp-config.php nie ma żadnej korzyści.
Zła część wp-config.php nie polega na tym, że przechowuje poufne dane. Złą częścią jest zdefiniowanie wrażliwych danych jako globalnie dostępnej stałej.
Aktualizacja
Chcę wyjaśnić problemy
define()
i dlaczego definiowanie wrażliwych danych jako stałej globalnej jest złym pomysłem.Istnieje wiele sposobów na atak na stronę internetową. Zastrzyk skryptu to tylko jeden sposób na zaatakowanie strony internetowej.
Zakładając, że serwer ma lukę, która pozwala osobie atakującej uzyskać dostęp do zrzutu pamięci. Atakujący znajdzie w pamięci zrzut wszystkich wartości wszystkich zmiennych. Jeśli zdefiniujesz globalnie dostępną stałą, musi ona pozostać w pamięci aż do zakończenia skryptu. Po utworzeniu zmiennej zamiast stałej istnieje duże prawdopodobieństwo, że śmieciarz nadpisze (lub zwolni) pamięć, gdy zmienna nie jest już potrzebna.
Lepszym sposobem ochrony wrażliwych danych jest usunięcie ich natychmiast po ich użyciu:
Po użyciu wrażliwych danych przypisanie do
null
spowoduje zastąpienie danych w pamięci. Osoba atakująca musi uzyskać zrzut pamięci w momencie, gdy$db_con
zawiera poufne dane. I to jest bardzo krótki czas w powyższym przykładzie (jeśli klasa Database_Handler nie zapisuje jej kopii).źródło
Oprócz korzyści związanych z bezpieczeństwem, pozwala również zachować instancję WordPress pod kontrolą wersji, jednocześnie zachowując podstawowe pliki WordPress jako submoduł / zewnętrzny. W ten sposób Mark Jaquith skonfigurował swój projekt WordPress-Skeleton. Szczegółowe informacje można znaleźć na stronie https://github.com/markjaquith/WordPress-Skeleton#assumptions .
źródło
wp-config.php
jeden katalog powyżej katalogu głównego vhosta , a nie tylko jeden katalog powyżej folderu instalacyjnego WordPress. Chodzi o to, aby umieścić go poza folderem, który może być odczytany przez żądania HTTP.