Перейти к содержанию

Linux: база

Как устроена система на уровне администратора: где что лежит, кто что может делать, как подключить диск.


Файловая иерархия

Каталог Что лежит
/ Корень файловой системы
/bin Исполняемые файлы системы, нужные для работы и загрузки
/sbin Системные исполняемые файлы для администрирования
/boot Файлы загрузки: ядро, initramfs, загрузчик GRUB
/dev Файлы устройств
/etc Конфигурационные файлы
/home Домашние каталоги пользователей
/root Домашний каталог root
/lib, /lib64 Библиотеки для системных утилит и приложений, /lib64 - 64-битные
/media Стандартное место для монтирования съёмных носителей
/mnt Временно смонтированные файловые системы
/opt Дополнительный софт, который не входит в стандартные пакеты
/proc Виртуальная ФС: состояние системы и работающих процессов
/sys Виртуальная ФС: интерфейс к ядру и устройствам
/run Данные времени работы с момента загрузки: PID-файлы, сокеты. Живёт в памяти (tmpfs)
/tmp Временные файлы приложений и служб
/usr Пользовательские программы и данные: /usr/bin, /usr/lib, /usr/share
/var Данные, которые меняются во время работы: логи, кэши, очереди, базы

Note

В современных дистрибутивах (Fedora, Debian 12, Ubuntu, Arch) /bin, /sbin и /lib - символические ссылки на каталоги внутри /usr (usrmerge). Разделения «нужное для загрузки - в /bin, остальное - в /usr/bin» там уже нет.


Права доступа

Права файла - три тройки rwx: для владельца (user), группы (group) и остальных (others). Перед ними - тип файла.

- rwx r-x r--
| ||| ||| |||
| ||| ||| ||└─ others
| ||| └└└───── group
| └└└───────── user
└───────────── тип файла
  • тип файла: - - обычный файл, d - каталог, l - символическая ссылка
  • права: r - read, w - write, x - execute
  • кому: u - владелец, g - группа, o - остальные, a - все (u + g + o)

Числовая запись. Каждое право - число: r = 4, w = 2, x = 1. Цифра тройки - их сумма.

Цифра Права Цифра Права
7 = 4+2+1 rwx 3 = 2+1 -wx
6 = 4+2 rw- 2 -w-
5 = 4+1 r-x 1 --x
4 r-- 0 ---
chmod 755 file.txt                # rwx r-x r-x
chmod [кому][операция][права] file.txt
chmod o+x file.txt                # остальным добавить выполнение
chmod u+rw file.txt
chmod a=r file.txt                # всем только чтение
chmod u=rwx file.txt
chmod u+x,g-w,o=r file.txt        # несколько изменений сразу

Пользователи и группы

Пользователи хранятся в /etc/passwd, группы - в /etc/group. getent читает их через NSS, поэтому видит и пользователей из LDAP или SSSD, а не только локальный файл.

cat /etc/passwd                                   # все пользователи из файла
getent passwd                                     # то же через NSS
getent passwd | cut -d: -f1                       # только имена
getent passwd | grep -v "/nologin\|/false"        # кто может войти: с рабочей оболочкой
getent passwd | awk -F: '$3 < 1000 {print $1}'    # UID < 1000 - обычно системные
getent passwd | awk -F: '$3 >= 1000 {print $1}'   # UID >= 1000 - обычные люди
getent passwd | grep username                     # конкретный пользователь

cat /etc/group                                    # все группы
getent group                                      # то же через NSS
getent group | cut -d: -f1                        # только названия групп
getent group | grep groupname                     # конкретная группа
getent group sudo                                 # пользователи с правами sudo

groups username                                   # группы пользователя
id username                                       # UID, GID и группы пользователя
id                                                # то же для себя
whoami                                            # имя текущего пользователя

sudo cat /etc/sudoers | grep -v "^#"              # правила sudo без комментариев

getent умеет и другие базы: ahosts, ahostsv4, ahostsv6, aliases, ethers, group, gshadow, hosts, initgroups, netgroup, networks, passwd, protocols, rpc, services, shadow.

См. Аудит входов.


Изоляция пользователей

Практические рецепты: кто что видит и что может запускать.

Домашние каталоги

Новые домашние каталоги создаются с правами из /etc/adduser.conf:

# /etc/adduser.conf
DIR_MODE=0750
UMASK=027

