Управление доступом в общей папке в ОС Linux

13 октября 2026

Права доступа на файлы в ОС Linux

В ОС Linux используется классическая система предоставления доступа к файлам, основанная на стандарте POSIX. В этой системе имеется несколько правил:

  • Каждый файл принадлежит какому-то пользователю и какой-то группе.
  • Для владельца, группы и всех остальных определена маска доступа, т. е. набор предоставляемых разрешений.
  • Всего есть три вида разрешений: чтение (r или 22=4), запись (w или 21=2) и выполнение (х или 20=1)
  • В момент создания файла UID и GID пользователя определяет кому будет принадлежать будущий файл.
  • Текущее значение umask определяет набор прав, который будет назначен на вновь создаваемый файл. Значение umask пользователь может назначать произвольно.
  • Владелец файла может произвольно менять права доступа к своим файлам.
  • Суперпользователь может назначать права доступа и права владения на любой файл. Так же он может игнорировать назначенные права доступа при работе с файлом.
В выше перечисленных правилах нет одного, но крайне важного пункта, а именно, отсутствует механизм наследования прав доступа. Другими словами права доступа некоторого файла никак не зависят от прав доступа каталога в котором он расположен. Отсутствие наследования не является проблемой, когда мы используем ОС, например, как веб-сервер или ОС используется монопольно одним человеком.
Но если предполагается, что несколько пользователей могут работать с некоторым каталогом, тогда возникает проблема: как разграничить права доступа в этом случае?

POSIX ACL

Рассмотрим пример: у нас есть общая папка /home/share и некоторые пользователи, которым нужен доступ на чтение и запись на файлы в каталоге и некоторый набор пользователей, которые должны иметь доступ только на чтение файлов в каталоге. 
Создадим каталог и проверим права доступа на него:
$ sudo mkdir /home/share
$ id root
uid=0(root) gid=0(root) группы=0(root)

# umask
0022

$ ls -ld /home/share/
drwxr-xr-x 2 root root 4096 янв 26 11:43 /home/share/

Мы видим, что владеет каталогом тот, кто его создавал, и группа каталога соответствует первичной группе создателя. Так же umask суперпользователя определила права доступа на созданный каталог.

Поменяем права доступа так, чтобы только суперпользователь имел доступ к этому каталогу:
$ sudo chmod 700 /home/share/
$ ls -ld /home/share/
drwx------ 2 root root 4096 янв 26 11:43 /home/share/

Теперь создадим пользователей и добавим их в нужные группы:
$ sudo adduser user1
$ sudo adduser user2
$ sudo groupadd rw_share
$ sudo groupadd ro_share
$ sudo gpasswd -a user1 rw_share
$ sudo gpasswd -a user2 ro_share

$ id user1
uid=1001(user1) gid=1001(user1) группы=1001(user1),100(users),1003(rw_share)
$ id user2
uid=1002(user2) gid=1002(user2) группы=1002(user2),100(users),1004(ro_share)

Пользователей мы подготовили, но сейчас ни у user1 ни у user2 никакого доступа к каталогу нет. Добавим их посредством POSIX ACL:
$ sudo setfacl -m g:rw_share:rwx,g:ro_share:rx /home/share

$ getfacl /home/share/
getfacl: Removing leading '/' from absolute path names
# file: home/share/
# owner: root
# group: root
user::rwx
group::---
group:rw_share:rwx
group:ro_share:r-x
mask::rwx
other::---

Теперь не только суперпользователь имеет права доступа, но еще и члены групп rw_share и ro_share.

Проверим как это работает.
$ sudo su - user1
$ id
uid=1001(user1) gid=1001(user1) группы=1001(user1),100(users),1003(rw_share)

$ mkdir /home/share/user1_dir
$ echo test1 > /home/share/u1.txt
$ getfacl /home/share/user1_dir /home/share/u1.txt
getfacl: Removing leading '/' from absolute path names
# file: home/share/user1_dir
# owner: user1
# group: user1
user::rwx
group::rwx
other::r-x

# file: home/share/u1.txt
# owner: user1
# group: user1
user::rw-
group::rw-
other::r--

$ sudo su — user2
$ id
uid=1002(user2) gid=1002(user2) группы=1002(user2),100(users),1004(ro_share)

$ mkdir /home/share/user2_dir/
mkdir: cannot create directory ‘/home/share/user2_dir/’: Отказано в доступе
$ echo test1 > /home/share/u2.txt
-bash: /home/share/u2.txt: Отказано в доступе

