Надати користувачеві доступ для читання / запису лише до одного каталогу


18

Я запускаю сервер, і мені потрібно надати доступ до читання / запису до певного каталогу одному користувачеві. Я спробував таке:

sudo adduser abcd
sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd

Вищезазначене, здається, працює, проте надає користувачеві доступ лише для читання до решти серверів.

Як я можу налаштувати дозволи, щоб користувач міг читати та записувати лише до певної папки? Користувач також повинен мати можливість запускати такі програми mysql.


2
Коротка відповідь: використовуйте chroot.
Кріс Даун

@Chris Care детальніше про це уточнити у відповіді? Меніш і я боролися з цим і, здається, не змусили його працювати.
Відмінити

Де б mysqlрозміщувалася програма? Користувач повинен мати можливість його читати та всі бібліотеки та файли даних, які йому потрібні.
Жил 'SO- перестань бути злим'

@Gilles Hmm. Наскільки я можу сказати, це стандартна установка mysql з apt-get (не моя система, це Undo's).
Manishearth

Відповіді:


18

Негативні ACL

Ви можете запобігти доступу користувача до певних частин файлової системи, встановивши списки контролю доступу . Наприклад, щоб переконатися, що користувач abcdне може отримати доступ до жодного файлу під /home:

setfacl -m user:abcd:0 /home

Цей підхід простий, але ви повинні пам'ятати, щоб заблокувати доступ до всього, до чого ви не хочете abcdмати доступ.

Chroot

Щоб отримати позитивний контроль над тим, що abcdможна бачити, встановіть chroot , тобто обмежте користувача на піддереві файлової системи.

Вам потрібно створити всі файли, які потрібні користувачеві (наприклад, mysqlі всі його залежності, якщо ви хочете, щоб користувач міг запускатись mysql) під chroot. Скажіть, що шлях до chroot є /home/restricted/abcd; mysqlпрограма повинна бути доступна під /home/restricted/abcd. Символічне посилання, що вказує за межами chroot, не є корисним, оскільки на пошук символьної посилання впливає тюрма Chroot. У Linux ви можете добре використовувати прив’язані кріплення:

mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr

Ви також можете скопіювати файли (але тоді вам потрібно буде подбати про їх оновлення).

Щоб обмежити користувача chroot, додайте ChrootDirectoryдирективу до /etc/sshd_config.

Match User abcd
    ChrootDirectory /home/restricted/abcd

Ви можете протестувати його за допомогою: chroot --userspec=abcd /home/restricted/abcd/ /bin/bash

Рамки безпеки

Ви також можете використовувати структури безпеки, такі як SELinux або AppArmor. В обох випадках вам потрібно написати досить делікатну конфігурацію, щоб переконатися, що ви не залишаєте жодних дірок.


Чи не можна зробити набагато простішим способом надання дозволів для читання та запису певного каталогу через створення груп? Наприклад, він може створити нову групу і використовувати chown, щоб зробити власником групи директорій групу, яку було створено, і додати користувача до групи. Нарешті, дайте каталогу дозволу для читання та запису для груп.
Касим

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

Я маю на увазі, що я не бачу, як у файлів повинні бути власні дозволи, якщо групові дозволи в каталозі були встановлені таким чином, щоб жоден користувач не міг "вписати" в каталог або "ls" каталог.
Касим

@Qasim Кожен файл під /var/www/allowfolderйого підкаталогами має бути доступним, не лише він /var/www/allowfolderсам. І навпаки, інші файли не повинні бути доступними. Насправді рішення, засноване виключно на дозволах файлів та ACL, не може повністю виконати вимоги: воно, принаймні, дозволить користувачеві перевірити, чи існує вказане ім'я /var/www, оскільки їм потрібно мати х дозвіл на /var/wwwдоступ /var/www/allowfolder.
Жил "ТАК - перестань бути злим"

Ну добре, я бачу, але якщо ми виключимо з цього каталог / var і скажемо, що ми говоримо про звичайний каталог в / home / user directory?
Касим

5

Ви повинні використовувати chroot. chrootКоманда змінює кореневий каталог, всі дочірні процеси см. Наведу приклад, щоб продемонструвати, як це працює.

Це було написано на місці; Зараз я фактично не перед машиною UNIX. У цьому прикладі є директорія dirз трьома файлами: a, b, c, і ls. Перші три - це звичайні файли. lsє твердим посиланням на справжній lsбінарний файл, щоб ми могли перелічити файли, перебуваючи в chroot.

Я збираюся chrootв dir. (Зауважте, що я, мабуть, забуваю деякі каталоги в кореневій директорії.)

Ось налаштування у формі виводу оболонки:

$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var

Тепер я буду chrootв dir. В /bin/bashвибирає аргумент , що процес повинен бути запущений з новою кореневої директорії. Це за замовчуванням до /bin/sh.

$ chroot /bin/bash dir
$ # this prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/

Тепер ми виходимо з chroot:

$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test

Сподіваюся, це ілюструє, як chrootпрацює команда. В основному, що вам потрібно зробити, щоб вирішити вашу проблему, це запустити chrootкоманду як цей користувач кожного разу, коли він увійде в систему. Можливо, помістіть її в сценарій запуску?

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

ln /usr/bin/mysql /path/to/chroot/target

Але хіба це не вимагатиме від мене створення цілого середовища chroot з усіма символьними посиланнями? Чи не було б легше запустити команду, щоб новий користувач не мав доступу до інших каталогів, але такі програми, як apache, не втрачають доступ до них?
Манішерт

В основному, чи є спосіб (через chmod) змусити користувача втратити доступ для читання до решти файлів, не впливаючи на доступ інших користувачів?
Манішерт

@Manishearth не існує простого способу chmod. коли ви говорите: "чи не було б легше запустити команди ... не втрачайте доступ до них", це команда chroot. якщо ви поясните, що ви маєте на увазі під "цілим середовищем chroot", або чому це буде проблемою, можливо, я зрозумію краще. (Зверніть увагу , що ви можете дати доступ до всіх виконуваним з Oneliner: ln /bin/* /path/to/chroot/target)
strugee

@Manishearth, якщо мій приклад не мав сенсу, я б закликав вас пограти з chrootсамим собою або дав мені знати, що не мало сенсу. ще краще, зробіть і те, і інше. (і читайте
рукописи

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