Спробую пояснити поетапно на кількох прикладах.
Короткий фон
Кожен процес має свої «повноваження процесу» , який включає в себе такі атрибути , як 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 а також способи їх отримання в одній підводці .
На даний момент, прийміть той факт, що атрибути EUID
and 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
та повернеться до привілейованого рахунку.