Права доступа в Linux с использованием "Классической модели разрешений Linux".

Блог - конспект, «Классическая модель разрешений Linux», рассмотрены основные принципы модели распределения прав операционной системы Linux, материал  сопровождается примеры на стенде ALT Linux server x64.

Ведение

Linux позаимствовал у Unix простую модель прав доступа к файлам, обозначив её как «Классическая модель разрешений Linux», которая является эффективным, гибким и относительно простым инструментом для понимания и дизайна безопасности файлов и каталогов.

Классическая модель разрешений Linux.

В OC Linux у каждого создаваемого файла и каталога есть два владельца: пользователь и группа. Владельцем файла становится пользователь, создатель файла, и группа в которую входит этот пользователь. Каждый раз когда система обращается к файлу происходит сопоставление: является ли тот кто пытается получить доступ к файлу его владельцем (owner) с правами владельца, если нет, система проверяет членство пользователя в группе (group) и права этой группы, если нет, происходит сопостовление прав для других (other), после чего принимается решение о правах доступа к файлу или каталогу для пользователя. Ещё одно условие при получение прав разрешения наличие - UID и GID, соответственно, для пользователя и группы. Когда пользователь входит в систему ему присваивается, вернее он уже есть при создании учётной записи, уникальный идентификатор - UID, следовательно все процессы, которые выполняет пользователь, система будет сопоставлять с его UID, определяя для этого UID, права разрешений для доступа к файлу и каталогу. Просмотреть UID можно командой id, Пример 1:

GID - группа пользователя по умолчанию, как правило её название и GID совпадает с именем и UID пользователя и является основной, Пример 1, в дальнейшем пользователь может быть членом многих групп, но основная группа будет главной, такие правила. Для просмотра членства в группе используется команда groups. В примерах 3-5 показаны варианты назначения прав и групп при создании файлов и каталогов.

кроме пользователей и групп создаваемых администратором, сушествуют системные пользователи и группы их числовой диапазон UID и GID, как правило начинается от 0-499, системные пользователи и группы выполняют управление служебных программ: ftp,apache,mysql... Пример 2;

Пример 1
 $ id usertest uid=500(usertest) gid=500(usertest) группы=500(usertest) 
$ groups usertest
usertest : usertest uucp proc cdrom floppy cdwriter audio radio scanner xgrp camera vboxusers video sambashare
Пример 2
 $ id root uid=0(root) gid=0(root)
