Спробую пояснити поетапно на кількох прикладах.
Короткий фон
Кожен процес має свої «повноваження процесу» , який включає в себе такі атрибути , як PID, в PPID, PGID, session IDа також реальні і ефективних ідентифікатори користувачів і груп:
RUID, EUID, RGID, EGID.
Ми зупинимося на них.
Частина 1: Розуміння UID та GID
Тепер я увійду в оболонку зі своїми обліковими даними і запущу:
$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash
Ви можете побачити моє ім'я журналу (rotem), UID та GID, які мають значення 1000, а також інші деталі, такі як оболонка, в яку я ввійшов.
Частина 2: Розуміння RUID та RGID
Кожен процес має власника і належить до групи .
У нашій оболонці кожен процес, який ми тепер будемо запускати, успадковуватиме привілеї мого облікового запису користувача і працюватиме з однаковими UID та GID.
Давайте запустимо просту команду, щоб перевірити це:
$ sleep 10 & ps aux | grep 'sleep'
І перевірте наявність UID та GID процесу:
$ stat -c "%u %g" /proc/$pid/
1000 1000
Це справжній ідентифікатор користувача ( RUID) та реальний ідентифікатор групи (RGID ) процесу .
(*) Перевірте інші опції, щоб переглянути UID та GID а також способи їх отримання в одній підводці .
На даний момент, прийміть той факт, що атрибути EUIDand EGIDє "зайвими" і просто дорівнюєRUID і RGIDза лаштунками.
Частина 3: Розуміння EUID та EGID
Візьмемо ping команду як приклад.
Знайдіть двійкове розташування за допомогою whichкоманди, після чого запустіть ls -la:
-rwsr-xr-x 1 root root 64424 Mar 10 2017 ping
Ви можете бачити, що власник і група файлів є root. Це тому, що pingкоманда повинна відкрити сокет, і ядро Linux вимагає rootдля цього привілеїв.
Але як я можу використовувати, pingякщо я не маю rootпривілеїв?
Зверніть увагу на букву "s" замість "x" у частині власника дозволу на файл.
Це спеціальний біт дозволу для певних двійкових виконуваних файлів (таких як pingіsudo ), який відомий як setuid .
Це де EUIDі EGIDвступає в гру.
Що трапиться, коли УИП довічного , як pingвиконується, процес змінює свій ефективний ідентифікатор користувача ( EUID) від значення за замовчуванням RUIDдля власника цього спеціального двійкового виконуваного файлу , який в даному випадку -root .
Все це робиться простим фактом, що цей файл має setuidбіт.
Ядро приймає рішення, чи має цей процес привілей, дивлячись на EUIDпроцес. Оскільки тепер EUIDвказує на root, операція не буде відхилена ядром.
Зверніть увагу : В останніх випусках Linux результати pingкоманди виглядатимуть інакше через те, що вони застосували підхід Linux Capabilities замість цього підходу setuid - для тих, хто не знайомий - читайте тут .
Частина 4: А як щодо SUID та SGID?
Збережений ідентифікатор користувача ( SUID) використовується, коли запущений привілейований процес (як, rootнаприклад), і йому потрібно виконати деякі непривілейовані завдання.
У цьому випадку ефективний UID ( EUID) від раніше буде збережено всередині, SUIDа потім змінено на непривілейоване завдання. Коли непривілейоване завдання буде виконано, значення EUIDбуде вилучено зі значення SUIDта повернеться до привілейованого рахунку.