Як обійтися без прав root’а. Частина 2., Linux, Операційні системи, статті

Станіслав Лапшанскій

Правильна реалізація системи безпеки на основі груп допомагає різко зменшити необхідність у застосуванні пароля суперкористувача, однак, незважаючи на це, час від часу користувачам все ж необхідно виконувати команди з правами якогось іншого користувача (зазвичай це суперкористувач). Так як ви є системним адміністратором, вам часто доводиться стояти перед нелегким вибором, або постійно виконувати прохання ваших користувачів, або роздати всім бажаючим суперпользовательскій пароль. Утиліта sudo дозволить розрубати вам цей гордіїв вузол, надаючи третій, більш раціональний шлях. Втім, не слід забувати, що це досить тонка програма, що вимагає акуратності при її конфігуруванні. sudo безпосередньо інтегрована в OpenBSD, але з таким же успіхом може бути встановлена ​​майже в будь-якій версії UNIX в якості стороннього додатка.

Утиліта sudo є програмою-посередником з встановленим бітом setuid, що виконується з привілеями суперкористувача. Вона дозволяє встановити гнучкі правила доступу до програм, для запуску яких потрібні адміністративні повноваження. sudo отримує від користувача команду, потім порівнює її з внутрішнім списків дозволених команд. Якщо користувач має право на виконання поданої команди, sudo негайно її виконує. Оскільки суперкористувач може запускати програми від імені будь-якого користувача, sudo так само може виконувати команди від імені якого завгодно наперед заданого користувача.

При відповідній настройці, системний адміністратор може дозволити будь-якому користувачеві виконувати будь-які програми від імені будь-якого іншого користувача. sudo дуже потужна утиліта, з її допомогою можна дозволити або заборонити практично будь-який набір команд. Як результат такої гнучкості, документація sudo, відлякує новачків своєю складністю. Ми займемося конфігуруванням sudo, на рівні, якого цілком повинно вистачити для більшості користувачів, проте вам слід пам’ятати, що існує велика кількість різних додаткових параметрів конфігурування, які описані в керівництві sudo (8) і sudoers (5).

Переваги від використання sudo не обмежуються наданням чіткої системи розмежування доступу. Одним з найважливіших переваг є журнал роботи виконуються користувачами команд. Кожна команда виконується sudo, записується в журнал, що надзвичайно спрощує з’ясування того, хто, що і коли зраджував. Крім того, коли ви коректно налаштуєте sudo, ви нарешті зможете поміняти суперпользовательскій пароль і ніколи більше нікому його не давати. Більш того, якщо ви все правильно налаштуєте, то суперпользовательскій пароль взагалі нікому не буде потрібно. Скорочення кількості людей, які знають пароль суперкористувача веде до збільшення захищеності вашої системи. І нарешті, один і той же конфігураційний файл програми sudo може застосовуватися на всіх ваших серверах, тим самим значно скорочуючи тимчасові витрати на адміністрування системи.

Найбільш серйозним «недоліком» sudo є, надзвичайно негативне ставлення до неї користувачів і молодших адміністраторів. Так як люди традиційно користувалися суперпользовательскім паролем для виконання своїх дій, вони підозрюють, що при установці в систему sudo вони втратять деякі перш доступні їм можливості. Для подолання такого відношення до sudo, ви, в першу чергу повинні будете упевнитися, що користувачі з її допомогою зможуть виконувати свою роботу в повному обсязі. Якщо користувачі запевняють вас, що їм потрібно суперпользовательскій пароль для виконання інших завдань, то ви повинні просто розібратися хто і за що відповідає. Ймовірно такі користувачі брали на себе вирішення невластивих їм завдань, замість того, щоб потурбуватися ними вас.

Неправильна настройка sudo може привести до появи «дірок» в безпеці системи. Бездумне конфігурування може привести до того, що кмітливий користувач зможе «незаконно» отримати права суперкористувача. Ця проблема вирішується за допомогою уважного конфігурації і дотримання адміністративної політики.

