Чи безпечно хаун `/ usr / local`?


15

Я знаю, що /usr/localтаке - встановлення програмного забезпечення для локальної машини. За замовчуванням rootволодіє каталогом. Це означає, що для встановлення там потрібно використовувати sudo. Для однокористувацької або розробницької машини це здається непотрібним додатковим використанням команди. Отже, моє запитання - чи безпечно це для мене володіти /usr/local?

Наприклад, Homebrew для OS X "Просто працює", оскільки вони володіють /usr/localі безпечно встановлюють там своє програмне забезпечення без використання sudo.

Крім того, якщо у вас встановлено локальне програмне забезпечення, для /usr/localцього програмне забезпечення потребує root, щоб змінити себе або встановити плагіни. Це здається небезпечним - я хочу використовувати лише sudoтоді, коли я точно знаю, що станеться.

Думки?

Відповіді:


5

Я не можу рекомендувати стати власником /usr/local; для більшості ситуацій це, мабуть, менш безпечно, ніж використання sudo.

Ваше запитання передбачає дві причини, які ви можете захотіти chown /usr/local.

Перший - уникати необхідності використовувати sudoдля встановлення програмного забезпечення. Деякі з них (наприклад, автор цієї відповіді ) можуть прочитати, що ви хочете ефективно працювати, або зберегти натискання клавіш, необхідні для введення sudoта введення пароля. Але, ймовірно, коли ви говорите "непотрібне", ви посилаєтесь на принцип найменшої пільги :

За замовчуванням rootволодіє каталогом. Це означає, що для встановлення там потрібно використовувати sudo. Для однокористувацької або розробницької машини це здається непотрібним додатковим використанням команди

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

Більшість програмних файлів, встановлених в системі Ubuntu, мають режим файлу 755 або символічно rwxr-xr-x, що означає, що будь-який користувач або програма може їх виконувати , але лише власник файлів, root, може змінювати їх. (Технічно це також вимагає, щоб ніхто, крім root, не мав wдозволу на каталог, який їх містить, тому інші користувачі не можуть їх видаляти або переміщувати.)

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

Якщо ви chown /usr/local, будь-яка програма, що працює з вашими привілеями, може записати туди файли, які пізніше можуть бути виконані як root з якоїсь причини, наприклад, замінивши іншу команду з тим же ім'ям. /usr/local/binє за замовчуванням $PATH, і в sudo's secure_path, і це перебуває перед іншими місцями в обох. Тож якщо у мене є два виконувані файли

/usr/local/bin/chown
/bin/chown

коли я виконую sudo chown ..., в виконуватиметься .chown/usr/local/bin

Але ви, напевно, вже все це знали, оскільки ваша друга причина полягає у безпеці:

Крім того, якщо у вас встановлено локальне програмне забезпечення, для /usr/localцього програмне забезпечення потребує root, щоб змінити себе або встановити плагіни. Це здається небезпечним - я хочу використовувати лише sudoтоді, коли я точно знаю, що станеться.

На всякий випадок, якщо це потрібно згадати тут, абсолютно правильно (згідно з FHS у будь-якому випадку) встановлювати локально складене програмне забезпечення /usr/local, але компіляцію слід робити десь у вашому $HOME, без sudo, до останнього кроку, коли ви вводите sudo make installабо еквівалент.

Я думаю, ви припускаєте, що запустивши програму, встановлену в /usr/localякості її непривілейованого власника, ви можете використовувати конкретні помилки дозволу, викинуті, коли він намагається оновити себе, щоб побачити, що він намагається змінити місце розташування іншої файлової системи, яке не належить вам, не хочете, щоб ви могли зупинити це від цього.

Це може бути корисним. Це означає, що ви довіряєте програмі робити все, що їй заманеться /usr/local, але не в іншому місці. Якщо він вимагає підвищених дозволів, ви можете відмовити в дозволі оновити або видалити його. Це має для мене певний сенс. Але я думаю, що намагатися використовувати /usr/localтакий спосіб пісочниці таким чином, мабуть, не є гарною ідеєю, або, принаймні, це навряд чи буде найбільш безпечним рішенням. Це не належно ізольоване місце ( /optтрохи більш ізольоване, оскільки воно не за замовчуванням $PATH). Програма може щось записати або видалити, /usr/localщоб заподіяти шкоду. Інші (потенційно погано написані) програми, які ви запускаєте, можуть записувати та виконувати там код, про який ви не знаєте.

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


