Понимание и применение специальных разрешений (SUID, SGID, бит сохранения)
На этом шаге вы изучите специальные разрешения в Linux: SUID (Set User ID), SGID (Set Group ID) и Sticky Bit. Эти разрешения обеспечивают расширенный контроль над выполнением файлов и поведением каталогов.
Специальные разрешения представлены дополнительной цифрой в восьмеричном режиме разрешений, размещенной перед стандартными тремя цифрами (владелец, группа, остальные).
- SUID (Set User ID):
- Восьмеричное значение: 4
- Влияние на файлы: Когда исполняемый файл с SUID запускается, он выполняется с разрешениями владельца файла, а не пользователя, который его запустил. Это обычно используется для программ, которым требуются повышенные привилегии для выполнения определенных задач, например, команда
passwd (которая должна записывать в /etc/shadow, файл, принадлежащий root).
- В выводе
ls -l: s отображается вместо x (выполнение) разрешения владельца. Если у владельца нет разрешения на выполнение, отображается заглавная буква S.
- SGID (Set Group ID):
- Восьмеричное значение: 2
- Влияние на файлы: Аналогично SUID, но исполняемый файл запускается с разрешениями владельца группы файла.
- Влияние на каталоги: Файлы и подкаталоги, созданные в каталоге с включенным SGID, наследуют принадлежность к группе этого каталога, а не основную группу пользователя, который их создал. Это очень полезно для общих каталогов, где все файлы должны принадлежать определенной группе.
- В выводе
ls -l: s отображается вместо x (выполнение) разрешения группы. Если у группы нет разрешения на выполнение, отображается заглавная буква S.
- Sticky Bit:
- Восьмеричное значение: 1
- Влияние на файлы: Не влияет.
- Влияние на каталоги: Пользователи могут создавать файлы в каталоге, но они могут удалять или переименовывать только файлы, которые им принадлежат. Это предотвращает удаление или перемещение пользователями файлов других пользователей в общем каталоге (например,
/tmp).
- В выводе
ls -l: t отображается вместо x (выполнение) разрешения для остальных. Если у остальных нет разрешения на выполнение, отображается заглавная буква T.
Давайте продемонстрируем эти специальные разрешения.
Пример SUID
Мы создадим простую программу на C, которая пытается прочитать ограниченный файл.
Сначала создайте файл, который может читать только root:
sudo touch ~/project/secret_data.txt
sudo chmod 600 ~/project/secret_data.txt
sudo chown root:root ~/project/secret_data.txt
Проверьте его разрешения:
ls -l ~/project/secret_data.txt
Вывод:
-rw------- 1 root root 0 Jun 6 17:36 /home/labex/project/secret_data.txt
Теперь создайте программу на C read_secret.c, которая пытается прочитать этот файл:
nano ~/project/read_secret.c
Вставьте следующий код в read_secret.c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
FILE *fp;
char buffer[256];
printf("Attempting to read /home/labex/project/secret_data.txt...\n");
fp = fopen("/home/labex/project/secret_data.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
printf("Successfully read file.\n");
return 0;
}
Сохраните и выйдите из nano (Ctrl+S, Ctrl+X).
Скомпилируйте программу:
gcc ~/project/read_secret.c -o ~/project/read_secret
Теперь попробуйте запустить ее от имени labex:
~/project/read_secret
Вы должны увидеть сообщение "Error opening file: Permission denied" (Ошибка открытия файла: Отказано в доступе), поскольку у labex нет доступа на чтение secret_data.txt.
Теперь давайте сделаем так, чтобы read_secret принадлежал root и установим бит SUID.
sudo chown root:root ~/project/read_secret
sudo chmod u+s ~/project/read_secret
Проверьте разрешения:
ls -l ~/project/read_secret
Вывод:
-rwsr-xr-x 1 root root 17704 Jun 6 01:02 /home/labex/project/read_secret
Обратите внимание на s в наборе разрешений владельца. Теперь запустите программу снова от имени labex:
~/project/read_secret
На этот раз она должна успешно прочитать файл (хотя он пуст, поэтому содержимое не будет напечатано, но сообщение "Successfully read file." указывает на успех). Это связано с тем, что бит SUID заставил программу работать с разрешениями root.
Пример SGID (в каталоге)
Давайте создадим общий каталог и новую группу.
sudo groupadd shared_group
sudo mkdir ~/project/shared_dir
sudo chown labex:shared_group ~/project/shared_dir
sudo chmod 770 ~/project/shared_dir
Теперь установите бит SGID в shared_dir:
sudo chmod g+s ~/project/shared_dir
Проверьте разрешения:
ls -ld ~/project/shared_dir
Вывод:
drwxrws--- 2 labex shared_group 6 Jun 6 01:02 /home/labex/project/shared_dir
Обратите внимание на s в наборе разрешений группы.
Теперь создайте файл внутри shared_dir:
touch ~/project/shared_dir/new_file.txt
Проверьте принадлежность new_file.txt:
ls -l ~/project/shared_dir/new_file.txt
Вывод:
-rw-r--r-- 1 labex shared_group 0 Jun 6 01:02 /home/labex/project/shared_dir/new_file.txt
Несмотря на то, что основная группа labex — labex, new_file.txt унаследовал принадлежность к группе shared_group от shared_dir из-за бита SGID.
Пример Sticky Bit
Каталог /tmp является классическим примером каталога с установленным sticky bit. Давайте создадим аналогичный каталог.
sudo mkdir ~/project/public_upload
sudo chmod 1777 ~/project/public_upload
1 в 1777 — это восьмеричное значение для sticky bit. 777 предоставляет полные разрешения владельцу, группе и остальным.
Проверьте разрешения:
ls -ld ~/project/public_upload
Вывод:
drwxrwxrwt 2 root root 6 Jun 6 01:02 /home/labex/project/public_upload
Обратите внимание на t в наборе разрешений для остальных.
Теперь давайте смоделируем, как другой пользователь создает файл в этом каталоге. Поскольку у нас есть только пользователь labex, мы создадим файл как labex, а затем попытаемся удалить его после изменения его владельца на root (имитируя другого пользователя).
Создайте файл как labex:
touch ~/project/public_upload/labex_file.txt
Измените его владельца на root:
sudo chown root:root ~/project/public_upload/labex_file.txt
Теперь попробуйте удалить labex_file.txt как labex:
rm ~/project/public_upload/labex_file.txt
Вы увидите запрос с вопросом, хотите ли вы удалить защищенный от записи файл, и после подтверждения с помощью y вы получите ошибку "Operation not permitted" (Операция не разрешена). Это связано с тем, что sticky bit не позволяет пользователям удалять файлы, которые им не принадлежат, в этом каталоге, даже если у labex есть разрешение на запись в каталог public_upload. Только root или владелец labex_file.txt (в данном случае root) могут удалить его.
Чтобы очистить, вам понадобится sudo, чтобы удалить labex_file.txt:
sudo rm ~/project/public_upload/labex_file.txt
Очистка
Удалите созданные файлы и каталоги, а также пользователя/группу:
sudo rm -f ~/project/secret_data.txt ~/project/read_secret.c ~/project/read_secret
sudo rm -rf ~/project/shared_dir ~/project/public_upload
sudo groupdel shared_group