31 KiB
source | tags | ||
---|---|---|---|
https://habr.com/ru/company/nixys/blog/645451 |
|
[!seealso] Все части
Введение
Приветствую читателей. В практике нашей компании часто появляется потребность в настройке серверов для простых односерверных проектов или небольших кластеров. В этой статье я бы хотел рассказать вам о нашем опыте подобной настройки, выделить особенности, которые могут вам пригодиться при дальнейшем администрировании. Статья предназначена для людей, которые только вникают в администрирование, а также для тех, кто самостоятельно администрирует свой небольшой проект и хочет набраться опыта в этом деле. Если вы являетесь опытным администратором, то можете смело пропускать данный материал.
Целью серии статей является описание подготовки работы сервера со стеком LEMP ( #Linux, #nginx, #MySQL, #PHP), развертывание стэка и поднятие на нем работающих площадок. Инструкция подойдет для небольших #Bitrix проектов, а тажке для проектов развернутых под любой популярной CMS.
Не смотря на то, что тема уже достаточно подробно отражена в сети, мы решили подробно описать общие стандарты администрирования с нуля, по-скольку регулярно получаем большое количество базовых вопросов от людей, так или иначе, связанных с нашей сферой.
Большая часть проектов базируется на ОС #Ubuntu, #Debian в статьях будут отражены настройки для этих систем.
Общая схема работы сервера
Представим, что вы получили сервер с установленной ОС, без каких-либо дополнительных настроек и кастомизаций со стороны ДЦ. Целью работы сервера является обслуживание сайта с развернутым на нем LEMP стэком.
Для удобства ниже представлена схема работы такого сервера со всем необходимым для работы ПО:
В нашем случае вместо php-fpm будет развернут #apache2, поэтому данный стэк является не совсем LEMP, но вместо apache2 можно без каких-либо проблем развернуть php-fpm, целью статьи является все же указать на основные базовые моменты при настройке серверов для простых проектов.
На данной схеме отражено не все ПО, необходимое для работы и анализа проблем, это лишь основные компоненты, требуемые для работы нашей будущей площадки. В статье будет приведен более полный список ПО, а также более подробно описана работа каждого компонента данной схемы.
Базовые пакеты
Для того, чтобы начать развертывание проекта, необходимо установить базовые пакеты для работы. Для их развертывния актуальны следующие команды:
apt-get update && apt-get install dirmngr mc iotop htop telnet tcpdump nmap curl console-cyrillic hexedit sudo zip unzip patch pwgen vim less parted subversion ntp bzip2 lsof strace mutt s-nail ncdu smartmontools tree dnsutils logrotate rsyslog
Здесь мы устанавливаем инструменты для работы на сервере, а также инструменты для анализа будущих проблем в работе сервера. Я не буду останавливаться на всех пакетах, а лишь перечислю самые необходимые:
dirmngr
– необходим для добавления ключей репозиториев. mc – он же Midnight Commander, файловый менеджер, не нуждающийся в представленииiotop
– утилита, показывающая каналы ввода/вывода; будет полезной при анализе работы дисков.htop
– наше все, могучий монитор ресурсов, отображающий всю информацию о текущем потреблении ресурсов системы. Позволяющий также отправлять системные вызовы процессам, менять их приоритет в системе и многое другое.telnet
– на практике, часто используем для проверки доступности удаленных портов. В случае если порт закрыт, мы будем точно знать, что проблема не на нашей стороне.tcpdump
иnmap
– утилиты для анализа сетевого трафикаcurl
– используем для отправки различных запросов, отладки работы веб-серверов.console
yrillic** - пакет для русификации консоли (поддержки кириллицы в локальном терминале).hexedit
- пакет для редактирования данных, в котором данные представлены как последовательность байтов..zip
,unzip
,bzip2
– также не нуждаются в представлении, известные архиваторы данных.pwgen
– утилита для генерации паролей, будет полезна для оперативного создания доступов любого уровня.strace
– утилита для анализа системных вызовов процесса, используется для расширенного анализа работающих в системе процессов. По факту мы используем strace в тех случаях, когда логи сервисов не указывают на конкретную проблему.ncdu
– удобный инструмент для быстрого отображения размера данных в директории.logrotate
– инструмент для ротации логов в системе, также в отдельном представлении не нуждается.
После установки базовых пакетов устанавливаем время на сервере согласно текущему часовому поясу, с помощью команды:
dpkg-reconfigure tzdata
Далее выбираем нужные локали в системе (RU-UTF8
, RU-KOI8R
, RU-CP1251
):
dpkg-reconfigure locales
Применяем локали:
/etc/default/locale
Устанавливаем mc как редактор по умолчанию:
update-alternatives --config editor
где выбираем пункт mcedit
.
Настройка git-autocommit
В процессе администрирования мы часто сталкиваемся с тем, что необходимо оперативно выяснить, кто и когда внес изменения в те или иные конфигурационные файлы. Для решения этой проблемы мы используем git-autocommit
, который фиксирует изменения в конфигах в локальный git
репозиторий сервера. Ниже будет описана его настройка:
Ставим на сервер git
:
apt-get install git
Создаем файл конфигурации в корневой директории root пользователя с нужными правами:
touch ~/.gitconfig
chmod 600 ~/.gitconfig
Файл имеет следующее содержание
[user]
name = root
email = root@$HOSTNAME
$HOSTNAME
заменяем на соответствующее название сервера в проекте. Далее потребуется создать репозиторий, с помощью команд:
cd
git init && mv .git config.git
chmod 700 /root/config.git
echo "gitdir: /root/config.git" > /.git && chmod 600 /.git
Далее задаем директории, для который автокоммит не должен фиксировать изменения, в файл ~/config.git/info/exclude
:
/*
!/etc
!/usr
/usr/*
!/usr/local
/usr/local/*
!/usr/local/scripts
!/var
/var/*
!/var/spool
/var/spool/*
!/var/spool/cron
/var/spool/cron/*
!/var/spool/cron/crontabs
На практике же нас интересуют директории /usr
и /etc
. В случае, если на проекте есть конфигурации docker
контейнеров, не помещенных во внешний git
репозиторий, мы также добавляем директорию в которой расположен docker-compose
к автокомиту для отслеживания изменений. С недавних пор мы также отслеживаем изменения в пользовательских кронатобов /var/spool/cron/crontabs
, так как существует проблема потери крон задач на Битрикс проектах. Также некоторые клиенты могут удалить нужную задачу по невнимательности.
После делаем первый коммит и проверяем:
git add -A && git commit -m 'Создание репозитория @system'
Также мы реализуем постоянное отслеживание установленных пакетов на сервере с помощью git autocommit, для этого записываем все текущие установленные пакеты в файл с помощью крон задачи:
* * * * * root /usr/bin/dpkg -l > /etc/package_list
Сам автокоммит запускается с помощью следующего крона:
* * * * * root sleep 10;cd / && git add -A && git commit -m "Autocommit @system" > /dev/null
Таким образом мы можем посмотреть, какие именно изменения вносились в конфигурации сервиса и в какое время. Пример коммита для файла etc/nginx/nginx.conf вызываем командой:
git log --follow -p /etc/nginx/nginx.conf
Результат:
git log --follow -p /etc/nginx/nginx.conf
Результат: commit be993a2734e9f206ed7cb8ee52f54a52ca642cc9 Author: root Date: Tue Oct 12 14:37:11 2021 +0300
Autocommit @system
diff --git a/etc/nginx/nginx.conf b/etc/nginx/nginx.conf index 8c9ed7c..8d694c9 100644 --- a/etc/nginx/nginx.conf +++ b/etc/nginx/nginx.conf @@ -52,12 +52,12 @@ deny 178.166.163.237; #limit_conn_zone $binary_remote_addr zone=cglob:16m;
-
map $http_user_agent $spam_bots {
-
default '';
-
~*(321039152) 1;
-
}
+# map $http_user_agent $spam_bots { +# default ''; +# ~*(321039152) 1; +# }
-
limit_req_zone $spam_bots zone=spambots:16m rate=2r/s;
+# limit_req_zone $spam_bots zone=spambots:16m rate=2r/s;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
commit 2df8332dc97681489e43e9aaa85f9078fc50e321 Author: root Date: Tue Oct 12 14:11:11 2021 +0300
Autocommit @system
diff --git a/etc/nginx/nginx.conf b/etc/nginx/nginx.conf index 8d694c9..8c9ed7c 100644 --- a/etc/nginx/nginx.conf +++ b/etc/nginx/nginx.conf @@ -52,12 +52,12 @@ deny 178.166.163.237; #limit_conn_zone $binary_remote_addr zone=cglob:16m;
-# map $http_user_agent $spam_bots { -# default ''; -# ~*(321039152) 1; -# }
-
map $http_user_agent $spam_bots {
-
default '';
-
~*(321039152) 1;
-
}
-# limit_req_zone $spam_bots zone=spambots:16m rate=2r/s;
-
limit_req_zone $spam_bots zone=spambots:16m rate=2r/s; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
Таким образом, мы видим, кто и когда внес изменения. Данное решение крайне полезно при возникновении спорных ситуаций внутри команды или когда проблема в конфигурации всплыла после внесения изменений не сразу, а спустя время.
## Базовая настройка ssh, добавление на сервер администратора
После можно приступить к установке и настройке базовых сервисов. Начнем с ssh. Устанавливаем службу, если по каким-то причинам она не была установлена ранее
```shell
apt update
apt install ssh
На наших серверах мы ограничиваем всех ssh пользователей через директиву AllowUsers
, добавляем и удаляем пользователей по мере необходимости:
AllowUsers USERS_NAMES
Сразу же отключаем доступ для пользователя root путем изменения строки в /etc/ssh/sshd_config
:
PermitRootLogin no
Вносим изменения в права на директорию ssh, в целях безопасности:
chmod 750 /etc/ssh
Перезапускаем службу для применения изменений:
/etc/init.d/ssh restart
Дальнейший вход на сервер по ssh будет доступен только для пользователей указанных в AllowUsers
. Добавление системных администраторов на сервера происходит с помощью наших внутренних утилит, однако я опишу процесс добавления так, если бы это происходило ручным способом:
Для добавления на сервер системного администратора вам потребуется:
Авторизоваться на сервере от пользователя root
Создать пользователя системы и группу (пользователи площадок и администраторы имеют UID
и GID
от 1000
это общий стандарт для несистемных пользователей):
groupadd -g 10001 v.pupkin
useradd -g 10001 -u 10001 -s /bin/bash -d /home/v.pupkin v.pupkin
Далее создаем домашнюю директорию пользователя и права для него:
mkdir -p /home/v.pupkin v.pupkin
cd /home/v.pupkin v.pupkin
chown -R v.pupkin: /home/v.pupkin v.pupkin
chmod 751 /home/v.pupkin v.pupkin
chmod -R o-rwx /home/v.pupkin v.pupkin/*
После нам останется только прокинуть публичный ssh ключ для пользователя v.pupkin
на сервер, а также дать пользователю права на выполнение sudo
. Для этого достаточно добавить строку в файл /etc/sudoers
вида:
v.pupkin ALL=(ALL) NOPASSWD: ALL
Делать это нужно исключительно путем выполнения команды:
visudo
Она проверит синтаксис файла /etc/sudoers
перед сохранением. Так как если отредактируете файл вручную и он будет с синтаксической ошибкой, вы не сможете авторизоваться в системе от нужного пользователя или перейти в /etc/sudoers
, что по сути поломает систему.
При этом обязательно в файле /etc/sudoers
необходимо закомментировать строку:
%sudo ALL=(ALL) ALL
для ограничения выполнения sudo
других пользователей. После внесения всех
После внесения всех изменений администратор v.pupkin
сможет попадать на сервер, а для перехода в root достаточно будет ввести команду sudo su -
. Обратите внимание на "-" в данной команде, зачастую многие начинающие системные администраторы забывают об этом. Дефис нужен для подтягивания системных окружений, так, например, без него вы не сможете корректно запустить скрипты на сервере.
После внесения всех изменений перейдите в консоль пользователя v.pupkin
и сгенерируйте пару ssh ключей**:**
su v.pupkin -
ssh-keygen -t rsa
В завершении обязательно сгенерируйте пароль для пользователя v.pupkin
в системе:
pwgen 15 1
Данная команда сгенерирует случайный 15 значный пароль. После примените его, для этого от пользователя root выполните команду:
passwd v.pupkin
На этом настройку ssh и предоставление доступов администратору можно считать завершенной. Дальнейшие администраторы будут добавлены также по этой схеме.
Базовая настройка FTP
Далее переходим к настройке доступа к серверу по FTP. Для этих целей будем использовать пакет vsftpd, который есть в стандартных репозиториях. Устанавливаем пакет:
apt install vsftpd
Стандартный файл конфигурации vsftpd расположен по пути /etc/vsftpd.conf
, но хранить конфигурации всех FTP пользователей в одном файле не совсем удобно для администрирования, поэтому мы создадим отдельный каталог для конфигураций службы и создадим символическую ссылку на конфигурационный файл /etc/vsftpd.conf
, чтобы предотвратить конфликты в системе.
Удаляем основной файл конфигурации службы:
rm /etc/vsftpd.conf
Создаем новую директорию, которая будет основной для конфигураций сервиса:
mkdir /etc/vsftp/
Далее создаем основной файл конфигурации /etc/vsftp/vsftpd.conf
:
touch /etc/vsftp/vsftpd.conf
Со следующим содержимым:
listen=YES
log_ftp_protocol=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
dirmessage_enable=YES
pasv_enable=YES
port_enable=NO
connect_from_port_20=NO
pasv_max_port=30005 #
pasv_min_port=30000 #
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
ascii_upload_enable=NO
ascii_download_enable=NO
ftpd_banner=Welcome to FTP server.
local_umask=0777
user_config_dir=/etc/vsftp/vsusers
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftp/vsftpd.chroot_list
userlist_file=/etc/vsftp/vsftpd.user_list
userlist_enable=YES
userlist_deny=NO
allow_writeable_chroot=YES
seccomp_sandbox=NO
force_dot_files=YES
pasv_promiscuous=YES
Здесь приведены основные настройки, вы можете их менять в зависимости от своих потребностей. Здесь же мы указываем файлы и директорию, в которых будем описывать FTP пользователей:
/etc/vsftp/vsftpd.chroot_list
/etc/vsftp/vsftpd.user_list
/etc/vsftp/vsusers
Логирование службы вынесено в отдельный файл:
xferlog_file=/var/log/vsftpd.log
Опционально вы можете воспользоваться следующими функциями при необходимости:
Для отображения скрытых файлов в листинге подключения, вне зависимости от настроек FTP-клиента можно использовать параметр force_dot_files
:
force_dot_files=YES
Для исключения постоянных проверок соответствия IP адресов соединения и управляющего, чтобы исключить ошибку 425 Security: Bad IP connecting.
, необходимо добавить в файл /etc/vsftp/vsftpd.conf
параметр:
pasv_promiscuous=YES
Далее создадим необходмые файлы и директории:
touch /etc/vsftp/vsftpd.chroot_list
touch /etc/vsftp/vsftpd.user_list
mkdir /etc/vsftp/vsusers
А также создадим символьную ссылку для корректной работы сервиса:
ln -s /etc/vsftp/vsftpd.conf /etc/vsftpd.conf
После вам потребуется открыть 21
и 30000:30005
порты для внешних подключений на уровне файрволла, например, следующим образом:
IPTABLES -A tcp_packets_inet -p tcp -s 0/0 --dport 30000:30005 -j allowed
IPTABLES -A tcp_packets_inet -p tcp -s 0/0 --dport 21 -j allowed
Мы рекомендуем открывать порты не для всех адресов, а только для тех IP, которым необходим доступ по FTP.
После выполнения этих действий, применяем права на каталог /etc/vsftp/
в целях безопасности:
chmod 750 /etc/vsftp/
Перезапускаем сервис:
service vsftpd restart
И проверяем, что он работает и запущен:
service vsftpd status
● vsftpd.service - vsftpd FTP server
Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2021-12-19 17:08:13 MSK; 1s ago
Process: 1285 ExecStartPre=/bin/mkdir -p /var/run/vsftpd/empty (code=exited, status=0/SUCCESS)
Main PID: 1286 (vsftpd)
Tasks: 1 (limit: 1171)
Memory: 608.0K
CGroup: /system.slice/vsftpd.service
└─1286 /usr/sbin/vsftpd /etc/vsftpd.conf
Dec 19 17:08:13 31-31-192-22.cloudvps.regruhosting.ru systemd[1]: Starting vsftpd FTP server...
Dec 19 17:08:13 31-31-192-22.cloudvps.regruhosting.ru systemd[1]: Started vsftpd FTP server.
В завершении всех действий, проверяем, что нужные порты открыты и слушаются службой. Для проверки доступности используем telnet
:
telnet 0.0.0.0 21
Где 0.0.0.0
- внешний IP адрес вашего сервера. Если команда выдает статус connected, то порты открыты корректно и служба vsftpd слушает их.
На данном этапе базовая настройка FTP завершена, как добавить конкретного пользователя я расскажу в третьей части статьи.
Базовая настройка exim4 (smarthost)
После настройки работы по FTP переходим к настройке отправки почты с сервера. Так как у нас простой сервер для небольшого проекта, мы будем настраивать exim4
в конфигурации smarthost
. То есть почтовый сервер будет осуществлять только отправку почты с сервера, не более.
Приступим к установке пакета:
apt update
apt install exim4 exim4-base exim4-config exim4-daemon-light
После переходим к редактированию файла /etc/exim4/update-exim4.conf
, и приводим его к следующему виду:
dc_eximconfig_configtype='internet'
dc_other_hostnames='DOMAIN.RU'
dc_local_interfaces='127.0.0.1 : EXTERNAL_IP'
dc_readhost=''
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets='127.0.0.1 : RELAY_FROM_HOST_IPs'
dc_smarthost=''
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname=''
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'
Где:
DOMAIN.RU
- Доменное имя сервера, прописанное в обратной зоне.EXTERNAL_IP
- Внешний IP данного сервераRELAY_FROM_HOST_IPs
- IP адреса satellit-серверов, если они есть.
Параметр dc_eximconfig_configtype
отвечает за режим работы почтового сервера, по умолчанию он будет установлен в local
, что запретит вам отправлять почту на удаленные сервера.
Далее переходим к файлу /etc/exim4/exim4.conf.template
и меняем там значения двух строк:
qualify_domain = DOMAIN.RU
primary_hostname = DOMAIN.RU
Здесь также задаем основное доменное имя, к ДНС зоне которого мы имеем доступ. Данные настройки потребуются нам в дальнейшем, при настройке почтовых записей.
Для системного администрирования важно, чтобы уведомления служб сервера для пользователя root отправленные по почте, отправлялись на нужный почтовый ящик, для этого в exim4.conf.template
потребуется внести следующие изменения, обеспечивающие доставку почты, адресованной пользователю root:
mail_for_root:
driver = redirect
domains = DOMAIN.RU
condition = ${if eq{$local_part}{root}}
data = admin@nixys.ru
где:
DOMAIN.RU
- это название проектаadmin@nixys.ru
– почтовый ящик администратора сервера
После выполнения всех действий перезапускаем exim4:
service exim4 restart
проверяем, что он запущен:
service exim4 status
● exim4.service - LSB: exim Mail Transport Agent
Loaded: loaded (/etc/init.d/exim4; generated)
Active: active (running) since Sun 2021-12-19 18:18:11 MSK; 1s ago
Docs: man:systemd-sysv-generator(8)
Process: 943 ExecStart=/etc/init.d/exim4 start (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 1171)
Memory: 2.1M
CGroup: /system.slice/exim4.service
└─1191 /usr/sbin/exim4 -bd -q30m
Проверяем, что права на файлы и каталоги exim следующие:
drwxr-x--- 3 root Debian-exim [...] exim4
Помните, что для работы почтового сервиса в режиме smarthost
открытие 25
порта не требуется, так как осуществляется только отправка почты.
На данном этапе вы можете проверить отправку почты из консоли, достаточно будет просто ввести команду вида:
echo "Hello there" | mail -s "world" -r адрес@отправителя адрес@получателя
Однако с учетом текущих настроек, почта для вашего домена вряд ли дойдет до получателей. В третьей части статьи мы расскажем, как настроить все почтовые записи таким образом, чтобы ваша почта не оказалась в СПАМе.
Заключение
Обратите внимание, что в данной статье не описывается настройка фаервола. Вы можете настроить правила фаервола любым из доступных вам решений. Для простых проектов мы используем надстройку над iptables
в виде пакета nxs-ferm
, в основу которого лег стандартный ferm с небольшими изменениями.
Во второй части статьи мы расскажем о настройке веб-серверов.
Создание площадок и пользователей площадок, обеспечения ими доступов, а также о настройке почтовых записей для отправки почты будет отражено в третьей части статьи.