6

Це незвично, що ним /usr/localне належить root. Але ви можете змінити власника, як вам захочеться.

Але я раджу переконатися, що /usr/local/sbinвсе ще належить, rootщоб уникнути проблем із безпекою. Команди тут, як правило, викликаються лише коренем.


2
Я робив інсталяцію bower раніше, і підручник запропонував зробити chown -R $ USER / usr / local, тому я зараз запускаю chown -R root / usr / local / sbin - чи є інші папки в / usr / local, які б бути краще з власністю root? Я повинен був перевірити всі дозволи перед запуском команди. Моментальне "шкодуйте про повернення".
OnethingSimple

2
Ця відповідь незадовільна, і пояснення не дуже правильне. Якщо, з міркувань безпеки, потрібно, щоб команда root покладалася на власність root, що може бути із командами /usr/local/binцього кореня (а також іншими користувачами)? Хіба їм не потрібно мати корінь? Крім того, використання кореневих команд команд - включаючи команди в - можуть /usr/local/sbinзалежати від спільних бібліотек в /usr/local/lib. Зміна цих бібліотек може внести довільні зміни в поведінку команд, які їх використовують. Наполягаючи, що просто /usr/local/sbinзалишатися у власності кореня, видається абсолютно довільним.
Елія Каган

5

Для програмного забезпечення тільки вам потрібно використовувати свій домашній каталог замість /usr/local.

Замість того, щоб змінювати право власності /usr/localабо не запускати команди як root, коли ви цього не хочете, вам слід просто налаштувати свої збірки, щоб вони встановились у вашому домашньому каталозі замість /usr/local. Це вирішує всі потенційні проблеми зі зміною права власності на /usr/local, включаючи те, як рухаються його binта sbinпідкаталоги root.

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

За допомогою програмного забезпечення, встановленого у вашому домашньому довіднику, бінарні файли, які були б увійшли /usr/local/bin, замість цього заходять . Ви отримаєте інші підкаталоги вашого домашнього каталогу, відповідні підкаталогам того програмного забезпечення, яке вам потрібно встановити. Зазвичай це відбувається автоматично, коли ви встановлюєте програмне забезпечення з вихідного коду./home/username/bin/usr/local

Налаштування ваших побудов

Більшість програмного забезпечення, яке ви будуєте з вихідного коду, має крок:

./configure

Для більшості програмного забезпечення, яке постачається зі configureскриптом, який можна запустити таким чином, він за замовчуванням налаштовує збірку для встановлення всередині, /usr/localколи ви, зрештою, запустіть sudo make installїї встановити. Причина в тому, що це неявно еквівалентно бігу:

./configure --prefix=/usr/local

Щоб налаштувати збірку для встановлення у своєму домашньому каталозі, використовуйте це замість цього:

./configure --prefix="$HOME"

На практиці в Ubuntu шляхи до домашнього каталогу не містять пробілів, інших пробілів або інших символів, які будуть оброблятися спеціально оболонкою, як *, наприклад , якщо ви не налаштували обліковий запис користувача досить дивним чином, ви можете просто ввести:

./configure --prefix=$HOME

(Я не рекомендую користуватися цим звичкою для написання сценаріїв . Також, на деяких інших ОС - наприклад, macOS - рідше траси в домашні каталоги користувачів містять пробіли.)

Або якщо ви хочете, ви можете ввести повний шлях до домашнього каталогу:

./configure --prefix=/home/username

( usernameЗвичайно, замініть власним іменем користувача. Якщо з якоїсь причини вашого домашнього каталогу немає, /homeто вам доведеться відповідно налаштувати.)

Встановлення ваших збірок

Після запуску make, можливо, ви звикли до запуску sudo make install, але при встановленні у власному домашньому каталозі вам не потрібно запускати його як корінь, тож ви можете - і повинні - використовувати sudo. Просто запустіть:

make install

Аналогічно для програмного забезпечення, яке підтримує uninstallціль:

make uninstall

Це саме те, про що ви просили ... просто у вашому домашньому каталозі, а не /usr/local.

Запуск ваших програм

Можливоbin підкаталог вашого домашнього каталогу є:

  • вже у вашому $PATH, або
  • буде у вас, $PATHякщо ви просто вийдете та знову ввійдете в систему.

