Unix / Linux: різниця між реальним ідентифікатором користувача, ефективним ідентифікатором користувача та збереженим ідентифікатором користувача


102

Я вже знаю справжній ідентифікатор користувача . Це унікальний номер для користувача в системі.

У моїй системі My uidє

$ echo $UID
1014
$                 

Що означають інші два посвідчення особи?
І в чому користь ефективного ідентифікатора користувача та збереженого ідентифікатора користувача та де ми використовуємо його в системі?


FYI - існує також ідентифікатор користувача файлової системи, як зазначено на сторінці Вікіпедії: en.wikipedia.org/wiki/User_identifier
Віллем ван Кетвіч

Я думаю, що він не згадав про це, оскільки (з вашого посилання на wiki): "З ядра 2.0 існування fsuid більше не потрібне, оскільки Linux дотримується правил SUSv3 для передачі сигналів, але fsuid залишається з міркувань сумісності."
RtmY

Відповіді:


147

Розрізняють справжній і ефективний ідентифікатор користувача, оскільки вам може знадобитися тимчасово взяти особу іншого користувача (більшу частину часу це може бути root, але це може бути будь-який користувач). Якби у вас був лише один ідентифікатор користувача, тоді не було б можливості повернутися до початкового ідентифікатора користувача згодом (крім прийняття вашого слова як належного, і на випадок, якщо ви rootвикористовуєтеroot привілеї '', щоб змінити будь-якого користувача).

Отже, справжній ідентифікатор користувача - це хто ви насправді (той, кому належить процес), а ефективний ідентифікатор користувача - це те, на що дивиться операційна система для прийняття рішення, дозволено вам щось робити (більшу частину часу , є деякі винятки).

Коли ви входите в систему, оболонка входу встановлює як реальний, так і ефективний ідентифікатор користувача на одне і те ж значення (ваш справжній ідентифікатор користувача), що надається файлом пароля.

Зараз також трапляється так, що ви виконуєте програму setuid, і крім запуску в якості іншого користувача (наприклад root) програма setuid також повинна робити щось від вашого імені. Як це працює?
Після запуску програми setuid вона матиме ваш справжній ідентифікатор (оскільки ви є власником процесу) та ефективний ідентифікатор користувача власника файлу (наприклад root), оскільки вона є setuid.

Програма робить будь-яку магію, необхідну для здійснення привілеїв суперкористувача, а потім хоче зробити щось від вашого імені. Це означає, що спроба зробити щось, чого ви не могли б зробити, повинна зазнати невдачі . Як це робиться? Ну, очевидно, змінивши його ефективний ідентифікатор користувача на справжній ідентифікатор користувача!

Тепер ця програма setuid не може переключитися назад, оскільки все ядро ​​знає, що це ваш ідентифікатор і ... ваш ідентифікатор . Банг, ти мертвий.

Для цього призначений збережений ідентифікатор встановленого користувача.


6
Докладніше про останню думку щодо збереженого встановленого ідентифікатора користувача див. У Вікіпедії.
GDP2,

Чи можете ви вказати мені деякі показання, де я можу знайти, який виклик sys перевіряє Real uid замість цього? дякую
mik1904

1
@ mik1904: Найважливіший, який ви, ймовірно, будете використовувати, який справді перевіряє справжній UID access. Це 99,9% від цього. Також setfsuid(але рідко потрібні) і деякі функції дуже низького рівня, і вам потрібен (але не перевіряється) справжній ідентифікатор користувача для отримання / встановлення пріоритетів або планувальника, а також ідентифікатори, передані обробникам сигналів або повернуті waitта ін. є реальні ідентифікатори. execveне перевіряє, але може вийти з ладу, якщо ви змінили реальний ідентифікатор користувача. Також forkне перевіряє, але може вийти з ладу, якщо ви досягнете максимальної квоти процесу на реальному UID. Google with site:man7.org- ваш друг тут.
Деймон,

"команда ping повинна відкрити сокет, і ядро ​​Linux вимагає для цього root права". це насправді не точно. pingпотрібна сира розетка. будь-який користувач може (зазвичай) відкрити сокет, а для прослуховування - вище 1024.
Даніель Фаррелл,

38

Спробую пояснити поетапно на кількох прикладах.

Короткий фон

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



1
Чітка відповідь, за винятком останнього пункту SUID. Поплутали з привілейованими та привілейованими завданнями. Корисно, якщо наведено приклад. Дякую.
Упендра

2
Дуже точна відповідь. Дякую!!
user37416
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.