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,sda2nvmeXnY- 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 - нет.
- Узнать UUID:
sudo blkid /dev/sdb1→/dev/sdb1: UUID="3e1c1a0c-57ef-47af-88a7-2195058f324b" TYPE="ext4". - Добавить строку в
/etc/fstab(sudo vim /etc/fstab):
- Применить без перезагрузки:
sudo mount -a. Ошибка вfstabздесь видна сразу, а не при следующей загрузке. - Отдать точку монтирования пользователю:
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