# на уже существующие домашние каталоги
chmod 750 /home/*   # или 700 для максимальной изоляции

Общие каталоги проектов

setgid на каталоге (2 в chmod 2770) - новые файлы наследуют группу каталога, а не основную группу автора. ACL по умолчанию (setfacl -d) - новые файлы наследуют права группы.

mkdir -p /srv/projects/alpha
chgrp proj-alpha /srv/projects/alpha
chmod 2770 /srv/projects/alpha                      # setgid, группе - всё, остальным - ничего
setfacl -d -m g:proj-alpha:rwx /srv/projects/alpha  # права по умолчанию для новых файлов
setfacl -m g:proj-alpha:rwx /srv/projects/alpha

# доступ только на чтение аналитику
usermod -aG analysts andrew
setfacl -m g:analysts:rx /srv/projects/alpha

sudo только на нужные команды

Правила кладут отдельным файлом в /etc/sudoers.d/ и правят через visudo: он проверяет синтаксис, и сломанный файл не запрёт root.

visudo -f /etc/sudoers.d/ops

# дежурные могут рестартовать сервисы и читать логи
User_Alias OPS = %ops
Cmnd_Alias SVC = /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart myapp
Cmnd_Alias LOG = /usr/bin/journalctl --no-pager *
OPS ALL=(root) SVC
OPS ALL=(root) LOG
# без NOPASSWD по умолчанию, включать точечно:
# OPS ALL=(root) NOPASSWD: SVC

Warning

В исходной версии было /usr/bin/journalctl *. journalctl открывает вывод в пейджере less, а из less можно запустить оболочку командой !sh - она будет от root. Поэтому разрешают только journalctl --no-pager. Звёздочка в аргументах sudo тоже опасна: она разрешает любые флаги.


Ограничение запуска программ

Белый список программ: в PATH пользователя остаётся только каталог со ссылками на разрешённые команды.

mkdir -p /opt/whitelist/bin
chgrp devs /opt/whitelist/bin
chmod 750 /opt/whitelist/bin
ln -s /usr/bin/git /opt/whitelist/bin/

# PATH для пользователей с белым списком
echo 'if id -nG | grep -qw devs; then export PATH="/opt/whitelist/bin"; fi' >/etc/profile.d/whitelist.sh

Warning

Это удобство, а не защита: пользователь запустит любую программу по полному пути (/usr/bin/curl) или поменяет PATH сам. Настоящее ограничение - rbash (restricted shell), AppArmor или SELinux.


Диски и монтирование

Имена дисков:

  • sdX - SATA, SCSI и USB-диски, X - буква: sda - первый, sdb - второй. Разделы - sda1, sda2
  • nvmeXnY - NVMe-диски: X - номер контроллера, Y - номер namespace. nvme0n1 - первый контроллер, первый namespace. Разделы - nvme0n1p1
lsblk                                  # диски и разделы деревом
lsblk -f                               # то же с файловыми системами и UUID
blkid                                  # UUID и тип ФС всех разделов
sudo blkid /dev/sdb1                   # одного раздела

sudo mkdir -p /mnt/usb
sudo mount /dev/sdb1 /mnt/usb          # смонтировать
mount | grep usb                       # проверить
sudo umount /mnt/usb                   # размонтировать по точке монтирования
sudo umount /dev/sdb1                  # или по устройству

/etc/fstab - Это список файловых систем, которые монтируются при загрузке. Чтобы диск монтировался после каждой перезагрузки, его добавляют сюда по UUID: имя sdb1 может поменяться, UUID - нет.

  1. Узнать UUID: sudo blkid /dev/sdb1 → /dev/sdb1: UUID="3e1c1a0c-57ef-47af-88a7-2195058f324b" TYPE="ext4".
  2. Добавить строку в /etc/fstab (sudo vim /etc/fstab):
UUID=3e1c1a0c-57ef-47af-88a7-2195058f324b /mnt/vortex ext4 defaults,noatime 0 2
  1. Применить без перезагрузки: sudo mount -a. Ошибка в fstab здесь видна сразу, а не при следующей загрузке.
  2. Отдать точку монтирования пользователю: sudo chown ramil:ramil /mnt/vortex.
Поле Значение
UUID=... Уникальный идентификатор раздела
/mnt/vortex Точка монтирования
ext4 Тип файловой системы
defaults,noatime Параметры: defaults - типовые, noatime - не обновлять время доступа, меньше лишних записей
0 dump: делать ли резервную копию утилитой dump. Сейчас всегда 0
2 Порядок проверки fsck при загрузке: 0 - не проверять, 1 - корень, 2 - после корня

Note

В исходной версии оба последних числа были описаны как параметры fsck. Первое - флаг устаревшей утилиты dump, к fsck относится только второе.


Расширить LVM - корень на LVM растягивают на всё свободное место группы томов:

df -h /                                                # сколько сейчас
sudo lvextend -r -l +100%FREE /dev/mapper/fedora-root  # -r сразу расширит и файловую систему

Файловые менеджеры

Тип Программы
GUI Nautilus, Dolphin, Thunar, PCManFM, Nemo, Double Commander
TUI Midnight Commander (mc), Ranger, nnn, Vifm, lf (list files)

TODO

  • terminal и оболочка: в чём разница
  • tty