Система sudo складається з трьох частин. По-перше, це сама програма sudo (8) – програма-посередник з встановленим setuid-бітом, з якою безпосередньо взаємодіють користувачі. По-друге це конфігураційний файл sudo / etc / sudoers. Цей файл містить таблицю прав доступу, в якій вказується кому і які команди дозволено запускати від імені якого користувача. Його структура повністю описана в керівництві man 5 sudoers. І нарешті команда visudo, яка дозволяє адміністраторам редагувати файл sudoers без ризику заблокувати собі вхід в систему. Ми розглянемо кожен компонент по черзі: visudo, sudoers і sudo.

Якщо файл sudoers має неправильний синтаксис, sudo просто не запуститься. Якщо ви понадієтеся на sudo (мається на увазі випадок, коли ви повністю відмовилися від використання суперпользовательского аккаунта «Забувши» його пароль – прим. перекладача), надасте через нього доступ до файлу sudoers і при цьому це файл зіпсуєте, то ви тим самим заблокуєте доступ до будь-яких дій вимагає прав суперкористувача і, до того ж, не зможете нічого виправити. Це погано. Програма visudo (8) покликана забезпечити певний захист від подібних ситуацій.

Подібно утиліті vipw (8), visudo (8) блокує редагований файл для того щоб в один момент часу його міг редагувати тільки одні осіб. visudo відкриває конфігураційний файл sudoers в редакторі (За умовчанням це редактор vi (1), проте така поведінка системи можна змінити, помінявши вміст змінної $ EDITOR). Коли ви залишаєте редактор, visudo перевіряє відредагований файл на наявність синтаксичних помилок, про які повідомляє користувачеві. Зрозуміло така перевірка не дає гарантії того, що конфігураційний файл буде таким як ви хочете, вона просто підтверджує його синтаксичну коректність. Наприклад утиліта visudo (8) не моргнувши оком візьме конфігураційний файл, в якому «ніхто за допомогою sudo зможе зробити« нічого », якщо цей файл має правильний синтаксис.

Якщо програма visudo знайде у відредагованому файлі помилку, вона видасть на термінал номер рядка в якій зустрілася помилка і запитає вас, що тепер робити:

# visudo
>>> sudoers file: syntax error, line 44 <<<
What now?

В даному випадку в 44 рядку ми допустили помилку. Є три варіанти дій: повернутися до редагування, вийти не зберігаючи зроблених змін або змусити visudo зберегти файл sudoers, незважаючи на знайдені помилки.

При натисканні клавіші «e», visudo поверне вас в режим редагування, де ви зможете спробувати виправити виявлену помилку.

Якщо натиснути на «x», visudo завершиться і поверне конфігураційний файл в стан, в якому він був до початку редагування. Зроблені вами зміни будуть втрачені, але можливо це саме те, що потрібно в такій ситуації, оскільки краще мати стару, але працюючу конфігурацію, ніж нову, але непрацездатну.

Клавіша «Q» змусить visudo прийняти зроблені зміни, незважаючи на знайдену помилку. Не забувайте, що якщо конфігураційний файл містить помилку, sudo не запуститься. Роблячи це, ви, по суті, на деякий час «вимикаєте» sudo, до тих пір, поки ви неотредактіруете конфігурацію під аккаунтом суперкористувача. У переважній більшості випадків це не те що вам потрібно.

Файл sudoers повідомляє sudo, хто може виконувати які команди і від якого користувача. OpenBSD зберігає файл sudoers в каталозі / etc, а FreeBSD в каталозі / usr / local / etc. Ніколи не редагуйте цей файл безпосередньо, навіть якщо ви впевнені, що точно знаєте, що саме ви хочете змінити. Завжди використовуйте visudo.

При першому конфігуруванні sudo вам може бути вам незрозумілий синтаксис таблиці прав доступу. Можливо, що відразу зробити все правильно вам не вдасться. Однак як тільки ви зрозумієте яким чином sudo встановлює ці правила, все стане легко і просто.

Різноманітні приклади файлів sudoers, які ви можете легко знайти в Інтернеті, часто бувають дуже складні і заплутані для розуміння, але в них можна побачити всі цікаві штучки які надає користувачеві sudo. Однак базовий синтаксис дуже простий. Кожен запис правил доступу у файлі sudoers має наступний формат:

username host = command

Де username це ім’я користувача, який може виконувати команду. Параметр host являє собою ім’я машини, для якої застосовується відповідне правило. Таким чином є можливість встановлювати правила для конкретної машини в мережі.

