Назад | Перейти на главную страницу

Ограничьте пользователя Linux файлами, которыми он владеет

Представьте себе настройку сервера совместно используемой компании веб-хостинга, где несколько (~ 100) клиентов имеют доступ через оболочку к одному серверу.

Многие веб-программы рекомендуют chmod файлы 0777. Я нервничаю из-за того, что наши клиенты неразумно следуют этим руководствам, открывая свои файлы другим клиентам. (Я точно не использую cmod 0777 напрасно себя!) Есть ли способ убедиться, что клиенты могут получить доступ только к своим файлам, и запретить им доступ к файлам, доступным для чтения всем, от других пользователей?

Я заглянул в AppArmor, но это очень тесно связано с процессом, который, кажется, терпит неудачу в этой среде.

Поставить ограниченный и неизменный каталог между внешним миром и защищенными файлами, например

/
 ├─ bin
 ├─ home
 │  └─ joe <===== restricted and immutable
 │     └─ joe <== regular home directory

или /home/joe/restricted/public_html.

Ограниченный означает, что только пользователь и, возможно, веб-сервер могут читать его (например, режимы 0700/0750 или несколько ACL).

Неизменяемость может быть достигнута с помощью chattr +i или изменив право собственности на что-то вроде root:joe.

Простой способ создать эту иерархию в Ubuntu - отредактировать /etc/adduser.conf и установить GROUPHOMES к yes.

Есть вариант, который вы, возможно, захотите рассмотреть (в зависимости от того, сколько работы вы хотите для этого сделать).

Как уже писали другие, «обычно» вы не можете помешать кому-либо с доступом к оболочке читать файлы, доступные для чтения всем.

Однако вы можете chroot их в их собственный дом, в основном ограничивая доступ к оболочке, во-первых, только желаемым корневым каталогом (он же домашний каталог) и, во-вторых, не позволяйте пользователям выполнять все, что вы не хотите, чтобы они выполняли.

Я применил аналогичный подход, когда у меня был один пользователь, имеющий доступ к веб-файлам, но я не хотел, чтобы он видел другие файлы вне веб-папки.

Это было связано с большими накладными расходами, было беспорядочно настраиваться, и каждый раз, когда я что-то обновлял, оно ломалось.

Но на сегодняшний день я думаю, что вы могли бы довольно легко добиться этого с помощью OpenSSH параметр chroot:

WikiBooks OpenSSH

Я обнаружил, что списки управления доступом POSIX позволяют вам, как системному администратору, защитить своих пользователей от наихудшего из их собственного невежества, переопределив обычное разрешение группы пользователей и другой файловой системы, без особых шансов сломать что-либо важное. .

Они могут быть особенно полезны, если вам, например (например), нужны домашние каталоги, чтобы они были доступны всем, потому что веб-контент должен быть доступен для apache в ~/public_html/. (Хотя с ACL теперь вы можете сделать наоборот, удалить доступ для всех и использовать конкретный эффективный ACL для пользователя apache.)

Да, знающий пользователь может удалить / переопределить их снова, просто достаточно редко, что маловероятно, и те пользователи, которые могут, как правило, не те, кому удобно chmod -R 777 ~/ в любом случае, правда?

Вам необходимо смонтировать файловую систему с acl вариант крепления:

 mount -o remount,acl /home

Во многих дистрибутивах по умолчанию создаются группы пользователей, у каждого пользователя есть своя основная группа, и я установил всех пользователей во вторичной группе с невообразимым именем users.

С помощью ACL теперь легко предотвратить доступ других пользователей к домашним каталогам:

Перед:

 chmod 0777 /home/user* 

 ls -l /home/user*
 drwxrwxrwx.  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx.  2 user2  user2  4096 Jul 11 15:24 user2

Теперь установите действующие разрешения на каталог для членов users группа в 0 нет чтения, записи или доступа:

 setfacl setfacl -m g:users:0 /home/user*

 ls -l 
 drwxrwxrwx+  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx+  2 user2  user2  4096 Jul 11 15:24 user2

