Настраиваем время
Узнать, какое время на сервере можно с помощью команды date:
# date
Чтобы сменить часовой пояс, необходимо выбрать подходящий файл часовой зоны в /usr/share/zoneinfo. В случае, если у вас часовой пояс Москвы, выполните следующее:
# mv /etc/localtime /etc/localtime.bak # ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
Либо можете воспользоваться специальной утилитой, которая входит в комплект CentOS 7. Делает она ровно то же самое:
# timedatectl set-timezone Europe/Moscow
В CentOS 7 есть утилита для синхронизации времени chrony. В стандартной установке она должна быть установлена в системе, в минимальной ее нет. Если у вас она не стоит, то устанавливайте вручную:
# yum install chrony
Запускаем chrony и добавляем в автозагрузку:
# systemctl start chronyd # systemctl enable chronyd
Проверяем, нормально ли запустился:
# systemctl status chronyd ● chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2016-08-05 00:33:09 MSK; 52min left Main PID: 667 (chronyd) CGroup: /system.slice/chronyd.service └─667 /usr/sbin/chronyd Aug 05 00:33:09 centos.local systemd: Starting NTP client/server... Aug 05 00:33:09 centos.local chronyd: chronyd version 2.1.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +DEBUG +ASYNCDNS +IPV6 +SECHASH) Aug 05 00:33:09 centos.local chronyd: Generated key 1 Aug 05 00:33:09 centos.local systemd: Started NTP client/server. Aug 05 00:33:26 centos.local chronyd: Selected source 85.21.78.91 Aug 05 00:33:26 centos.local chronyd: System clock wrong by -3595.761368 seconds, adjustment started Aug 04 23:33:30 centos.local chronyd: System clock was stepped by -3595.761368 seconds
Все в порядке, сервис работает. После запуска он автоматически синхронизирует время.
Для синхронизации времени вы можете воспользоваться более привычно программой, которая присутствует практически во всех unix дистрибутивах — ntp. Устанавливаем утилиту синхронизации времени ntp в CentOS:
# yum install ntp
Разово синхронизируем время:
# /usr/sbin/ntpdate pool.ntp.org
Если ntpdate не работает, посмотрите материал, может это ваш случай. Запустим демон синхронизации и запишем его запуск в автозагрузку:
# systemctl start ntpd # systemctl enable ntpd ln -s '/usr/lib/systemd/system/ntpd.service' '/etc/systemd/system/multi-user.target.wants/ntpd.service'
Теперь наши часы будут автоматически синхронизироваться с сервером времени.
Не используйте одновременно оба демона синхронизации времени — chrony и ntp. Выберите какой-нибудь один. Лично я не вижу в них разницы, сам чаще всего ставлю привычный ntp.
Установка и базовая настройка vsFTPd
Обновляем систему:
yum update
Запускаем процесс установки:
yum install vsftpd
После открываем на редактирование следующий файл:
vi /etc/vsftpd/vsftpd.conf
И приводим его к следующему виду:
anonymous_enable=NO
chroot_local_user=YES
allow_writeable_chroot=YES
pasv_min_port=40900
pasv_max_port=40999
* первые две строчки мы редактируем: anonymous_enable разрешает подключение анонимных пользователей, поэтому мы отключаем такую возможность; chroot_local_user запрещает выход за пределы домашней директории пользователя. Третью, четвертую и пятую строки мы дописываем — allow_writeable_chroot разрешает подключения пользователю, у которого есть права на запись в корневую директорию; это диапазон динамических портов, которые будут использоваться vsFTPd
Данный диапазон важно указывать, если используется брандмауэр. Сам диапазон можно задать любой из незарегистрированных портов
Отключаем SELinux следующими командами:
setenforce 0
sed -i «s/SELINUX=enforcing/SELINUX=disabled/» /etc/selinux/config
* первая команда отключит SELinux, вторая — отключит его автозапуск после перезагрузки.
Добавляем правила в брандмауэр для корректной работы FTP-сервера:
firewall-cmd —permanent —add-port=20-21/tcp
firewall-cmd —permanent —add-port=40900-40999/tcp
firewall-cmd —reload
Разрешаем автозапуск vsFTPd и запускаем его:
systemctl enable vsftpd
systemctl start vsftpd
По умолчанию, к vsFTPd нельзя подключиться с использованием учетной записи root. Поэтому нужно использовать другую пользовательскую запись или создать новую следующей командой:
useradd ftpuser -d /var/www -s /sbin/nologin
* ftpuser — имя учетной записи; /var/www — домашняя директория; /sbin/nologin запрещает локальный вход в систему.
Задаем пароль новому пользователю:
passwd ftpuser
Базовая настройка закончена — можно пробовать подключаться к FTP-серверу.
Установка phpmyadmin
Устанавливаем phpmyadmin со всеми зависимостями:
# yum install -y phpmyadmin
После установки в каталоге с конфигурациями httpd /etc/httpd/conf.d появляется файл phpMyAdmin.conf. Сохраним сразу на всякий случай оригинальный файл, перед тем как начать его редактировать:
# cp /etc/httpd/conf.d/phpMyAdmin.conf /etc/httpd/conf.d/phpMyAdmin.conf.orig
По-умолчанию, в конфиге закрыт доступ к панели управления для всех адресов, кроме 127.0.0.1. Чтобы открыть доступ для всех, приведите файл к следующему виду:
# mcedit /etc/httpd/conf.d/phpMyAdmin.conf
Alias /phpMyAdmin /usr/share/phpMyAdmin Alias /phpmyadmin /usr/share/phpMyAdmin <Directory /usr/share/phpMyAdmin/> AddDefaultCharset UTF-8 Require all granted </Directory> <Directory /usr/share/phpMyAdmin/setup/> Require all granted </Directory> <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>
Я удалил все лишнее из файла, в том числе настройки, которые относились к версии apache 2.2. Перезапускаем httpd:
# systemctl restart httpd
Заходим по адресу http://ip-адрес-сервера/phpmyadmin. Вы должны увидеть страницу логина:
В этот момент я понял, что мне некуда логиниться. На тестовом сервере, где я готовлю статью, нет mysql. Если у вас та же ситуация, что у меня, установите mariadb. Подробно об я рассказал в статье, посвещенной настройке web-сервера, все подробности можете там посмотреть. Сейчас быстро ставим базу данных и запускаем ее:
# yum install -y mariadb mariadb-server # systemctl enable mariadb.service # systemctl start mariadb # /usr/bin/mysql_secure_installation
После этого можно еще раз окрыть web интерфейс phpmyadmin и зайти под учетной записью рута. Откроется главная страница панели с общей информацией о сервере:
На этом установка закончена, веб панелью можно пользоваться. Некоторые полезные настройки мы рассмотрим далее в соответствующем разделе, а сейчас установим phpmyadmin на веб сервере nginx.
Создание пользователя
Для каждого клиента необходимо создавать отдельного пользователя Linux, к которому будут привязаны виртуальные домены и базы данных. Это позволит изолировать ресурсы одного пользователя от другого и осуществить квотирование.
1. Создаем пользователя и группу Linux:
groupadd u10001 -g 10001
useradd u10001 -u 10001 -g virtwww -G u10001 -d /var/www/u10001 -m -k /dev/null
* где u10001 — имя пользователя/группы; 10001 — идентификатор пользователя в системе; virtwww — основная группа, которой будет принадлежать пользователь; опция -m создаст каталог пользователя; -k /dev/null — не использовать скелет для наполнения профиля файлами.
2. Создаем базу данных и пользователя mysql:
mysql -uroot -p -e «CREATE DATABASE b10001 DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;» -e «GRANT ALL PRIVILEGES ON b10001.* TO m10001@localhost IDENTIFIED BY ‘mysqlpass’;»
* где b10001 — название базы; m10001 — пользователя базы данных; mysqlpass — пароль доступа к mysql.
3. Создаем FTP-пользователя. Процесс зависит от того, где мы решили хранить пользователей.
Если храним в файле:
ftpasswd —passwd —file=/etc/proftpd.d/ftpd.passwd —name=f10001 —uid=10001 —gid=10001 —home=/var/www/u10001 —shell=/sbin/nologin
Если в базе данных:
mysql -uroot -p -e «INSERT INTO proftpd.users (username, password, uid, gid, homedir) values (‘f10001’, encrypt(‘ftpass’), 10001, 10001, ‘/var/www/u10001’);»
* f10001 — имя FTP-пользователя; ftpass — пароль пользователя.
4. Задаем права на каталоги:
chmod 4710 /var/www/u10001
chmod 4470 /home/mysql/b10001
chown u10001:virtwww /var/www/u10001
chown u10001:mysql /home/mysql/b10001
* где /home/mysql — путь, по которому хранятся базы.
Управление репозиториями в CentOS
Управление пакетами и репозиториями осуществляет утилита YUM (Yellowdog Updater, Modified) — менеджер RPM-пакетов, использующийся в дистрибутивах: RHEL, SentOS, Scientific Linux. В его задачи входит: поиск, установка, удаление пакетов, обновление системы.
Процесс установки пакетов происходит после выполнения команды — yum install packagename. После ввода команды менеджер пакетов проверяет наличие конфигурационных файлов «*.repo», эти файлы содержат информацию о репозиториях и хранятся в директории /etc/yum.repos.d. Во время проверки YUM получает всю необходимую информацию, указывающую откуда загружать пакет и какие зависимости имеют к нему отношение. После чего происходит установка пакета.
Конфигурационные файлы репозиториев содержат следующие параметры:
- name — имя репозитория, может быть любым.
- baseurl — ссылка указывающая на репозиторий. Может быть вида: ftp://link, http://link, https://link, если репозиторий размещен в сети интернет, или file://path, если репозиторий размещен локально.
- enabled — указывает на активацию репозитория при выполнении обновления. Может иметь следующие значения, 1 — если подключен, 0 — если отключен.
- gpgcheck — включить или выключить проверку сигнатуры GPG. Может иметь следующие значения, 1 — проверять, 0- не проверять.
- gpgkey — ссылка на ключ GPG.
- exclude — список исключаемых пакетов.
- includepkgs — список включаемых пакетов.
- mirrorlist — вместо ссылки на конкретный адрес репозитория, может использоваться ссылка на список адресов из которых будет выбран нужный адрес.
Подключение репозиториев в CentOS
Добавить репозиторий в CentOS можно несколькими способами. Можно создать файл «.repo» в директории /etc/yum.repos.d или установить rpm-пакет с информацией о репозитории. Если rpm-пакет отсутствует, то добавлять приходится ручками, создавая конф. файл репозитория.
Для просмотра списка активных репозиториев выполняют команду — yum repolist
yum repolist # Выхлоп: repo id repo name status base/7/x86_64 CentOS-7 - Base 9,007 epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 10,580 extras/7/x86_64 CentOS-7 - Extras 390 updates/7/x86_64 CentOS-7 - Updates 2,469 repolist: 22,446 # repo id - id репозитория # repo name - имя репозитория # status - количество пакетов
Удаление репозиториев в CentOS
Для удаления репозиториев в системе должен быть установлен пакет yum-utils.
yum install yum-utils -y
Допустим мы хотим удалить из системы репозитории REMI и ELRepo, для этого надо узнать «repo id» при помощи команды yum repolist.
yum repolist Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirror.yandex.ru * elrepo: elrepo.0m3n.net * epel: mirror.23media.de * extras: mirror.yandex.ru * remi-safe: mirror.23media.de * updates: mirror.yandex.ru repo id repo name status base/7/x86_64 CentOS-7 - Base 9,007 elrepo ELRepo.org Community Enterprise Linux Repository - el7 162 epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 10,580 extras/7/x86_64 CentOS-7 - Extras 390 remi-safe Safe Remi's RPM repository for Enterprise Linux 7 - x86_64 1,144 updates/7/x86_64 CentOS-7 - Updates 2,469 repolist: 23,752
Удалим указанные репозитории.
yum-config-manager --disable remi-safe --disable elrepo
Команда скорее отключает указанные репозитории, чем удаляет их. Она выставляет значение параметра enabled равным 0. Файлы репозиториев «.repo» останутся на месте. Если выполнить команду yum repolist, то репозитории будут недоступны.
yum repolist Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirror.yandex.ru * epel: fedora-mirror01.rbc.ru * extras: mirror.yandex.ru * updates: mirror.yandex.ru repo id repo name status base/7/x86_64 CentOS-7 - Base 9,007 epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 10,580 extras/7/x86_64 CentOS-7 - Extras 390 updates/7/x86_64 CentOS-7 - Updates 2,469 repolist: 22,446
Теперь нужно обновить кэш YUM.
yum clean all yum makecache
Для полного удаления репозиториев следует удалить их конфигурационные файлы.
# Переходим в каталог /etc/yum.repos.d cd /etc/yum.repos.d # Удаляем файлы rm -f elrepo.repo remi-php70.repo remi-php71.repo remi-safe.repo remi.repo
Настраиваем firewall
Сейчас мы быстро и просто настроим firewall. В CentOS 7 в качестве фаервола выступает iptables. По-умолчанию он запущен. Чтобы посмотреть текущие правила, нужно ввести команду:
# iptables -L -v -n
Сразу хочу предупредить, что не имея доступа к консоли сервера, настраивать firewall плохая идея. Даже если вы очень хорошо понимаете что делаете и проделывали подобное много раз, все равно есть шанс остаться без доступа к серверу. Так что первым делом перед настройкой iptables проверяем доступ к консоли через KVM или физически.
В 7-й версии CentOS для управления iptables разработан новый инструмент под названием firewalld и все управление производится через него. Я не понял зачем это сделали, и не могу сказать, удобнее с ним стало или нет. По мне, так удобнее использовать одни и те же наработки по iptables. Мигрируя от сервера к серверу и от дистрибутива к дистрибутиву, я просто редактирую скрипт настроек фаервола.
Но CentOS зачем-то придумали firewalld, в Ubuntu стоит ufw, но суть одна и та же — это утилиты для конфигурирования iptables, который один и тот же во всех дистрибутивах. Я привык управлять iptables через самописный скрипт, который переношу от сервера к серверу и редактирую под конкретные потребности. Этим скриптом я и поделюсь. Так что для начала остановим и отключим firewalld:
# systemctl stop firewalld # systemctl disable firewalld rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service' rm '/etc/systemd/system/basic.target.wants/firewalld.service'
Установим утилиты для iptables:
# yum -y install iptables-services
Включим автозапуск iptables:
# systemctl enable iptables
Теперь создадим файл /etc/iptables_rules.sh следующего содержания:
#!/bin/bash # # Объявление переменных export IPT="iptables" # Интерфейс который смотрит в интернет export WAN=eth0 export WAN_IP=149.154.71.205 # Очистка всех цепочек iptables $IPT -F $IPT -F -t nat $IPT -F -t mangle $IPT -X $IPT -t nat -X $IPT -t mangle -X # Установим политики по умолчанию для трафика, не соответствующего ни одному из правил $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP # разрешаем локальный траффик для loopback $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # Разрешаем исходящие соединения самого сервера $IPT -A OUTPUT -o $WAN -j ACCEPT # Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении. # Пропускать все уже инициированные соединения, а также дочерние от них $IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Пропускать новые, а так же уже инициированные и их дочерние соединения $IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешить форвардинг для уже инициированных и их дочерних соединений $IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Включаем фрагментацию пакетов. Необходимо из за разных значений MTU $IPT -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # Отбрасывать все пакеты, которые не могут быть идентифицированы # и поэтому не могут иметь определенного статуса. $IPT -A INPUT -m state --state INVALID -j DROP $IPT -A FORWARD -m state --state INVALID -j DROP # Приводит к связыванию системных ресурсов, так что реальный # обмен данными становится не возможным, обрубаем $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP $IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP # Рзрешаем пинги $IPT -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT $IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT $IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT $IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # Открываем порт для ssh $IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT # Открываем порт для DNS #$IPT -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT # Открываем порт для NTP #$IPT -A INPUT -i $WAN -p udp --dport 123 -j ACCEPT # Логирование # Все что не разрешено, но ломится отправим в цепочку undef $IPT -N undef_in $IPT -N undef_out $IPT -N undef_fw $IPT -A INPUT -j undef_in $IPT -A OUTPUT -j undef_out $IPT -A FORWARD -j undef_fw # Логируем все из undef $IPT -A undef_in -j LOG --log-level info --log-prefix "-- IN -- DROP " $IPT -A undef_in -j DROP $IPT -A undef_out -j LOG --log-level info --log-prefix "-- OUT -- DROP " $IPT -A undef_out -j DROP $IPT -A undef_fw -j LOG --log-level info --log-prefix "-- FW -- DROP " $IPT -A undef_fw -j DROP # Записываем правила /sbin/iptables-save > /etc/sysconfig/iptables
Делаем файл c правилами исполняемым и запускаем:
# chmod 0740 /etc/iptables_rules.sh # /etc/iptables_rules.sh
Проверяем, применились ли правила:
# iptables -L -v -n
При каждом запуске файла с правилами iptables, все изменения записываются в файл /etc/sysconfig/iptables и применяются при загрузке системы.
Ограничение доступа ssh по группам и пользователям домена
На текущий момент подключиться к серверу может любой пользователь домена. Исправим это и разрешим подключаться только пользователям из группы gr_linux_adm. Для этого правим конфиг /etc/sssd/sssd.conf, добавляя туда новые параметры.
# mcedit /etc/sssd/sssd.conf
access_provider = simple simple_allow_users = user55@xs.local simple_allow_groups = gr_linux_adm@xs.local
Обращаю внимание, что параметр access_provider у вас уже будет установлен в другое значение. Надо это изменить
Вы можете добавить разрешение как для конкретного пользователя, так и для целых групп. Сохраняйте конфиг и перезапускайте sssd.
# systemctl restart sssd
Теперь подключиться по ssh к серверу сможет только пользователь домена user55 и все члены группы gr_linux_adm.
Для разбора полетов и решения проблем нужно использовать лог файл — /var/log/secure. Вот пример успешного подключения:
Jul 12 18:10:44 xs-centos7-test sshd: pam_sss(sshd:auth): authentication success; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.1.3.221 user=lin-user Jul 12 18:10:44 xs-centos7-test sshd: Accepted password for lin-user from 10.1.3.221 port 51063 ssh2 Jul 12 18:10:45 xs-centos7-test sshd: pam_unix(sshd:session): session opened for user lin-user by (uid=0)
А вот кусок лога подключения доменного пользователя, для которого доступ по ssh закрыт.
Jul 12 18:08:28 xs-centos7-test sshd: pam_sss(sshd:auth): authentication success; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.1.3.221 user=vzap Jul 12 18:08:28 xs-centos7-test sshd: pam_sss(sshd:account): Access denied for user vzap: 6 (Permission denied) Jul 12 18:08:28 xs-centos7-test sshd: Failed password for vzap from 10.1.3.221 port 51057 ssh2 Jul 12 18:08:28 xs-centos7-test sshd: fatal: Access denied for user vzap by PAM account configuration
Здесь видно, что идентификация пользователя прошла корректно, но доступ к серверу запрещен.