Instalacja (Wordpress + Mysql + FTPS + SELinux)

 

Dystrybucja:

Linux CentOS 7 (1708) x64

https://www.centos.org/

 

 

Spis treści

Instalacja wymaganych pakietów

Uruchomienie wymaganych usług wraz ze startem systemu

Struktura plików Wordpress

Pobranie i instalacja pakietu Wordpress oraz zmiana wersji EN na PL

Struktura pliku konfiguracyjnego wordpress.conf serwera apache

Struktura pliku konfiguracyjnego virtualhost’a

Struktura pliku konfiguracyjnego phpMyAdmin.conf

Wymagany użytkownik w systemie operacyjnym Linux

Uruchomienie usługi www i konfiguracja SELinux (kontrola procesów)

Uruchomienie usługi www i konfiguracja SELinux (kontrola plików)

Konfiguracja serwera bazy danych mariadb

Wymagany użytkownik w bazie danych mariadb

Instalacja Wordpress za pośrednictwem serwisu www

Struktura pliku konfiguracyjnego wp-config.php

Uruchomienie instalacji Wordpress w serwisie www

Konfiguracja i uruchomienie serwera FTP na potrzeby Wordpress’a

Konfiguracja SELinux i integracja z serwerem FTP

Serwer FTPS + SSL zamiast serwera FTP

Struktura pliku konfiguracyjnego serwera FTPS

Klient FTPS i podłączenie do serwera

Dodatkowe zabezpieczenie katalogu wp-admin

 

 

 

Pakiety:

httpd-2.4.6-80.el7.centos.x86_64

wordpress-4.9.6-1.el7.noarch

phpMyAdmin-4.4.15.10-2.el7.noarch (pakiet opcjonalny)

mariadb-server-5.5.56-2.el7.x86_64

vsftpd-3.0.2-22.el7.x86_64

 

 

 

Polecenia poprzedzone # są wykonane z konta uprzywilejowanego (z uprawnieniami root).

  

Instalacja wymaganych pakietów

 

# yum install epel-release

# yum install httpd

# yum install wordpress

# yum install phpmyadmin

# yum install mariadb-server

  

 Instalacja programem YUM przewiduje również instalację pakietów zależnych np. php i innych.

 

Uruchomienie wymaganych usług wraz ze startem systemu

 

# systemctl enable httpd

Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

 

# systemctl enable mariadb

Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

 

# systemctl enable vsftpd

Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.

 

 

Struktura plików Wordpress

 

W systemie Centos7 struktura plików pakietu wordpress instaluje się w katalogu /usr/share/wordpress przy czym jest to angielska wersja pakietu.

Polską wersję można pobrać ze strony https://pl.wordpress.org/txt-download/

 

 

# rpm -ql wordpress

/etc/httpd/conf.d/wordpress.conf

/etc/wordpress

/etc/wordpress/wp-config.php

/usr/share/doc/wordpress-4.9.6

/usr/share/doc/wordpress-4.9.6/README.fedora

/usr/share/doc/wordpress-4.9.6/README.fedora-multiuser

/usr/share/doc/wordpress-4.9.6/readme.html

/usr/share/licenses/wordpress-4.9.6

/usr/share/licenses/wordpress-4.9.6/license.txt

/usr/share/wordpress

/usr/share/wordpress/index.php

(…)

 

 

Pobranie i instalacja pakietu Wordpress oraz zmiana wersji EN na PL

 

# cd /root/

 

Pobranie pakietu

# wget https://pl.wordpress.org/wordpress-4.9.6-pl_PL.zip

 

Rozpakowanie pakietu

# unzip wordpress-4.9.6-pl_PL.zip

 

Wykonanie kopii pliku konfiguracyjnego

# cp /etc/httpd/conf.d/wordpress.conf /root/

 

Usuwamy wersję EN

# yum erase wordpress

 

Przenosimy rozpakowany pakiet (katalog wordpress) do /usr/share/

# mv /root/wordpress /usr/share/

 

Zawartość katalogu

# ls -l /usr/share/wordpress/

razem 192

-rw-r--r--.  1 root root   418 2013-09-25  index.php

-rw-r--r--.  1 root root 19935 06-06 14:00 license.txt

-rw-r--r--.  1 root root  7415 06-06 14:00 readme.html

-rw-r--r--.  1 root root  5458 05-02 00:10 wp-activate.php

drwxr-xr-x.  9 root root  4096 06-06 14:00 wp-admin

-rw-r--r--.  1 root root   364 2015-12-19  wp-blog-header.php

-rw-r--r--.  1 root root  1889 05-03 00:11 wp-comments-post.php

-rw-r--r--.  1 root root  2853 06-06 14:00 wp-config-sample.php

