Некоторые аспекты управления VDS-сервером под Linux

VDS (Virtual Dedicated Server) — услуга, в рамках которой пользователь получает виртуальный выделенный сервер с максимальными привилегиями. Это эмуляция реального физического сервера, у него есть рутовый доступ, возможность установки произвольных операционных систем и любого софта. При этом он обходится значительно дешевле аренды сопоставимого по мощности физического сервера.

На сервер можно поставить ОС со своего образа или воспользоваться готовым образом в панели управления.

0u9ydabend68r01ea0t_yosbuoq.png

Предположим, мы поставили Debian 10 и веб-сервер Nginx, который идёт в стандартном репозитории (apt install nginx). Давайте посмотрим, какие полезные утилиты и команды помогут в управлении сервером под Linux. Рассмотрим и отдельно Nginx, и сам VDS-сервер в целом.



Для начала желательно разобраться с самим веб-сервером. Nginx запускается по окончании установки. Проверяем этот факт:

systemctl status nginx


Выдача:

● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-08-17 08:52:54 UTC; 4min 23s ago
Docs: man:nginx(8)
Main PID: 3942 (nginx)
Tasks: 3 (limit: 4719)
Memory: 6.1M
CGroup: /system.slice/nginx.service
├─3942 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
├─3943 nginx: worker process
└─3944 nginx: worker process


Или просто вводим IP-адрес сервера в браузере:

http://your_server_ip


Если мы ещё не скопировали на сервер файлы своего сайта, то будет показана стандартная заглавная страница Nginx.

8ktj6jbxdwaucovqqq_zssglm2y.png


Примечание. Если пользователь не имеет рутовых прав, то для выполнения каждой команды он должен получить рутовые привилегии с помощью команды sudo.

Остановка веб-сервера:

sudo systemctl stop nginx


В случае запуска от имени root, команда такая:

systemctl stop nginx


Запуск после остановки:

systemctl start nginx


Остановка и повторный запуск (перезапуск):

systemctl restart nginx


Если вы просто внесли некие изменения в конфигурацию, Nginx может перегрузиться без потери текущих соединений. Это делается следующей командой:

systemctl reload nginx


По умолчанию, Nginx сконфигурирован на автоматический запуск при загрузке сервера. Такое поведение можно изменить следующей командой:

systemctl disable nginx


Снова включить автозапуск Nginx при загрузке сервера:

systemctl enable nginx


По умолчанию в Nginx сконфигурирован один набор правил server blocks для одного домена. Предполагается, что на вашем сервере размещается только один сайт. По умолчанию он должен располагаться в директории /var/www/html.

Предположим, что вы хотите создать в Nginx несколько наборов правил server blocks для нескольких сайтов или переместить файлы текущего сайта в другую директорию /var/www/your_domain.

Это делается следующими командами.

Сначала создаём нужную директорию на сервере.

mkdir -p /var/www/your_domain/html


Затем назначаем владельца этой директории с помощью переменной $USER, которая должна соответствовать текущему пользователю:

chown -R $USER:$USER /var/www/your_domain/html


Размещаем в указанной директории главную страничку index.html.

Потом нужно создать соответствующий набор правил для Nginx. В любом текстовом редакторе создаём файл /etc/nginx/sites-available/your_domain и копируем туда конфигурацию из файла по умолчанию, только с изменённым адресом и доменом:

server {
listen 80;
listen [::]:80;

root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;

server_name your_domain www.your_domain;

location / {
try_files $uri $uri/ =404;
}
}


В конце концов, активируем эту конфигурацию, прописав симлинк к новому конфигурационному файлу в директории sites-enabled, которую Nginx считывает при загрузке:

ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/


После перезагрузки Nginx будет выдавать соответствующую страницу на запросы your_domain и www.your_domain.
Какие вопросы чаще всего возникают у пользователей при управлении Linux-сервером? Какие инструменты можно порекомендовать даже не очень опытным администраторам?

Установка супервизора


Supervisor — это система клиент/сервер, при помощи которой администратор контролирует процессы на сервере. Инструмент создает процессы в виде подпроцессов от своего имени.

Установка supervisord в Debian или Ubuntu предельно простая:

apt-get install supervisor


После этого демон супервизора уже запущен и будет запускаться при каждой загрузке системы.

Новые программы передаются в супервизор через конфигурационные файлы в директории /etc/supervisor/conf.d. Например, для скрипта long.sh конфигурационный файл может выглядеть следующим образом:

[program:long_script]
command=/usr/local/bin/long.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/long.err.log
stdout_logfile=/var/log/long.out.log


Соответственно, скрипт будет автоматически запускаться при каждой загрузке системы и автоматически перезапускаться в случае выхода. Это значение может быть 'false' (не перезапускаться) или 'unexpected' (перезапускаться только в случае выхода с неожиданным кодом ошибки, по умолчанию, с любым кодом, кроме 0 или 2).