В + Знак означает наличие там настроек ACL. И getfacl могу подтвердить, что:

getfacl /home/user1
getfacl: Removing leading '/' from absolute path names
# file: home/user1
# owner: user1
# group: user1
user::rwx
group::rwx
group:users:---
mask::rwx
other::rwx

В group:users:--- показать, что группа фактически не имеет прав доступа, несмотря на обычные разрешения для других существ other::rwx

И тестирование как user1:

[user1@access ~]$ ls -la /home/user2
ls: cannot open directory /home/user2: Permission denied

Второе распространенное решение в совместно используемых системах - это автоматическое монтирование домашних каталогов по запросу и выделение сервера для доступа к оболочке. Это далеко не защита от дурака, но, как правило, только несколько пользователей будут одновременно входить в систему, что означает, что только домашние каталоги этих пользователей видны и доступны.

Контейнеры Linux (LXC) может быть лучшим сочетанием chroot и отдельной системы.

  1. Они больше похожи на расширенный chroot, а не на виртуализацию, но вы можете комбинировать разные операционные системы на одном сервере.

  2. Вы можете предоставить пользователю полную операционную систему и заблокировать его там, чтобы, когда пользователь входит в систему, он переходит в свой контейнер. И вы также можете ограничить использование процессора и памяти.

Стефан Грабер, автор LXC, имеет хороший руководство чтобы помочь вам начать работу.

Например, если вы хотите, чтобы пользователь имел доступ только к своим home каталог, вам следует сделать:

cd /home
sudo chmod 700 *

Сейчас /home/username виден только его владельцу. Чтобы сделать это значение по умолчанию для всех новых пользователей, отредактируйте /etc/adduser.conf и установить DIR_MODE к 0700 вместо 0755 дефолт.

Конечно, если вы хотите изменить DIR_MODE по умолчанию, это зависит от вашего дистрибутива, тот, который я опубликовал, работает на Ubuntu.

редактировать

Так как @Dani_l правильно упомянуто, этот ответ правильный, делая их НЕ читаемыми во всем мире.

Просто чтобы быть педантичным - нет, нет.
@Marek дал правильный ответ, но ваш вопрос неверен - вы не можете запретить кому-либо доступ к файлам, доступным для чтения всем.
Либо они доступны для чтения, либо нет. Ответ @Marek верен в том, что делает их НЕ читаемыми.

Я не вижу упоминания о «ограниченной оболочке» в ответах, данных до сих пор.

ln / bin / bash / bin / rbash

Установите это как их оболочку входа в систему.

Если веб-сервер работает как один и тот же пользователь и группа для каждого размещенного домена, сложно (если не невозможно) обеспечить безопасность установки.

Вы хотите, чтобы определенные файлы были доступны пользователю, а также веб-серверу, но не другим пользователям. Но как только веб-сервер получит к ним доступ, другой пользователь сможет прочитать их, поместив символическую ссылку на файл на своем собственном веб-сайте.

Если вы можете заставить каждый веб-сайт работать от имени отдельного пользователя, это становится довольно просто. У каждого клиента теперь будет два пользователя в системе: один для веб-сервера и один для доступа к оболочке.

Создайте группу, содержащую этих двух пользователей. Теперь создайте каталог с этой группой и пользователем root. У этого каталога должны быть разрешения 750, что означает, что root имеет полный доступ, а группа имеет доступ на чтение и выполнение. Внутри этого каталога вы можете создать домашние каталоги для каждого из двух пользователей. Это означает, что домашний каталог пользователя больше не будет иметь форму /home/username, а скорее что-то с еще одним компонентом каталога. Это не проблема, ничто не требует, чтобы домашние каталоги назывались в соответствии с этим конкретным соглашением.

Получить веб-сайты, работающие с разными пользователями и группами, может быть сложно, если вы используете vhosts на основе имен. Если окажется, что разделение работает только с виртуальными хостами на основе IP, и у вас недостаточно IP-адресов для каждого сайта, вы можете разместить каждый веб-сайт на IPv6-адресе и поместить обратный прокси для всех из них на IPv4-адрес.