drwxr-xr-x.  5 root root  4096 06-06 14:00 wp-content

-rw-r--r--.  1 root root  3669 2017-08-20  wp-cron.php

drwxr-xr-x. 18 root root 12288 06-06 14:00 wp-includes

-rw-r--r--.  1 root root  2422 2016-11-21  wp-links-opml.php

-rw-r--r--.  1 root root  3306 2017-08-22  wp-load.php

-rw-r--r--.  1 root root 37760 05-10 23:05 wp-login.php

-rw-r--r--.  1 root root  8048 2017-01-11  wp-mail.php

-rw-r--r--.  1 root root 16246 2017-10-04  wp-settings.php

-rw-r--r--.  1 root root 30091 04-30 01:10 wp-signup.php

-rw-r--r--.  1 root root  4620 2017-10-24  wp-trackback.php

-rw-r--r--.  1 root root  3065 2016-08-31  xmlrpc.php

 

 

Przenosimy plik konfiguracyjny wordpress (konfiguracja serwera www)

# mv /root/wordpress.conf /etc/httpd/conf.d/

 

 

Struktura pliku konfiguracyjnego wordpress.conf serwera apache

 

Zawartość pliku konfiguracyjnego:

 

# cat /etc/httpd/conf.d/wordpress.conf

Alias /wordpress /usr/share/wordpress

# Access is only allowed via local access

# Change this once configured

<Directory /usr/share/wordpress>

  AllowOverride Options

  <IfModule mod_authz_core.c>

    # Apache 2.4

    # Require local

    Require all granted

  </IfModule>

  <IfModule !mod_authz_core.c>

    # Apache 2.2

    Order Deny,Allow

    Deny from All

    Allow from 127.0.0.1

    Allow from ::1

 </IfModule>

</Directory>

<Directory /usr/share/wordpress/wp-content/uploads>

  # Deny access to any php file in the uploads directory

  <FilesMatch "\.(php)$">

    Order Deny,Allow

    Deny from all

  </FilesMatch>

</Directory>

<Directory /usr/share/wordpress/wp-content/plugins/akismet>

  # Deny access to any php file in the akismet directory

  <FilesMatch "\.(php|txt)$">

    Order Deny,Allow

    Deny from all

  </FilesMatch>

</Directory>

 

 

Dyrektywa Require local (standardowo domyślnie włączona), zezwala na lokalne połączenia z serwerem ( tylko z localhost’a). Jeżeli chcemy aby dostęp do naszej strony internetowej mieli wszyscy należy ustawić aktywną dyrektywę Require all granted. Oczywiście należy również skonfigurować odpowiednio zaporę sieciową (firewall) zezwalający na ruch http.

 

 

Struktura pliku konfiguracyjnego virtualhost’a

 

Należy również utworzyć plik konfiguracyjny virtualhost’a dla wordpress.

 

Zawartość pliku:

 

# cat /etc/httpd/conf.d/virtual.conf

<VirtualHost *:80>

    ServerAdmin adres_meil@domena.pl

    DocumentRoot /usr/share/wordpress

    ServerName twoja_domena.pl

    ServerAlias *.twoja_domena.pl

</VirtualHost>

 

 

Struktura pliku konfiguracyjnego phpMyAdmin.conf

 

Zawartość pliku konfiguracyjnego:

 

# cat /etc/httpd/conf.d/phpMyAdmin.conf

Alias /phpMyAdmin /usr/share/phpMyAdmin

Alias /phpmyadmin /usr/share/phpMyAdmin

<Directory /usr/share/phpMyAdmin/>

   AddDefaultCharset UTF-8

   <IfModule mod_authz_core.c>

     # Apache 2.4

     <RequireAny>

       Require ip 127.0.0.1 192.168.2.5 192.168.56.1

       Require ip ::1

     </RequireAny>

   </IfModule>

   <IfModule !mod_authz_core.c>

     # Apache 2.2

     Order Deny,Allow

     Deny from All

     Allow from 127.0.0.1

     Allow from ::1

   </IfModule>

</Directory>

<Directory /usr/share/phpMyAdmin/setup/>

   <IfModule mod_authz_core.c>

     # Apache 2.4

     <RequireAny>

       Require ip 127.0.0.1

       Require ip ::1

     </RequireAny>

   </IfModule>

   <IfModule !mod_authz_core.c>

     # Apache 2.2

     Order Deny,Allow

     Deny from All

     Allow from 127.0.0.1

     Allow from ::1

   </IfModule>

</Directory>

# These directories do not require access over HTTP - taken from the original

# phpMyAdmin upstream tarball

#

<Directory /usr/share/phpMyAdmin/libraries/>

    Order Deny,Allow

    Deny from All

    Allow from None

</Directory>

