По причине частых вопросов и не понимания многими того, как работают права доступа в linux, решил попросить Perplexity создать небольшой курс.
В конце, в качестве бонуса есть раздел Proxmox и управление правами в LXC/VM
Обучающий курс: Права доступа и маски в Linux
В этом подробном руководстве мы разберём систему прав доступа в Linux от основ до продвинутых концепций. Курс предназначен для тех, кто ранее не работал с Linux, поэтому все темы будут объяснены простым языком с примерами. В конце мы рассмотрим специфику работы с правами в среде Proxmox при использовании LXC-контейнеров и виртуальных машин.
Глава 1: Основы прав доступа в Linux
Что такое права доступа и зачем они нужны
Linux — многопользовательская операционная система[1][2]. Это означает, что на одном компьютере могут работать несколько человек одновременно, и у каждого должен быть свой уровень доступа к файлам и директориям. Система прав доступа (permissions) защищает файлы от несанкционированного доступа, изменения или удаления[3][4].
Представьте, что у вас есть личный дневник. Вы хотите, чтобы вы могли его читать и писать в него, члены вашей семьи могли только читать, а посторонние люди вообще не имели к нему доступа. Точно так же работают права доступа в Linux — для каждого файла и директории определяется, кто и что может с ними делать[2:1][5].
Три типа пользователей
В Linux для каждого файла или директории определяются права для трёх категорий пользователей[1:1][2:2][3:1][4:1]:
Владелец (Owner/User) — это пользователь, который создал файл или директорию. По умолчанию создатель становится владельцем и имеет максимальный контроль над объектом[6][7]. Владелец может изменять права доступа и передавать владение другому пользователю[8].
Группа (Group) — это набор пользователей, объединённых для совместной работы[2:3][5:1][9]. Когда создаётся файл, ему назначается группа (обычно основная группа владельца). Все члены этой группы получают определённые права доступа к файлу[10][11]. Группы упрощают управление правами для нескольких пользователей одновременно[12][13].
Остальные (Others) — все остальные пользователи системы, которые не являются владельцем и не входят в группу файла[2:4][3:2][5:2]. Это самая широкая категория, и обычно им даются минимальные права доступа.
Три типа прав доступа
Для каждой из трёх категорий пользователей можно установить три типа прав[1:2][2:5][3:3][4:2]:
Чтение (Read, r) — позволяет просматривать содержимое файла или списка файлов в директории[5:3][14][15]. Для файлов это означает возможность открыть и прочитать содержимое. Для директорий — возможность увидеть список файлов внутри (команда ls)[4:3][16].
Запись (Write, w) — позволяет изменять содержимое файла или создавать/удалять файлы в директории[5:4][14:1][15:1]. Для файлов это означает возможность редактирования и сохранения изменений. Для директорий — возможность создавать новые файлы, удалять существующие и переименовывать их[4:4][16:1].
Выполнение (Execute, x) — позволяет запускать файл как программу или входить в директорию[5:5][14:2][15:2]. Для файлов это означает возможность запуска исполняемых программ и скриптов. Для директорий — возможность войти в неё командой cd и получить доступ к файлам внутри[4:5][16:2].
Как посмотреть права доступа
Для просмотра прав доступа используется команда ls -l[2:6][3:4][4:6]. Рассмотрим пример вывода:
-rw-r--r-- 1 alice staff 1234 Oct 20 19:00 document.txt
drwxr-xr-x 2 bob users 4096 Oct 19 14:30 projects
Разберём первую строку по частям[1:3][3:5][4:7]:
-— первый символ указывает тип объекта (-означает обычный файл,d— директория,l— символическая ссылка)rw-— права владельца (alice): чтение и запись, без выполненияr--— права группы (staff): только чтениеr--— права остальных: только чтение1— количество жёстких ссылок на файлalice— имя владельца файлаstaff— имя группы1234— размер файла в байтахOct 20 19:00— дата и время последнего измененияdocument.txt— имя файла
Во второй строке видим директорию projects с владельцем bob. Права rwxr-xr-x означают, что владелец может читать, писать и входить в директорию, а группа и остальные могут только читать и входить[16:3].
Глава 2: Изменение прав доступа
Команда chmod — изменение прав
Команда chmod (change mode) используется для изменения прав доступа[1:4][3:6][17][4:8]. Существует два способа указания прав: символьный и восьмеричный (числовой)[17:1][8:1][14:3].
Символьный способ
В символьном режиме используются буквенные обозначения[17:2][4:9][14:4]:
- Категории:
u(user/владелец),g(group/группа),o(others/остальные),a(all/все) - Операторы:
+(добавить право),-(убрать право),=(установить точно) - Права:
r(чтение),w(запись),x(выполнение)
Примеры использования:
# Добавить право на выполнение для владельца
chmod u+x script.sh
# Убрать право на запись для группы
chmod g-w document.txt
# Установить права: владелец - rwx, группа - rx, остальные - ничего
chmod u=rwx,g=rx,o= file.txt
# Добавить право на чтение для всех
chmod a+r report.txt
Символьный способ удобен тем, что позволяет изменять отдельные права, не затрагивая остальные[17:3][4:10].
Восьмеричный (числовой) способ
В восьмеричном режиме права представляются тремя цифрами от 0 до 7[17:4][14:5][18][19][20][15:3]. Каждая цифра — это сумма значений прав:
- Чтение (r) = 4
- Запись (w) = 2
- Выполнение (x) = 1
Первая цифра задаёт права владельца, вторая — группы, третья — остальных[19:1][20:1][15:4].
Примеры:
# 755 = rwxr-xr-x
# Владелец: 7 = 4+2+1 = rwx (все права)
# Группа: 5 = 4+1 = r-x (чтение и выполнение)
# Остальные: 5 = 4+1 = r-x (чтение и выполнение)
chmod 755 script.sh
# 644 = rw-r--r--
# Владелец: 6 = 4+2 = rw- (чтение и запись)
# Группа: 4 = r-- (только чтение)
# Остальные: 4 = r-- (только чтение)
chmod 644 document.txt
# 700 = rwx------
# Владелец: 7 = rwx (все права)
# Группа: 0 = --- (нет прав)
# Остальные: 0 = --- (нет прав)
chmod 700 private.sh
Восьмеричный способ компактен и часто используется опытными администраторами[14:6][18:1][20:2].
Команда chown — изменение владельца
Команда chown (change owner) изменяет владельца и группу файла или директории[1:5][3:7][17:5][7:1]. Для её использования обычно требуются права суперпользователя (root)[17:6][7:2].
Синтаксис:
chown [владелец]:[группа] файл
Примеры:
# Изменить только владельца
sudo chown alice document.txt
# Изменить владельца и группу
sudo chown alice:developers project.txt
# Изменить только группу (с двоеточием)
sudo chown :staff file.txt
# Рекурсивно для всех файлов в директории
sudo chown -R alice:developers /home/alice/projects/
Опция -R (recursive) применяет изменения ко всем файлам и поддиректориям внутри указанной директории[1:6][7:3].
Команда chgrp — изменение группы
Команда chgrp (change group) изменяет только группу файла[6:1]. Это более специализированная команда по сравнению с chown.
Примеры:
# Изменить группу файла
sudo chgrp developers project.txt
# Рекурсивно для директории
sudo chgrp -R users /shared/documents/
Практические примеры
Пример 1: Создание общей директории для команды
# Создаём директорию
mkdir /shared/team-project
# Создаём группу разработчиков
sudo groupadd developers
# Добавляем пользователей в группу
sudo usermod -aG developers alice
sudo usermod -aG developers bob
# Устанавливаем владельца и группу
sudo chown root:developers /shared/team-project
# Даём группе полные права, остальным - никаких
chmod 770 /shared/team-project
Теперь alice и bob могут работать с файлами в этой директории, а остальные пользователи не имеют доступа[5:6][9:1].
Пример 2: Безопасный скрипт
# Создаём скрипт
echo '#!/bin/bash' > backup.sh
echo 'echo "Running backup..."' >> backup.sh
# Даём права на выполнение только владельцу
chmod 700 backup.sh
# Проверяем
ls -l backup.sh
# Вывод: -rwx------ 1 user user 45 Oct 20 19:00 backup.sh
Теперь только владелец может запускать и читать этот скрипт[18:2][15:5].
Глава 3: Специальные права доступа
SetUID — выполнение с правами владельца
Бит SetUID (Set User ID) — это специальное право, которое позволяет пользователю запустить исполняемый файл с правами его владельца, а не с правами того, кто его запускает[21][22][23][24]. Восьмеричное значение SetUID — 4000[21:1][25].
Классический пример — команда passwd, которая позволяет обычным пользователям менять свой пароль[26][27]. Эта команда должна изменять системный файл /etc/shadow, который доступен только root. Благодаря SetUID, когда обычный пользователь запускает passwd, программа временно получает права root[23:1][27:1].
Проверим:
ls -l /usr/bin/passwd
# Вывод: -rwsr-xr-x 1 root root 68208 May 28 01:37 /usr/bin/passwd
Обратите внимание на символ s вместо x в правах владельца. Это указывает на установленный бит SetUID[21:2][23:2][24:1].
Установка SetUID:
# Символьным способом
chmod u+s program
# Числовым способом (4 в начале)
chmod 4755 program
Удаление SetUID:
# Символьным способом
chmod u-s program
# Числовым способом
chmod 0755 program
Важно: SetUID представляет потенциальную угрозу безопасности, если установлен на неправильные программы. Используйте его осторожно и только когда это действительно необходимо[21:3][24:2].
SetGID — выполнение с правами группы
Бит SetGID (Set Group ID) работает похоже на SetUID, но относится к группе[21:4][22:1][23:3][24:3]. Восьмеричное значение SetGID — 2000[21:5][25:1].
Для файлов: программа запускается с правами группы-владельца файла[22:2][24:4].
Для директорий: все новые файлы, созданные в этой директории, автоматически получают группу директории, а не группу пользователя, который создал файл[21:6][22:3][24:5]. Это очень удобно для совместной работы над проектами.
Пример использования SetGID для директории:
# Создаём общую директорию для проекта
mkdir /shared/project
# Устанавливаем группу
sudo chgrp developers /shared/project
# Устанавливаем SetGID
chmod g+s /shared/project
# Или числовым способом
chmod 2775 /shared/project
# Проверяем
ls -ld /shared/project
# Вывод: drwxrwsr-x 2 root developers 4096 Oct 20 19:00 /shared/project
Теперь все файлы, созданные в этой директории любым пользователем, будут автоматически принадлежать группе developers[21:7][22:4].
Sticky Bit — защита от удаления
Sticky Bit — это специальный бит, который обычно применяется к директориям[21:8][22:5][23:4][24:6]. Он гарантирует, что пользователи могут удалять или переименовывать только те файлы, которыми они владеют, даже если у них есть права на запись в директорию[21:9][22:6][24:7]. Восьмеричное значение Sticky Bit — 1000[21:10].
Классический пример — директория /tmp, где все пользователи могут создавать файлы, но не могут удалять чужие[22:7][24:8]:
ls -ld /tmp
# Вывод: drwxrwxrwt 14 root root 300 Oct 20 16:48 /tmp
Символ t в конце (вместо x для остальных) указывает на установленный Sticky Bit[22:8][23:5][24:9].
Установка Sticky Bit:
# Символьным способом
chmod +t /shared/public
# Числовым способом
chmod 1777 /shared/public
Теперь все могут создавать файлы в /shared/public, но удалить может только владелец файла или root[21:11][22:9][24:10].
Комбинирование специальных битов
Можно устанавливать несколько специальных битов одновременно. Для этого суммируем их значения[21:12][25:2]:
# SetUID (4000) + SetGID (2000) = 6000
chmod 6755 program
# SetGID (2000) + Sticky Bit (1000) = 3000
chmod 3775 directory
Глава 4: Маска umask
Что такое umask
Umask (user file-creation mode mask) — это маска, которая определяет права доступа по умолчанию для вновь создаваемых файлов и директорий[28][29][30][31]. Она работает путём вычитания указанных прав из максимально возможных[31:1][32][33].
По умолчанию в Linux максимальные права для файлов — 666 (rw-rw-rw-), а для директорий — 777 (rwxrwxrwx)[29:1][32:1][34]. Однако по соображениям безопасности файлы не могут быть созданы с правом на выполнение автоматически[32:2].
Как работает umask
Umask указывает, какие права нужно убрать из максимальных[29:2][30:1][31:2]. Наиболее распространённое значение umask — 0022[28:1][29:3][30:2]:
# Проверяем текущий umask
umask
# Вывод: 0022
Расчёт для файлов:
Максимум для файлов: 666 (rw-rw-rw-)
Umask: -022 (----w--w-)
Результат: 644 (rw-r--r--)
Расчёт для директорий:
Максимум для директорий: 777 (rwxrwxrwx)
Umask: -022 (----w--w-)
Результат: 755 (rwxr-xr-x)
Таким образом, при umask 0022 новые файлы создаются с правами 644 (владелец может читать и писать, остальные только читать), а директории — с правами 755 (владелец может всё, остальные могут читать и входить)[29:4][34:1].
Изменение umask
Изменить umask для текущей сессии:
# Установить более строгий umask (только владелец имеет полный доступ)
umask 0077
# Теперь создадим файл
touch newfile.txt
ls -l newfile.txt
# Вывод: -rw------- 1 user user 0 Oct 20 19:00 newfile.txt
Для постоянного изменения umask отредактируйте файл ~/.bashrc или ~/.profile[28:2][32:3]:
# Добавьте в конец файла
echo "umask 0027" >> ~/.bashrc
# Перечитайте конфигурацию
source ~/.bashrc
Практические примеры umask
Пример 1: Максимальная приватность
# Устанавливаем umask, при котором только владелец имеет доступ
umask 0077
# Создаём файл и директорию
touch private.txt
mkdir private_dir
# Проверяем
ls -l
# private.txt: -rw------- (600)
# private_dir: drwx------ (700)
Пример 2: Совместная работа
# Устанавливаем umask для работы в группе
umask 0002
# Создаём файл и директорию
touch shared.txt
mkdir shared_dir
# Проверяем
ls -l
# shared.txt: -rw-rw-r-- (664)
# shared_dir: drwxrwxr-x (775)
Теперь группа имеет те же права, что и владелец[34:2].
Глава 5: Списки контроля доступа (ACL)
Ограничения стандартных прав
Стандартная система прав в Linux имеет ограничение: можно установить права только для одного владельца, одной группы и всех остальных[26:1][35][36][37]. Что делать, если нужно дать доступ нескольким конкретным пользователям с разными уровнями прав?[35:1][36:1]
Представьте ситуацию: у вас есть файл проекта, и вы хотите:
- Дать полный доступ себе (владелец)
- Дать доступ на чтение и запись пользователю Alice
- Дать только чтение пользователю Bob
- Запретить доступ всем остальным
Со стандартными правами это невозможно сделать элегантно. Здесь на помощь приходят ACL (Access Control Lists) — списки контроля доступа[26:2][35:2][36:2][37:1][38].
Что такое ACL
ACL — это расширенная система прав доступа, которая позволяет устанавливать права для любого количества пользователей и групп на один файл или директорию[26:3][35:3][36:3][39][37:2]. ACL работают дополнительно к стандартным правам Unix и предоставляют гораздо более гибкий механизм управления доступом[36:4][39:1].
Большинство современных файловых систем Linux (ext2/3/4, Btrfs, XFS) поддерживают ACL по умолчанию[39:2][38:1].
Просмотр ACL: команда getfacl
Команда getfacl (get file access control list) показывает ACL файла или директории[26:4][35:4][37:3][40][41]:
# Просмотр ACL файла
getfacl myfile.txt
Пример вывода:
# file: myfile.txt
# owner: alice
# group: staff
user::rw-
user:bob:r--
user:charlie:rw-
group::r--
mask::rw-
other::---
Разберём вывод[26:5][35:5][37:4]:
user::rw-— права владельца (alice)user:bob:r--— дополнительные права для пользователя bob (только чтение)user:charlie:rw-— дополнительные права для пользователя charlie (чтение и запись)group::r--— права группы staffmask::rw-— эффективная маска (максимальные права для всех ACL-записей кроме владельца)other::---— права для остальных
Установка ACL: команда setfacl
Команда setfacl (set file access control list) устанавливает или изменяет ACL[26:6][35:6][37:5][40:1][41:1][42].
Добавление прав для пользователя
# Дать пользователю bob права на чтение файла
setfacl -m u:bob:r myfile.txt
# Дать пользователю alice права на чтение и запись
setfacl -m u:alice:rw project.txt
# Дать пользователю charlie полные права
setfacl -m u:charlie:rwx script.sh
Опция -m (modify) изменяет или добавляет ACL-запись[37:6][42:1].
Добавление прав для группы
# Дать группе developers права на чтение и запись
setfacl -m g:developers:rw document.txt
# Дать группе admin полные права
setfacl -m g:admin:rwx /var/log/app/
Удаление ACL-записей
# Удалить ACL-запись для пользователя bob
setfacl -x u:bob myfile.txt
# Удалить ACL-запись для группы developers
setfacl -x g:developers document.txt
# Удалить все ACL (оставить только стандартные права)
setfacl -b myfile.txt
Опция -x (remove) удаляет конкретную запись, а -b (remove all) удаляет все расширенные ACL[26:7][37:7][42:2].
Рекурсивное применение ACL
# Применить ACL ко всем файлам в директории рекурсивно
setfacl -R -m u:bob:rx /shared/project/
# -R означает recursive (рекурсивно)
ACL по умолчанию для директорий
Для директорий можно установить ACL по умолчанию (default ACL), которые будут автоматически применяться ко всем новым файлам и поддиректориям[26:8][38:2][40:2]:
# Установить ACL по умолчанию для директории
setfacl -d -m u:bob:rw /shared/project/
# -d означает default (по умолчанию)
# Теперь все новые файлы в /shared/project/ будут иметь
# права на чтение и запись для bob
Проверка:
getfacl /shared/project/
# Вывод покажет как обычные ACL, так и default ACL
Практический пример использования ACL
Сценарий: Создать общую директорию проекта, где:
- Alice (владелец) имеет полный доступ
- Bob может читать и записывать
- Charlie может только читать
- Все остальные не имеют доступа
# Создаём директорию
mkdir /shared/project
chmod 700 /shared/project
# Устанавливаем ACL для bob
setfacl -m u:bob:rwx /shared/project/
# Устанавливаем ACL для charlie
setfacl -m u:charlie:rx /shared/project/
# Устанавливаем ACL по умолчанию для новых файлов
setfacl -d -m u:bob:rw /shared/project/
setfacl -d -m u:charlie:r /shared/project/
# Проверяем
getfacl /shared/project/
Теперь создадим файл и проверим его ACL:
cd /shared/project/
touch newfile.txt
getfacl newfile.txt
# Видим, что bob и charlie автоматически получили свои права
Важные замечания об ACL
ACL работают аддитивно (дополняют стандартные права, но не могут их отменить)[36:5]. Если стандартные права Unix дают доступ группе “other”, то ACL не могут его полностью запретить без изменения базовых прав[36:6].
Маска ACL (mask::) определяет максимальные эффективные права для всех ACL-записей (кроме владельца и other)[26:9][37:8]. Даже если вы дали пользователю права rwx, но маска установлена в r--, пользователь сможет только читать.
Бэкапы и копирование: не все инструменты сохраняют ACL при копировании файлов. Используйте опции вроде cp --preserve=all или rsync -A для сохранения ACL[38:3].
Глава 6: Управление пользователями и группами
Создание пользователей
В Linux пользователи создаются командой useradd или adduser[5:7][9:2][10:1][43]:
# Создать нового пользователя
sudo useradd bob
# Создать пользователя с домашней директорией
sudo useradd -m alice
# Установить пароль для пользователя
sudo passwd alice
Информация о пользователях хранится в файле /etc/passwd[6:2][9:3], а пароли (в зашифрованном виде) — в /etc/shadow[9:4].
Удаление пользователей
# Удалить пользователя (оставить домашнюю директорию)
sudo userdel bob
# Удалить пользователя вместе с домашней директорией
sudo userdel -r bob
Создание групп
Группы создаются командой groupadd[5:8][9:5][10:2][11:1]:
# Создать новую группу
sudo groupadd developers
# Создать группу с определённым GID (group ID)
sudo groupadd -g 1500 admins
Информация о группах хранится в файле /etc/group[9:6][10:3][11:2].
Добавление пользователя в группу
# Добавить пользователя bob в группу developers
sudo usermod -aG developers bob
# -a означает append (добавить)
# -G означает supplementary groups (дополнительные группы)
Важно: используйте опцию -a вместе с -G, иначе пользователь будет удалён из всех других групп![5:9][10:4][43:1]
Просмотр групп пользователя
# Посмотреть группы текущего пользователя
groups
# Посмотреть группы конкретного пользователя
groups bob
# Более детальная информация
id bob
# Вывод: uid=1001(bob) gid=1001(bob) groups=1001(bob),1500(developers)
Удаление группы
# Удалить группу
sudo groupdel developers
Практический пример: создание команды разработки
# Создаём группу для разработчиков
sudo groupadd developers
# Создаём трёх пользователей
sudo useradd -m -s /bin/bash alice
sudo useradd -m -s /bin/bash bob
sudo useradd -m -s /bin/bash charlie
# Устанавливаем пароли
sudo passwd alice
sudo passwd bob
sudo passwd charlie
# Добавляем всех в группу developers
sudo usermod -aG developers alice
sudo usermod -aG developers bob
sudo usermod -aG developers charlie
# Создаём общую директорию для проекта
sudo mkdir /projects/webapp
sudo chgrp developers /projects/webapp
sudo chmod 2775 /projects/webapp
# Проверяем
ls -ld /projects/webapp
# Вывод: drwxrwsr-x 2 root developers 4096 Oct 20 19:00 /projects/webapp
Теперь все члены группы developers могут работать с файлами в /projects/webapp, и новые файлы автоматически получают группу developers благодаря SetGID биту[21:13][22:10].
Глава 7: Proxmox и управление правами в LXC/VM
Введение в Proxmox и контейнеры
Proxmox Virtual Environment — это платформа для виртуализации с открытым исходным кодом, которая поддерживает виртуальные машины (VM) и LXC-контейнеры[44][45]. Работа с правами доступа в среде Proxmox имеет свои особенности, особенно при использовании непривилегированных контейнеров[46][47][48][49].
Привилегированные vs Непривилегированные контейнеры
Привилегированный контейнер (privileged) — это контейнер, в котором UID и GID внутри контейнера напрямую соответствуют UID и GID на хосте[50][51][49:1]. Например, root (UID 0) в контейнере — это настоящий root (UID 0) на хосте Proxmox. Это создаёт риски безопасности: если злоумышленник получит root-доступ внутри контейнера и сможет выйти за его пределы, он получит полный контроль над хостом[52][49:2][53].
Непривилегированный контейнер (unprivileged) — это контейнер, в котором все UID и GID смещены (mapped) на другие значения на хосте[46:1][47:1][48:1][49:3]. По умолчанию Proxmox добавляет смещение 100000[46:2][47:2][48:2]. Это означает:
- UID 0 (root) в контейнере → UID 100000 на хосте
- UID 1 в контейнере → UID 100001 на хосте
- UID 1000 в контейнере → UID 101000 на хосте
Таким образом, даже если злоумышленник получит root в контейнере и выйдет за его пределы, на хосте он будет обычным пользователем с UID 100000, не имеющим особых привилегий[54][52:1][49:4].
Рекомендация: всегда используйте непривилегированные контейнеры, если только нет веских причин использовать привилегированные[52:2][51:1][49:5][53:1].
Проблема с правами доступа в непривилегированных контейнерах
Главная проблема возникает, когда нужно дать контейнеру доступ к файлам на хосте (через bind mount)[46:3][47:3][55][48:3][56]. Представьте ситуацию:
- На хосте Proxmox у вас есть директория
/storage/data, принадлежащая пользователю с UID 1000 - Вы монтируете эту директорию в непривилегированный контейнер
- Внутри контейнера пользователь с UID 1000 пытается получить доступ к файлам
Что происходит? UID 1000 в контейнере — это на самом деле UID 101000 на хосте (из-за смещения +100000). А файлы принадлежат UID 1000 на хосте. Несоответствие! Контейнер видит файлы как принадлежащие nobody:nogroup и получает “Permission denied”[55:1][57][58][59].
Настройка маппинга UID/GID в Proxmox
Чтобы решить проблему с правами, нужно настроить маппинг UID/GID между контейнером и хостом[46:4][47:4][48:4][60].
Шаг 1: Разрешить маппинг на хосте
На хосте Proxmox отредактируйте файлы /etc/subuid и /etc/subgid[46:5][48:5][60:1]:
# Открываем файл /etc/subuid
nano /etc/subuid
# Добавляем строку (если её нет):
root:100000:65536
root:1000:1
# Аналогично для /etc/subgid
nano /etc/subgid
root:100000:65536
root:1000:1
Это разрешает root (под которым работает Proxmox) маппить UID/GID из диапазона 100000-165535, а также конкретно UID/GID 1000[46:6][48:6].
Шаг 2: Настроить маппинг в конфигурации контейнера
Остановите контейнер:
pct stop 100
Отредактируйте конфигурационный файл контейнера /etc/pve/lxc/100.conf (где 100 — ID контейнера)[46:7][48:7][60:2]:
nano /etc/pve/lxc/100.conf
Добавьте в конец файла строки маппинга:
# Маппинг для UID
lxc.idmap: u 0 100000 1000
lxc.idmap: u 1000 1000 1
lxc.idmap: u 1001 101001 64535
# Маппинг для GID
lxc.idmap: g 0 100000 1000
lxc.idmap: g 1000 1000 1
lxc.idmap: g 1001 101001 64535
Разберём эти строки[46:8][48:8][60:3]:
lxc.idmap: u 0 100000 1000— маппит UID 0-999 контейнера на UID 100000-100999 хостаlxc.idmap: u 1000 1000 1— маппит UID 1000 контейнера на UID 1000 хоста (один к одному!)lxc.idmap: u 1001 101001 64535— маппит UID 1001-65535 контейнера на UID 101001-165535 хоста
Аналогично для GID. Теперь UID 1000 в контейнере будет соответствовать UID 1000 на хосте[48:9][60:4].
Шаг 3: Запустить контейнер
pct start 100
Теперь пользователь с UID 1000 внутри контейнера сможет работать с файлами, принадлежащими UID 1000 на хосте[47:5][48:10].
Практический пример: монтирование хранилища в контейнер
Задача: Смонтировать директорию /storage/shared с хоста Proxmox в контейнер и обеспечить доступ.
Шаг 1: На хосте создаём директорию и пользователя:
# Создаём пользователя для контейнеров
useradd -u 1000 -m lxcuser
# Создаём общую директорию
mkdir -p /storage/shared
chown 1000:1000 /storage/shared
chmod 755 /storage/shared
Шаг 2: Настраиваем маппинг (как описано выше в /etc/subuid, /etc/subgid и конфиге контейнера).
Шаг 3: Добавляем bind mount в конфигурацию контейнера:
nano /etc/pve/lxc/100.conf
# Добавляем строку:
mp0: /storage/shared,mp=/mnt/shared
Шаг 4: Запускаем контейнер и проверяем:
pct start 100
pct enter 100
# Внутри контейнера:
ls -l /mnt/shared
# Должны видеть файлы с правильным владельцем
# Создаём тестовый файл
touch /mnt/shared/test.txt
# Выходим из контейнера
exit
# На хосте проверяем
ls -l /storage/shared/test.txt
# Должен быть владелец UID 1000
Типичные проблемы и их решения
Проблема 1: “Permission denied” при доступе к bind mount
Решение: Проверьте, что UID/GID в контейнере правильно замаппированы на хост. Используйте команды id внутри контейнера и ls -ln на хосте для проверки числовых ID[47:6][55:2][58:1].
Проблема 2: Файлы показываются как “nobody:nogroup”
Решение: UID файлов находится вне диапазона маппинга. Расширьте диапазон в lxc.idmap или измените владельца файлов на хосте[55:3][59:1][61].
Проблема 3: Контейнер не запускается после изменения маппинга
Решение: Проверьте синтаксис в /etc/pve/lxc/XXX.conf. Убедитесь, что диапазоны в lxc.idmap не пересекаются и покрывают весь необходимый диапазон (0-65535)[57:1][59:2][61:1].
Проблема 4: Root в контейнере не может читать свои же файлы
Решение: Это происходит, когда файлы внутри контейнера принадлежат немаппированному UID. После изменения маппинга нужно исправить владельца файлов. Остановите контейнер, смонтируйте его файловую систему и измените владельца[62][55:4]:
# Остановить контейнер
pct stop 100
# Смонтировать файловую систему
pct mount 100
# Изменить владельца файлов (пример)
find /var/lib/lxc/100/rootfs -user 100000 -exec chown 1000 {} +
find /var/lib/lxc/100/rootfs -group 100000 -exec chgrp 1000 {} +
# Размонтировать
pct unmount 100
# Запустить
pct start 100
Использование ACL на хосте Proxmox
Если маппинг UID/GID сложен или невозможен, можно использовать ACL на хосте для предоставления доступа[56:1]:
# На хосте Proxmox
# Дать доступ UID 101000 (это UID 1000 в контейнере со смещением)
setfacl -m u:101000:rwx /storage/shared
# Проверить
getfacl /storage/shared
Теперь пользователь с UID 1000 в контейнере (который на хосте — UID 101000) сможет работать с этой директорией[56:2].
Виртуальные машины (VM) и права доступа
В отличие от LXC-контейнеров, виртуальные машины в Proxmox полностью изолированы от хоста[44:1]. VM не имеют прямого доступа к файловой системе хоста. Для обмена данными между VM и хостом используются:
- Сетевые протоколы (NFS, SMB/CIFS, SSH) — VM монтирует сетевую папку с хоста[50:1][58:2]
- VirtIO-FS — специальная файловая система для обмена данными между хостом и VM (экспериментальная функция)
- Облачные диски — создание общего диска, доступного нескольким VM
При использовании сетевых протоколов права доступа настраиваются обычным способом через UID/GID и ACL на сервере (хосте Proxmox)[56:3][50:2].
Рекомендации по безопасности в Proxmox
- Используйте непривилегированные контейнеры везде, где возможно[52:3][49:6][53:2]
- Минимизируйте маппинг UID/GID — маппьте только те ID, которые действительно нужны[48:11][60:5]
- Используйте отдельные UID для разных контейнеров — не давайте всем контейнерам доступ к одним и тем же UID хоста[46:9][47:7]
- Регулярно проверяйте права доступа к смонтированным директориям[56:4]
- Используйте ACL для гранулярного контроля доступа вместо chmod 777[56:5]
- Документируйте свои маппинги — создайте файл с описанием, какие UID/GID используются в каких контейнерах[60:6]
Инструменты для упрощения маппинга
Существуют инструменты, облегчающие настройку маппинга:
proxmox-lxc-idmapper — Python-скрипт, который генерирует правильный синтаксис для lxc.idmap[60:7]:
# Пример использования
./run.py 1000=1005 1005=1001
# Скрипт выдаст готовые строки для конфига
Это помогает избежать ошибок в синтаксисе маппинга[60:8].
Заключение
В этом курсе мы прошли путь от базовых понятий прав доступа в Linux до сложных сценариев работы с Proxmox и контейнерами. Давайте подведём итоги основных тем.
Основные выводы
Стандартные права доступа (владелец, группа, остальные с правами r, w, x) — это фундамент безопасности Linux[1:7][2:7][3:8][4:11]. Понимание команд chmod, chown и chgrp критически важно для любого администратора системы[17:7][8:2][7:4].
Специальные биты (SetUID, SetGID, Sticky Bit) предоставляют дополнительные возможности для управления выполнением программ и защиты файлов в общих директориях[21:14][22:11][23:6][24:11]. Они должны использоваться осторожно из соображений безопасности.
Umask определяет права по умолчанию для новых файлов и директорий[28:3][29:5][30:3][31:3]. Правильная настройка umask помогает автоматически создавать файлы с нужным уровнем безопасности[32:4][33:1].
ACL решают проблему ограниченности стандартной модели прав, позволяя устанавливать права для множества пользователей и групп на один файл[26:10][35:7][36:7][37:9]. Это мощный инструмент для сложных сценариев совместной работы[38:4][40:3][41:2].
Группы — это эффективный способ управления правами для множества пользователей одновременно[5:10][9:7][10:5][11:3][13:1]. Грамотное использование групп упрощает администрирование и повышает безопасность[12:1][43:2].
Маппинг UID/GID в Proxmox — необходимая техника для безопасной работы с непривилегированными LXC-контейнерами[46:10][47:8][48:12][60:9]. Понимание принципов маппинга критически важно для корректной работы приложений в контейнерах с доступом к данным хоста[49:7].
Практические советы для начинающих
Всегда начинайте с минимальных прав и добавляйте их по мере необходимости (принцип наименьших привилегий)[2:8][63]. Это безопаснее, чем давать избыточные права и потом их отбирать.
Используйте группы для организации пользователей с похожими потребностями в доступе[5:11][9:8][12:2]. Это упрощает управление и снижает вероятность ошибок.
Регулярно проверяйте права критичных файлов и директорий командами ls -l и getfacl[4:12][40:4]. Автоматизируйте проверки с помощью скриптов.
Документируйте нестандартные настройки прав, особенно ACL и маппинги UID/GID в контейнерах[60:10]. Это поможет вам и вашим коллегам в будущем.
Тестируйте изменения прав на тестовых системах перед применением на продакшене. Неправильные права могут привести к потере доступа или утечке данных.
Изучайте логи системы (/var/log/auth.log, /var/log/syslog) для выявления проблем с доступом[9:9]. Сообщения “Permission denied” часто указывают на проблемы с правами.
Дальнейшее обучение
Эта обучающая программа охватила основные темы прав доступа в Linux, но есть ещё множество продвинутых тем для изучения: SELinux и AppArmor (системы обязательного контроля доступа)[63:1], возможности Linux (capabilities) для тонкой настройки привилегий процессов, системы аудита действий пользователей, шифрование файловых систем и интеграция с централизованными системами аутентификации (LDAP, Active Directory).
Продолжайте практиковаться, экспериментируйте в безопасной среде и не бойтесь читать документацию (man chmod, man setfacl, документацию Proxmox). Опыт приходит с практикой, и чем больше вы работаете с правами доступа, тем увереннее вы становитесь в управлении безопасностью Linux-систем[1:8][2:9][49:8].
Удачи в освоении Linux!
[64][65][66][67][68][69][70][71][72][73][74][75][76]
An Overview of Understanding Chown and Chmod in Linux ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Linux User Groups and Permissions Guide ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
How to Use the Chmod and Chown Commands to Change File Permissions ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Classic SysAdmin: Understanding Linux File Permissions - Linux Foundation ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
A Guide to User and Permission Management in Linux- DevOps Prerequisite 6 - DEV Community ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Linux chmod and chown – How to Change File Permissions and Ownership in Linux ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Lesson 5: Users, Groups, Permissions — OSU DevOps BootCamp 0.0.1 documentation ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Managing Linux Users and Groups | Linux Training Academy ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
How to create, delete, and modify groups in Linux ↩︎ ↩︎ ↩︎ ↩︎
How to change directory permissions in Linux | Online Courses, Learning Paths, and Certifications - Pluralsight ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
https://kodekloud.com/blog/linux-permissions-explained-in-simple-terms/ ↩︎ ↩︎ ↩︎ ↩︎
https://www.baeldung.com/linux/chown-chmod-permissions ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
How to Set Permissions in Linux: A Guide to chmod and chown | DigitalOcean ↩︎ ↩︎ ↩︎
https://linuxconfig.org/retrieving-file-permissions-in-octal-mode-using-the-command-line ↩︎ ↩︎ ↩︎
Understanding Special Permissions in Linux: Sticky Bit, SetGID, and SetUID ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
https://linuxconfig.org/how-to-use-special-permissions-the-setuid-setgid-and-sticky-bits ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Linux File Permissions: Understanding Setuid, Setgid, and the Sticky Bit ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
SetUID, SetGID, and Sticky Bits in Linux File Permissions - GeeksforGeeks ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Linux Access Control Lists (ACLs): A Simplified Guide with Examples - DEV Community ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
SetUID, SetGID, and Sticky Bits in Linux File Permissions ↩︎ ↩︎
What is Umask and How to Use It {Update Default Linux File Permissions} ↩︎ ↩︎ ↩︎ ↩︎
Linux 'umask' Command: Default Permissions Guide ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
https://www.liquidweb.com/blog/what-is-umask-and-how-to-use-it-effectively/ ↩︎ ↩︎ ↩︎ ↩︎
Umask command in Linux with examples - GeeksforGeeks ↩︎ ↩︎ ↩︎ ↩︎
https://linuxize.com/post/umask-command-in-linux/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Access Control Lists (ACL) in Linux - GeeksforGeeks ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
https://docs.tacc.utexas.edu/tutorials/acls/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
How to create and use file access control lists in Linux ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
https://help.ubuntu.com/community/FilePermissionsACLs ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
15+ setfacl & getfacl command examples in Linux [Cheat Sheet] | GoLinuxCloud ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
How to use getfacl and setfacl to get and set access control lists (ACLs) on directories in Linux ↩︎ ↩︎ ↩︎
User and Group Management in Linux: A Beginner’s Guide ↩︎ ↩︎ ↩︎
User and Permission Management in Proxmox VE - BDRSuite ↩︎ ↩︎
Understanding LXC user/group mapping - kcore.org ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Proxmox unprivileged LXC id mapping ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
https://www.apalrd.net/posts/2023/tip_idmap/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Unprivileged LXC containers - Proxmox VE ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
https://cloudspinx.com/convert-unprivileged-container-in-proxmox-to-privileged/ ↩︎ ↩︎
https://www.reddit.com/r/Proxmox/comments/vf83ok/i_just_want_to_make_sure_i_understand/ ↩︎ ↩︎ ↩︎ ↩︎
https://www.reddit.com/r/Proxmox/comments/9ui3j6/lxc_privileged_vs_unprivileged/ ↩︎ ↩︎ ↩︎
https://bobcares.com/blog/proxmox-bind-mount-permissions/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
https://www.reddit.com/r/Proxmox/comments/lqc7ma/uidgid_mapping_for_unprivileged_lxc_container/ ↩︎ ↩︎
https://forum.proxmox.com/threads/cannot-access-shared-folder-on-unprivileged-lxc-container-due-to-permissions.140473/ ↩︎ ↩︎ ↩︎
https://forum.proxmox.com/threads/proxmox-lxc-uid-gid-mapping.139916/ ↩︎ ↩︎ ↩︎
https://github.com/ddimick/proxmox-lxc-idmapper ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
https://www.reddit.com/r/Proxmox/comments/134t7ku/need_help_with_file_permissions_for_unprivileged/ ↩︎ ↩︎
https://github.com/Rossatron-UI/proxmox-lxc-permissions-fix ↩︎
https://www.reddit.com/r/Proxmox/comments/xxccr1/mapping_users/ ↩︎
https://www.reddit.com/r/Proxmox/comments/1e52f0q/pbs_permission_settings_for_dataset_and_namespace/ ↩︎
https://forum.proxmox.com/threads/fixing-lxc-container-permissions-and-network-issues.152819/ ↩︎
https://forum.proxmox.com/threads/new-user-namespace-and-permission-level-for-each-proxmox-ve-host-in-a-cluster.149427/ ↩︎
https://www.reddit.com/r/linux4noobs/comments/1cz13o1/can_i_use_the_octal_notation_for_the_chmod/ ↩︎
https://docs.nersc.gov/filesystems/unix-file-permissions/ ↩︎
https://www.liquidweb.com/blog/how-do-i-set-up-setuid-setgid-and-sticky-bits-on-linux/ ↩︎
https://stackoverflow.com/questions/36618977/linux-file-permissionsin-depth-numeric-to-string-notation-and-vice-versa-a ↩︎
https://bobcares.com/blog/change-lxc-from-unprivileged-back-to-privileged/ ↩︎
https://bobcares.com/blog/proxmox-docker-unprivileged-container/ ↩︎
https://www.geeksforgeeks.org/linux-unix/groups-command-in-linux-with-examples/ ↩︎
