Инсталация и конфигурация на CentOS 7 – Enterprise Linux Server

CentOS – Community ENTerprise Operating System

CentOS е Линукс операционна система която определено няма нужда от реклама, най малкото поради което е дериват на RedHat. Дистрибуцията е сървърно насочена и изповядва собствена философия която доста се различава от Debian и Ubuntu които пък владеят останалият дял при сървърите в Линукс. Ubuntu сървър винаги е предлагал най новият и модерен софтуер заедно със риска от бъгове и дупки в сигурноста. CentOS масово се използва като сървър където стабилноста и сигурноста е от първостепенно значение. Поради тази политика обаче CentOS често изпада в ситуация в която използва по стар но пък стабилен софтуер за услугите които предлага. Разбира се CentOS е гъвкава дистрибуция и с малко “тунинг” но извън стандартното хранилище за софтуер може да се освежи системата до последните версии на Apache, MariaDB, PHP и др. Аз общо взето ще следвам мирогледа на разработчиците на CentOS и няма да използвам неофициални хранилища за софтуер, както, и няма да компилирам последни версии на програми именно за да запазя духа на дистрибуцията – сигурност и стабилност пред всичко останало !

Инсталация на операционната система

Логвам се отдалечено като root през терминал от моя десктоп. По време на инсталацията аз зададох параметър системата да получи автоматично IP адрес чрез DHCP протокола

След като съм вече логнат в сървъра първата ми стъпка е да обновя на системата.

[root@server4 ~]# yum update

Инсталиране на основни пакети

[root@server4 ~]# yum install nano net-tools mc wget ntp traceroute whois nmap zip unzip

Конфигуриране на мрежов интерфейс

[root@server4 ~]# nano /etc/sysconfig/network-scripts/ifcfg-eth0

Вариант1: Автоматично получане на адрес – DHCP

TYPE="Ethernet"
BOOTPROTO="dhcp"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth0"
UUID="3516b1d3-4277-44fc-bb8c-ff639b9a3bbb"
DEVICE="eth0"
ONBOOT="yes"

Вариант2: Само статичен IPv4 адрес

TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth0"
UUID="3516b1d3-4277-44fc-bb8c-ff639b9a3bbb"
DEVICE="eth0"
ONBOOT="yes"
IPADDR="93.155.130.93"
PREFIX="29"
GATEWAY="93.155.130.89"
DNS1="93.155.130.11"
DNS2="93.155.130.14"

Вариант3: Статични IPv4/IPv6 адреси – Dual Stack

TYPE="Ethernet"
HWADDR="52:54:00:c0:43:64"
BOOTPROTO="none"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6ADDR="2001:470:20f1::5/64"
IPV6_DEFAULTGW="2001:470:20f1::1"
IPV6_AUTOCONF="no"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth0"
UUID="3516b1d3-4277-44fc-bb8c-ff639b9a3bbb"
DEVICE="eth0"
ONBOOT="yes"
IPADDR="93.155.130.93"
PREFIX="29"
GATEWAY="93.155.130.89"
DNS1="93.155.130.11"
DNS2="93.155.130.14"
DNS3="2001:470:20::2"
DNS4="2001:4860:4860::8888"

Рестартиране на правилата в мрежовата конфигурация (може да се изпълнява отдалечено)

[root@server4 ~]# systemctl restart network

Проверка на мрежата

Конфигуриране на hosts резолвера в IPv4/IPv6 Dual Stack режим

[root@server4 ~]# nano /etc/hosts
127.0.0.1           localhost localhost.localdomain localhost4 localhost4.localdomain4
93.155.130.93       server4.itservice-bg.net server4

::1                 localhost localhost.localdomain localhost6 localhost6.localdomain6
2001:470:20f1::5    server4.itservice-bg.net server4
Ако въпреки всичко по някаква причина сте пропуснали по време на инсталацията да конфигурирате мрежовия интерфейс има един удобен конзолен инструмент който ще ви помогне да направите лесно това в терминала чрез вълшебната команда nmtui (network manager text user interface)
[root@server4 ~]# nmtui

Основното хранилище за софтуерни пакети на CentOS съдържа само базов софтуер от който всяка една дистрибуция минимално има нужда. Когато искаме да изградим един Интернет сървър хранилището по подразбиране е крайно недостатъчно. По тази причина в CentOS е прието да се изполват допълнителни хранилища (repositories) като в повечето случаи избора е така наречения EPEL (Extra Packages for Enterprise Linux) което въпреки, че ще го добавим ръчно си е официално хранилище. Добавянето на EPEL на практика се състой в инсталирането само на един пакет наречен epel-release.
[root@server4 ~]# yum install epel-release

Инсталиране на Apache уеб сървър

[root@server4 ~]# yum install httpd mod_ssl