<Directory /usr/share/phpMyAdmin/setup/lib/>

    Order Deny,Allow

    Deny from All

    Allow from None

</Directory>

<Directory /usr/share/phpMyAdmin/setup/frames/>

    Order Deny,Allow

    Deny from All

    Allow from None

</Directory>

 

 

Dyrektywa Require ip 127.0.0.1 domyślnie zezwala tylko lokalne połączenia (z localhosta). Jeżeli chcemy aby dostęp do phpMyAdmin był możliwy z innych adresów należy dopisać kolejne adresy IP. Oczywiście należy również skonfigurować odpowiednio zaporę sieciową (firewall) zezwalający na ruch http.

 

 

Wymagany użytkownik w systemie operacyjnym Linux

 

Tworzenie użytkownika

# useradd -d /usr/share/wordpress wpuser

useradd: uwaga: katalog domowy już istnieje.

Pliki z katalogu skel nie są kopiowane.

 

Ustawienie hasła

# passwd wpuser

Zmienianie hasła użytkownika wpuser.

Nowe hasło : <wpuser_haslo>

Proszę ponownie podać nowe hasło : <wpuser_haslo>

passwd: zaktualizowanie wszystkich tokenów uwierzytelniania się powiodło.

 

Zmiana powłoki systemowej (zablokuje możliwość logowania się przez ssh użytkownikowi wpuser)

# usermod -s /sbin/nologin wpuser

 

Zmiana właściciela i grupy struktury plików wordpress

# chown -R wpuser:wpuser /usr/share/wordpress

 

Utworzenie katalogu uploads

# mkdir /usr/share/wordpress/wp-content/uploads

 

Ustawienie właściciela katalogu

# chown apache:apache /usr/share/wordpress/wp-content/uploads

 

Katalog uploads służy do przechowywania wszelkich plików graficznych instalowanych za pośrednictwem Kokpitu WordPress’a (np. „logo” naszej witryny).

Wskazany katalog nie jest instalowany automatycznie, należy go utworzyć i nadać odpowiednie uprawniania – zazwyczaj takie na jakich działa usługa httpd.

 

Uruchomienie usługi www i konfiguracja SELinux (kontrola procesów)

 

Na tym etapie poprawna konfiguracja httpd powinna umożliwić uruchomienie usługi. Może się zdarzyć, że usługa nie chce się uruchomić z uwagi na „nowe” pliki konfiguracyjne serwera apache. Za brak możliwości uruchomienia usługi (tak jak było w tym przypadku) jest odpowiedzialny mechanizm SELinux - domyślnie włączony w systemie Linux CentOS7.

 

Przykład:

# systemctl start httpd

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

 

# journalctl -xe

                                         Do

                                         # /sbin/restorecon -v /etc/httpd/conf.d/wordpress.conf

                                         

                                         *****  Plugin catchall (1.49 confidence) suggests   **************************

                                         

                                         If you believe that httpd should be allowed getattr access on the wordpress.conf file by default.

                                         Then you should report this as a bug.

                                         You can generate a local policy module to allow this access.

                                         Do

                                         allow this access for now by executing:

                                         # ausearch -c 'httpd' --raw | audit2allow -M my-httpd

                                         # semodule -i my-httpd.pp

                                         

cze 09 12:44:40 server_wp setroubleshoot[12615]: failed to retrieve rpm info for /etc/httpd/conf.d/wordpress.conf

cze 09 12:44:40 server_wp setroubleshoot[12615]: SELinux is preventing /usr/sbin/httpd from read access on the file /etc/httpd/conf.d/wordpress.conf. For comp

cze 09 12:44:40 server_wp python[12615]: SELinux is preventing /usr/sbin/httpd from read access on the file /etc/httpd/conf.d/wordpress.conf.

                                         

                                         *****  Plugin restorecon (99.5 confidence) suggests   ************************

(…)

 

Na wskazanym przykładzie widać, że SELinux prewencyjnie zablokował uruchomienie usługi httpd, ponieważ ma wątpliwości co do pliku /etc/httpd/conf.d/wordpress.conf czy aby na pewno usługa httpd powinna mieć do niego dostęp. SELinux proponuje co najmniej dwa rozwiązania:

- wykonanie polecenia  restorecon i odbudowanie domyślnej etykiety serwera httpd

- utworzenie lokalnego modułu polityki

 

Odbudowanie (aktualizacja) etykiety serwera httpd

# /sbin/restorecon -v /etc/httpd/conf.d/wordpress.conf

/sbin/restorecon reset /etc/httpd/conf.d/wordpress.conf context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:httpd_config_t:s0

 

Uruchomienie usługi

# systemctl start httpd

# systemctl status httpd