$ id apache uid=96(apache) gid=96(apache) группы=96(apache
Пример 3
 $ pwd
/home/usertest
$ touch file
$ ls -l file
-rw-r--r--
$ groups
usertest ...


Пример 4
 $ pwd
/home/usertest
$ mkdir dir
$ ls -ld dir
$ cd dir
$ groups
$ drwxr-xr-x
$ groups
usertest ...
Пример 5
 $ ls -l file
-rw-r--r--
// -файл;
// владелец: читать|писать
// группа: читать
// другие: читать



Пример 5a
 $ ls -ld dir
drwxr-xr-x
// d файл
// владелец: читать|писать|исполнять
// группа: читать|исполнять
// другие: читать|исполнят



 Комментарий
 Пример 3 создали файл смотрим права по умолчанию и группу 
Пример 4 создали каталог смотрим права по умолчанию и группу
Пример 5 расшифровка синтаксиса прав файла
Пример 5a расшифровка синтаксиса прав каталога

Синтаксис классической модели разрешений Linux.

В ОС Linux каждый файл или каталог имеет три правила для разрешений доступа:

Пример 6

                      Арибуты доступа:
кто            полное наз.  сокращение
владелец owner      user       u
участник группы     group      g
остальные           оther      o
все                  all        a // all включает ugo
Флаги доступа:
 что       пояснение    сим-кое     числовое    
Read        чтение         r          4
Write       запись         w          2
Execute     исполнение     x          1
Операторы доступа:
оператор                    пояснение
+          указанные разрешения включены, разрешения, которые не указаны, остаются без изменений.
-          указанные разрешения отключены, разрешения, которые не указаны, остаются без изменений.
=          указанные разрешения включены, не указанные разрешения отключены

Значения: атрибут|флаг|оператор разбиты на триады каждая из которых добавляется для:|владелец|группа|другие, Пример 7-8:

Пример 7 расшифровка, с лева > право
 $ ls -l file
-rw-r--r--
// - файл;
// владелец: читать|писать
// группа: читать
// другие: читать
$ ls -ld dir
drwxr-xr-x
// d файл
// владелец: читать|писать|исполнять
// группа: читать|исполнять
// другие: читать|исполнять
Пример 8
 $ pwd
/home/usertest
$ ls -l file
-rw-r--r--
$ chmod g+w file   // символьное написание
$ $ ls -l file
-rw-rw-r--
$ chmod 671 file   // числовое написание
$ ls -l file
-rw-rwx--x


Комментарий
  
Значения:атрибут|флаг|оператор разбиты на триады
каждая из которых добавляется для:
|владелец|группа|другие, Пример 7-8:
Устанавливать разрешения можно при помощи команды chmod
назначая права в числовом или символьном значении Пример 8,
контролировать результаты выполнения команды chmod можно
с помощью ls команды.


 Пример 9: расшифровка, движемся с лева > право

$ ls -l file
-rwxr-xr-x 1 smm smm 43 месяц 7 21:11 file- файл
rwx триада прав владельца
r-x триада права группы
r-x триада прав других
1 количество ссылок на файл
smm владелец
группы smm
43 размер
месяц создания
время создания или изменения
название
Пример 10
 $ ls -l file
-rw-r--r--
$ chmod =rwx file
$ ls -l file
-rwxr-xr-x  
Пример 10a
 $ ls -l file
-rw-r--r--
$ chmod ugo=rwx file
$ ls -l file
-rwxrwxrwx  
Пример 10b
 $ ls -l file
-rw-r--r--
$ chmod 777 file
$ ls -l file
-rwxrwxrwx 
Комментарий
 Пример 10 использование оператора'='для владельца 
Пример 10а использование оператора'=' для всех
Пример 10б числовое использование для всех
Пример 12
 $ pwd
$ /home/usertest
$ ls -l file
-rw-r-x--x
$ chmod 644 file
-rw-r--r--
Пример 13
 $ pwd
$ /home/usertest
$ ls -l file
-rw-r-x--x
$ chmod go-x file
-rw-r--r--
Комментарий
 Числовые разрешений прав доступа полезны, когда 
 необходимо указать сразу все разрешения для файла,
 Пример 12.
 Но, иногда удобнее использовать символические обозначения:
 наглядно, не надо пересчитывать комбинацию цифр, можно
 менять в целевой тройке, Пример 13.

отключить модель разрешений можно установив восьмеричное число 777 или его аналога, символического обозначения ugo+rwx - это плохое решение т.к модель разрешения будет полностью отключена.

Модель разрешений доступа для каталога.

Пример 14
                    Атрибуты каталогов. 
r  Read      просмотр какие файлы находятся в каталоге
w  Write     добавлять\переименовывать\удалять записи в каталоге,
даже если нет права w для файла
x  Execute   смотреть: \владельцев\размер файлов\атрибуты\дату\время создания\,
возможность перехода в подкаталог
 Комментарий
Как и файлы, каталоги имеют полный набор атрибутов безопасности: 
владелец|группа|другие; модификаторы|флаги|операторы.
Но, в отличие от файлов, для каталогов атрибуты имеют особое значение.
Для понимания возможности разрешений прав на каталоги смотри пример


 

 Использование umask.

 В Linux umask контролирует права доступа для вновь создаваемых файлов определяя, какие разрешения следует отключить, параметр umask указывается в файле /etc/profile. Структура маски идентична структуре прав доступа к файлам, umask может быть представлен в двоичной, восьмеричной или символьной записи. Команда umask позволяет установить маску во всех трех триадах. Понимание для чего нужна маска исходит из того, что при создании пользователем каталога ему присваиваются права доступа 0777, файлу 0666 из этого становится очевидно - безопасность отключена. Маска устраняет этот недостаток ограничивая разрешения файла или каталога при его создании, накладывая на них свои права. В большинстве системах Linux значение маски определено следующим значением:

 Пример 15

$ umask 
0022 // отобразить в цифровом виде
$ umask -S // отобразить в виде символов
u=rwx,g=rx,o=rx

Теперь зная значение маски можно определить разрешение для создаваемых каталогов, накладывая параметр маски: для каталога и получаем ограничения 0777-0022=0755 для файла эти ограничения будут составлять 0666-0022=0644, таким образом при создании пользователем каталога или файла права доступа будут соответственно 755 и 644.

Значение маски указывается в файле /etc/profile и применяется для всей системы в целом, но если требуется применить этот параметр для отдельного каталога, то можно воспользоваться следующими рекомендациями:

Пример 16

umask a+r              разрешить read для всех пользовательских модификаторов
umask a-x        запретить execute для всех пользовательских модификаторов
umask a+rw        разрешить read\write для всех пользовательских модификаторов
umask +rwx        разрешить read\write\execute для всех пользовательских модификаторов
umask u=rw     разрешить read\write для владельца, запретить execute для владельца
umask u+w,go-w разрешить write для владельца; запретить write для группы и других
umask -S        отображать текущий umask в символической записи
umask 777      запретить read\write\execute для всех и владельца
umask 000        разрешить read, write и execute для всех (угроза безопасности)
umask 077        разрешить read\write\execute для владельца файла, запрет read\write\execute для всех остальных
umask 113        разрешить read\write для владельца и группы, запрет на execute; разрешить read, для других запрет на write\execute
umask 0755        эквивалент u-rwx (4+2+1),go=w (4+1 & 4+1). 

Специальные права доступа к файлам и каталогам SUID, SGID, Sticky Bit.

Пользователи Linux войдя при регистрации в систему, запускают процесс доступа к файлам и каталогам системы используя свой UID см.выше, Каждый каталог и файл в системе имеет триаду прав: |владелец|группа|другие. При необходимости в каждой тройке прав, бит 'x', при некоторых обстоятельствах, может заменятся на специальный, бит, SUID для владельца 's'; SGID для группы 's'; Sticky Bit для остальных 't'.

 Владелец (владелец файла) может иметь дополнительный атрибут для файлов заменив bit execute (x):
    Атрибут SUID: Когда файл выполняется, UID времени выполнения устанавливается для владельца файла, а не для пользователя, запускавшего файл. Если, например, файл принадлежит пользователю root, то UID времени выполнения устанавливается в root. Это означает, что программа выполняется так, как если бы она принадлежала пользователю root. Синтаксис SUID: добавление вместо бит 'x' бит 's' в триаде прав владельца файла, причём появится 's' - если стоял бит 'x', и 'S' -если бит 'x' не стоял.

Пример 17

 Пример: 'S'
    $ ls -l  /usr/local/bin/update
    -rw---x--x
    $ sudo chmod u+s  /usr/local/bin/update
    -rwS--x--x
  Пример: 's'
    $ ls -l  /usr/local/bin/update
    -rwx--x--x
    $ sudo chmod u+s  /usr/local/bin/update
    -rws--x--x
    $ sudo chmod u-s  /usr/local/bin/update
    -rwx--x--x // нет маскировки 's'
  Пример: команда ping
    $ ls -l /bin/ping
    -rws--x--x 1 root root
  Пример: файл паролей
    $ ls -l /usr/bin/passwd
    -rwx--s--x 

 В OC Linux существует несколько десятков SUID файлов, они являются причиной многих эксплойтов 'переполнения буфера', SUID файлы подвергаются строгому аудиту безопасности, захват бита 'мошеннической' программой - нарушение безопасности.

 Группа (пользователи файла) может иметь дополнительный атрибут для группы заменив execute (x):
    Атрибут SGID: изменяет правила наследования для новых файлов в каталоге, файлы созданные в этом каталоге будут иметь привилегированного владельца, а не права первичной группы пользователя. Подкаталоги и созданные файлы, наследует SGID корневого каталога. Синтаксис SGID: добавление вместо бит 'x' бит 's' в триаде прав группы файла, причём появится 's' - если стоял бит 'x', и 'S' -если бит 'x' не стоял.

Пример 18

 Пример:'s' 
    $ sudo chmod g+s  /usr/local/bin/
    $ ls -ld  /usr/local/bin/
    drwxr-sr-x
    $ sudo mkdir  /usr/local/bin/dir
    $ ls -ld  /usr/local/bin/dir
    drwxr-sr-x
    $ sudo chmod g-s  /usr/local/bin/
    $ ls -ld  /usr/local/bin/
    drwxr-xr-x // нет маскировки 's'
 Пример:'S'
    $ ls -ld  /usr/local/bin/
    drwxr--r-x
    $ sudo chmod g+s  /usr/local/bin/
    $ ls -ld  /usr/local/bin/
    drwxr-Sr-x
    $ sudo mkdir  /usr/local/bin/dir
    $ ls -ld  /usr/local/bin/
    drwxr-Sr-x

SGID каталоги подвергаются строгому аудиту безопасности, захват бита 'мошеннической' программой - нарушение безопасности.

Остальные: (кроме суперпользователя, владельца, членов группы, назначенных для файла).
    Атрибут Sticky bit: запрещает удаление файлов кем-либо кроме владельца этого файла, владелеца каталога и пользователя root. Синтаксист Sticky bit: добавление вместо бит 'x' бит 't' в триаде прав other (o) файла, причём появится 't' - если стоял бит 'x', и 'T' -если бит 'x' не стоял.

Пример 19

 Пример:'t'
    $ ls -l  /usr/local/bin/update
    -rw-r-xr-x
    $ sudo chmod o+t  /usr/local/bin/update
    $ ls -l  /usr/local/bin/update
     -rw-r-xr-t
    $ sudo chmod o-t  /usr/local/bin/update
    $ ls -l  /usr/local/bin/update
    -rw-r-xr-x // нет маскировки 't'
Пример: 'T'
    $ ls -l  /usr/local/bin/update
    -rw-r-xr--
    $ sudo chmod o+t  /usr/local/bin/update
    $ ls -l  /usr/local/bin/update
     -rw-r-xr-T    
  Классический пример:
   $ ls -ld  /tmp //каталог временных файлов пользователей
   drwxrwxrwt

Sticky bit получил свое название в ранних системах Linux до виртуальной памяти с постраничной загрузкой. Если был установлен Sticky bit исполняемого файла, то после выхода из программы копия его текстового сегмента сохранялась в области подкачки системы. Она, копия, «оставалась» для следующего использования. Эта функция использовалась для ускорения загрузки часто запускаемых программ. Теперь применяется только как защита файла от удаления другими пользователем

Все выше перечисленные примеры представлены в символьном виде, но они могут быть записаны и в числовом, с учётом синтаксиса, виде:

Пример 20
 число кто 
4 SUID
2 SGID 
1 sticky bit
Пример 21
 $ sudo chmod 4711  /usr/local/bin/update 
$ ls -l  /usr/local/bin/update
-rws--x--x

Пример 22
 $ sudo chmod 2755  /usr/local/bin/update
$ ls -l  /usr/local/bin/update
-rwxr-sr-x

Пример 23
 $ sudo chmod 1755  /usr/local/bin/update
$ ls -l  /usr/local/bin/update
-rwxr-xr-t

Пример 24
suid      sgid     sticky     mode digit
on         on       on      7
on         on        off      6
on         off      on      5
on         off      off      4
off   on        on      3
off      on       off      2
off      off      on      1
off      off      off      0
Комментарий
 В заключение этого раздела, ниже приведенны примеры  
испрльзования первой цифры числового режима разрешений
доступа для установки битов sticky, suid и sgid
Пример 25
$ mkdir dir
$ ls -ld dir
drwxr-xr-x
$ chmod 7755 dir
$ ls -ld dir
drwsrwsrwt
Пример 26
 $ mkdir dir
$ ls -ld dir
drwxr-xr-x
$ chmod 6755 dir
$ ls -ld dir
drwsr-sr-x
Пример 27
$ mkdir dir
$ ls -ld dir
drwxr-xr-x
$ chmod 5755 dir
$ ls -ld dir
drwsr-xr-t
Пример 28
$ mkdir dir
$ ls -ld dir
drwxr-xr-x
$ chmod 3755 dir
$ ls -ld dir
drwxr-sr-t
Пример 29
$ mkdir dir
$ ls -ld dir
drwxr-xr-x
$ chmod 0755 dir
$ ls -ld dir
drwxr-xr-x
Комментарий
 Пример 25 первая цифра 7
Пример 26 первая цифра 6
Пример 27 первая цифра 5
Пример 28 первая цифра 3
Пример 29 первая цифра 0
Остальные цифры см.Пример 21-23

Условие

В системе зарегистрированы два пользователя alex и eustace, пользователь alex управляет правами доступа к своим папкам и файлам, пользователь eustace пытается совершить вход в каталог alex, и выполнить доступные  для своего GID операции чтения, запись, создания, удаления, запуск файла в каталоге. Принятые обозначения: владелец $ alex; пользователь $ eustace], для оптимизации строк, некоторые  фрагменты кода опушены: дата, время, размер, количество ссылок и т.д...

