Доступ к файлам в каталоге без x-разрешения?

19

У меня возникли проблемы с пониманием того, что означает разрешение на выполнение для каталогов. Правильно ли я понимаю, что что-либо в каталоге, для которого у пользователя нет x-прав, недоступно, даже если вещи внутри каталога дают определенные права пользователю?

Или пользователь все еще будет иметь прямой доступ к вещам в каталоге, но просто не сможет перечислить, что находится в каталоге?

(Что я действительно пытаюсь понять, так это то, насколько безопасен каталог от доступа других пользователей, если у них нет x-разрешения для него.)

Лео
источник

Ответы:

20

x бит для каталога также называется поисковым битом. На самом деле, он позволяет вам получить доступ к индексам файлов, перечисленных внутри папки. Так что если вы хотите получить доступ к /home/user/foo/bar.txt, то у вас должен быть доступ к поиску для каждого предка bar.txt

Цитирование со страницы

Поскольку каталоги не используются так же, как обычные файлы, разрешения работают немного (но только немного) по-разному. Попытка перечислить файлы в каталоге требует разрешения на чтение для каталога, но не для файлов внутри. Попытка добавить файл в каталог, удалить файл из каталога или переименовать файл - все требует разрешения на запись для каталога, но (что может быть удивительно) не для файлов внутри. Разрешение на выполнение не распространяется на каталоги (каталог также не может быть программой). Но этот бит разрешения повторно используется для каталогов для других целей.

Разрешение на выполнение требуется для каталога, чтобы иметь возможность CD в него (то есть, чтобы сделать некоторый каталог вашим текущим рабочим каталогом).

Выполнение необходимо в каталоге для доступа к информации об индексах файлов внутри. Это необходимо для поиска в каталоге для чтения инодов файлов внутри. По этой причине разрешение на выполнение в каталоге часто называется разрешением поиска.

Разрешение на поиск требуется во многих распространенных ситуациях. Рассмотрим команду cat / home / user / foo. Эта команда явно требует разрешения на чтение для файла foo. Но если у вас нет разрешения на поиск в каталогах /, / home и / home / user, cat не может найти индекс foo и, следовательно, не может его прочитать! Чтобы получить доступ к индексу любого файла (или каталога), вам необходимо разрешение на поиск в каждом каталоге предков, и вы не сможете прочитать файл, если не сможете добраться до его инода.

Пожалуйста, прочитайте больше в разделе каталога прав доступа к файлам.

Обновление: Лео поднял очень хороший вопрос. Если мы знаем индекс, то сможем ли мы получить доступ к файлу из каталога, если его бит x не установлен? Я считаю, что мы не должны быть в состоянии сделать это. Я не тестировал его с помощью программы, а использовал несколько удобных команд bash для подтверждения.

user@user-desktop:~/test$ ls -lart
total 12
drwxr-xr-x 49 user user 4096 2011-11-30 22:37 ..
drwxr-xr-x  3 user user 4096 2011-11-30 22:37 .
drwxr-xr-x  2 user user 4096 2011-11-30 22:38 level1
user@user-desktop:~/test$ ls -lart level1/
total 12
drwxr-xr-x 3 user user 4096 2011-11-30 22:37 ..
drwxr-xr-x 2 user user 4096 2011-11-30 22:38 .
-rw-r--r-- 1 user user    8 2011-11-30 22:38 file1
user@user-desktop:~/test$ stat level1
  File: `level1'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 808h/2056d  Inode: 95494       Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2011-11-30 22:46:16.576702105 +0530
Modify: 2011-11-30 22:38:12.386701913 +0530
Change: 2011-11-30 22:46:08.876702102 +0530
user@user-desktop:~/test$ stat level1/file1 
  File: `level1/file1'
  Size: 8           Blocks: 8          IO Block: 4096   regular file