httpd.service - The Apache HTTP Server

   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)

   Active: active (running) since sob 2018-06-09 12:56:51 CEST; 1s ago

     Docs: man:httpd(8)

           man:apachectl(8)

  Process: 14689 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)

 Main PID: 14696 (httpd)

   Status: "Processing requests..."

   CGroup: /system.slice/httpd.service

           ├─14696 /usr/sbin/httpd -DFOREGROUND

           ├─14698 /usr/sbin/httpd -DFOREGROUND

           ├─14699 /usr/sbin/httpd -DFOREGROUND

           ├─14700 /usr/sbin/httpd -DFOREGROUND

           ├─14701 /usr/sbin/httpd -DFOREGROUND

           └─14702 /usr/sbin/httpd -DFOREGROUND

cze 09 12:56:51 server_wp systemd[1]: Starting The Apache HTTP Server...

cze 09 12:56:51 server_wp httpd[14696]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::a448:af...s message

cze 09 12:56:51 server_wp systemd[1]: Started The Apache HTTP Server.

Hint: Some lines were ellipsized, use -l to show in full.

   

 

   

Uruchomienie usługi www i konfiguracja SELinux (kontrola plików)

 

Przedstawiona konfiguracja uruchomiła proces odpowiedzialny za usługę www. Następnie w kolejnym kroku należy wskazać pliki, które stanowią zawartość strony internetowej. W innym przypadku po wejściu na stronę internetową otrzymamy błąd 403 - brak dostępu i nie jest to w żadnym stopniu błąd serwera www ! SELinux prewencyjnie blokuje pliki, które mają „niestandardowy” kontekst do sytuacji.

A konkretnie przyjmuje się domyślnie, że:

- wszystkie pliki z których korzysta proces httpd powinny mieć nadany kontekst  httpd_sys_content_t.

- wszystkie pliki „zwykłego” użytkownika powinny mieć nadany kontekst admin_home_t.

 

Po rozpakowaniu archiwum wordpress-4.9.6-pl_PL.zip pliki znajdujące się w katalogu /usr/share/wordpress przyjmują domyślny kontekst admin_home_t, dlatego też domyślnie SELinux takie pliki zablokuje (błąd 403 po wejściu na stronę).

 

 

Aktualny kontekst plików

# ls -Z /usr/share/wordpress/

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 index.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 license.txt

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 readme.html

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-activate.php

drwxr-xr-x. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-admin

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-blog-header.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-comments-post.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-config.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-config-sample.php

drwxr-xr-x. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-content

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-cron.php

drwxr-xr-x. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-includes

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-links-opml.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-load.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-login.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-mail.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-settings.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-signup.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 wp-trackback.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:admin_home_t:s0 xmlrpc.php

 

 

Zmiana kontekstu

# chcon -t httpd_sys_content_t /usr/share/wordpress -R

 

Kontekst plików po zmianie

# ls -Z /usr/share/wordpress

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 index.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 license.txt

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 readme.html

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-activate.php

drwxr-xr-x. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-admin

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-blog-header.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-comments-post.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-config.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-config-sample.php

drwxr-xr-x. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-content

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-cron.php

drwxr-xr-x. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-includes

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-links-opml.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-load.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-login.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-mail.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-settings.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-signup.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 wp-trackback.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_content_t:s0 xmlrpc.php

 

 

Jeszcze innym rozwiązaniem jest automatyczne nadanie kontekstu poprzez całkowite włączenie i wyłączenie SELinux (wymaga restartu systemu).

SELinux przy pierwszym uruchomieniu nadaje konteksty automatycznie zgodnie ze swoją „intuicją” biorąc po uwagę np. zależności między plikami.

 

 

Kontekst plików httpd_sys_script_exec_t nadany automatycznie przy pierwszym uruchomieniu SELinux wraz ze startem systemu

# ls -Z /usr/share/wordpress/

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 index.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:usr_t:s0   license.txt

-rw-r--r--. wpuser wpuser unconfined_u:object_r:usr_t:s0   readme.html

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-activate.php

drwxr-xr-x. wpuser wpuser unconfined_u:object_r:usr_t:s0   wp-admin

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-blog-header.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-comments-post.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-config.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-config-sample.php

drwxr-xr-x. wpuser wpuser unconfined_u:object_r:usr_t:s0   wp-content

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-cron.php

drwxr-xr-x. wpuser wpuser unconfined_u:object_r:usr_t:s0   wp-includes

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-links-opml.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-load.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-login.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-mail.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-settings.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-signup.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 wp-trackback.php

-rw-r--r--. wpuser wpuser unconfined_u:object_r:httpd_sys_script_exec_t:s0 xmlrpc.php

 

 

Konfiguracja serwera bazy danych mariadb

 