Команды для работы:

$ ls 
-l подробный список
-x выстраивает по вертик.
-F / у каталогов
-a все файлы и скрытые
-al подробно все файлы и скрытые
-r обратный порядок
-t последние изменения
-R выводит подкаталоги
$ groups
$ sudo groupadd
$ sudo groupdel
$ getent group grp
# chown
$ chgrp
$ whoami
# chmod
$ umask
$ usermod
sudo groupmems -g grp -a user \\добавить в группу grp user
sudo groupmems -g grp -d user  \\удалить из группы grp user
sudo groupmems -g grp -l      \\список участников в группы grp
sudo groupmems -g grp -p user  \\очистить группу grp

Действия с каталогом.

 $ ls -la
drwx-----x .
drwxr-xr-x ..
$ sudo groupmems -g alex -l

 $ eustace] $ groups 
eustace
$ eustace] ls -la /home/alex
'/home/alex': Отказано в доступе


 Пример:владелец один в группе
Пример:пользователь не читает каталог 
 $ mkdir /home/alex/dir
$ touch /home/alex/dir/file
$ ls -la  /home/alex/dir
drwxr-xr-x    .
drwx-----x   ..
-rw-r--r--  file 
 $ eustace] ls -l /home/alex/dir 
-rw-r-r--   file




 Пример:владелец создал каталог и файл 
