Инсталиране и конфигуриране на Apache, MariaDB, PHP-FPM на Debian 12 (Bookworm) с Firewall и Fail2ban

В тази статия ще покажа как да инсталирате LAMP (Linux, Apache, MariaDB, PHP-FPM) сървър на Debian 12 (bookworm). Също така ще направя едни от най-важните и основни неща за да защитим нашия сървър. Идеята на статията е да бъде кратка и систематизирана. Предвидена е за средно напреднали и напреднали с Linux-а. 

 

Обновяване на repository и софтуерните пакети:

apt update
apt dist-upgrade

Инсталиране на помощни пакети, ако не са инсталирани преди това: 

apt install sudo
sudo apt install htop mc curl net-tools rsyslog

 

Препоръчително е добавим админ user-a към Sudoers. Това става със следната команда:

usermod -aG sudo YOUR_USER

След като приключи инсталирането на помощните пакети вече може да започнем със инсталацията на Apache2.

 

Инсталиране на Apache2:

sudo apt install apache2 apache2-utils

Също така може да отворим следния адрес: http://IP-то-на-сървъра. Трябва да видим страницата по подразбиране на Apache.

Активираме най-използваните модули за Apache2:

sudo a2enmod rewrite ssl headers http2 vhost_alias setenvif

Препоръчително е да спрем 'directory listing' и да позволим 'AllowOverride'. Отваряме конфиг файла:

nano /etc/apache2/apache2.conf

Намираме <Directory /var/www/> и го променяме на:

<Directory /var/www/>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

За да приложим промените рестартираме Apache2:

systemctl restart apache2

С това приключи инсталирането на Apache2.

 

Инсталиране на MariaDB (MySQL server)

Изпълняваме следната команда:

sudo apt install mariadb-server mariadb-client

След като завърши инсталацията ще изпълним скрипта за secure installation:

sudo mysql_secure_installation

Следваме стъпките на скрипта:

  • слагаме парола на root акаунта;
  • премахваме анонимния акаунт;
  • Забраняваме remote логина с root акаунта;
  • премахваме test базата;

Сега ще създадем акаунт с пълни права за MariaDB. Първо трябва да се свържем с MariaDB:

mysql -u root -p

Въвеждаме root паролата.

След което изпълняваме следните заявки за да създадем нов потребител с пълни права:

CREATE USER 'user'@'%' IDENTIFIED BY 'userpass';
GRANT ALL ON *.* TO 'user'@'%' WITH GRANT OPTION;

Следва сега да редактираме основните настройки на ресурсите на MariaDB. Създаваме файл /etc/mysql/mariadb.conf.d/80-tuning.cnf:

nano /etc/mysql/mariadb.conf.d/80-tuning.cnf

След това поставяме настройките в новия файл:

[mysqld]
bind-address = 0.0.0.0
performance_schema=ON
log_error = /var/log/mysql/error.log

slow-query-log = 1
slow-query-log-file = /var/log/mysql/slow-queries.log
long_query_time = 10

# Skip binary log files
skip-log-bin
# Skip reverse DNS lookup of clients
skip-name-resolve
# https://mariadb.com/kb/en/server-system-variables/#max_connections
max_connections = 500

#InnoDB
# https://mariadb.com/kb/en/innodb-system-variables/#innodb_buffer_pool_size
innodb_buffer_pool_size   = 4G
# https://mariadb.com/kb/en/innodb-system-variables/#innodb_io_capacity
innodb_io_capacity      = 4000
innodb_io_capacity_max  = 8000
# https://mariadb.com/kb/en/innodb-system-variables/#innodb_log_file_size
innodb_log_file_size    = 1G

Трябва да въведете следните настройки според ресурсите на вашия сървър:

max_connections - според ресурсите на сървъра и типа бази в него

innodb_buffer_pool_size  - не повече от 50% от общата RAM

innodb_io_capacity - според типа дискове на сървъра (HDD, SSD, NVMe).

Създаваме папката за log файловете и променяме собственика на mysql user-a:

mkdir /var/log/mysql
chown mysql /var/log/mysql

Рестартираме MariaDB за да приложим промените:

sudo systemctl restart mysql

 

 

Инсталиране на PHP 8.1:

Добавяне на SURY repository:

apt-get -y install lsb-release ca-certificates curl
curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

Обновяване на repository:

sudo apt update

Инсталиране на PHP 8.1:

sudo apt install php8.1

С това инсталацията на PHP 8 е готова. Обаче много от WEB приложенията се нуждаят от допълнителни разширения. С тази команда ще инсталираме едни от най-известните PHP extentions:

sudo apt install php8.1-{fpm,mysql,intl,apcu,zip,dev,curl,cli,imagick,mbstring,gd,bcmath,redis,memcached,xml}

Следва сега да редактираме основните настройки на ресурсите на PHP. Създаваме файл /etc/php/80-tuning.ini:

nano /etc/php/80-tuning.ini

След това поставяме настройките в новия файл:

; Maximum amount of memory a script may consume
; http://php.net/memory-limit
memory_limit = 512M

; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 60

; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 512M

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 512M

html_errors = Off

 

Сега трябва да добавим symlinks на новия файл в папките с конфигурационни файлове на PHP:

ln -s /etc/php/80-tuning.ini /etc/php/8.1/fpm/conf.d/80-tuning.ini
ln -s /etc/php/80-tuning.ini /etc/php/8.1/cli/conf.d/80-tuning.ini

 

Активиране на Apache Fast CGI и PHP-FPM:

a2enmod proxy_fcgi
a2enconf php8.1-fpm

Рестартираме Apache2 и PHP-FPM за да приложим всички промени:

sudo systemctl restart apache2 php8.1-fpm

 

Инсталиране на по-стари версии на PHP <= 7.x:

Инсталиране на PHP 7.4 с най-известните PHP extention:

sudo apt install php7.4 php7.4-{fpm,mysql,apcu,zip,dev,curl,cli,imagick,geoip,mbstring,gd,bcmath,json,redis,memcached,xml}
ln -s /etc/php/80-tuning.ini /etc/php/7.4/fpm/conf.d/80-tuning.ini
ln -s /etc/php/80-tuning.ini /etc/php/7.4/cli/conf.d/80-tuning.ini

 

Настройки по сигурността:

Следа една кратка и важна стъпка - настройките по сигурността. Има доста неща които може да се правят свързани със сигурността. Тук ще посоча най-общите от тях. 

Инсталиране на firewall (ufw), ако не е инсталиран:

sudo apt install ufw

ufw allow ssh
ufw allow http
ufw allow https
ufw allow mysql

ufw enable

Инсталиране на fail2ban:

apt install fail2ban

Сега трябва да активираме някои Action Jails:

Отваряме или създаваме jail.local файла:

nano /etc/fail2ban/jail.local

Поставяме следните редова:

[sshd]
enabled = true

[mysqld-auth]
enabled = true
logpath = /var/log/mysql/error.log

По този начин активираме автоматичното блокиране на поредни неуспешни опити за вход в SSH и MySQL сървъра от едно и също IP.

 

Настройки за автоматично рестартиране на MySQL и PHP-FPM:

В определни случаи се слючва линукса да премахне (kill-не) процесите на MySQL или PHP-FPM. В този случай приложението ще спре да работи. За да избегнем това systemd има възможност автоматично да рестартира процесите. За да настроим това ще трябва да редактираме config файловете на процесите със следната команда:

systemctl edit mysql

 

добавете след този ред: ### Anything between here and the comment below will become the new contents of the file

[Service]
Restart=on-failure

 

Сега добавим същите редове и за PHP-FPM:

systemctl edit php8.1-fpm

 

добавете след този ред: ### Anything between here and the comment below will become the new contents of the file

[Service]
Restart=on-failure

След като запазите промените ще трябва да приложите промените като изпълните следната команда:

systemctl daemon-reload

 

С това завършихме основните настройки на сървъра!

Коментари