Usługa została wcześniej uruchomiona (sprawdzenie statusu usługi)

# systemctl status mariadb

mariadb.service - MariaDB database server

   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)

   Active: active (running) since sob 2018-06-09 14:07:10 CEST; 33min ago

  Process: 1130 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)

  Process: 977 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)

 Main PID: 1129 (mysqld_safe)

   CGroup: /system.slice/mariadb.service

           ├─1129 /bin/sh /usr/bin/mysqld_safe --basedir=/usr

           └─1454 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log...

cze 09 14:07:01 server_wp systemd[1]: Starting MariaDB database server...

cze 09 14:07:06 server_wp mariadb-prepare-db-dir[977]: Database MariaDB is probably initialized in /var/lib/mysql already, nothing is done.

cze 09 14:07:08 server_wp mysqld_safe[1129]: 180609 14:07:08 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.

cze 09 14:07:08 server_wp mysqld_safe[1129]: 180609 14:07:08 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

cze 09 14:07:10 server_wp systemd[1]: Started MariaDB database server.

 

 

Ustawienie hasła root bazy danych (domyślnie przy pierwszym uruchomieniu nie ma hasła)

# mysqladmin -u root password twoje_haslo

 

Zmiana hasła

# mysqladmin -u root -p'stare_haslo' password nowe_haslo

 

Zalogowanie się do bazy na konto  root

# mysql -u root -p

Enter password:

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 12

Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

 

 

Wymagany użytkownik w bazie danych mariadb

 

Utworzenie bazy danych na potrzeby witryny Wordpress

nazwa bazy danych:  wordpress_db

MariaDB [(none)]> CREATE DATABASE wordpress_db DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]>

 

 

Utworzenie konta użytkownika do bazy danych wordpress_db oraz nadanie uprawnień

użytkownik:  wordpress_user

hasło:  wordpress_haslo

MariaDB [(none)]> GRANT ALL ON wordpress_db.* TO 'wordpress_user'@'localhost' IDENTIFIED BY 'wordpress_haslo';

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]>

 

 

Odświeżamy wprowadzone zmiany

MariaDB [(none)]> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.00 sec)

 

 

Kończymy pracę

MariaDB [(none)]> EXIT;

Bye

 

 

Zalogowanie się na użytkownika wordpress_user i weryfikacja dostępu do bazy danych  wordpress_db

 

# mysql -u wordpress_user --password=wordpress_haslo

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 42

Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

 

 

MariaDB [(none)]> USE wordpress_db;

Database changed

MariaDB [wordpress_db]>

 

 

MariaDB [wordpress_db]> EXIT;

Bye

 

 

Zarządzaniem i dostępem do bazy danych możemy również realizować za pośrednictwem

 

http://adres_ip/phpmyadmin/

 

 

Instalacja Wordpress za pośrednictwem serwisu www

 

Dostęp do usługi z localhosta

http://localhost/wp-admin/setup-config.php

 

 

Dostęp do usługi z „zewnątrz” zależy od konfiguracji zapory sieciowej i pliku konfiguracyjnego /etc/httpd/conf.d/wordpress.conf

http://adres_ip/wp-admin/setup-config.php

 

 

Może się zdarzyć, że po wejściu na stronę www otrzymamy błąd 403 (odmowa dostępu), za który może odpowiadać SELinux.

Rozwiązaniem może być wyłączenie i ponowne włączenie SELinux, które spowoduje ponowne nadanie kontekstu plikom.

Celem diagnostyki możemy również wyłączyć (do czasu ponownego uruchomienia) SELinux poleceniem:

 

# setenforce 0

 

 

Okno powitalne

 
 

Instalacja i tworzenie pliku konfiguracyjnego

 

Nazwa bazy danych:                   wordpress_db

Nazwa użytkownika:                   wordpress_user

Hasło:                                          wordpress_haslo

Adres serwera bazy danych:        localhost

Prefiks tabel:                                wp_

 

 
 

Skrypt wygenerował zawartość pliku konfiguracyjnego wp-config.php

 

 
 

 

Wygenerowaną zawartość należy zaznaczyć i skopiować do pliku /usr/share/wordpress/wp-config.php

Plik taki należy utworzyć. Możemy to zrobić np. poleceniem vi /usr/share/wordpress/wp-config.php i wkleić wygenerowaną zawartość.

 

 

Struktura pliku konfiguracyjnego wp-config.php

 

W przedstawionym przykładzie zawartość pliku konfiguracyjnego Wordpress wygląda następująco

# cat /usr/share/wordpress/wp-config.php

<?php