Причина полягає в тому, що .profileфайл у вашому домашньому каталозі, який містить команди, які виконуються під час входу, містить це за замовчуванням для облікових записів користувачів, створених у більшості версій Ubuntu (включаючи початковий обліковий запис адміністратора, створений при встановленні ОС):

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Цей код запускається під час входу (оскільки він є .profile) і розміщує ваш особистий binкаталог $PATH лише в тому випадку, якщо він існує на той момент. Ось чому вам може знадобитися вийти та знову увійти.

Старіші випуски, такі як Ubuntu 14.04, а також новіші версії, такі як Ubuntu 17.10, поставляються з цим. Однак Ubuntu 16.04, який, мабуть, є найпопулярнішим випуском статей у цій статті, натомість має таке:

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

Це просто додає binпідкаталог домашнього каталогу ---, а також .local/binпідкаталог - до вашого $PATH, не перевіряючи, чи існують ці каталоги насправді. Так що якщо ви використовуєте 16.04, або при оновленні від системи , яка була 16,04 , коли була створена ваш обліковий запис користувача, то binпідкаталог вашого домашнього каталогу, швидше за все , вже в вашому $PATH.

Ваш .profileфайл копіюється з /etc/skelкаталогу під час створення облікового запису користувача. Якщо ваш обліковий запис користувача був створений на старій версії Ubuntu, він отримав цю версію .profile, і він не був змінений - для вашого облікового запису користувача - оновленням до більш нової версії.

Після того, як binпідкаталог вашого домашнього каталогу знаходиться у вашому $PATH, ви зможете запускати програми, виконуючі файли яких встановлені там, просто ввівши їх імена, як ви могли це зробити з програмами, встановленими менеджером пакетів Ubuntu або встановленими всередині /usr/local.

.localваріант

Можливо, ви помітили, що .profileфайл за замовчуванням для облікових записів користувачів, створених у деяких випусках Ubuntu, в тому числі в 16.04, як описано вище, додає не тільки $HOME/binваш шлях, але і $HOME/.local/bin. Якщо ваш .profileдодаток цього не додає, але ви хочете це зробити, ви можете просто відредагувати його.

Хоча часто використовується для зберігання налаштувань і кешованих даних , ви також можете встановити програмне забезпечення всередині .localпідкаталогу домашнього каталогу. Ви повинні відчувати себе таким, що заборонено, так як з точки зору зручності використання та безпеки --prefix="$HOME/.local"схоже на --prefix="$HOME".

Пам’ятайте, що файли та каталоги, що починаються з ., не відображаються за замовчуванням у графічних браузерах файлів (використовуйте Ctrl+, Hщоб їх приховати та повторно сховати) або lsкомандою (передайте -Aабо -aпрапор, щоб їх показати). Це може бути не те, що ви хочете, а може бути саме те, що ви хочете. Це питання особистих уподобань.

Однак я помітив, що деякі автоматизовані менеджери пакунків на основі джерел, які створюють та встановлюють програмне забезпечення в домашньому каталозі, використовують $HOME/.local. Я насправді не знаю, наскільки це поширене - я сподіваюсь, що далі вивчити і оновити цю відповідь, - але ви можете скористатись $HOMEлише тим, що ви збираєте вручну. Таким чином буде зрозуміло, звідки взялися речі. І якщо відбудеться зіткнення, програмне забезпечення все одно може існувати припустимо.

Ви також можете навмисно встановити певне програмне забезпечення $HOME/.localта інше програмне забезпечення в $HOME. Тобі вирішувати. Незалежно від того, яка binкаталог з’явиться першою у вашій $PATHзмінній оточення, це та, з якої буде виконуватися команда, у разі якщо команди з однаковим іменем існують в обох.


Заслуга Zanna та Videonauth для вказуючи на помилки в попередній версії цієї відповіді, про те, яких релізах Ubuntu є якийсь код за замовчуванням в .profile, і допомагають мені виправити їх (дивіться також тут ).


0

Якщо судо таке незручність, тоді просто оновіть / etc / sudoers, щоб вам не довелося вводити свій пароль під час запуску sudo. Я вважаю, що це краще рішення, ніж зміна власника / usr / local.


4
Паролі - це не проблема - скоріше ідея того, що для установки модулів у програму /usr/localпотрібно використовувати sudo, що потенційно небезпечно.
PR3x
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.