Пример:пользователь читает каталог
 $ chmod o-r dir
$ ls -la dir
drwxr-x--x  .
drwx-----x ..
-rw-r--r--  fil
 $ eustace] $ ls -la /home/alex/dir
'/home/alex/dir': Отказано в доступе



 Пример:владелец o-r dir
Пример:пользователь не читает dir

 $ chmod o+r-x dir
 $ ls -la dir
drwxr-xr--  .
drwx-----x  ..
-rw-r--r--  file


 $ eustace] ls -la /home/alex/dir
'/home/alex/dir/file': Отказано в доступе
'/home/alex/dir/.': Отказано в доступе
'/home/alex/dir/..': Отказано в доступе
d????????? ? ? ? ?            ? .
d????????? ? ? ? ?            ? ..
-????????? ? ? ? ?            ? file
 Пример:владелец o+r-x dir
Пример:пользователь не читает dir
 $ chmod o+w dir
$ ls -la dir
s -la dir
drwxr-xrw-  .
drwx-----x  ..
-rw-r--r--  file

 $ eustace] ls -la /home/alex/dir
': Отказано в доступе
': Отказано в доступе
': Отказано в доступе
d????????? ? ? ? ?   ? .
d????????? ? ? ? ?   ? ..
-????????? ? ? ? ?   ? file
 Пример:владелец o+w dir