/**

 * The base configuration for WordPress

 *

 * The wp-config.php creation script uses this file during the

 * installation. You don't have to use the web site, you can

 * copy this file to "wp-config.php" and fill in the values.

 *

 * This file contains the following configurations:

 *

 * * MySQL settings

 * * Secret keys

 * * Database table prefix

 * * ABSPATH

 *

 * @link https://codex.wordpress.org/Editing_wp-config.php

 *

 * @package WordPress

 */

// ** MySQL settings - You can get this info from your web host ** //

/** The name of the database for WordPress */

define('DB_NAME', 'wordpress_db');

/** MySQL database username */

define('DB_USER', 'wordpress_user');

/** MySQL database password */

define('DB_PASSWORD', 'wordpress_haslo');

/** MySQL hostname */

define('DB_HOST', 'localhost');

/** Database Charset to use in creating database tables. */

define('DB_CHARSET', 'utf8mb4');

/** The Database Collate type. Don't change this if in doubt. */

define('DB_COLLATE', '');

/**#@+

 * Authentication Unique Keys and Salts.

 *

 * Change these to different unique phrases!

 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}

 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.

 *

 * @since 2.6.0

 */

define('AUTH_KEY',         'k2fa3Z$_vAed`VSFp:@zk9%8Z,|yZaxW?yK!^;Iq4T;?9)XW!Kc7[ !tKjt!R@2t');

define('SECURE_AUTH_KEY',  '4Ov;2HW!)|Xs-PUT;lCI7oQFn2w(wX.8xI:cFvD9>d#)<Og|bd}={!r|>ow7~2N-');

define('LOGGED_IN_KEY',    'tfa,x6]6dv%LH&SX%Q-k&2Kx_ZBDiW~Ec 0:MCO~/nE-nWn6F{k5Apto[BWMYaPh');

define('NONCE_KEY',        '+TIMFi~P1#Z;_RU8%hV?DDvK1So~O2sD8XF1JY13U]JE@}5Gci/{bq&_Oh671:%m');

define('AUTH_SALT',        '0Ml}_14NX)Q7~Kz{e+GK[kS$*86L4Np./ns7o@l*{^xJl>ZZ8!YpIhS+FE@y3vLi');

define('SECURE_AUTH_SALT', 'eO?CKr$F;f@BVjN<TtkbSWIZR5f#d1mjx#~d,#aM:Ot6gvSUI<B[V~EC1Co5S0]C');

define('LOGGED_IN_SALT',   'uy!c^h^E5J82.A_W<[r8f&3P,f]*PT)RsSN6vh{SPj]+fL]azaIe9TywLI`(cAc|');

define('NONCE_SALT',       'D2*_M=.jBBr^2%XNk)$jC,M|i_HyW}5l8k*!yAFG3Qm23S[wm5A>@#3(4O{>58@y');

/**#@-*/

/**

 * WordPress Database Table prefix.

 *

 * You can have multiple installations in one database if you give each

 * a unique prefix. Only numbers, letters, and underscores please!

 */

$table_prefix  = 'wp_';

/**

 * For developers: WordPress debugging mode.

 *

 * Change this to true to enable the display of notices during development.

 * It is strongly recommended that plugin and theme developers use WP_DEBUG

 * in their development environments.

 *

 * For information on other constants that can be used for debugging,

 * visit the Codex.

 *

 * @link https://codex.wordpress.org/Debugging_in_WordPress

 */

define('WP_DEBUG', false);

/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */

if ( !defined('ABSPATH') )

 define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */

require_once(ABSPATH . 'wp-settings.php');

 

 

Uruchomienie instalacji Wordpress w serwisie www

 

W kolejnym kroku uruchamiamy instalację

- wpisujemy tytuł witryny

- wpisujemy nazwę użytkownika oraz hasło (administrator naszej witryny)

- email

 

 
 

 

Poprawna instalacja informuje nas komunikatem Sukces!

Możemy już teraz się zalogować i utworzyć witrynę. Tworzenie witryn i obsługę platformy Wordpress możemy znaleźć w innych tutorialach.

 

 
 

Konfiguracja i uruchomienie serwera FTP na potrzeby Wordpress’a

 

Zakładam, że użytkownik zalogował się i utworzył witrynę !

Ostatnią czynnością konfiguracyjną jest integracja Wordpress z serwerem FTP lub FTPS. Za pośrednictwem takiego serwera Wordpress (Administrator Wordpress’a) aktualizuje swoje skrypty jak również instaluje pluginy i inne dodatki – zarządza. Innymi słowy dostęp do plików w katalogu /usr/share/wordpress/ jest realizowany za pośrednictwem serwera FTP lub FTPS.

 

Uruchomienie i sprawdzenie usługi

# systemctl start vsftpd

# systemctl status vsftpd

