# Администрирование серверов Linux В этом курсе мы постараемся рассмотреть некоторые из **типичных задач**, которые выполняет администратор Linux-сервера. Мы сначала разберём, **что делает каждая команда**, а затем **попробуем её в действии на примерах**. 👉 Важно: **обязательно практиковаться** и выполнять команды самостоятельно. ## **Настройка лабораторного окружения** * Установите Docker на свою систему: [https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/) **ИЛИ** используйте **онлайн-песочницу Docker** (например, [https://labs.play-with-docker.com/](https://labs.play-with-docker.com/))

**Среда выполнения команд** * Все команды будут выполняться в системе **Red Hat Enterprise Linux (RHEL) 8**. На скриншоте пример запуска контейнера: ``` docker run -it --name test registry.access.redhat.com/ubi8 bash ``` * `docker run -it` — запустить контейнер в интерактивном режиме с терминалом * `-name test` — задать контейнеру имя `test` * `registry.access.redhat.com/ubi8` — образ RHEL 8 (минимальная версия Universal Base Image) * `bash` — запустить Bash внутри контейнера После запуска вы окажетесь внутри контейнера как пользователь `root`. **Дополнение** Такой подход позволяет безопасно экспериментировать с командами Linux, не рискуя основной системой. Хочешь — покажу дальше примеры базового администрирования (например, управление пользователями или правами). 🚀 ## Операционные системы с поддержкой нескольких пользователей Операционная система считается **многопользовательской**, если она позволяет нескольким пользователям работать с компьютером, **не мешая** друг другу — то есть **не затрагивая файлы и настройки других пользователей**. Операционные системы на базе Linux **являются многопользовательскими**: они позволяют **нескольким пользователям** одновременно подключаться к системе. Обычно на компьютере есть **одна клавиатура и один монитор**, но при подключении к сети **много пользователей** могут входить через **SSH**. (Позже мы подробнее рассмотрим SSH.) *** **Роль администратора сервера** Как администраторы, мы чаще всего имеем дело с **удалёнными Linux-серверами**, которые могут находиться **на большом расстоянии**. Мы подключаемся к ним с помощью **удалённого входа**, например через **SSH**. *** **Безопасность пользователей** Поскольку Linux поддерживает работу **нескольких пользователей**, необходимо обеспечить **изоляцию**: * Один пользователь **не должен иметь доступа** к файлам другого * Пользователь **не должен** иметь возможности **изменять чужие файлы** ## Управление пользователями и группами В Linux: * **Каждому пользователю** назначается уникальный **UID** (User ID — идентификатор пользователя). * У пользователя также есть **домашний каталог** (home directory) и **оболочка входа** (login shell), с помощью которой он взаимодействует с системой. *** **Что такое группа** * **Группа** — это **набор одного или нескольких пользователей**. * Группы используются для **упрощения управления правами доступа**: вы можете назначать права **на всю группу сразу**, а не на каждого пользователя отдельно.

* **Каждой группе** присваивается уникальный **GID** (Group ID — идентификатор группы). *** **Дополнение** Простыми словами: | Объект | Идентификатор | Назначение | | ------ | ------------- | ---------- | | Пользователь | UID | Кому принадлежат файлы, процессы | | Группа | GID | Совместный доступ между пользователями | ### Команда `id` Команда `id` используется для того, чтобы: * Узнать **UID** (идентификатор пользователя) * Узнать **GID** (идентификатор группы) * Посмотреть, в какие **группы** входит пользователь Пример со скриншота: Команда: ``` id ``` Результат: ``` uid=0(root) gid=0(root) groups=0(root) ``` * `uid=0` — это **ID пользователя** `root` * `gid=0` — это **ID основной группы** `root` * `groups=0(root)` — в каких группах состоит пользователь (здесь только `root`) **Дополнение** * У пользователя `root` всегда `UID = 0` и `GID = 0`. * Обычные пользователи обычно получают UID, начиная с 1000 (например, 1001, 1002 и так далее). В Linux удобный способ узнать, **под каким пользователем вы сейчас работаете**, — использовать команду: ``` whoami ``` ``` whoami ``` Результат: ``` root ``` То есть, текущий пользователь — `root`. **Про пользователя root** * **root** — это **суперпользователь** с **неограниченными правами** на системе. * Он имеет **UID = 0**. * root может делать **абсолютно всё**: читать, изменять, удалять любые файлы и управлять всеми процессами. ### **Важные файлы, связанные с пользователями и группами в Linux** | Файл | Описание | | ---- | -------- | | `/etc/passwd` | Хранит **имена пользователей**, **UID**, **GID**, **домашние директории**, **оболочки входа** и другую информацию. | | `/etc/shadow` | Хранит **хеши паролей** пользователей. (Ограниченный доступ, чтобы повысить безопасность.) | | `/etc/group` | Хранит информацию о **группах** в системе: имена групп, их **GID** и участников. |