Пример:пользователь не читает dir
 $ chmod o-r+x dir
$ ls -la dir
drwxr-x-wx  .
drwx-----x  ..
-rw-r--r--  file
 $ eustace] $ ls -la /home/alex/dir
': Отказано в доступе



 Пример:владелец o-r+x dir
Пример:пользователь не читает dir
 $ chmod o+r dir
$ ls -la dir
drwxr-xrwx   .
drwx-----x   ..
-rw-r--r--   alex alex file
$ ls -la dir
drwxr-xrwx  .
drwx-----x  ..
-rw-r--r--  1 alex alex file
-rw-r--r--  1 eustace eustace file1
$ vim /home/alex/dir/file1
Привет я Eustace
~/dir/file1" [только для чтения
$ eustace] ls -la /home/alex/dir
drwxr-xrwx  .
drwx-----x  ..
-rw-r--r--  alex alex file
$ eustace] $ vim /home/alex/dir/file
Привет я Alex
"/home/alex/dir/file" [только для чтения]
$ eustace] touch /home/alex/dir/file1
$ eustace] ls -la /home/alex/dir
drwxr-xrwx  .
drwx-----x  ..
-rw-r--r--  alex alex file
-rw-r--r--  eustace eustace file
 Пример:владелец o+r dir
Пример:пользователь читает dir
Пример:пользователь читает file
Пример:пользователь создаёт file1
Пример:владелец читает file1
 $ /home/alex 
$ sudo groupmems -g alex -l
$ sudo groupmems -g alex -a eustace
$ sudo groupmems -g alex -l
eustace
 $ eustace] groups 
eustace..
перелогин eustace
$ eustace] groups
eustace alex...
 Пример:владелец добавил в свою группу пользователя 
Пример:пользователь,после перелогин,проверил членство в группах
!перелогин - выход/вход в систему
 

 продолжение следуе...