vsftpd.service - Vsftpd ftp daemon

   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)

   Active: active (running) since nie 2018-06-10 08:42:17 CEST; 1h 58min ago

 Main PID: 991 (vsftpd)

   CGroup: /system.slice/vsftpd.service

           └─991 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

cze 10 08:42:17 server_wp systemd[1]: Starting Vsftpd ftp daemon...

cze 10 08:42:17 server_wp systemd[1]: Started Vsftpd ftp daemon.

 

 

Plik konfiguracyjny serwera vsftpd

# cat /etc/vsftpd/vsftpd.conf

anonymous_enable=YES

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_std_format=YES

listen=NO

listen_ipv6=YES

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

 

 

Teoretycznie dostęp do katalogu /usr/share/wordpress/ gdzie jest zainstalowany Wordpress za pośrednictwem FTP mamy już w tym momencie. Zakładam, że zapora sieciowa zezwala na ruch FTP.

 

Użytkownik: wpuser

Hasło: wpuser_haslo

 

Użytkownika utworzyliśmy w rozdziale „Wymagany użytkownik w systemie operacyjnym Linux”

 

 

Konfiguracja SELinux i integracja z serwerem FTP

 

 

Jeśli mamy włączoną politykę SELinux to zazwyczaj usługa FTP (proces w systemie Linux) nie ma dostępu do struktury plików serwera www, pomimo tego, że właścicielem procesu FTP jest root.

W systemie operacyjnym Linux CentOS7 SELinux jest domyślnie włączony.

 

 

Sprawdzenie stanu SELinux

# sestatus

SELinux status:                 enabled

SELinuxfs mount:                /sys/fs/selinux

SELinux root directory:         /etc/selinux

Loaded policy name:             targeted

Current mode:                   enforcing

Mode from config file:          enforcing

Policy MLS status:              enabled

Policy deny_unknown status:     allowed

Max kernel policy version:      28

 

 

Kto jest właścicielem procesu serwera FTP ?

# ps aux | grep vsftpd

root       991  0.0  0.0  53212   700 ?        Ss   09:17   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

root      8197  0.0  0.0 112684   980 pts/0    S+   11:28   0:00 grep --color=auto vsftpd

 

Mimo, że właścicielem procesu jest użytkownik root to nie ma dostępu do katalogu /usr/share/wordpress/ za pośrednictwem usługi FTP.

Co możemy zrobić ?

- wyłączyć SELinux

- nadać odpowiednie uprawnienia

 

Sprawdzenie wybranych wartości ustawień boolean value SELinux w odniesieniu do usługi ftpd

# getsebool -a | grep ftpd

ftpd_anon_write --> off

ftpd_connect_all_unreserved --> off

ftpd_connect_db --> off

ftpd_full_access --> off

ftpd_use_cifs --> off

ftpd_use_fusefs --> off

ftpd_use_nfs --> off

ftpd_use_passive_mode --> off

 

Rozwiązaniem jest włączenie boolean value ftpd_full_access

# setsebool -P ftpd_full_access 1

 

Sprawdzenie

# getsebool -a | grep ftpd

ftpd_anon_write --> off

ftpd_connect_all_unreserved --> off

ftpd_connect_db --> off

ftpd_full_access --> on

ftpd_use_cifs --> off

ftpd_use_fusefs --> off

ftpd_use_nfs --> off

ftpd_use_passive_mode --> off

 

 

Sprawdzenie wybranych wartości ustawień boolean value SELinux w odniesieniu do usługi httpd

# getsebool -a | grep httpd_can_connect

httpd_can_connect_ftp --> off

httpd_can_connect_ldap --> off

httpd_can_connect_mythtv --> off

httpd_can_connect_zabbix --> off

 

 

Zezwalamy ‘on serwerowi apache na łączenie się z serwerem ftp (możliwość aktualizacji wordpress’a za pośrednictwem tzw. kokpitu)

# setsebool -P httpd_can_connect_ftp 1

 

Od tej chwili powinniśmy mieć pełny dostęp do zawartości katalogu /usr/share/wordpress/ za pośrednictwem usługi ftp oraz http.

 

W systemie operacyjnym Linux mechanizm SELinux jest na bieżąco rozwijany, dlatego też przedstawiona konfiguracja SELinux może nie być wystarczająca w późniejszym czasie.

 

   

Serwer FTPS + SSL zamiast serwera FTP

 

Generowanie certyfikatu dla serwera vsftpd

 

przykład:

# openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/ssl/certs/vsftpd.pem -out /etc/ssl/certs/vsftpd.pem

Generating a 1024 bit RSA private key

........++++++

..........++++++

writing new private key to '/etc/ssl/certs/vsftpd.pem'

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [XX]:PL

State or Province Name (full name) []:Lodzkie

Locality Name (eg, city) [Default City]:Pabianice

