Изменить владельца и права доступа на файлы и папки в Linux и *BSD системах
Представленная ниже информация будет полезная начинающим Linux и *BSD системным администраторам. По большому счету, в любой операционной системе, будь то Linux, Windows или FreeBSD, корректная работа приложений, сервисов и безопасность системы в целом напрямую зависит от прав доступа на файлы и папки. Используя ниже приведённые средства, можно решить практически 90% проблем, возникающих при настройке прав доступа.
Сменить владельца для всех папок и файлов. Для этих целей в Unix используется команда chown. Она обладает рядом параметров:
- Опции. Например, для того, чтобы изменения коснулись не только данной директории, но и всех поддиректорий, нужно применить команду рекурсивно, т.е. с параметром «-R».
- Владелец или группа владельцев («user:group» или «user»).
- Пути до папок / файлов, к которым нужно применить команду. Например, «/mnt/pool1/dts1/backup».
Таким образом, команда для смены смены владельца (и группы владельцев) для директорий и всех вложенных папок и фалов будет выглядеть так:
sudo chown -R user:group /home/user/dir/
Изменить права доступа на файл или папку в Linux и *BDS системах можно командой chmod. Стоит отметить, что в Unix имеются свои особенности в работе данной команды и принципа разделения прав. Так, кроме владельца файла или папки, можно настроить, какие операции может выполнять этот самый владелец и группа, а также все остальные пользователи. В Unix идёт разделение возможностей следующим способом — владелец, группа владельцев и другие. Также присутствует следующее разделение прав:
- Право на запуск файла (для папок — проход по директории).
- Право на изменение файла (создание и удаление файлов и папок в директории)
- Право на чтение файла (для папок — это право на просмотр содержимого директории)
Для удобства использования и запоминания, используется следующая кодировка:
- запуск — 1
- изменение — 2
- чтение — 4
Складывая данные цифровые обозначения мы получим набор прав, предоставляемый владельцу/группе/другим. Разберем данную информацию на примере:
Изменять файл имеет право только владелец, группа владельцев может читать, остальные — ничего не могут, соответственно команда будет такой:
chmod 640 /media/fileshare/file.txt
Создавать файлы в папке могут все, но видит их только владелец:
chmod 622 /media/fileshare/messages/
Чтобы все могли запускать какую-либо программу, но никто, кроме владельца, не мог её редактировать:
chmod 711 /media/share/exec
Для изменения прав на все вложенные файлы и папки (т.е. рекурсивно) используется опять же ключ «-R».
Выполняя данные операции, стоит понимать — изменять права на файлы и директории могут только администраторы и владелец этих папок и файлов.
Изменение прав только на файлы или только на папки — команда find. При этом файлы обозначаются как file (f), а директории, соответственно — d. Например:
chmod -R 775 $(find . -type d)
Содержание
- 1 Владение файлом.
- 2 Чтение прав доступа
- 3 Изменение владельца файла и прав доступа.
- 3.1 Числовой способ назначения режима доступа:
- 3.2 Символическое изменение режимов
Владение файлом.
Вот так, потихоньку, мы и подошли к понимаю модели владения файлами в операционной системе FreeBSD. Да и не только FreeBSD, всем операционным системам семейства UNIX присуща одна и та же структура принадлежности. Файл может принадлежать как пользователю, так и группе.
Чтение прав доступа
Для того, чтобы увидеть детали полномочий и владений для набора файлов воспользуемся командой ls с ключом -la (-l – ключ, дающий подробный листинг, -a для того, чтобы отобразить “скрытые” файлы, имена которых начинаются с точки).
Первая мысль после увиденного: “Что это?”. Хотя всё намного проще, чем кажется. Строка типа -rw-r–r– обозначает режим файла. Существует три модели прав владения файлом (каталогом): пользователь (user), группа (group) и другие (others). И три модели доступа: чтение (read), запись (write) и выполнение (execute).
Все эти позиции символов – это биты. По номерам.
- d, -. Означает “директория” и “файл” соответственно.
- r, -. Означает, может ли объект быть прочитан своим владельцем.
- w, -. Означает, может ли объект модифицироваться владельцем.
- x, -, s. Означает, может ли владелец выполнять этот файл, или (если “s”) может ли элемент выполняться в режиме setuid (об этом ниже).
- r, -. Может ли элемент быть прочитан членами той же группы, что и владелец.
- w, -. Может ли элемент быть модифицирован группой владельца.
- x, -, s. Может ли элемент выполняться группой владельца, либо выполняться в режиме setuid.
- r, -. Может ли элемент быть прочитан другим пользователем, отличным от владельца.
- w, -. Может ли элемент быть модифицирован другим пользователем, отличным от владельца.
- x, -, t. Может ли любой пользователь выполнять этот элемент, либо, (если “t”) элемент является “не поддающимся командам” (“sticky”) каталогом, в котором пользователь не может удалять файлы, если он им не владеет.
Таким образом комбинация:
drw-r–r– означает: директория, владелец может как читать, так и модифицировать, члены его группы могут только читать, любые другие пользователи могут только читать.
-rwxrwxrwx означает, что этот файл могут и читать и модифицировать абсолютно любые пользователи. И т.д.
Удобней всего представлять список прав в таком виде:
[d] [rwx], [rwx], [rwx], т.е. первый бит отдельно, а далее тройками для пользователя, группы и остальных соответственно.
Ну есть также общие правила:
Файл, который может быть удалён – можно и переименовать.
Файл, который можно прочитать – можно и скопировать.
Изменение владельца файла и прав доступа.
Будучи суперпользователем, мы можем отдавать свои файлы другим пользователям, либо менять владельца файла по своему усмотрению. Для этого служит команда chown (“change own”):
# chown user file1.txt
установит владельцем file1.txt пользователя user, но не сменит группу. Точно так же можно воспользоваться этой командой, чтобы сменить владельца у каталога:
# chown -R user /home/user
Минуточку. А что это за ключ -R? Мы о нём не говорили! Исправляюсь. Ключ -R означает рекурсивную обработку и применяется для каталогов. То есть для каждого файла в каталоге, для каждого подкаталога в каталоге и для файлов в них. И так далее. В общем применит команду для всех элементов внутри директории. Очень полезно :).
Аналогичным образом действует команда chgrp (“change group”):
# chgrp users file1.txt
изменит группу владельца на users. По умолчанию, FreeBSD создает для каждого пользователя персональную (первичную) группу с именем пользователя. Например пользователь “ivan” будет состоять в группу “ivan” и т.д.
И наконец – смена полномочий доступа. Команда chmod (“change mode”). Эта хитрая команда может работать двумя способами – численном и символическом. Какой удобней – решать вам, но знать лучше всего оба.
Числовой способ назначения режима доступа:
Самый простой способ – установить трёхразрядное восьмиричное число, которое уникально определяет полномочия для каждого типа владения. Каждый разряд относится к определённому режиму владения, соответственно для пользователя, группы и остальных. А биты таковы:
- 0 – нет полномочий;
- 1 – выполнение (поиск);
- 2 – запись;
- 4 – чтение;
Комбинация вычисляется соответственно суммой этих бит. Например 755 будет значить то же самое, что rwxr-xr-x. 777 – соответственно rwxrwxrwx, 644 – rw-r–r–и т.д. Схема понятна, надеюсь.
Таким образом может быть доступно только 3 из 4 разрядов. Четвёртый, “самый старший” разряд управляет дополнительными функциями. Биты сейчас и рассмотрим:
- 0. Обычные полномочия;
- 1. “sticky”-бит. Может быть установлен только для каталогов, превращая их в каталоги “только для добавления”, в которые файлы можно добавлять, но не удалять.
- 2. “setgid”, если этот бит установлен для исполняемого файла, то файл будет выполняться с групповыми полномочиями группы-владельца файла, а не того пользователя, кто запустил файл. Этот бит можно выставить только от имени суперпользователя.
- 4. “setuid”. Аналогично, если выставлен этот бит для исполняемого файла, то файл будет выполняться от имени владельца, независимо от того, кто запустил файл.
Таким образом назначение прав
# chmod 755 file.txt
на самом деле означает
# chmod 0755 file.txt, но старший бит можно опускать.
Символическое изменение режимов
Доступен второй способ, с указанием алфавитных флагов. Основные литеры:
- u (пользователь),
- g (группа),
- o (другие),
- a (все).
Права доступа:
- r (чтение),
- w (запись),
- x (исполнение),
- t (“липкий” бит),
- s (setuid, setgid биты).
Операции:
- + (добавление),
- – (отъем),
- = (установка)
Примеры здесь:
- g+w – добавляет полномочия на запись группе владельцу;
- +x – добавляет полномочия на исполнение для всех;
- o-r – отменяет полномочие на чтение остальным пользователям;
- ugo=rw – устанавливает для всех полномочия чтения-записи;
- a=rw – аналогично предыдущему;
Какой способ удобней – решать каждому. Но теперь мы знаем оба!
chown
chown — изменение владельца и группы на файлы и директории
chown [-fhv] [-R [-H | -L | -P]] владелец [:группа ] файл ... chown [-fhv] [-R [-H | -L | -P]] :группа файл ...
Программа изменяет владельца и/или группу файла или директории, то есть UserID и GroupID для указанного файла. Если не указана опция -h, символические ссылки переданные в качестве аргументов, не изменяются
Возможно использование следующих опций:
- -H
- Если установлена опция -R, следовать по ссылкам из командной строки. ( Ссылки найденные при обходе дерева каталогов не прослеживаются )
- -L
- Если опция -R установлена, следовать по всем символическим ссылкам.
- -P
- Если опция -R установлена, не следовать по ссылкам. Поведение по-умолчанию.
- -R
- Рекурсия. Изменить UserID и/или GroupID для всего дерева директорий и файлов начиная с указанной. Остерегайтесь совпадения с жесткой ссылкой на родительский каталог «..», при использовании шаблона «.*».
- -f
- Не сообщать о неудачной попытке изменить владельци и группу не менять код завершения операции, для сигнализирования о неудаче.
- -h
- Если файл является символической ссылкой, изменить UserID и/или GroupID только на саму ссылку.
- -v
Режим вывода сообщений о ходе выполнения программы. Если опция указана более одного раза, chown выведет имя файла вслед за старыми и новыми UserID/GroupID.
Опции -H, -L и -P, будут проигнорированы, если опция -R не установлена. Кроме того, все эти опции, переопределяет друг друга, и поведение команды chown, будет определятся опцией которая указана последней.
Опции владелец и группа не являются обязательными, но должна быть указана хотя-бы одна из них. Если указывается только группа, перед ней ставится знак : ( двоеточие ).
Параметр владелец файла, может быть представлен как в виде числового выражения UserID, так и в виде символического имени. Если имя пользователя совпадает с его UserID, операнд используется как «имя пользователя». То же самое относится к параметру группа.
Принадлежность файла может быть изменена только суперпользователем, по соображениям безопасности.
Программа chown возвращает 0 при удачном завершении и >0 в случае возникновения ошибки.
СМОТРИТЕ ТАКЖЕ
chgrp(1), find(1), chown(2), fts(3), symlink(7)
настройка и оптимизация серверов
Мое полугодовое интенсивное изучение freebsd подошло к концу. Понятно, что я не стал профессионалом в области nix систем (не пишу на Shell или Perl никаких скриптов), но наверное многое познал за последнее время. Самое печальное в этом всем, что через полгода я уже не буду помнить и половины того что помню сейчас. Юних как и Циска требует постоянного внимания к себе … Но по крайней мере уже не придется тупо смотреть в черный экран, как это было раньше. В качестве завершения хотелось бы еще раз опубликовать список основных команд по Юниху. Всем удачной работы.
Файлы и директории | |
cd /home | перейти в директорию ‘/home’ |
cd .. | перейти в директорию уровнем выше |
cd ../.. | перейти в директорию двумя уровнями выше |
cd | перейти в домашнюю директорию |
cd ~user | перейти в домашнюю директорию пользователя user |
cd — | перейти в директорию, в которой находились до перехода в текущую директорию |
pwd | показать текущюю директорию |
ls | отобразить содержимое текущей директории |
ls -F | отобразить содержимое текущей директории с добавлением к именам символов, храктеризующих тип |
ls -l | показать детализированое представление файлов и директорий в текущей директории |
ls -a | показать скрытые файлы и директории в текущей директории |
ls *[0-9]* | показать файлы и директории содержащие в имени цифры |
tree | показать дерево файлов и директорий, начиная от корня (/) |
lstree | |
mkdir dir1 | создать директорию с именем ‘dir1’ |
mkdir dir1 dir2 | создать две директории одновременно |
mkdir -p /tmp/dir1/dir2 | создать дерево директорий |
rm -f file1 | удалить файл с именем ‘file1’ |
rmdir dir1 | удалить директорию с именем ‘dir1’ |
rm -rf dir1 | удалить директорию с именем ‘dir1’ и рекурсивно всё её содержимое |
rm -rf dir1 dir2 | удалить две директории и рекурсивно их содержимое |
mv dir1 new_dir | переименовать или переместить файл или директорию |
cp file1 file2 | сопировать файл file1 в файл file2 |
cp dir/* . | копировать все файлы директории dir в текущую директорию |
cp -a /tmp/dir1 . | копировать директорию dir1 со всем содержимым в текущую директорию |
cp -a dir1 dir2 | копировать директорию dir1 в директорию dir2 |
ln -s file1 lnk1 | создать символическую ссылку на файл или директорию |
ln file1 lnk1 | создать «жёсткую» (физическую) ссылку на файл или директорию |
touch -t 0712250000 fileditest | модифицировать дату и время создания файла, при его отсутствии, создать файл с указанными датой и временем (YYMMDDhhmm) |
Поиск файлов | |
find / -name file1 | найти файлы и директории с именем file1. Поиск начать с корня (/) |
find / -user user1 | найти файл и директорию принадлежащие пользователю user1. Поиск начать с корня (/) |
find /home/user1 -name «*.bin» | Найти все файлы и директории, имена которых оканчиваются на ‘. bin’. Поиск начать с ‘/ home/user1’ |
find /usr/bin -type f -atime +100 | найти все файлы в ‘/usr/bin’, время последнего обращения к которым более 100 дней |
find /usr/bin -type f -mtime -10 | найти все файлы в ‘/usr/bin’, созданные или изменённые в течении последних 10 дней |
find / -name *.rpm -exec chmod 755 ‘{}’ ; | найти все фалы и директории, имена которых оканчиваются на ‘.rpm’, и изменить права доступа к ним |
find / -xdev -name «*.rpm» | найти все фалы и директории, имена которых оканчиваются на ‘.rpm’, игнорируя съёмные носители, такие как cdrom, floppy и т.п. |
locate «*.ps» | найти все файлы, сожержащие в имени ‘.ps’. Предварительно рекомендуется выполнить команду ‘updatedb’ |
whereis halt | показывает размещение бинарных файлов, исходных кодов и руководств, относящихся к файлу ‘halt’ |
which halt | отображает полный путь к файлу ‘halt’ |
Монтирование файловых систем | |
mount /dev/hda2 /mnt/hda2 | монтирует раздел ‘hda2’ в точку монтирования ‘/mnt/hda2’. Убедитесь в наличии директории-точки монтирования ‘/mnt/hda2’ |
umount /dev/hda2 | размонтирует раздел ‘hda2’. Перед выполнением, покиньте ‘/mnt/hda2’ |
fuser -km /mnt/hda2 | принудительное размонтирование раздела. Применяется в случае, когда раздел занят каким-либо пользователем |
umount -n /mnt/hda2 | выполнить размонитрование без занесения информации в /etc/mtab. Полезно когда файл имеет атрибуты «только чтение» или недостаточно места на диске |
mount /dev/fd0 /mnt/floppy | монтировать флоппи-диск |
mount /dev/cdrom /mnt/cdrom | монтировать CD или DVD |
mount /dev/hdc /mnt/cdrecorder | монтировать CD-R/CD-RW или DVD-R/DVD-RW(+-) |
mount -o loop file.iso /mnt/cdrom | смонтировать ISO-образ |
mount -t vfat /dev/hda5 /mnt/hda5 | монтировать файловую систему Windows FAT32 |
mount -t smbfs -o username=user,password=pass //winclient/share /mnt/share | монтировать сетевую файловую систему Windows (SMB/CIFS) |
mount -o bind /home/user/prg /var/ftp/user | «монтирует» директорию в директорию (binding). Доступна с версии ядра 2.4.0. Полезна, например, для предоставления содержимого пользовательской директории через ftp при работе ftp-сервера в «песочнице» (chroot), когда симлинки сделать невозможно. Выполнение данной команды сделает копию содержимого /home/user/prg в /var/ftp/user |
Дисковое пространство | |
df -h | отображает информацию о смонтированных разделах с отображением общего, доступного и используемого пространства(Прим.переводчика. ключ —h работает не во всех *nix системах) |
ls -lSr |more | выдаёт список файлов и директорий рекурсивно с сортировкой по возрастанию размера и позволяет осуществлять постраничный просмотр |
du -sh dir1 | подсчитывает и выводит размер, занимаемый директорией ‘dir1’ (Прим.переводчика. ключ —h работает не во всех *nix системах) |
du -sk * | sort -rn | отображает размер и имена файлов и директорий, с соритровкой по размеру |
rpm -q -a —qf ‘%10{SIZE}t%{NAME}n’ | sort -k1,1n | показывает размер используемого дискового пространства, занимаемое файлами rpm-пакета, с сортировкой по размеру (fedora, redhat и т.п.) |
dpkg-query -W -f=’${Installed-Size;10}t${Package}n’ | sort -k1,1n | показывает размер используемого дискового пространства, занимаемое файлами deb-пакета, с сортировкой по размеру (ubuntu, debian т. |
Пользователи и группы | |
groupadd group_name | создать новую группу с именем group_name |
groupdel group_name | удалить группу group_name |
groupmod -n new_group_name old_group_name | переименовать группу old_group_name в new_group_name |
useradd -c «Nome Cognome» -g admin -d /home/user1 -s /bin/bash user1 | создать пользователя user1, назначить ему в качестве домашнего каталога /home/user1, в качестве shell’а /bin/bash, включить его в группу admin и добавить комментарий Nome Cognome |
useradd user1 | создать пользователя user1 |
userdel -r user1 | удалить пользователя user1 и его домашний каталог |
usermod -c «User FTP» -g system -d /ftp/user1 -s /bin/nologin user1 | изменить атрибуты пользователя |
passwd | сменить пароль |
passwd user1 | сменить пароль пользователя user1 (только root) |
chage -E 2005-12-31 user1 | установить дату окончания действия учётной записи пользователя user1 |
pwck | проверить корректность системных файлов учётных записей. Проверяются файлы /etc/passwd и /etc/shadow |
grpck | проверяет корректность системных файлов учётных записей. Проверяется файл/etc/group |
newgrp [-] group_name | изменяет первичную группу текущего пользователя. Если указать «-«, ситуация будет идентичной той, в которой пользователь вышил из системы и снова вошёл. Если не указывать группу, первичная группа будет назначена из /etc/passwd |
Выставление/изменение полномочий на файлы | |
ls -lh | просмотр полномочий на файлы и директории в текущей директории |
ls /tmp | pr -T5 -W$COLUMNS | вывести содержимое директории /tmp и разделить вывод на пять колонок |
chmod ugo+rwx directory1 | добавить полномочия на директорию directory1 ugo(User Group Other)+rwx(Read Write eXecute) — всем полные права. Аналогичное можно сделать таким образом chmod 777 directory1 |
chmod go-rwx directory1 | отобрать у группы и всех остальных все полномочия на директорию directory1. |
chown user1 file1 | назначить владельцем файла file1 пользователя user1 |
chown -R user1 directory1 | назначить рекурсивно владельцем директории directory1 пользователя user1 |
chgrp group1 file1 | сменить группу-владельца файла file1 на group1 |
chown user1:group1 file1 | сменить владельца и группу владельца файла file1 |
find / -perm -u+s | найти, начиная от корня, все файлы с выставленным SUID |
chmod u+s /bin/binary_file | назначить SUID-бит файлу /bin/binary_file. Это даёт возможность любому пользователю запускать на выполнение файл с полномочиями владельца файла. |
chmod u-s /bin/binary_file | снять SUID-бит с файла /bin/binary_file. |
chmod g+s /home/public | назначить SGID-бит директории /home/public. |
chmod g-s /home/public | снять SGID-бит с директории /home/public. |
chmod o+t /home/public | назначить STIKY-бит директории /home/public. Позволяет удалять файлы только владельцам |
chmod o-t /home/public | снять STIKY-бит с директории /home/public |
Специальные атрибуты файлов | |
chattr +a file1 | позволить открывать файл на запись только в режиме добавления |
chattr +c file1 | позволяет ядру автоматически сжимать/разжимать содержимое файла. |
chattr +d file1 | указавет утилите dump игнорировать данный файл во время выполнения backup’а |
chattr +i file1 | делает файл недоступным для любых изменений: редактирование, удаление, перемещение, создание линков на него. |
chattr +s file1 | позволяет сделать удаление файла безопасным, т.е. выставленный атрибут s говорит о том, что при удалении файла, место, занимаемое файлом на диске заполняется нулями, что предотвращяет возможность восстановления данных. |
chattr +S file1 | указывает, что, при сохранении изменений, будет произведена синхронизация, как при выполнении команды sync |
chattr +u file1 | данный атрибут указывает, что при удалении файла содержимое его будет сохранено и при необходимости пользователь сможет его восстановить |
lsattr | показать атрибуты файлов |
Архивирование и сжатие файлов | |
bunzip2 file1.bz2 | разжимает файл ‘file1.gz’ |
gunzip file1.gz | |
gzip file1 | сжимает файл ‘file1’ |
bzip2 file1 | |
gzip -9 file1 | сжать файл file1 с максимальным сжатием |
rar a file1.rar test_file | создать rar-архив ‘file1.rar’ и включить в него файл test_file |
rar a file1.rar file1 file2 dir1 | создать rar-архив ‘file1.rar’ и включить в него file1, file2 и dir1 |
rar x file1.rar | распаковать rar-архив |
unrar x file1.rar | |
tar -cvf archive.tar file1 | создать tar-архив archive.tar, содержащий файл file1 |
tar -cvf archive.tar file1 file2 dir1 | создать tar-архив archive.tar, содержащий файл file1, file2 и dir1 |
tar -tf archive.tar | показать содержимое архива |
tar -xvf archive.tar | распаковать архив |
tar -xvf archive.tar -C /tmp | распаковать архив в /tmp |
tar -cvfj archive.tar.bz2 dir1 | создать архив и сжать его с помощью bzip2(Прим.переводчика. ключ —j работает не во всех *nix системах) |
tar -xvfj archive.tar.bz2 | разжать архив и распаковать его(Прим.переводчика. ключ —j работает не во всех *nix системах) |
tar -cvfz archive.tar.gz dir1 | создать архив и сжать его с помощью gzip |
tar -xvfz archive.tar.gz | разжать архив и распаковать его |
zip file1.zip file1 | создать сжатый zip-архив |
zip -r file1.zip file1 file2 dir1 | создать сжатый zip-архив и со включением в него нескольких файлов и/или директорий |
unzip file1.zip | разжать и распаковать zip-архив |
23.08.2011 —
Posted by |
linux and unix servers
Sorry, the comment form is closed at this time.
Сегодня хочется задеть одну очень скользкую тему: права (и обязанности) на файлы в системах, основанных на Unix.
Как всегда, хочется рассказать интересно и не упустить важные моменты. Но многим это просто не надо. Им нужен очередной stackoverflow с ответами, в которые не надо вдумываться… Вжух-вжух и ты ботнет.
Поэтому вот рецепты (tl;dr), а объяснение будет ниже.
Чтобы сменить владельца файлов в директории и во всех поддиректориях (рекурсивно), выполните:
sudo chown -R user:group /home/user/path/to/directory/
Например, чтобы apache смог в какой-то папке сохранять файлы, выполняем:
sudo chown -R www-data:www-data /home/user/www/site/upload/
Чтобы дать права на чтение файла для всех, выполните:
chmod o+r /var/www/index.html
Чтобы сделать это для всей папки и подпапок (рекурсивно):
chmod -R o+r /var/www/index.html
Чтобы для всех файлов в папке (рекурсивно) выставить права «владелец может читать и менять, остальные — только читать»:
find /var/www/html-site -type f -exec chmod 644 {} ;
Чтобы для папки и подпапок (рекурсивно) выставить права «владелец может просматривать содержимое и создавать файлы и папки, остальные — только просматривать»:
find /var/www/html-site -type d -exec chmod 755 {} ;
Чтобы проверить, что у пользователя есть права, самое простое — зайти под ним:
sudo su user_name
— прочитать файл / создать файл прямо под этим пользователем.
Ну и самое интересное, что я нашёл в популярных вопросах:
$ sudo chown -R user:group /data/ chown: неверный пользователь: «user:group»
— замените user на имя пользователя (не «Иван Иванович Иванов», а «ivanov»), а «:group» можно не указывать.
А на самом деле…
Файлы в Unix
Начнём с того, что файлы в Unix бывают разные. Идеология «всё есть файл» предполагает, что файлы — не то, чем кажутся.
- Обычный файл — как раз всё то, что мы называем файлом.
- Директория — она же «папка», она же «каталог».
- Символическая ссылка — этакий ярлык на другой «файл».
- Блочное устройство — те же жёсткие диски, флешки.
- Символьное устройство — например, терминалы tty.
- Канал (fifo) — один из вариантов межпроцессорного взаимодействия.
- Unix сокет — ещё один из вариантов межпроцессорного взаимодействия.
Так что даже с понятием «файл» не так уж и просто. Зато есть возможность на всех них единообразно раздавать права, пользоваться ими. Например, можно сделать cat на устройство, echo для записи в сеть и т. д.
Во FreeBSD я успешно делал cat на директорию, правда получал не особо читаемую информацию. Но и её можно было использовать для получения нужной информации о файле типа «каталог».
В особо весёлых Unix-ах, например Plan9 можно использовать вместо интерфейса сокетов файлы типа /net/tcp. В общем, как всегда идеология «всё есть что-то» не имеет границ здравого смысла. И это прекрасно!
Права в Unix
Здесь мы рассмотрим базовую модель прав в Unix (модель дискреционного управления доступом), без всяких расширений типа атрибутов файлов, эффективных прав и прочих липких битов.
Суть модели прав довольно проста:
- У каждого файла есть владелец. Владелец устанавливает права доступа на свои файлы (например, командой chmod).
- В системе есть супер-пользователь (root), который устанавливает владельцев файлов (например, командой chown).
Теперь подробнее по первому пункту.
Доступ по пользователям делится на 3 группы
- Владелец (user) — тот самый, что имеет возможность изменять права доступа.
- Группа (group) — какая-то группа пользователей, которая должна иметь определённые права на файл. Посмотреть группы пользователя можно командой
$ groups gosha gosha : gosha adm cdrom sudo dip plugdev lpadmin sambashare libvirtd
— пользователь gosha состоит в группах:
gosha adm cdrom sudo dip plugdev lpadmin sambashare libvirtd
.С другой стороны можно посмотреть всех пользователей, состоящих в группе:
$ grep cdrom /etc/group cdrom:x:24:gosha
Не самый элегантный способ, но работает на всех Unix. Также можно использовать утилиты
lid
иmembers
. - Все другие (other) — любой пользователь, существующий в системе.
Сами права доступа также делятся на 3 группы
- Права на чтения (read или «4» в битовой маске) — право читать файл или читать содержимое директории.
- Права на запись (write или «2» в битовой маске) — право писать в файл или создавать файлы в директории.
- Право на исполнение (execute или «1» в битовой маске) — право запускать файл (программу, записанную в файле) или переходить по директории вглубь (например, сделать cd в поддиреторию).
Битовая маска прав доступа
Давайте посмотрим права на папку /bin, например, с помощью команды ls -l / | grep bin
:
drwxr-xr-x 2 root root 4096 май 6 03:24 bin |||||||||| |||||||||+-исполнение для всех остальных - разрешено ||||||||+--запись для всех остальных - НЕ разрешено |||||||+---чтение для всех остальных - разрешено ||||||+----исполнение для группы владельца - разрешено |||||+-----запись для группы владельца - НЕ разрешено ||||+------чтение для группы владельца - разрешено |||+-------исполнение для владельца - разрешено ||+--------запись для владельца - разрешено |+---------чтение для владельца - разрешено +----------тип файла - диретория
Кроме указанного представления полномочий доступа (символьного), существует так же и числовое представление. Для общего понимания, приведу таблицу соответствия числового (двоичного и десятичного) значения прав доступа и буквенного:
владелец | группа | остальные | |
буквенное | rwx | r-x | r-x |
числовое (десятичное) | 421 | 401 | 401 |
итоговое (сумма) | 7 | 5 | 5 |
В приведенной таблице показано, что право чтения, соответствует значению 4, право записи — 2, право выполнения — 1, отсутствие права — 0, складывая данные показатели, можно представлять и назначать права в числовом виде. Таким образом, вместо drwxr-xr-x
можно написать 755
. Часто можно увидеть именно числовое определение прав доступа — теперь вы понимаете, что это значит.
Часто можно увидеть на файле права 644 — постарайтесь понять, что это значит, чтобы закрепить полученные знания.
Содержание
- Freebsd сменить владельца папки
- Как поменять.
- Владельца и группу.
- Права доступа (permissions)
- Флаги.
- Freebsd сменить владельца папки
- Несколько слов о «режиме безопасности».
- С какими правами файл «рождается»
- Владелец
- Группа
- Права доступа
- Как изменяются права доступа при копировании и перемещении файла.
- Как поменять.
- Команда chown
- Команда chgrp
- Права доступа (permissions)
- Флаги.
Freebsd сменить владельца папки
Как поменять.
Владельца и группу.
Во-первых, надо отметить — кто может поменять для файла (директории) владельца и группу.
Безусловно, это может сделать root.
Поменять владельца файла не может никто, кроме root’а.
А вот группу для файла может, также, поменять сам владелец файла, но только в том случае, если он сам является членом этой (новой) группы.
Для изменения владельца файла служит команда chown («change owner»). С ее помощью можно заодно заменить и группу, хотя для изменения этого атрибута есть специальная команда chgrp («change group»).
Подробно об этих командах можно прочитать в соответствующих man’уалах ( man chown и man chgrp ). Поэтому, рассмотрим только их краткое описание.
Команда chown выглядит очень просто если же вы хотите поменять не только владелец, но и группу, то
Кстати, никто не мешает указать в команде «старого» владельца, тогда изменится только группа.
Ну и, конечно, если вы хотите заменить владельца (группу) сразу на нескольких файлах, вместо имени файла можно указать подходящий «шаблон», например «*» (выполнить операцию для всех файлов в текущей директории).
Если же вы хотите, чтобы аналогичная операция была проделана не только в текущей директории, но и во всех «нижележащих» поддиректориях, вам поможет ключ -R (recursively).
заменит владельца на vasia , а группу на users для всех файлов и поддиректорий, находящихся в текущей директории и «ниже», то есть в самих поддиректориях.
Команда chgrp очень похожа не предыдущую, толко в качестве первого аргумента ей нужно указать название новой группы для файла (или файлов).
Естественно, все что было сказано о команде chown относительно выполнения ее над несколькими файлами и о ключе -R , также относится и к команде chgrp .
Права доступа (permissions)
Права доступа, кроме root’а может поменять также и владелец этого файла (директории). Кстати, обратите внимание, что хозяин файла может нечаянно установить такие биты доступа, что сам не сможет пользоваться этим файлом по назначению. Правда, никто не помешает ему же и исправить собственную ошибку.
Итак, для изменения прав доступа (permissions) служит команда chmod («change mode»). В целом эта команда выглядит как и предыдущие (которые меняют владельца и группу)
Но, в отличии от предыдущих команд, второй аргумент («что сделать») имеет несколько более сложный вид. В нем можно выделить три части
«категория юзеров» | «операция» | «биты прав доступа» |
---|---|---|
u (user) владелец g (group) группа o (other) все остальные a (all) все три категории |
— + = |
r w x s или t |
Как понятно из таблицы, первой задается категория юзеров (владелец, группа или «все остальные»). Причем, можно поставить сразу несколько букв, обозначив тем самым сразу несколько категорий. Например, go будет означать, что права меняются сразу и для группы и для «всех остальных». Если надо изменить права сразу для трех категорий, можно написать три буквы — ugo или одну букву a (все три категории).
Следом указывается «операция» (добавить права или наоборот — убрать). И, наконец, после «операции» один или несколько битов доступа, которые требуется изменить. Значение этих битов подробно рассматривалось выше, поэтому здесь не будем на них останавливаться.
Некоторых пояснений, наверное, требует «операция». Как можно догадаться, знаки «-» и «+» означают «убрать» или «поставить» соответствующие права.
А знак «=» означает сразу и то и другое. Дело в том, что если вы укажете, например o+x это будет означать — добавить бит x для категории «остальные», но никак не повлияет на биты r и w для этой же категории. А указав действие как o=rx , вы тем самым скажете системе — «установить биты r и x , и убрать бит w , если он там был».
Бит s имеет разный смысл ( suid или sgid ) в зависимости от того, в какой части permissions он находится. Поэтому, если вы хотите поставить именно suid бит, то «что сделать» должно выглядеть как u+s , а если вам нужен sgid , то — g+s . Sticky бит ставится командой chmod a+t . .
Как видите, синтаксис этой команды достаточно гибкий (хотя и несколько сложноватый). Кроме того, второй аргумент («что сделать») может состоять из нескольких «действий» перечисленных через запятую.
Например, можно задать команду
это будет означать — «для всех категорий права r-x , а для владельца еще и w (право записи)».
Кроме того, команда chmod (точнее — ее первый аргумент) имеет еще одну форму.
Поскольку, все биты доступа это действительно двоичные биты из одной ячейки, «продвинутый» пользователь может указать сразу число (в восьмеричном виде) которое должно получится после изменения прав.
Восьмеричное представление выбрано потому, что при переводе в него двоичного числа, каждая группа из трех бит «сворачивается» в одну цифру. Таким образом, вам надо просто указать три цифры, каждая из которых описывает отдельную категорию юзеров (точнее — права для этой категории). Например, permissions rwxr-xr-x можно представить в восьмеричном виде как 755 . И, следовательно, такие права могут быть выставлены командой
Что касается выполнения этой операций над несколькими файлами или «рекурсивного» обхода всех поддиректорий, здесь все так же, как для команд chown, chgrp . В качестве имени файла может быть задан «шаблон», а для обхода всех поддиректорий используйте ключ -R .
И, конечно, я советую все таки прочитать man chmod .
Флаги.
Кто может менять флаги (и какие) подробно описывалось в разделе о флагах.
Команда, которая их ставит/убирает — chflags («change flags»). Формат ее достаточно простой
Аргумент «флаги» — это название флага или нескольких флагов через запятую. Названия флагов описаны в разделе о флагах. Кроме того, эта команда понимает и сокращенные названия.
- sappend — sappnd
- uappend — uappnd
- sunlink — sunlnk
- uunlink — uunlnk
- simmutable — schange или schg
- uimmutable — uchange или uchg
- arcived — arch
- (флаг nodump не сокращается 🙂
Для того, чтобы убрать флаг, надо указать его название с префиксом no — nosappnd, nosunlnk, noschg и т.п.
Исключение составляет флаг nodump . Чтобы его убрать нужно сказать не nonodump , а просто dump . 🙂
Естественно, как и предыдущие команды chflag s может применяться к нескольким файлам и «рекурсивно» обходить поддиректории (ключ тот же — -R ).
Источник
Freebsd сменить владельца папки
Несколько слов о «режиме безопасности».
Дело в том, что в FreeBSD система может находится на разных «уровнях безопасности». Существует четыре уровня
- -1 — система безопасности выключена
- 0 — система безопасности включена, но никаких ограничений нет
- 1 — «режим безопасности», установлен ряд ограничений на работу с внешними устройствами и операции с флагами
- 2 — «повышенная безопасность», еще больше ограничений, чем на уровне 1.
Подробнее о том, в чем заключаются ограничения и как меняются «уровни безопасности», можно прочитать в man init (отмечу только, что «по умолчанию» система стартует с уровнем -1, то есть «безопасность» выключена).
Для нас в данный момент важно только, что на уровне 1 и 2, даже суперюзеру (root’у) запрещено снимать флаги sappend и simmutable.
Естественно, это делается не для того, чтобы «защитить» систему от собственного администратора. Он все равно, при желании, сможет убрать эти флаги (и удалить/изменить соответствующие файлы). Правда, для этого ему придется перезагрузить систему, причем с консоли.
А вот «взломщик», проникший в систему, даже если каким-то образом и получит root’овские права, не сможет изменить «жизненно важные файлы» (если, конечно, они защищены флагом simmutable) или «почистить логи» (если они защищены флагом sappend), чтобы «замести следы» своего пребывания в системе.
С какими правами файл «рождается»
На самом деле вопрос поставлен не совсем корректно.
Дело в том, что новый файл появляется в результате работы какой-либо программы. В то же время, в Unix существуют системные функции, которые позволяют менять владельца файла, группу и права доступа. Естественно, программа, порождающая файл может вызывать эти функции и таким образом создать файл с любыми атрибутами.
Поэтому, правильный ответ — «это зависит от программы, которая этот файл создает».
Однако, большинство программ этими функциями не пользуются, поэтому можно сказать, что «в большинстве случаев» атрибуты создаваемых файлов все таки подчиняются нескольким простым правилам.
Какие же у только что созданного файла будут владелец, группа и права доступа?
Владелец
Владелец файла определяется «эффективным userID» программы, которая его создает. Это означает, что в большинстве случаев владельцем файла будет тот юзер, который его создал (естественно, с помощью какой-нибудь программы). Если же программа «суидная», то есть во время выполнения имеет права того юзера, которой является владельцем этой программы, то, соответственно, все файлы, порожденные этой программой, будут принадлежать хозяину программы, а не юзеру, который ее запустил.
Кстати, если даже в программе используются системные функции, которые меняют владельца файла, они сработают только в том случае, если ее «эффективный userID» будет userID root. То есть, если ее запустит юзер root или она является «суидной» и ее владелец root.
Другими словами, какие бы программы не использовал рядовой юзер (если, конечно, они не «суидные») он может создать файлы владельцем которых будет только он. «Подарить» файл кому-нибудь другому обычный юзер не может.
Группа
Группа создаваемого файла в FreeBSD определяется немного необычно. Она всегда «наследуется» от директории, в которой этот файл создается. То есть файл будет иметь ту же группу, которую имеет директория.
Обратите внимание, что юзер, создающий файл, может даже не являться членом этой группы. Это, конечно, не очень хорошо с точки зрения безопасности системы. Дело в том, что если юзер создаст исполняемый файл и потом поставит на него бит sgid, то этот файл при выполнении получит права группы, в которую сам юзер не входит и, возможно, получит доступ к таким файлам, куда его в обычной ситуации «не подпускают».
Правда, в FreeBSD такая ситуация предусмотрена и система просто не даст юзеру поставить бит sgid на файл, если юзер не является членом группы, которая «приписана» к файлу.
В других разновидностях Unix группа файлу, обычно, присваивается та, которая является «первичной» группой юзера, создающего файл (то есть, та, которая записана в его бюджете). А для того, чтобы группа, как и в FreeBSD «наследовалась» от директории, на самой директории должен стоять бит sgid.
Права доступа
Права доступа, которые будут у «свежеиспеченного» файла определяются параметром umask. Он задает — какие биты прав доступа НЕ НАДО выставлять в permissions.
Если это параметр равен нулю, то у всех создаваемых файлов права доступа будут одинаковые для всех категорий и выглядеть как rw-rw-rw. Директории (созданные, например, командой mkdir) будут иметь права доступа rwxrwxrwx. Такие же права доступа получатся и у исполняемых файлов, которые создают различные трансляторы (они, естественно, ставят биты «исполняемости» на результат своей работы).
Параметр umask можно посмотреть или изменить «одноименной» командой umask. Команда umask без аргументов просто показывает текущее значение этого параметра. А для того, чтобы поменять его, надо этой команде в качестве аргумента указать число, которое система «развернет» в соответствующие биты.
Если каждую группу из трех бит (что соответствует отдельной категории в правах доступа) рассматривать как двоичное число, то «свернув» их по отдельности в десятичные цифры мы получим число из трех цифр, которое и отражает значение всех битов в permissions. Точнее, получается не десятичное, а восьмеричное представление прав доступа, но, если вы мало знакомы с восьмеричной системой счисления, то можете просто рассматривать это число как три отдельных десятичных цифры.
Еще раз напоминаю, что биты в umask отмечают — какие биты прав доступа НЕ надо ставить при создании файла. То есть, если вы хотите, чтобы у категории «все остальные» вообще не было никаких прав, а «группе допущенных» не ставился бит разрешающий запись, то umask должна выглядеть как 027.
В FreeBSD по умолчанию в командных файлах, которые выполняются при входе в систему, у всех юзеров (включая root) вставлена команда, которая задает umask равной 022. То есть отменяются только биты разрешения записи для группы и «всех остальных». Если вас это не устраивает, вы можете изменить аргумент в соответствующем файле (обычно это файлы .login или .profile в домашней директории юзера) или поменять параметр umask в любой момент «вручную».
Как изменяются права доступа при копировании и перемещении файла.
Этот вопрос на самом деле более сложный, чем может показаться. Дело в том, что ответ на него зависит от многих условий
- кто копирует (перемещает) файлы, root или обычный юзер
- какие программы, и с какими ключами при этом используются
- копируется файл «на пустое место» или там уже существует файл с таким именем
Тем не менее, опишем несколько общих правил, определяющих — какие права доступа могут получиться в результат.
Во-первых, при копировании (например, командой cp) создается новый файл. А при перемещении (например, командой mv) меняется только место расположения файла (и, возможно, имя).
Поэтому, если «рядовой юзер» копирует файл, то действуют все те же правила, что и при создании файла. То есть, владельцем копии становится юзер, который ее создал, группа «наследуется» от директории, а сами права доступа определяются параметром umask.
Строго говоря, если копирование делает root, то эти правила действуют и для него (то есть, владельцем полученной копии будет root, группа будет взята от директории, а права выставятся в соответствии с umask). Однако, root может изменить поведение команды cp. У этой команды есть ключ (-p — сохранять permissions) который означает, что надо сохранить все атрибуты (владельца, группу и permissions) при копировании.
Обычный же юзер, даже используя ключ -p не сможет сохранить владельца и группу, но получит permissions такие же, как у оригинального файла. К тому же биты suid и sgid при этом также «сбрасываются».
Существует еще одна ситуация, когда при копировании сохраняются все атрибуты доступа. Это происходит, когда в «месте назначения» файл с таким именем уже существует. Собственно, в этом случае файл не создается, а только замещается его содержимое. Поэтому, даже если эту операцию проделает обычный юзер (естественно, для этого надо, чтобы ему было разрешено писать в существующий файл), все атрибуты, в том числе владелец и группа сохранятся. Правда, биты suid и sgid все равно «сбросятся».
А вот при перемещении файла все атрибуты сохраняются (даже «опасные» биты suid и sgid). Однако, не забудьте, что для того, чтобы обычный юзер смог переместить чужой файл, он должен иметь право записи и в ту директорию, куда файл переносится и в ту, откуда он переносится (поскольку, там запись о файле должна быть удалена). Такие ситуации в нормальной системе, как правило, не встречаются.
Как поменять.
Владельца и группу.
Во-первых, надо отметить — кто может поменять для файла (директории) владельца и группу.
Безусловно, это может сделать root.
Поменять владельца файла не может никто, кроме root.
А вот группу для файла может, также, поменять сам владелец файла, но только в том случае, если он сам является членом этой (новой) группы.
Для изменения владельца файла служит команда chown («change owner»). С ее помощью можно заодно заменить и группу, хотя для изменения этого атрибута есть специальная команда chgrp («change group»).
Подробно об этих командах можно прочитать в соответствующих man-страницах (man chown и man chgrp). Поэтому, рассмотрим только их краткое описание.
Команда chown
Команда chown выглядит очень просто.
если же вы хотите поменять не только владельца, но и группу, то
Кстати, никто не мешает указать в команде «старого» владельца, тогда изменится только группа.
Ну и, конечно, если вы хотите заменить владельца (группу) сразу на нескольких файлах, вместо имени файла можно указать подходящий «шаблон», например «*» (выполнить операцию для всех файлов в текущей директории).
Если же вы хотите, чтобы аналогичная операция была проделана не только в текущей директории, но и во всех «нижележащих» поддиректориях, вам поможет ключ -R (recursively).
chown -R bob:users *
заменит владельца на bob, а группу на users для всех файлов и поддиректорий, находящихся в текущей директории и «ниже», то есть в самих поддиректориях.
Команда chgrp
Команда chgrp очень похожа на предыдущую, только в качестве первого аргумента ей нужно указать название новой группы для файла (или файлов).
Естественно, все, что было сказано о команде chown относительно выполнения ее над несколькими файлами и о ключе -R, также относится и к команде chgrp.
Права доступа (permissions)
Права доступа, кроме root может поменять также и владелец этого файла (директории). Кстати, обратите внимание, что хозяин файла может нечаянно установить такие биты доступа, что сам не сможет пользоваться этим файлом по назначению. Правда, никто не помешает ему же и исправить собственную ошибку.
Итак, для изменения прав доступа (permissions) служит команда chmod («change mode»). В целом эта команда выглядит, как и предыдущие (которые меняют владельца игруппу).
Но, в отличии от предыдущих команд, второй аргумент («что сделать») имеет несколько более сложный вид.
В нем можно выделить три части
Как понятно из таблицы, первой задается категория юзеров (владелец, группа или «все остальные»). Причем, можно поставить сразу несколько букв, обозначив тем самым сразу несколько категорий. Например, go будет означать, что права меняются сразу и для группы и для «всех остальных». Если надо изменить права сразу для трех категорий, можно написать три буквы — ugo или одну букву a (все три категории).
Следом указывается «операция» (добавить права или наоборот — убрать). И, наконец, после «операции» один или несколько битов доступа, которые требуется изменить. Значение этих битов подробно рассматривалось выше, поэтому здесь не будем на них останавливаться.
Некоторых пояснений, наверное, требует «операция». Как можно догадаться, знаки «-» и «+» означают «убрать» или «поставить» соответствующие права.
А знак «=» означает сразу и то и другое. Дело в том, что если вы укажете, например o+x это будет означать — добавить бит x для категории «остальные», но никак не повлияет на биты r и w для этой же категории. А указав действие как o=rx, вы тем самым скажете системе — «установить биты r и x, и убрать бит w, если он там был».
Бит s имеет разный смысл (suid или sgid) в зависимости от того, в какой части permissions он находится. Поэтому, если вы хотите поставить именно suid бит, то «что сделать» должно выглядеть как u+s, а если вам нужен sgid, то — g+s. Sticky бит ставится командой chmod a+t . .
Как видите, синтаксис этой команды достаточно гибкий (хотя и несколько усложненный). Кроме того, второй аргумент («что сделать») может состоять из нескольких «действий» перечисленных через запятую.
Например, можно задать команду
это будет означать — «для всех категорий права r-x, а для владельца еще и w (право записи)».
Кроме того, команда chmod (точнее — ее первый аргумент) имеет еще одну форму.
Поскольку, все биты доступа это действительно двоичные биты из одной ячейки, «продвинутый» пользователь может указать сразу число (в восьмеричном виде) которое должно получится после изменения прав.
Восьмеричное представление выбрано потому, что при переводе в него двоичного числа, каждая группа из трех бит «сворачивается» в одну цифру. Таким образом, вам надо просто указать три цифры, каждая из которых описывает отдельную категорию юзеров (точнее — права для этой категории). Например, permissions rwxr-xr-x можно представить в восьмеричном виде как 755. И, следовательно, такие права могут быть выставлены командой
Что касается выполнения этой операций над несколькими файлами или «рекурсивного» обхода всех поддиректорий, здесь все так же, как для команд chown, chgrp. В качестве имени файла может быть задан «шаблон», а для обхода всех поддиректорий используйте ключ -R.
И, конечно, обязательно прочтите man chmod.
Флаги.
Команда, которая ставит/убирает флаги — chflags («change flags»). Формат ее достаточно простой
Аргумент — это название флага или нескольких флагов через запятую. Названия флагов описаны в разделе о флагах. Кроме того, эта команда понимает и сокращенные названия.
Для того, чтобы убрать флаг, надо указать его название с префиксом no — nosappnd, nosunlnk, noschg и т.п.
Исключение составляет флаг nodump. Чтобы его убрать нужно сказать не nonodump, а просто dump.
Естественно, как и предыдущие команды chflags может применяться к нескольким файлам и «рекурсивно» обходить поддиректории (ключ тот же -R).
Источник