В поле command міститься список команд для яких застосовується дане правило. Ви повинні вказати повний шлях для кожної команди, або sudo не буде їх розпізнавати. (Ви ж не хочете, що б користувачі могли, просто помінявши змінну $ PATH, виконувати зовсім інші команди з тими ж іменами?)

Умовчання прийняті в sudo виключають випадковості. Для того що б дозволити користувачу виконувати певну команду, ви повинні написати для цього відповідне правило. Якщо хоча б одне з трьох полів не відповідатиме необхідному значенню, користувач не зможе нічого зробити.

Ви можете використовувати ключове слово «ALL» в будь-якому з трьох полів для вказівки значення відповідного «для всього». Наприклад, припустимо, що я повністю довіряю користувачеві chris і хочу дозволити йому виконувати абсолютно будь-яку команду від імені суперкористувача на будь-якій машині:

chris ALL = ALL

Проте давати молодшому адміністратору повний контроль над однією з моїх машин не дуже розумно. Як головний адміністратор, я повинен знати, які команди знадобляться Крісу для виконання його роботи. Припустимо, що Кріс адмініструє DNS-сервер. До файлів, що описує зони сервера імен, доступ обмежується за допомогою груп, але вони не зможуть нам допомогти, коли знадобиться стартувати, перезапустити або зупинити сервер. Ось як я дав йому права на запуск програми контролюючої демона DNS-сервера:

chris ALL = /usr/sbin/ndc

Якщо я поширю цей файл на кілька машин, є висока ймовірність, що далеко не на всіх з них виявиться сервер імен. Ось так я обмежую коло машин, на яких Кріс зможе запускати керуючу програму, одним комп’ютером з ім’ям «dns1»:

chris dns1 = /usr/bin/ndc

З іншого боку, Кріс є ще й адміністратором машини поштового сервера «mail». Він повністю відповідає за цей сервер, і, тому може виконувати на ньому будь-які команди, як йому заманеться. Я можу встановити для нього зовсім інші права доступу до поштового сервера і, незважаючи на це, використовувати один і той же файл sudoers на обох машинах:

chris dns1 = /usr/bin/ndc
chris mail = ALL

Для того що б вказати кілька значень в одному полі, їх можна розділяти комами. Ось як можна вирішити Крісу монтувати гнучкий диск за допомогою команди mount (8) і одночасно дозволити управління сервером імен:

chris dns1 = /usr/bin/ndc, /bin/mount

У файлі sudoers, ви можете вказати sudo, що їй необхідно виконувати певні команди від користувача відмінного від root. Для цього вставте ім’я потрібного користувача в дужках перед командою. Припустимо, що наш сервер імен виконується не від імені суперкористувача, а від імені користувача «named» і всі команди для управління ним повинні запускатися від імені цього користувача.

chris dns1 = (named) /usr/bin/ndc

Кожен запис в файлі / etc / sudoers повинна займати один рядок. У зв’язку з цим рядки можуть бути непомірно довгим. В такому випадку ви можете перенести рядок на іншу скориставшись символом «\» в кінці рядки:
chris server1 = /sbin/fdisk,/sbin/fsck,/sbin/kldload, \
/sbin/newfs,/sbin/newfs_msdos,/sbin/mount

Тепер, коли ви ознайомилися, як задаються правила доступу, давайте подивимось, як використовувати sudo. Скористайтеся visudo, і дозвольте свого аккаунту виконувати будь-яку команду. (Якщо ви змогли встановити sudo, значить ви вже володієте правами суперкористувача і, тому те, що ви дали свого аккаунту необмежені привілеї, не буде дірою в безпеці).

При запуску sudo, по-перше вона запитає вас пароль. Введіть пароль свого облікового запису (не пароль суперкористувача). Якщо ви неправильно введете пароль, sudo образить ваші розумові здібності чи родовід, і запропонує ввести пароль ще раз. Після третього разу, sudo відв’яжеться від вас. Якщо ви хочете спробувати ще, запустіть sudo знову.