Две последние строчки — адреса журналов. Это минимальный шаблон конфигурации для программы в супервизоре.

После создания файла конфигурации для конкретной программы запускаем две команды, чтобы супервизор перечитал и применил новые конфигурации:

supervisorctl reread
supervisorctl update


На этом этапе наша программа или скрипт уже должны запуститься, что можно проверить по логам.

В утилите supervisorctl есть интерактивный режим, в котором она запускается без аргументов:

$ supervisorctl
long_script RUNNING pid 12614, uptime 1:49:37
supervisor>


В этом режиме supervisorctl изначально выводит статус и время работы всех программ под управлением супервизора, а потом свю командную строку. Там можно ввести help — и увидеть список доступных команд:

supervisor> help

default commands (type help ):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version

Как видим, можно запускать, останавливать и перезапускать программы из командной строки с помощью команд start, stop и restart.

Выход из супервизорпа осуществляется по Ctrl-C или командой quit:

supervisor> quit

Анализ свободного места на диске


Стандартная утилита для просмотра информации о смонтированных разделах — это df. Она выводит список подключенных устройств и информацию о занятом месте.

df опции устройство


Параметр -h активирует режим читаемого человеком вывода (то есть в мегабайтах или гигабайтах):

$ df -h
Файловая система Размер Использовано Дост Использовано% Cмонтировано в
devtmpfs 925M 0 925M 0% /dev
tmpfs 936M 56K 936M 1% /dev/shm
tmpfs 936M 1,9M 934M 1% /run
tmpfs 936M 0 936M 0% /sys/fs/cgroup
/dev/sda3 15G 11G 4,2G 71% /
tmpfs 936M 192K 936M 1% /tmp
/dev/sdb4 133G 126G 974M 100% /home
tmpfs 188M 20K 188M 1% /run/user/42
tmpfs 188M 7,1M 181M 4% /run/user/1000


Информация о конкретной директории (например, /home):

df -h /home


Информация о разделах с заданной файловой системой:

df -h -t ext4


Поиск файлов командой find


Поиск по названию файла:

find -name "query"


Поиск по названию без учёта регистра:

find -iname "query"


«Обратный» поиск файлов, которые не соответствуют указанному шаблону:

find -not -name "query_to_avoid"


или

find \! -name "query_to_avoid"


Поиск по типу файла

find -type дескриптор_типа запрос


Некоторые из распространённых дескрипторов:

  • f — обычный файл
  • d — директория
  • l — символическая ссылка
  • c — файлы устройств посимвольного ввода-вывода
  • b — файлы устройств блочного ввода-вывода


Например, следующая команда выведет все устройства посимвольного ввода-вывода, установленные в системе:

find / -type c
/dev/parport0
/dev/snd/seq
/dev/snd/timer
/dev/autofs
/dev/cpu/microcode
/dev/vcsa7
/dev/vcs7
/dev/vcsa6
/dev/vcs6
/dev/vcsa5
/dev/vcs5
/dev/vcsa4
. . .


Есть фильтр по размеру и времени доступа/изменения. Например, вот команда для поиска всех файлов менее 50 байт:

find / -size -50c


Поиск всех файлов более 700 мегабайт:

find / -size +700M


Для поиска по времени доступа, модификации или изменения метаинформации файла используются параметры '-atime', '-mtime' и '-ctime' с символами плюса и минуса для указания диапазона больше и меньше указанного, соответственно.

Поиск файлов, которые были модифицированы менее суток назад:

find / -mtime -1


Файлы с временем доступа более трёх суток назад:

find / -atime +3


Файлы, которые изменялись за последнюю минуту:

find / -mmin -1


Файлы, которые новее указанного файла:

find / -newer myfile


Доступен поиск по владельцу ('-user', '-group') и по файлам с конкретными разрешениями ('-perm'). На всех найденных файлах можно сразу провести какое-нибудь действие ('-exec').

Тестирование TCP и UDP-соединений


В комплекте Linux идёт большое количество полезных утилит. Некоторые системные администраторы способны выполнять большинство задач, пользуясь только встроенным инструментарием, без установки дополнительных программ. Настоящий швейцарский нож среди встроенных инструментов Linux — сетевая утилита netcat. Общий синтаксис:

netcat [options] host port


Эта команда инициирует TCP-соединение на заданный хост по указанному порту. Если вместе TCP нужно протестировать UDP-соединение, то указываем опцию -u:

netcat -u host port


Диапазон портов:

netcat host startport-endport


В большинстве систем можно писать как netcat, так и nc.

Сканирование портов


Одно из типичных применений netcat — сканирование портов, опция -z означает сканирование вместо установления соединения. Используем её вместе с опцией -v для выдачи более детальной информации при сканировании портов с 1 до 1000:

netcat -z -v domain.com 1-1000


Выдача будет выглядеть примерно так:

nc: connect to domain.com port 1 (tcp) failed: Connection refused
nc: connect to domain.com port 2 (tcp) failed: Connection refused
nc: connect to domain.com port 3 (tcp) failed: Connection refused
nc: connect to domain.com port 4 (tcp) failed: Connection refused
nc: connect to domain.com port 5 (tcp) failed: Connection refused
nc: connect to domain.com port 6 (tcp) failed: Connection refused
nc: connect to domain.com port 7 (tcp) failed: Connection refused
. . .
Connection to domain.com 22 port [tcp/ssh] succeeded!
. . .


Впрочем, для этой задачи имеется более продвинутая, специализированная программа nmap. Устанавливаем её:

apt-get update
apt-get install nmap


Эта утилита выдаёт более подробную информацию о портах. Реестр известных портов /usr/share/nmap/nmap-services содержит более 20 тысяч строк, в том числе дополнительные поля, такие как средняя частота открытия конкретного порта на серверах в интернете (третья колонка):

. . .
tcpmux 1/tcp 0.001995 # TCP Port Service Multiplexer [rfc-1078]
tcpmux 1/udp 0.001236 # TCP Port Service Multiplexer
compressnet 2/tcp 0.000013 # Management Utility
compressnet 2/udp 0.001845 # Management Utility
compressnet 3/tcp 0.001242 # Compression Process
compressnet 3/udp 0.001532 # Compression Process
unknown 4/tcp 0.000477
rje 5/udp 0.000593 # Remote Job Entry
unknown 6/tcp 0.000502
echo 7/tcp 0.004855
echo 7/udp 0.024679
echo 7/sctp 0.000000
. . .


Не рекомендуется запускать сканирование портов чужого сервера, поскольку администратор системы может принять такие действия за враждебные. Nmap предназначен для исследования своего собственного сервера, а поэкспериментировать можно на специально предназначенном для тестовых целей сервере scanme.nmap.org.

Некоторые команды требует длительного времени для выполнения.

Сканирование операционной системы на хосте:

nmap -O хост


Сканирование диапазона хостов от xxx.xxx.xxx.xxx до yyy.yyy.yyy.yyy:

nmap -PN xxx.xxx.xxx.xxx-yyy.yyy.yyy.yyy


Сканирование сетевого диапазона с поиском доступных сервисов:

nmap -sP диапазон_адресов


Сканирование конкретного порта:

nmap -p номер_порта хост


Сканирование всех открытых портов TCP и UDP:

nmap -n -PN -sT -sU -p- хост


Изучение версий ПО, работающего на хосте:

nmap -PN -p номер_порта хост


Есть много других команд, параметров и вариантов использования nmap. Сканирование портов своего VDS-сервера позволяет определить потенциальные векторы атак и уязвимости, поскольку злоумышленник начнёт свои действия именно со сканирования.

Пересылка сообщений и файлов


С помощью ключа -l можно поставить на прослушивание конкретный порт на сервере:

netcat -l 5438


На другой машине мы указываем подключиться к машине по данному порту:

netcat domain.com 5438


Теперь между двумя системами установлен канал связи. По нему можно передавать текстовые сообщения.

Таким способом можно даже передать файл. Для этого команду прослушивания направляем сразу в файл:

netcat -l 5438 > полученный_файл


На другом компьютере вместо текстового сообщения подаём на вход оригинальный файл:

netcat domain.com 5438 < оригинальный_файл


Аналогично можно передавать самые разные вещи, например, содержимое директорий, заархивированное на лету в tarball:

tar -czf - * | netcat domain.com 4444


Таким же способом можно на одной стороне создать образ диска (dd), отправить его в указанный порт по созданному TCP-соединению — и принять на другой системе.

Добавление и удаление пользователей


Для добавления, удаления пользователей и выдачи им привилегий sudo нужно для начала подключиться к серверу как root:

ssh root@ip_вашего_сервера


После этого добавляем пользователя:

adduser newuser


Изначально у него нет никаких привилегий. Но если это основной пользователь системы, то мы можем назначить ему административные привилегии, чтобы он мог выполнять рутинные задачи по обслуживанию и поддержке сервера.

Для назначения административных привилегий нужно добавить пользователя в группу sudo. Пользователям из этой группы разрешено запускать команду sudo с повышением своих привилегий до административных.

usermod -aG sudo user1


Вместо user1 указываем имя пользователя, которого добавили ранее. Теперь он сможет запускать любые команды через sudo:

sudo команда


Имея такие права, этот пользователь может удалять других пользователей:

sudo deluser --remove-home username


Опция --remove-home удаляет также и домашнюю директорию пользователя.

Сам root имеет право выполнить команду deluser без sudo.

Конечно, здесь далеко не полный список полезных инструментов для управления VDS-сервером. Но эти вопросы часто возникают у начинающих системных администраторов, которые подняли свой первый сервер, поставили ОС и начинают разбираться в мире Linux-администрирования.


8p3vz47nluspfyc0axlkx88gdua.png

© Habrahabr.ru