Device: 808h/2056d  Inode: 60775       Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2011-11-30 22:38:19.846701917 +0530
Modify: 2011-11-30 22:38:16.366701915 +0530
Change: 2011-11-30 22:38:16.366701915 +0530
user@user-desktop:~/test$ chmod -x level1
user@user-desktop:~/test$ stat level1/file1 
stat: cannot stat `level1/file1': Permission denied
user@user-desktop:~/test$ ls -lart level1/
ls: cannot access level1/..: Permission denied
ls: cannot access level1/.: Permission denied
ls: cannot access level1/file1: Permission denied
total 0
-????????? ? ? ? ?                ? file1
d????????? ? ? ? ?                ? ..
d????????? ? ? ? ?                ? .
user@user-desktop:~/test$ cat level1/file1
cat: level1/file1: Permission denied
user@user-desktop:~/test$ find . -inum 95494
./level1
user@user-desktop:~/test$ find . -inum 60775
user@user-desktop:~/test$ find ./level -inum 60775
find: `./level': No such file or directory
user@user-desktop:~/test$ find ./level1 -inum 60775
Амей Джа
источник
2
Итак, если у меня есть номер индекса файла / каталога внутри каталога без прав поиска, я смогу получить к нему доступ, если его разрешения позволяют? (Хотя, я полагаю, получить номер инода без возможности сделать stat довольно сложно.)
Лев
@ Лео, я думаю, мы не должны этого делать. Я обновил ответ. Если у вас небольшая заглушка c, проверьте ее и дайте нам знать.
Амей Джа
1
@ AmeyJah, на самом деле, держу пари, ты можешь. Подумайте, что происходит, когда вы жестко связываете файл с другим каталогом, на который у вас есть разрешение. Тот же индекс, но вы можете прочитать его. Другими словами, разрешение на чтение не зависит от того, как система ищет все папки, к которым может принадлежать индекс, и проверяет, есть ли у них бит x. Отличный ответ, хотя. Большое спасибо.
user1477
@ AmeyJah ls , stat и т. Д. Используйте stat (2) и т. Д. На тот случай, если вы еще не знали. Я мог бы написать программу на C, но ваш тест делает все, что показала бы программа, хотя уверен, что он мог бы сделать больше, смысл тот же: он использует системные вызовы (раздел 2). Вызовы библиотеки (раздел 3) имеют более высокий уровень, чем системные вызовы, но это ничего не меняет (например, remove (3) использует rmdir (2) для каталогов и unlink (2) для файлов).
Прифтан
5

Так как вы просите каталоги:

чтение означает: прочитать содержимое, то есть перечислить их с помощью ls.

написать означает: написать в директора. т.е. создание файлов или подкаталогов.

выполнить означает: войти в этот каталог.

разрешения на чтение и выполнение могут быть немного сложнее для каталогов.

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

Если у вас есть разрешение на выполнение, но вы не можете читать, вы можете войти в него, но не можете перечислить файлы напрямую. Но, если вы знаете имена файлов или каталогов, вы можете перечислить их.

heartsmagic
источник
2
Если у вас есть разрешение на чтение, но вы не можете выполнить его, вы можете перечислить (ls) содержимое каталога, но не можете получить доступ (cat) к файлам в нем. Если у вас есть разрешение на выполнение, но вы не читаете и знаете имена файлов, вы можете получить к ним доступ (cat).
dash17291
2

Разрешение на выполнение для каталогов означает:

Возможность CD в этот каталог и доступ к файлам в этом каталоге.

Если у вас нет xправ на ваш каталог, вы не можете:

  • Введите в каталог (например: cd)
  • Невозможно получить доступ к любому файлу в этом каталоге (даже если вы знаете имя).

Пример:

$ ls -ld testdir
drw------- 2 xxxxxx xxxxxx 14 2011-11-29 19:38 testdir

$ cd testdir
bash: cd: testdir: Permission denied

$ cat testdir/a
cat: testdir/a: Permission denied

$ chmod 700 testdir
$ cat testdir/a
Some text.

Прочитайте Linux Permission Confusion pt 2 для хорошего введения в тему.

xКажется, единственное, что не мешает разрешению, - это доступ к именам файлов в этом каталоге.

Пример:

$ ls -ld testdir
drw------- 2 xxxxxx xxxxxx 14 2011-11-29 19:38 testdir

$ ls testdir
ls: cannot access testdir/a: Permission denied
ls: cannot access testdir/b: Permission denied
a  b
lgarzo
источник