Распределение прав доступа на файлы и каталоги в Линукс
Преамбулачитаем свежую ветку спора по поводу security в w8 :
у меня дома вин8 еще держится Но домашние чуть не поколотили за установку этой поделки вместо вин7. :) Чтобы открыть что-нибудь на внешнем диске надо у КАЖДОГО файла поменять права доступа. А если их несколько тысяч?! Поменять права на каталог так, чтобы и подкаталоги сменили права - ну никак не получается... Грязно ругается, что не может открыть какой-то контейнер. А вот поштучно, пожалуйста, все меняется...
О хосспади! Открываешь свойства всего фолдера, идешь в секьюрити, адвансед, в оунер, и прежде всего - меняешь оунершип на всех вложеных обьектах и субконтейнерах. После чего - меняешь права на стандартные, наследуемые. Или тупо фулл контрол юзерам этого компа. Если на попытке смены оунершипа будет ругаться - то либо ты не админ на этом компе, либо срочно чекдиском проверять внешний хард, либо эксплорер убит каким-то дерьмом, который юзеры обожают ставить на свой комп.
Это НЕ 8-ки вина! Это вина того кто эти файлы клепал с нестандартными правами! Я начинаю уважать Эппл за то что считают своих юзеров - баранами. И просто не дают без консоли лезть в то в чем не шаришь. Хотя у меня сильное подозрение, что наши и макОС запросто сломают.
>>Или тупо фулл контрол юзерам этого компа.
да-да, именно для этого микрософт разрабатывал навороченную систему безопасности. :)
А при чем здесь вообще безопасность? Это называется - права на доступ. Или кто-то свои личные фотки таки способом пытается "обезопасить"? Если кто-то умный создавал юзера Вася, и давал доступ к файлам только ему, а потом снес старую ОС и начисто поставил новую - то вместо Васи, в правах он увидит длинную фигню, старый SID. Потому что сгенерированный системой Вася - это уже совсем другой Вася. Вот это как раз к вопросу о безопасности.
Обратите внимание на win-нюанс:
"Потому что сгенерированный системой Вася - это уже совсем другой Вася"Резюме:
Не нужно создавать себе трудности, а затем их героически преодолевать.Допустим на винчестере при переинсталляции системы (а надо?) у вас есть туча файлов которые принадлежат пользователю, которого нет в системе, но они лежат в каталоге с абстрактным именем в абстрактном месте, представьте что их тысячи:
# ls -l ./
total 0
drwx------ 2 503 503 48 Янв 13 2009 Documents
drwx------ 2 503 503 48 Янв 13 2009 tmp
У вас имеется ровно два варианта, чтобы избежать виндовых трудностей:
$ man useradd
$ man usermod
Вариант второй: моделируем ситуацию с уже созданным пользователем, которого предварительно и создаём
# useradd -m -k /etc/skel -d /home/tt tester
# ls -la /home/tt
total 60
drwx-----x 9 tester tester 4096 Янв 24 21:41 .
drwxr-xr-x 7 root root 4096 Янв 24 21:41 ..
-rw------- 1 tester tester 24 Янв 24 21:41 .bash_logout
-rw------- 1 tester tester 182 Янв 24 21:41 .bash_profile
-rw------- 1 tester tester 124 Янв 24 21:41 .bashrc
drwx------ 2 tester tester 4096 Янв 24 21:41 .cache
drwx------ 2 tester tester 4096 Янв 24 21:41 .config
drwx------ 3 tester tester 4096 Янв 24 21:41 .kde4
drwx------ 3 tester tester 4096 Янв 24 21:41 .local
-rw------- 1 tester tester 17 Янв 24 21:41 .lpoptions
drwx------ 3 tester tester 4096 Янв 24 21:41 .mutt
-rw------- 1 tester tester 120 Янв 24 21:41 .rpmmacros
drwx------ 2 tester tester 4096 Янв 24 21:41 .ssh
-rwx------ 1 tester tester 240 Янв 24 21:41 .xprofile
drwx------ 2 tester tester 4096 Янв 24 21:41 .xsession.d
По-умолчанию, вновь регистрируемый в системе пользователь будет иметь на единицу больший ID, чем у последнего зарегистрированного.
Следующие три команды показывают что где произошло в системе
# id tester
uid=502(tester) gid=502(tester) groups=502(tester)
# getent passwd tester # эта команда просматривает файл /etc/passwd
tester:x:502:502::/home/tt:/bin/bash
# cat /etc/group|grep tester:
tester:x:502:
Поскольку этот пользователь с uid/gid=502 бывший владелец файлов (с uid/gid=503), намного логичнее сменить uid/gid пользователя, чем менять права у сотен тысяч файлов.
Что и сделаем:
# usermod -u 503 tester
# id tester
uid=503(tester) gid=502(tester) groups=502(tester)
# getent passwd tester
tester:x:503:502::/home/tt:/bin/bash
# cat /etc/group|grep tester:
tester:x:502:
# groupmod -g 503 tester
# id tester
uid=503(tester) gid=502 groups=502
# getent passwd tester
tester:x:503:502::/home/tt:/bin/bash
# cat /etc/group|grep tester:
tester:x:503:
# usermod -g 503 tester
# id tester
uid=503(tester) gid=503(tester) groups=503(tester)
# getent passwd tester
tester:x:503:503::/home/tt:/bin/bash
# cat /etc/group|grep tester:
tester:x:503:
Но в этом случае права на файлы домашнего каталога
# ls -la /home/tt
total 60
drwx-----x 9 tester 502 4096 Янв 24 21:41 .
drwxr-xr-x 7 root root 4096 Янв 24 21:41 ..
-rw------- 1 tester 502 24 Янв 24 21:41 .bash_logout
-rw------- 1 tester 502 182 Янв 24 21:41 .bash_profile
-rw------- 1 tester 502 124 Янв 24 21:41 .bashrc
drwx------ 2 tester 502 4096 Янв 24 21:41 .cache
drwx------ 2 tester 502 4096 Янв 24 21:41 .config
drwx------ 3 tester 502 4096 Янв 24 21:41 .kde4
drwx------ 3 tester 502 4096 Янв 24 21:41 .local
-rw------- 1 tester 502 17 Янв 24 21:41 .lpoptions
drwx------ 3 tester 502 4096 Янв 24 21:41 .mutt
-rw------- 1 tester 502 120 Янв 24 21:41 .rpmmacros
drwx------ 2 tester 502 4096 Янв 24 21:41 .ssh
-rwx------ 1 tester 502 240 Янв 24 21:41 .xprofile
drwx------ 2 tester 502 4096 Янв 24 21:41 .xsession.d
# ls -l /home/|grep tt
drwx-----x 9 tester 502 4096 Янв 24 21:41 tt
необходимо подкорректировать
# chown tester:tester -R /home/tt
# ls -la /home/tt
total 60
drwx-----x 9 tester tester 4096 Янв 24 21:41 .
drwxr-xr-x 7 root root 4096 Янв 24 21:41 ..
-rw------- 1 tester tester 24 Янв 24 21:41 .bash_logout
-rw------- 1 tester tester 182 Янв 24 21:41 .bash_profile
-rw------- 1 tester tester 124 Янв 24 21:41 .bashrc
drwx------ 2 tester tester 4096 Янв 24 21:41 .cache
drwx------ 2 tester tester 4096 Янв 24 21:41 .config
drwx------ 3 tester tester 4096 Янв 24 21:41 .kde4
drwx------ 3 tester tester 4096 Янв 24 21:41 .local
-rw------- 1 tester tester 17 Янв 24 21:41 .lpoptions
drwx------ 3 tester tester 4096 Янв 24 21:41 .mutt
-rw------- 1 tester tester 120 Янв 24 21:41 .rpmmacros
drwx------ 2 tester tester 4096 Янв 24 21:41 .ssh
-rwx------ 1 tester tester 240 Янв 24 21:41 .xprofile
drwx------ 2 tester tester 4096 Янв 24 21:41 .xsession.d
Зарегистрированных в системе пользователей стоит посмотреть
# cat /etc/passwd | grep -i -E ':50[0-9]' | cut -d: -f1
но лучше так, чтобы увидеть не только логин, но и uid/gid пользователей
# cat /etc/passwd | awk '/bash/{print}'
...
tester:x:503:503::/home/tt:/bin/bash
...
Теперь вычистим систему удалив предварительно пользователя
# userdel -r tester
(и каталоги /tmp, /tmp/.private от файлов пользователя)
и взглянем на другой вариант.
Вариант первый: свежепереустановленная система, на винчестере приватные файлы пользователя, пользователь в системе не зарегистрирован.
Напомним ситуацию
Файлы на винчестере существуют, пользователь в системе не зарегистрирован:
# ls -l ./
total 0
drwx------ 2 503 503 48 Янв 13 2009 Documents
drwx------ 2 503 503 48 Янв 13 2009 tmp
Зарегистрированные в системе пользователи:
# cat /etc/passwd | awk '/bash/{print}'
root:x:0:0:System Administrator:/root:/bin/bash
john:x:500:500::/home/john:/bin/bash
bob:x:501:501::/home/bob:/bin/bash
В этом случае ещё проще.
Создаём группу с gid=503 для будущего пользователя соответствующим правам файлов пользователя:
# groupadd -g 503 tester
Что и где произошло?
# getent passwd tester
#
# cat /etc/group|grep tester:
tester:x:503:
Создаём пользователя:
# useradd -u 503 -g 503 -m -k /etc/skel -d /home/tt tester
Просматриваем ситуацию:
# id tester
uid=503(tester) gid=503(tester) groups=503(tester)
# getent passwd tester
tester:x:503:503::/home/tt:/bin/bash
# cat /etc/group|grep tester:
tester:x:503:
# ls -la /home/tt
total 60
drwx-----x 9 tester tester 4096 Янв 25 18:49 .
drwxr-xr-x 7 root root 4096 Янв 25 18:49 ..
-rw------- 1 tester tester 24 Янв 25 18:49 .bash_logout
-rw------- 1 tester tester 182 Янв 25 18:49 .bash_profile
-rw------- 1 tester tester 124 Янв 25 18:49 .bashrc
drwx------ 2 tester tester 4096 Янв 25 18:49 .cache
drwx------ 2 tester tester 4096 Янв 25 18:49 .config
drwx------ 3 tester tester 4096 Янв 25 18:49 .kde4
drwx------ 3 tester tester 4096 Янв 25 18:49 .local
-rw------- 1 tester tester 17 Янв 25 18:49 .lpoptions
drwx------ 3 tester tester 4096 Янв 25 18:49 .mutt
-rw------- 1 tester tester 120 Янв 25 18:49 .rpmmacros
drwx------ 2 tester tester 4096 Янв 25 18:49 .ssh
-rwx------ 1 tester tester 240 Янв 25 18:49 .xprofile
drwx------ 2 tester tester 4096 Янв 25 18:49 .xsession.d
# cat /etc/passwd | awk '/bash/{print}'
root:x:0:0:System Administrator:/root:/bin/bash
john:x:500:500::/home/john:/bin/bash
bob:x:501:501::/home/bob:/bin/bash
tester:x:503:503::/home/tt:/bin/bash
Вновь созданный пользователь сразу же имеет возможность доступа к своим файлам на винчестере.
Гигантское количество команд и выводов теоретически не нужны, но они даны для того, чтобы сделать материал более воспринимаемым визуально. На практике всё это укладывается в две-пять команд в зависимости от ситуации.
Лирическое отступление.В варианте первом, который описан вторым, команда
# groupadd -g 503 tester
должна предварять команду
# useradd -u 503 -g 503 -m -k /etc/skel -d /home/tt tester
потому, что ключ -g, с указанием номера gid, в команде useradd добавляет пользователя только в уже существующую группу. Поэтому её необходимо предварительно создать.
Некоторый разбор полётов с командой
# useradd -u 503 -g 503 -G mail,audio,users -m -k /etc/skel -d /home/tt tester
-u 503
присваивает регистрируемому в системе пользователю номер ID.
-g 503
Номер группы.
Группа должна существовать.
-G mail,audio,users
Список групп в которых пользователь должен состоять и в которые будет добавлен.
Группы должны существовать.
-m
Ключ указывающий, что необходимо создать каталог пользователя.
-k /etc/skel
Ключ -k указывает откуда следует скопировать в домашний каталог пользователя минимально необходимые файлы профиля. Наличие ключа -m в комбинации с ключём -k обязательно.
Этот ключ может быть исключительно полезен, если необходимо создавать для нового пользователя кастомизированный профиль для пущего удобства.
Например используя кастомизацию bash:
Удобная работа в Bash (bash shell console)Заготовка этого профиля может лежать в любом месте. Лучше если он доступен только администатору или соадминистратору с делегированными ему правами доступа.
-d /home/tt
Имя домашнего каталога пользователя.
По-умолчанию, при отсутствии ключа и пути, имя домашнего каталога будет соответствовать имени логина пользователя.
Для нестандартных ситуаций очистки системы от файлов пользователя.
Где их найти?
С учётом, что ID пользователя 503, логин tester.
# cat /etc/group|grep tester
# cat /etc/passwd|grep tester
# ls -laF /tmp|grep 503
# ls -laF /tmp|grep tester
# ls -laF /tmp/.private/|grep tester
# ls -laF /etc/tcb/|grep tester
# ls -laF /var/mail/|grep tester
# ls -laF /home|grep tester
Фичи и трюки.Ещё одно свойство *nix-систем.
Допустим вы хотите попробовать Debian GNU/Linux параллельно с ALT Linux и при этом являться владельцем всех своих файлов на винчестере.
Учтите, что параметры UID_MIN/GID_MIN в ALT Linux равен 500, а в Debian и многих других Линукс он равен 1000.
В свойствах файлов принадлежность указывается не в виде имени пользователя, а в виде ID:
# ls -l ./
total 0
drwx------ 2 503 503 48 Янв 13 2009 Documents
drwx------ 2 503 503 48 Янв 13 2009 tmp
Соответственно, если в двух системах пользователь будет иметь одинаковые UID/GID, то в них обеих он будет являться владельцем всех своих локальных файлов.
Не уверен в том, что для двух разных Линукс использовать один домашний каталог хорошая идея, даже если и логин с паролем одинаковые в двух системах: из-за того, что расположение и настройки конфигурационных файлов могут различаться. Этот момент вы должны выяснить самостоятельно. Но в любом случае при одинаковых UID/GID вам ни что не мешает иметь два домашних каталога для разных систем для этого пользователя и являться владельцем всех своих локальных файлов.
На этот счёт будет интересен файл ALT Linux
# cat /etc/login.defs
в котором задаются диапазоны параметров ID используемых при регистрации нового пользователя
#
# Min/max values for automatic UID selection in useradd.
#
UID_MIN 500
UID_MAX 60000
#
# Min/max values for automatic GID selection in useradd and groupadd.
#
GID_MIN 500
GID_MAX 60000
В чём хитрость, вы наверное уже сообразили.
Но "ручное" задание UID/GID при регистрации нового пользователя на мой взгляд проще и более предсказуемо.
В общем это только идея, реализацию которой вы можете додумать по своему вкусу.
В общем и целом, это попытка показать, что в *nix-системах многие вопросы решаются проще, чем в ОС линейки Windows, а bash shell из страшной консоли может превратиться в мощный и удобный инструмент.