Як тільки ви введете правильний пароль, sudo засіче час. Якщо ви спробуєте запустити sudo протягом наступних п’яти хвилин, вона не буде запитувати пароль. Після закінчення п’яти хвилин, пароль доведеться вводити як звичайно. Це робить життя простішим у випадку, якщо вам необхідно виконати відразу кілька команд за допомогою sudo, проте пам’ятайте, що якщо ви відлучитися від комп’ютера п’ять хвилин пройдуть достатньо швидко.

Якщо ви простий користувач і на вашій машині встановлена ​​sudo, то досить імовірно, що вам буде цікавий список команд, які системний адміністратор визнав допустимими для виконання вами за допомогою sudo. Для виведення цього списку вам знадобиться ключ «-l»:

# sudo -l
Password:
User mwlucas may run the following commands on this host:
(root) ALL
#

Якщо у вас більш серйозні обмеження ніж у мене, всі вони будуть виведені на екран.

Для того що б виконати команду за допомогою sudo, просто поставте перед нею слово «sudo». Наприклад, ось як можна виконати команду su за допомогою sudo:

# sudo su
Password:
#

Використання sudo для доступу до облікового запису суперкористувача дозволяє головному адміністратору надійно зберігати суперпользовательскій пароль. Однак це не завжди корисно, оскільки молодші адміністратори при наявності необмеженого sudo-доступу можуть поміняти пароль суперкористувача. У теж час це гарний початок для збільшення безпеки системи та застосування sudo для виконання всіх команд.

За допомогою sudo ви, так само можете запускати і більш складні команди передаючи їм всі необхідні аргументи. Наприклад, команда «tail-f» прекрасно підходить для перегляду останніх повідомлень у файлі журналу, крім того, нові записи будуть з’являтися на екрані по мірі їх появи у файлі журналу. Перегляд деяких файлів журналів доступний тільки для суперкористувача. Журнал програми sudo є відмінною кандидатурою на таку роль. Напевно ви хочете мати можливість перегляду журналів без необхідності входити під аккаунтом суперкористувача.

# sudo tail -f /var/log/authlog
openbsd/usr/src/usr.bin/sudo;sudo tail -f /var/log/secure
Jul 29 13:24:19 openbsd sudo: mwlucas : TTY=ttyp0 ;
PWD=/home/mwlucas ; USER=root ; COMMAND=list
Jul 29 13:30:03 openbsd sudo: mwlucas : TTY=ttyp0 ;
PWD=/home/mwlucas ; USER=root ;
COMMAND=/usr/bin/tail -f /var/log/authlog

Якщо ви володієте достатніми правами, то ви зможете запускати програми не тільки від імені суперкористувача, а й від імені будь-якого іншого користувача. Припустимо, наприклад, що у нас є сервер баз даних, для роботи з яким команди треба віддавати від імені користувача під яким виконується цей сервер. Ви можете вказати необхідного користувача в ключі «-u». Наприклад оператор бази даних має привілеї для виконання програми dump, використовуваної для резервного копіювання:

# sudo -u operator dump /dev/sd0s1

Все це чудово, але як проконтролювати використання sudo?

Повідомлення від sudo журналіруются на джерело LOCAL2. Кожне повідомлення містить час його запису, ім’я користувача, каталог, де запускалася sudo і команду, яка була виконана.

Jul 29 11:21:02 openbsd sudo: chris : TTY=ttyp0 ;
PWD=/home/chris ; USER=root ;
COMMAND=/sbin/mount /dev/fd0 /mnt

При гіршому варіанті розвитку подій (якщо в системі щось порушиться), ви зможете відстежити, що відбувалося. Наприклад, якщо одна з моїх машин не може коректно перезавантажитися через те, що файл / etc / rc.conf зіпсований або відсутній, я можу перевірити журнал sudo на предмет операцій з цим файлом:

Jul 29 11:34:56 openbsd sudo: chris : TTY=ttyp0 ;
PWD=/home/chris ; USER=root ;
COMMAND=/bin/rm /etc/rc.conf

Якщо хто-небудь для запуску команд, скористався б командою «su» або навіть «sudo su» замість «sudo», я не зміг би побачити що призвело до збою системи. З журналами sudo я завжди можу з’ясувати хто винен, як тільки доберуся до комп’ютера. Тільки через одного цього sudo варто встановити!

Наступного разу я розповім про більш складних і цікавих опціях конфігурації команди sudo, а так само про поширені помилки чекають новачків.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*