У меня в каталоге / tmp / есть 2 файла.
Первый - это пустой файл с именем «файл» с разрешением -rw-------
и владелец root:root
.
Второй файл называется "скрипт" и представляет собой простой сценарий Ruby с разрешением -rwsr-xr-x
и владелец root:root
. Содержимое файла сценария:
#!/usr/bin/env ruby
$-v = true
IO.write( File.join(Dir.pwd, 'file'), 100.times.map { rand(97..122).chr }.join << ?\n )
Файл "file" имеет то же разрешение, что и /etc/shadow
файл:
# ls -l /etc/shadow
-rw------- 1 root root 1045 Sep 22 04:13 /etc/shadow
# ls -l file
-rw------- 1 root root 6 Nov 29 12:22 file
Рубиновый скрипт "скрипт" имеет те же права, что и passwd
команда:
$ ls -l $(type -p passwd)
-rwsr-xr-x 1 root root 63624 Nov 13 22:28 /usr/bin/passwd
# ls -l script
-rwsr-xr-x 1 root root 78 Nov 29 12:22 script
Я могу бегать ./script
как root, который заменяет содержимое файла "file" некоторой случайной строкой.
Но когда я бегу ./script
как пользователь без полномочий root, Ruby поднимает Errno::EACCES
.
Могу ли я писать в корневой записываемый файл «file» как пользователь без полномочий root, правильно настроив разрешение SUID?
Вместо этого вы можете попробовать использовать список управления доступом (ACL). В приведенной ниже команде я (dmo) даю пользователю боб доступ для чтения / записи к файлу с именем тест:
$ setfacl -m u:bob:rw test
Сейчас ls
показывает +
подпишите в конце разрешений, чтобы указать, что для файла действует ACL.
$ ls -l
total 4
-rw-rw-r--+ 1 dmo dmo 0 Nov 29 07:22 test
Чтобы узнать, что позволяет использовать ACL getfacl
:
$ getfacl test
# file: test
# owner: dmo
# group: dmo
user::rw-
user:bob:rw-
group::rw-
mask::rw-
other::r--
Как вы видете боб теперь имеет доступ на запись, который ему нужен.
Если вы хотите удалить ACL, вы можете использовать setfacl --remove-all
:
$ setfacl --remove-all test
$ ls -l
total 0
-rw-rw-r--. 1 dmo dmo 0 Nov 29 07:22 test
Есть несколько хороших руководств по ACL, которые часто упускаются из виду: https://linuxconfig.org/how-to-manage-acls-on-linux
Наконец, будьте очень осторожны с тем, кому вы разрешаете писать в файлы, принадлежащие / читаемые корень пользователь.