Organization Name (eg, company) [Default Company Ltd]:SUID.PL                                                      

Organizational Unit Name (eg, section) []:IT

Common Name (eg, your name or your server's hostname) []:*.suid.pl

Email Address []:szymon.urbanczyk@list.pl

 

 

Następnie należy wskazać ścieżkę do certyfikatu i odpowiednio skonfigurować plik serwera vsftpd

 

 

Struktura pliku konfiguracyjnego serwera FTPS

przykład:

# cat /etc/vsftpd/vsftpd.conf

anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_std_format=YES

chroot_local_user=YES

listen=NO

listen_ipv6=YES

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

rsa_cert_file=/etc/ssl/certs/vsftpd.pem

rsa_private_key_file=/etc/ssl/certs/vsftpd.pem

ssl_enable=YES

allow_anon_ssl=NO

force_local_data_ssl=YES

force_local_logins_ssl=YES

ssl_tlsv1=YES

ssl_sslv2=NO

ssl_sslv3=NO

require_ssl_reuse=NO

ssl_ciphers=HIGH

pasv_min_port=40001

pasv_max_port=40100

allow_writeable_chroot=YES

 

 

Dla trybu pasywnego PASV określono zakresy portów TCP od 40001 do 40100. Wymienione porty powinny zostać uwzględnione w konfiguracji zapory sieciowej.

 

 

 

Klient FTPS i podłączenie do serwera

 

Jako klienta FTPS możemy wykorzystać np. https://filezilla-project.org/ lub Total Commander https://www.ghisler.com/

 

Konfiguracja klienta FTPS na przykładzie Total Commander

 

TC potrzebuje dwie biblioteki:

libeay32.dll

ssleay32.dll

 

Można je znaleźć w Internecie pod hasłem: „FTPS for Total Commandernp.  na stronie https://sourceforge.net/

Pobrane biblioteki umieszczamy do katalogu w którym jest zainstalowany Total Commander, najczęściej jest to:

 

C:\Program Files\totalcmd

lub

C:\totalcmd

 

W przypadku programu FileZilla nie są wymagane dodatkowe biblioteki (wszystko jest zaimplementowane).

 

 

Połączenie i sprawdzenie usługi

 

Uruchamiamy TC i przechodzimy do FTP. Tworząc Nowe połączenie … należy zaznaczyć SSL/TLS.

 

 
 

 

 

 

 Przykład połączenia (czerwona kłódka):

 

 

 

 

 

FTPS jest rozszerzeniem protokołu FTP, w którym login i hasło są szyfrowane. Wordpress wspiera zarówno zarówno FTP jak i FTPS.

   

 

Dodatkowe zabezpieczenie katalogu wp-admin

 

Istnieje możliwość dodatkowej autoryzacji (dostęp do Kokpitu wordpress’a) po wywołaniu strony http://nasza_strona/wp-admin/

W katalogu /usr/share/wordpress/wp-admin/ należy utworzyć plik .htaccess

 

Zawartość pliku

# cat /usr/share/wordpress/wp-admin/.htaccess

AuthType Basic

AuthName "Authentication Required"

AuthUserFile "/usr/share/httpd/.htpasswd"

Require valid-user

 

 

Powinno się również zabezpieczyć dostęp do plików wp-login.php oraz xmlprc.php tworząc plik /usr/share/wordpress/.htaccess

 

Zawartość pliku

cat /usr/share/wordpress/.htaccess

AuthType Basic

AuthName "Authentication Required"

AuthUserFile "/usr/share/httpd/.htpasswd"

<Files "wp-login.php">

Require valid-user

</Files>

<Files "xmlrpc.php">

Order allow,deny

Deny from all

</Files>

 

 

Następnie należy utworzyć plik przechowujący użytkownika i hasło, gdzie admin jest nazwą użytkownika.

# htpasswd -c /usr/share/httpd/.htpasswd admin

New password: <twoje_haslo>

Re-type new password: <twoje_haslo>

Adding password for user admin

 

 

Zmieniamy właściciela i grupę pliku na apache

# chown apache:apache /usr/share/httpd/.htpasswd

 

 

Ograniczamy dostęp do pliku (tylko odczyt przez właściciela pliku)

# chmod 400 /usr/share/httpd/.htpasswd

 

 

Sprawdzenie aktualnych uprawnień

# ls -la /usr/share/httpd/.htpasswd

-r--------. 1 apache apache 44 06-26 19:45 /usr/share/httpd/.htpasswd

 

 

Ostatni krok to ustawienie dyrektywy na AllowOverride All w pliku /etc/httpd/conf.d/wordpress.conf i restart usługi.

# systemctl restart httpd

 

 

 

 

 

 

Autor: Szymon Urbańczyk , 26.06.2018 r.