$ ls -l /home/share/
итого 8
-rw-rw-r-- 1 user1 user1    6 янв 26 12:04 u1.txt
drwxrwxr-x 2 user1 user1 4096 янв 26 12:04 user1_dir

Что получилось: пользователь user1 смог в каталоге /home/share создать и каталог и файл, но права доступа на содержимое никак не зависят от прав доступа самого каталога. Права доступа вновь назначались согласно классической модели дискреционного доступа.

Поправим это:
$ sudo setfacl -m d:g:rw_share:rwx,d:g:ro_share:rx /home/share

$ getfacl /home/share/
getfacl: Removing leading '/' from absolute path names
# file: home/share/
# owner: root
# group: root
user::rwx
group::---
group:rw_share:rwx
group:ro_share:r-x
mask::rwx
other::---
default:user::rwx
default:group::---
default:group:rw_share:rwx
default:group:ro_share:r-x
default:mask::rwx
default:other::---

$ sudo getfacl /home/share/u1.txt
getfacl: Removing leading '/' from absolute path names
# file: home/share/u1.txt
# owner: user1
# group: user1
user::rw-
group::rw-
other::r--

На каталог /home/share мы установили права доступа, но на его содержимое права доступа остались прежними. Поправим и это. Сделаем ACL на содержимое таким же как и на каталог, конструкция <() создает файл из стандартного потока команды, а опция -M команды setfacl назначает права как в файле, указанном после этой опции:

# find /home/share/ | xargs setfacl -M <(getfacl /home/share/)
getfacl: Removing leading '/' from absolute path names
setfacl: /home/share/u1.txt: Only directories can have default ACLs

# getfacl /home/share/user1_dir/ 
getfacl: Removing leading '/' from absolute path names
# file: home/share/user1_dir/
# owner: user1
# group: user1
user::rwx
group::---
group:rw_share:rwx
group:ro_share:r-x
mask::rwx
other::---
default:user::rwx
default:group::---
default:group:rw_share:rwx
default:group:ro_share:r-x
default:mask::rwx
default:other::---

# getfacl /home/share/u1.txt 
getfacl: Removing leading '/' from absolute path names
# file: home/share/u1.txt
# owner: user1
# group: user1
user::rwx
group::---
group:rw_share:rwx
group:ro_share:r-x
mask::rwx
other::---

Обратим еще внимание на права доступа на обычные файлы. Мы видим, что у файла u1.txt имеются права на выполнение, что не хорошо с точки зрения безопасности. Исправим и это:

# find /home/share/ -type f | xargs chmod -x
# getfacl /home/share/u1.txt 
getfacl: Removing leading '/' from absolute path names
# file: home/share/u1.txt
# owner: user1
# group: user1
user::rw-
group::---
group:rw_share:rwx                   #effective:rw-
group:ro_share:r-x                     #effective:r--
mask::rw-
other::---

Проверим еще раз, что получилось.

$ sudo su — user1
$ echo test2 > /home/share/u2.txt

$ ls -l /home/share/u2.txt
-rw-rw----+ 1 user1 user1 6 янв 26 12:28 /home/share/u2.txt

$ getfacl /home/share/u2.txt
getfacl: Removing leading '/' from absolute path names
# file: home/share/u2.txt
# owner: user1
# group: user1
user::rw-
group::---
group:rw_share:rwx          #effective:rw-
group:ro_share:r-x            #effective:r--
mask::rw-
other::---

Теперь при создании нового файла в каталоге на него автоматически назначается так называемый default ACL. В POSIX ACL все-таки нет наследования, но мы можем управлять автоматическим назначением нужных нам ACL на новые файлы и каталоги. 

Итоги

При совместном доступе к файлам стандартных прав доступа будет недостаточно для реализации правил доступа к файлам. POSIX ACL могут решить эту проблему. ACL позволяют указать более одного пользователя или более одной группы, которым вы предоставляете доступ.
Хотя наследования прав доступа в ACL нет, default ACL помогают контролировать то, какие права доступа получат вновь создаваемые файлы в каталоге. На существующие файлы default ACL не влияют.
Автор статьи
Вячеслав Лесковец
Преподаватель:
по направлениям сетевые технологии, операционные системы

Курсы к статье

Хотите преподавать в АйТи Клауд?

Если вы имеете компетенции и хотите работать тренером курсов в АйТи Клауд - оставьте ваши данные, мы свяжемся с вами!