Стартиране и добавяне на услугата перманентно

[root@server4 ~]# systemctl start httpd.service
[root@server4 ~]# systemctl enable httpd.service

Добавяне на протоколите HTTP/HTTPS във Firewall

[root@server4 ~]# firewall-cmd --permanent --zone=public --add-service=http 
[root@server4 ~]# firewall-cmd --permanent --zone=public --add-service=https
[root@server4 ~]# firewall-cmd --reload

Проверка дали работи сървъра Apache отдалечено

Инсталиране на базата данни MariaDB

[root@server4 ~]# yum install mariadb-server mariadb

Стартиране и добавяне на услугата перманентно

[root@server4 ~]# systemctl start mariadb.service
[root@server4 ~]# systemctl enable mariadb.service

Трябва да създадем парола на root аканта на MariaDB със скрипт mysql_secure_installation:

[root@server4 ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): <--ENTER
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] 
New password: <--yourmariadbpassword
Re-enter new password: <--yourmariadbpassword
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] <--ENTER
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] <--ENTER
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] <--ENTER
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] <--ENTER
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
[root@server4 ~]#

Тест с базата данни

[root@server4 ~]# mysql -u root -p
Enter password: *************
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 5.5.52-MariaDB MariaDB Server

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

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

MariaDB [(none)]> quit;
Bye
[root@server4 ~]#

Добавяне на mysql порта 3306 във Firewall за достъп от Интернет

[root@server4 ~]# firewall-cmd --permanent --zone=public --add-service=mysql
[root@server4 ~]# firewall-cmd --reload

Инсталиране на PHP и основните му пакети

[root@server4 ~]# yum install php php-mysql php-mcrypt php-gd php-snmp php-process \
php-xcache php-soap php-imap php-recode php-magickwand php-pspell php-php-gettext \
php-mbstring php-xml php-xmlrpc php-tidy php-ldap php-odbc php-devel php-pecl-apc \
perl-libwww-perl libxml2-devel mod_fcgid httpd-devel php-fpm
Добра практика е да заложим параметри на php още преди да го използваме, защото така или иначе стойностите са крайно недостатъчни. Намерете параметрите по долу във файла php.ini и ги заменете с вашите нужди.
[root@server4 ~]# nano /etc/php.ini 
memory_limit = 528M
upload_max_filesize = 128M
post_max_size = 64M
upload_tmp_dir = /tmp

Рестартиране на сървъра Apache за да зареди модула на PHP

[root@server4 ~]# systemctl restart httpd.service

Създаваме тестов файл info.php за да тестваме php работи ли на сървъра

[root@server4 ~]# nano /var/www/html/info.php

Копираме следния код във файла

<?php
phpinfo();
?>

Съхраняваме го и посещаваме линк за проверка на сървъра

Инсталиране на phpMyAdmin

[root@server4 ~]# yum install phpMyAdmin

Трябва да редактираме конфигурационния файл в Apache на phpMyAdmin

[root@server4 ~]# nano /etc/httpd/conf.d/phpMyAdmin.conf

Като променим модула IfModule mod_authz_core.c по следния начин

 <IfModule mod_authz_core.c>
 # Apache 2.4
# <RequireAny>
# Require ip 127.0.0.1
# Require ip ::1
# </RequireAny>
 Require all granted
 </IfModule>

Също, трябва да редактираме конфигурациония файл на phpMyAdmin

[root@server4 ~]# nano /etc/phpMyAdmin/config.inc.php

Като в долния ред променим само параметъра от cookie на http

[...]
$cfg['Servers'][$i]['auth_type']     = 'http';    // Authentication method (config, http or cookie based)?
[...]

След което задължително рестартираме Apache сървъра

[root@server4 ~]# systemctl restart httpd.service

Съхраняваме го и посещаваме линк за проверка на сървъра на адрес http://server4.itservice-bg.net/phpmyadmin

Време е да обърнем внимание на защитната стена в CentOS 7. Операционната система идва със собствена имплементация firewalld която не всички харесват. Ако и вие сте от тях лесно може да спрете услугата със комадите:
[root@server4 ~]# systemctl disable firewalld
[root@server4 ~]# systemctl stop firewalld

И да се убедите след това, че вригите на защитната стена iptables са празни с командата:

[root@server4 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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

[root@server4 ~]# systemctl enable firewalld
[root@server4 ~]# systemctl start firewalld

Нека разгледаме какви услуги ни разрешава защитната стена в момента

[root@server4 ~]# firewall-cmd --list-services
dhcpv6-client http ssh https mysql

Тъй като аз няма да използвам dhcpv6-client ще го махна от листата с командите:

[root@server4 ~]# firewall-cmd --remove-service=dhcpv6-client --permanent
[root@server4 ~]# firewall-cmd --reload

Нека разгледаме резултата с командата firewall-cmd –list-services

[root@server4 ~]# firewall-cmd --list-services
http ssh https mysql

Инсталиране на ProFTPd сървърa

[root@server4 ~]# yum install proftpd

Стартиране и добавяне на ftp услугата перманентно

[root@server4 ~]# systemctl start proftpd.service
[root@server4 ~]# systemctl enable proftpd.service

Добавяне на ftp порта 21 във Firewall за достъп от Интернет

[root@server4 ~]# firewall-cmd --permanent --zone=public --add-service=ftp
[root@server4 ~]# firewall-cmd --reload
За да използваме ftp услугата на CentOS сървъра трябва да добавим стандартен потребител в системата който по подразбиране ще има собствена директория във файловата система на сървъра /home/потребител
[root@server4 ~]# adduser samyil
[root@server4 ~]# passwd samyil
Changing password for user samyil.
New password: **********
Retype new password: **********
passwd: all authentication tokens updated successfully.

След като инсталирахме ftp сървъра и създадохме потребител в системата можем чрез ftp клиента Filezilla да се логнем в системата

Инсталиране на Bind/Named DNS сървърa. Bind ще го ползваме само като кешираш DNS сървър.

[root@server4 ~]# yum install bind bind-utils

Стартиране и добавяне на bind услугата перманентно

[root@server4 ~]# systemctl start named.service
[root@server4 ~]# systemctl enable named.service

Добавяне на bind порта 53 във Firewall за достъп от Интернет

[root@server4 ~]# firewall-cmd --permanent --zone=public --add-service=dns
[root@server4 ~]# firewall-cmd --reload

Трябва да редактираме nano /etc/named.conf и по скоро секцията options за нашите нужди по следния начин

options {
	listen-on port 53 { 127.0.0.1; 93.155.130.93; };
        listen-on-v6 port 53 { ::1; };
        directory	"/var/named";
        dump-file	"/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";

        allow-query     {
        192.168.0.0/16;
        172.16.0.0/12;
        10.0.0.0/8;
        93.155.130.0/23;
        93.155.162.0/24;
        93.155.169.0/24;
        localhost; };

И да проверим отдалечено отговаря ли ни DNS сървъра на заявки

Конфигуриране на виртуални хостове в Apache. Първо нека се убедим от отдалечен компютър, че mysite.itservice-bg.net е асоцииран към IP адрес 93.155.130.93, операция която сме направили преди това в мастер DNS сървъра който ни обслужва

samyil@desktop:~$ ping mysite.itservice-bg.net -c 2 -n
PING mysite.itservice-bg.net (93.155.130.93) 56(84) bytes of data.
64 bytes from 93.155.130.93: icmp_seq=1 ttl=62 time=3.37 ms
64 bytes from 93.155.130.93: icmp_seq=2 ttl=62 time=2.78 ms

--- mysite.itservice-bg.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 2.786/3.079/3.373/0.298 ms

След което се връщаме в CentOS сървъра, създаваме директория където ще се намира новия ни сайт и в нея създаваме файл с разширение .html който ще ни послужи за тест, дали работи виртуалния домейн mysite.itservice-bg.net в сървъра Apache

[root@server4 ~]# mkdir /var/www/mysite.itservice-bg.net
[root@server4 ~]# nano /var/www/mysite.itservice-bg.net/index.html

Копираме html кода във файла index.html

<html>
  <head>
    <title>новия сайт mysite.itservice-bg.net</title>
  </head>
  <body>
    <h1>Виртуалният ми хост mysite.itservice-bg.net работи !!!</h1>
  </body>
</html>

Създаваме виртуалния домейн във конфигурационната директория на Apache сървъра (разширението .conf е задължително)

[root@server4 ~]# nano /etc/httpd/conf.d/mysite.itservice-bg.net.conf

Копираме следните директиви за Apache сървъра

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    ServerName mysite.itservice-bg.net
    ServerAlias www.mysite.itservice-bg.net
    DocumentRoot /var/www/mysite.itservice-bg.net/
    ErrorLog /var/log/httpd/mysite.itservice-bg.net.error.log
    CustomLog /var/log/httpd/mysite.itservice-bg.net.access.log combined
</VirtualHost>

Трябва обаче да направим още един конфигурационен файл за да запазим страницата по подразбиране на Apache сървъра защото ако вместо домейн име се напише IP адрес в браузера ще ни се покаже първия сайт което не е много приятно особено ако този сайт вече е с вдигнат сертификат.

[root@server4 ~]# nano /etc/httpd/conf.d/000-default.conf
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog /var/log/httpd/error.log
        CustomLog /var/log/httpd/access.log combined
</VirtualHost>

Рестартираме Apache за да влязат промените в сила

[root@server4 ~]# systemctl restart httpd.service

Проверка с любим браузер имаме ли сайт

Инсталиране на WordPress

Отиваме на официалната страница на WordPress за да изтеглим последната актуална версия на софтуера

С rm -rf изтриваме текущата директория на сайта ни, с wget изтегляме WordPress, с unzip разархивираме в директорията /var/www на Apache сървъра, с mv преименуваме директория както си беше с името на сайта и с chown променяме собственика на файловете в директорията да е Apache сървъра.

[root@server4 ~]# rm -rf /var/www/mysite.itservice-bg.net/
[root@server4 ~]# wget -c https://bg.wordpress.org/wordpress-4.7.3-bg_BG.zip
[root@server4 ~]# unzip wordpress-4.7.3-bg_BG.zip -d /var/www/
[root@server4 ~]# mv /var/www/wordpress/ /var/www/mysite.itservice-bg.net
[root@server4 ~]# chown -R apache:apache /var/www/mysite.itservice-bg.net/

Връщаме се в phpmyadmin и създаваме база с име mysite без съдържание която ще ни е необходима за WordPress инсталацията ни

Първата страничка на WordPress ще ни прекара през съветник за да можем да инсталираме системата

Копираме съдържанието в указания файл и продължаваме инсталацията

[root@server4 ~]# nano /var/www/mysite.itservice-bg.net/wp-config.php

Готово !!! Имаме инсталиран WordPress.

Конфигуриране на сайта със SSL сертификат на Letsencrypt

[root@server4 ~]# install python-certbot-apache
[root@server4 ~]# certbot --apache

certbot –apache е скрипт на Letsencrypt който ще ни създаде няколко въпроса за да настрой автоматично конфигурацияра в Apache, нашият сайт да притежава валиден SSL сертификат. Важно е да се знае, че като изискване е сайта да има и www пред домейна

След като вече имаме сертификат на сайта той трябва да се обновява по някакъв начин. Един от вариантите е да се копира командата certbot renew в /etc/crontab например, като Letsencrypt ни препоръчва то да не е повече от два пъти на ден, аз ще направя проверката да е всеки ден в 4:20 сутринта.

[root@server4 ~]# nano /etc/crontab
02 4 * * * root certbot renew
systemctl restart crond.service
SELinux е вътрешна система за сигурност в CentOS. В реални условия обаче на натоварен сървър SELinux вероятно ще ви създаде повече проблеми отколкото ще ви помогне. Моят реален такъв случай се случи когато DNS услугата спря да работи при рязко повишаване на заявки към сървъра. При явно правилна конфигурация на DNS сървъра ми отне малко, но ценно време за да въстановя услугата като спрях SELinux.
[root@server4 ~]# nano /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@server4 ~]# reboot
Ако по някаква причина не намирате нужния за вас софтуерен пакет в хранилищата можете да разширите още възможностите на системата дори с още по модерен софтуер като добавите хранилището Remi RPM repository което подчертавам не е официално хранилище на дистрибуцията но пък е добре поддържано и винаги актуално
[root@server4 ~]# rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
[root@server4 ~]# yum -y install yum-utils
[root@server4 ~]# yum update
[root@server4 ~]# yum update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.us.leaseweb.net
 * epel: fedora-epel.mirrors.tds.net
 * extras: mirror.us.leaseweb.net
 * remi-safe: mirrors.neterra.net
 * updates: mirror.us.leaseweb.net
No packages marked for update

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

This Post Has 8 Comments

  1. Богомил Симеонов

    Много полезен топик! Благодаря!

  2. Zxel

    Така и не разбрах какво ще ме накара да използвам стотинка ос пред дебиан например. Сички викат сигурност и стабилност а хакнати сайтове колко искаш ? С Дебилиана си ми е добре – научил съм му бъговете вече.

  3. Самуил Арсов

    Мисля, че сам си отговаряш на въпроса, че написаното по горе не е адресирано до теб.

  4. Ростислав Малев

    А може ли да се инсталира php 7 ? Имам впредвид не със емнайсет хиляди команди а с yum ?

  5. Самуил Арсов

    Може

    rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
    yum -y install yum-utils
    yum update
    yum -y install php
    yum-config-manager --enable remi-php70
    yum -y install php php-opcache
    
  6. Христо Донев

    Много полезно, благодаря 🙂

  7. The_Admin

    @Zxel, някой се е потрудил да напише една чудесна статия а ти тролиш без никакъв смисъл !!! По думите ти разбирам, че нито Debian нито CentOS са ти ясни но анонимно като се направиш на капацитет се чувстваш по могъщ, нали ?

  8. Майстор тричко

    Много добре написано стъпка по стъпка, благодаря. Ще се радвам да виждам все повече такива статии 🙂