**Дополнение к примерам** * `cat /etc/passwd` — показывает базовую информацию о пользователях. * `cat /etc/shadow` — показывает зашифрованные пароли и настройки сроков действия паролей. * `cat /etc/group` — показывает список всех групп. **Структура записи** в `/etc/passwd`, `/etc/shadow` и `/etc/group` делится двоеточиями `:` на поля. Если вы хотите разобраться в каждой области, о которой идет речь в приведенных выше выводах, вы можете перейти по ссылкам ниже: * [https://tldp.org/LDP/lame/LAME/linux-admin-made-easy/shadow-file-formats.html](https://tldp.org/LDP/lame/LAME/linux-admin-made-easy/shadow-file-formats.html) * [https://tldp.org/HOWTO/User-Authentication-HOWTO/x71.html](https://tldp.org/HOWTO/User-Authentication-HOWTO/x71.html) ## Важные команды для управления пользователями в Linux | Команда | Описание | | ------- | -------- | | `useradd` | Создаёт нового пользователя. | | `passwd` | Добавляет или изменяет пароль пользователя. | | `usermod` | Изменяет атрибуты существующего пользователя (например, добавляет в группу, меняет оболочку входа). | | `userdel` | Удаляет пользователя из системы. | **Дополнение** **Примеры использования:** * Создать пользователя: ``` useradd username ``` * Задать пароль: ``` passwd username ``` * Добавить пользователя в группу: ``` usermod -aG groupname username ``` * Удалить пользователя: ``` userdel username ``` Важно: Удаляя пользователя через `userdel`, его домашняя папка (`/home/username`) **не удаляется автоматически**, если не добавить флаг `-r`: ``` userdel -r username ``` ### useradd Команда `useradd` добавляет нового пользователя в Linux. Мы создадим нового пользователя с именем **shivam**. Затем проверим, что пользователь был создан, просмотрев конец файла `/etc/passwd`. UID и GID для нового пользователя — **1000**. Домашняя директория назначена как `/home/shivam`, а оболочка входа — `/bin/bash`. Обрати внимание: домашнюю директорию и оболочку можно изменить позже. Если при создании пользователя не указывать явно домашнюю директорию или оболочку, то будут использованы значения по умолчанию. Также мы можем переопределить эти значения при создании пользователя. **Дополнение:** * В примере со вторым пользователем **amit** явно указали другую оболочку `/bin/sh` с помощью опции `s`. * Файл `/etc/passwd` после создания новых пользователей отражает все их параметры: имя пользователя, UID, GID, домашнюю директорию и оболочку. ### **passwd** Команда `passwd` используется для создания или изменения пароля пользователя. В приведённых выше примерах мы не назначали пароль для пользователей **shivam** и **amit** при их создании. Если в файле `/etc/shadow` в записи пользователя стоит `!!`, это означает, что учётная запись создана, но пароль для неё ещё не установлен. Теперь попробуем создать пароль для пользователя shivam. **Важно помнить установленный пароль**, так как дальше в примерах он нам пригодится. Также давай сейчас изменим пароль для пользователя **root**. Когда мы будем переключаться с обычного пользователя на root-пользователя, система попросит ввести пароль. Кроме того, при входе в систему напрямую под root-пользователем тоже потребуется ввести пароль. ### **usermod** **Команда `usermod` используется для изменения атрибутов пользователя**, таких как домашний каталог или командная оболочка (shell). Давай попробуем изменить оболочку входа для пользователя **amit** на `/bin/bash`. Аналогичным образом ты можешь изменить и другие атрибуты пользователя. Попробуй выполнить команду `usermod -h`, чтобы увидеть список всех доступных опций для изменения. ### **userdel** **Команда `userdel` используется для удаления пользователя в Linux.** После удаления пользователя вся информация, связанная с ним, будет также удалена. Давай попробуем удалить пользователя **amit**. После удаления ты больше не найдёшь его запись ни в файле `/etc/passwd`, ни в файле `/etc/shadow`. ## Важные команды для управления группами Команды для управления группами очень похожи на команды для управления пользователями. Здесь каждая команда описана кратко, потому что их использование аналогично. Ты можешь попробовать выполнить эти команды у себя на системе: | Команда | Описание | | ------- | -------- | | `groupadd <имя_группы>` | Создать новую группу | | `groupmod <имя_группы>` | Изменить атрибуты группы | | `groupdel <имя_группы>` | Удалить группу | | `gpasswd <имя_группы>` | Изменить пароль группы | **Пример на скриншоте:** Мы создали новую группу `sre` с помощью команды `groupadd sre`, а затем посмотрели её наличие в файле `/etc/group` (последние строки). Теперь мы попробуем добавить пользователя `shivam` в созданную нами выше группу. **Что происходит на скриншоте:** * Команда `usermod -a -G sre shivam` добавляет пользователя `shivam` в группу `sre`. * Ключ `G` указывает дополнительные группы, а `a` (append) говорит о добавлении, а не о перезаписи списка групп. * Команда `groups shivam` показывает, что теперь пользователь состоит в двух группах: `shivam` и `sre`. * Просмотр `/etc/group` подтверждает это — у группы `sre` теперь в списке участников указан `shivam`. ## Стать суперпользователем Перед выполнением приведённых ниже команд обязательно убедитесь, что вы установили пароли для пользователя `shivam` и пользователя `root`, используя команду `passwd`, описанную в предыдущем разделе. Команда `su` используется для переключения между пользователями в Linux. Теперь попробуем переключиться на пользователя `shivam`. Теперь попробуем открыть файл `/etc/shadow`. Операционная система не разрешила пользователю `shivam` прочитать содержимое файла `/etc/shadow`. Это важный файл в Linux, который хранит пароли пользователей. Этот файл может быть доступен только для пользователя `root` или для пользователей с привилегиями суперпользователя. **Команда `sudo`** позволяет пользователю выполнять команды с привилегиями суперпользователя (root). Помните, что root имеет все права на системе. Мы также можем использовать команду `su` для перехода к root, чтобы открыть важные файлы, но тогда потребуется вводить пароль root-пользователя. Альтернативный способ, который используется в большинстве современных операционных систем, — использовать команду `sudo`. При таком способе пользователь вводит **свой** пароль и должен быть членом группы `sudo`. **Как дать другим пользователям права суперпользователя?** Сначала перейдём к root-пользователю с помощью команды `su`. Обратите внимание, что при выполнении этой команды потребуется ввести пароль root. Если вы забыли установить пароль для root, можно выйти (`exit`), чтобы вернуться к обычной командной строке root-пользователя, и затем установить пароль с помощью команды `passwd`. Файл **`/etc/sudoers`** содержит список пользователей, которым разрешено использовать `sudo`. В операционных системах на базе Red Hat этот файл по умолчанию отсутствует. Поэтому нам нужно установить `sudo`. Команду `yum`, которую мы используем для установки пакета `sudo`, мы разберём подробно в следующих разделах. Откройте файл `/etc/sudoers` на системе. Этот файл содержит много информации. В нём хранятся правила, которым пользователи должны следовать при использовании команды `sudo`. Например, пользователю `root` разрешено выполнять любые команды откуда угодно. Один из простых способов предоставить пользователю права root — это добавить его в группу, которой разрешено выполнять все команды. В Red Hat Linux такой группой является `wheel`. Добавим пользователя `shivam` в группу `wheel`, чтобы он получил права `sudo`. Теперь переключимся обратно на пользователя `shivam` и попробуем получить доступ к файлу `/etc/shadow`. Перед выполнением команды необходимо использовать `sudo`, потому что доступ к файлу `/etc/shadow` разрешён только суперпользователю. Мы уже предоставили пользователю `shivam` права `sudo`, добавив его в группу `wheel`. ## Права на файлы В операционной системе Linux каждому файлу и каталогу назначаются права доступа для владельца файла, членов группы пользователей и всех остальных. Это необходимо для того, чтобы один пользователь не мог получить доступ к файлам и ресурсам другого пользователя. Чтобы посмотреть права файла, мы можем использовать команду `ls`. Давай посмотрим права файла `/etc/passwd`. Теперь давай разберем важные части вывода, которые относятся к правам доступа. | № | Обозначение | Описание | | --- | ----------- | -------- | | 1. | `-` | Тип файла: ● `-` — обычный файл ● `d` — каталог | | 2. | `rw-` | Права владельца файла на чтение (r), запись (w) и выполнение (x). В данном примере root — владелец файла. Root может читать файл и записывать в него. Файл не является исполняемым. | | 3. | `r--` | Права группы владельца файла на чтение, запись и выполнение. В данном примере группа `root` — это группа владельца файла. Пользователи этой группы могут только читать файл. | | 4. | `r--` | Права всех остальных пользователей на чтение, запись и выполнение. В данном примере все остальные пользователи могут только читать файл. | | 5. | `root` | Имя владельца файла. | | 6. | `root` | Имя группы, которой принадлежит файл. | ### Команда `chmod` Команда `chmod` используется для изменения прав доступа к файлам и директориям в Linux. Команда `chmod` принимает права в виде числового аргумента. Можно представить права как последовательность битов, где 1 означает «разрешено» или «истинно», а 0 — «запрещено» или «ложно». | Права | rwx | Двоичное | Десятичное | | ----- | --- | -------- | ---------- | | Чтение, запись, выполнение | rwx | 111 | 7 | | Чтение и запись | rw- | 110 | 6 | | Чтение и выполнение | r-x | 101 | 5 | | Только чтение | r-- | 100 | 4 | | Запись и выполнение | -wx | 011 | 3 | | Только запись | -w- | 010 | 2 | | Только выполнение | --x | 001 | 1 | | Нет прав | \-\-\- | 000 | 0 | Теперь мы создадим новый файл и посмотрим его права. Групповой владелец файла не имеет прав на запись в этот файл. Дадим групповому владельцу (или root) право записи с помощью команды `chmod`. Команду `chmod` также можно использовать для изменения прав доступа к директориям аналогичным образом. ### Команда `chown` Команда `chown` используется для изменения владельца файлов или директорий в Linux. Синтаксис команды: ``` chown <новый_владелец> <имя_файла> ``` Если у нас нет прав sudo, необходимо использовать команду sudo. Давайте переключимся на пользователя `shivam` и попробуем изменить владельца файла. Перед выполнением команды мы также изменили владельца файла обратно на `root`. Команда `chown` также может использоваться для изменения владельца директории аналогичным образом. ### Команда `chgrp` Команда `chgrp` используется для изменения группы-владельца файлов или директорий в Linux. Синтаксис команды очень похож на синтаксис команды `chown`. Команда `chgrp` также может использоваться для изменения группы-владельца директории аналогичным образом. ## Команда `ssh` Команда `ssh` используется для входа на удалённые системы, передачи файлов между системами и выполнения команд на удалённой машине. SSH расшифровывается как **Secure Shell** и предназначен для обеспечения зашифрованного и безопасного соединения между двумя узлами через небезопасную сеть, такую как интернет. Источник: [https://www.ssh.com/ssh/command/](https://www.ssh.com/ssh/command/) ### Аутентификация без пароля с помощью SSH Теперь мы рассмотрим аутентификацию без пароля, которая является безопасной и наиболее часто используемой формой аутентификации через SSH. С помощью этого метода мы можем подключаться по SSH к другим хостам без ввода пароля. Этот способ особенно полезен, когда необходимо, чтобы какие-либо скрипты выполняли задачи, связанные с SSH. Аутентификация без пароля требует использования пары ключей: публичного и приватного. Как следует из названия, **публичный ключ** можно свободно распространять, а **приватный ключ** должен оставаться в секрете. Не будем вдаваться в технические детали того, как именно работает такая аутентификация. Если хочешь разобраться глубже, можешь почитать об этом [здесь](https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process) Шаги для настройки подключения по SSH без пароля к удалённому хосту: 1. Генерация пары ключей (публичный и приватный) **Если в директории `~/.ssh` уже есть пара ключей, создавать их заново не нужно.** Устанавливаем пакет `openssh`, который содержит все команды, связанные с SSH. Далее с помощью команды `ssh-keygen` генерируем новую пару ключей. На все вопросы можно нажимать Enter, чтобы принять значения по умолчанию. После успешного выполнения команды `ssh-keygen` в директории `~/.ssh` должны появиться два файла: * `id_rsa` — приватный ключ, * `id_rsa.pub` — публичный ключ. Обрати внимание: приватный ключ можно читать и изменять только владельцу. 1. Передача публичного ключа на удалённый сервер: Существует несколько способов передать публичный ключ на удалённый сервер. Мы рассмотрим один из самых популярных способов — с помощью команды `ssh-copy-id`. Для использования команды `ssh-copy-id` необходимо установить пакет `openssh-clients`. Теперь с помощью команды `ssh-copy-id` можно скопировать публичный ключ на удалённый сервер. Теперь можно подключаться к удалённому серверу по SSH без необходимости каждый раз вводить пароль. Наш публичный ключ теперь должен находиться в файле `~/.ssh/authorized_keys` на удалённом сервере. Файл `~/.ssh/authorized_keys` содержит список публичных ключей. Пользователи, чьи ключи добавлены в этот файл, имеют доступ по SSH к удалённому серверу. ### Как выполнять команды на удалённом сервере? Общий синтаксис: ``` ssh @ ``` ### Как передавать файлы с одного сервера на другой? Общий синтаксис: ``` scp ``` ## Управление пакетами Управление пакетами — это процесс установки и управления программным обеспечением на системе. Мы можем устанавливать необходимые пакеты из репозиториев дистрибутивов Linux. Разные дистрибутивы используют разные системы упаковки пакетов. | Системы упаковки | Дистрибутивы | | ---------------- | ------------ | | Debian-стиль (.deb) | Debian, Ubuntu | | Red Hat-стиль (.rpm) | Fedora, CentOS, Red Hat Enterprise Linux | **Популярные системы управления пакетами в Linux** | **Command** | **Description** | | ------- | ----------- | | yum install | Installs a package on your system | | yum update | Updates a package to its latest available version | | yum remove | Removes a package from your system | | yum search | Searches for a particular keyword | DNF является преемником YUM, который сейчас используется в Fedora для установки и управления пакетами. В будущем DNF может полностью заменить YUM во всех RPM-совместимых дистрибутивах Linux. На скриншоте: * Выполняется поиск пакета `httpd` с помощью команды `yum search httpd`. * В выводе видно, что найдены совпадения, включая основной сервер Apache HTTP (`httpd.x86_64`) и несколько связанных с ним пакетов. Мы действительно нашли точное совпадение для ключевого слова `httpd`, когда выполняли поиск с помощью команды `yum search`. Теперь давайте установим пакет `httpd`. На скриншоте показан: Показан процесс установки пакета `httpd` с помощью команды `sudo yum install httpd`. Также устанавливаются его зависимости: `apr`, `apr-util`, `httpd-filesystem`, `httpd-tools`, `mailcap`, `mod_http2`, `redhat-logos-httpd` После установки `httpd`, мы используем команду `yum remove`, чтобы удалить пакет `httpd`. На скриншоте показан: показан процесс удаления пакета `httpd` с помощью команды `sudo yum remove httpd` ## Управление процессами В этом разделе мы рассмотрим несколько полезных команд, которые можно использовать для мониторинга процессов в системах Linux. ### ps (process status) Команда `ps` используется для получения информации об одном процессе или списке процессов. Если при запуске команды `ps` возникает ошибка `"ps command not found"`, необходимо установить пакет `procps`. Просто `ps` без аргументов не особо полезен. Давай попробуем вывести все процессы в системе, используя следующую команду: Ссылка: [https://unix.stackexchange.com/questions/106847/what-does-aux-mean-in-ps-aux](https://unix.stackexchange.com/questions/106847/what-does-aux-mean-in-ps-aux) Можно использовать дополнительный аргумент с командой `ps`, чтобы получить информацию о процессе по его конкретному идентификатору (PID). Также мы можем использовать `grep` вместе с `ps`, чтобы отфильтровать только определённые процессы. ### top Команда `top` используется для отображения информации о процессах, запущенных в Linux в реальном времени. Также она показывает краткое сводное состояние системы. Для каждого процесса `top` отображает идентификатор процесса (PID), владельца, приоритет, состояние, использование процессора (CPU), использование памяти (MEM) и другую информацию. Кроме этого, выводятся общие данные об использовании памяти, процессора, времени работы системы и средней нагрузке на процессор. ## Управление памятью В этом разделе мы изучим несколько полезных команд, которые можно использовать для получения информации о памяти системы. ### free Команда `free` используется для отображения информации об использовании памяти в системе. Команда показывает общий объём, занятую и свободную память в оперативной памяти (RAM), а также объём памяти, занятой кэшами и буферами. По умолчанию команда `free` отображает данные в килобайтах. Чтобы вывести информацию в более удобочитаемом формате, можно использовать дополнительный аргумент. ### **vmstat** Команда `vmstat` используется для отображения информации об использовании памяти, а также дополнительной информации о вводе-выводе (I/O) и загрузке процессора (CPU). ## Проверка дискового пространства В этом разделе мы изучим несколько полезных команд, которые позволяют просматривать информацию о дисковом пространстве в Linux. ### df (disk free) Команда `df` используется для отображения информации о свободном и доступном пространстве для каждой смонтированной файловой системы. ### du (disk usage) Команда `du` используется для отображения информации об использовании дискового пространства файлами и директориями в системе. Нижеприведённая команда позволяет отобразить 5 самых больших директорий в корневой (`/`) директории. ## **Daemons** Компьютерная программа, которая работает в фоновом режиме, называется демоном. Традиционно имена процессов-демонов заканчиваются на **d** — например, **sshd**, **httpd** и т.д. Мы не можем взаимодействовать с процессом-демоном напрямую, так как он работает в фоне. Термины **сервисы** и **демоны** чаще всего используются как синонимы. ## Systemd **systemd** — это менеджер системных и сервисных процессов для операционных систем Linux. **systemd** использует **юниты** в качестве строительных блоков. Эти юниты представлены в виде конфигурационных файлов. На приведённом примере показаны конфигурационные файлы юнитов, которые находятся в директории **/usr/lib/systemd/system**. Эти файлы распространяются вместе с установленными RPM-пакетами. Нас в первую очередь интересуют конфигурационные файлы, которые заканчиваются на **.service**, так как они представляют собой сервисные юниты. ### Управление системными сервисами Сервисные юниты оканчиваются на расширение файла **.service**. Команда **systemctl** используется для запуска, остановки и перезапуска сервисов, управляемых **systemd**. | Команда | Описание | | ------- | -------- | | systemctl start name.service | Запускает сервис | | systemctl stop name.service | Останавливает сервис | | systemctl restart name.service | Перезапускает сервис | | systemctl status name.service | Проверяет статус сервиса | | systemctl reload name.service | Перезагружает конфигурацию сервиса | ## Логи В этом разделе мы поговорим о некоторых важных файлах и директориях, которые могут быть очень полезны для просмотра системных логов и логов приложений в Linux. Эти логи часто помогают при устранении неполадок на системе. | Файл/Директория | Описание | | --------------- | -------- | | /var/log/\* | Хранят логи, связанные с процессами-демонами и системные логи. Некоторые важные файлы в директории /var/log: | * /var/log/messages — содержит логи системных ошибок, загрузки и выключения системы, изменения конфигурации и т.д. * /var/log/authlog — содержит логи, связанные с авторизацией в системе * /var/log/lastlog — содержит информацию о последних входах всех пользователей
\| \| dmesg \| Показывает логи ядра системы\. Подробнее: [Wikipedia — Dmesg](https://en.wikipedia.org/wiki/Dmesg) \| [Задания (Администрирование серверов Linux)](https://www.notion.so/Linux-1e31736e9acf80de830dea50d2081b93?pvs=21)