Как запереть пользователя в домашней директории linux
Хочу представить Вам ещё один вариант поднятия vsFTPD на системе Ubuntu 10.10. В прошлой заметке у нас получилось, что пользователь зашедший на FTP видит все директории, но это не правильно, чтобы этого не было об этом и статья, как запереть пользователей работающих с FTP их собственным домашним каталогом.
Итак, в нашем распоряжении операционная система Ubuntu 10.10.
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 10.10
Произведём обзор имеющегося пакета в репозиториях Ubuntu 10.10:
$ sudo aptitude search vsftpd
Какая версия и информация по необходимому пакету доступна:
$ sudo aptitude show vsftpd
State: not installed
Version: 2.3.0
Uncompressed Size: 442k
Depends: debconf (>= 0.5) | debconf-2.0, upstart-job, libc6 (>= 2.7), libcap2 (>= 2.10), libpam0g (>= 0.99.7.1), libssl0.9.8 (>= 0.9.8m-1), libwrap0 (>= 7.6-4
), adduser, libpam-modules, netbase
Description: lightweight, efficient FTP server written for security
It supports both anonymous and non-anonymous FTP access, PAM authentication, bandwidth limiting, and the Linux sendfile() facility.
Установим пакет в нашу систему:
$ sudo aptitude install vsftpd
The following NEW packages will be installed:
0 packages upgraded, 1 newly installed, 0 to remove and 385 not upgraded.
Need to get 116kB of archives. After unpacking 442kB will be used.
Fetched 116kB in 1s (101kB/s)
Selecting previously deselected package vsftpd.
ureadahead will be reprofiled on next reboot
Setting up vsftpd (2.3.0
Adding user ftp to group ftp
vsftpd start/running, process 3115
Создадим резервную копию конфигурационного файла :
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup
Редактируем и ограничиваем работу только по IPv4.
$ sudo nano /etc/vsftpd.conf
< span style = "font-family: Times New Roman,serif;" > < span style = "font-size: medium;" > write_enable = YES < / span > < / span > < span style = "font-family: Times New Roman,serif;" > < span style = "font-size: medium;" > ascii_upload_enable = YES < / span > < / span > < span style = "font-family: Times New Roman,serif;" > < span style = "font-size: medium;" > ascii_download_enable = YES < / span > < / span >напишем свой баннер для входа.
< span style = "font-family: Times New Roman,serif;" > < span style = "font-size: medium;" > ftpd_banner = Welcome to FTP Ubuntu 10.10 ( blog www . ekzorchik . ru ) . < / span > < / span >Запираем пользователей в домашних директориях:
< span style = "font-family: Times New Roman,serif;" > < span style = "font-size: medium;" > chroot_local_user = YES < / span > < / span >Разрешаем вход локальным пользователям:
< span style = "font-family: Times New Roman,serif;" > < span style = "font-size: medium;" > local_enable = YES < / span > < / span >Запрещаем анонимный доступ, необходимо найти строку:
< span style = "font-family: Times New Roman,serif;" > < span style = "font-size: medium;" > anonymous_enable = NO < / span > < / span >Права доступа на файлы и директории
< span style = "font-family: Times New Roman,serif;" > < span style = "font-size: medium;" > local_umask = 023 < / span > < / span >Перейдем к с озданию пользователя который будет работать с нашим FTP сервисом , в целях безопасности у него будет отлючен шелл:
$ sudo useradd user1 -b /home/ -m -U -s /bin/false
user1 — это произвольное именование создаваемого пользователя.
home — это директория где будет находится его собственный домашний каталог.
Ключ -m — это обозначение его домашнего каталога по создаваемому имени.
Ключ -U — это создать персональную группу.
Ключ -s /bin/false — это указывает, что пользователю будет отключён шелл (т. е. интерпретатор команд).
Присвоим нашему созданному пользователю пароль :
$ sudo passwd user1
Enter new UNIX password:
Aa1234567
Retype new UNIX password:
Aa1234567
passwd: password updated successfully
Для того что бы пользовать смог получить доступ к FTP с отключённым шеллом , следует отредактировать файл:
$ sudo nano /etc/pam.d/vsftpd
и закомментировать строчку
И перезапускаем сервис vsftpd:
$ sudo service vsftpd restart
vsftpd start/running, process 3193
Вот собственно и наш FTP поднят и развернут. Продемонстрирую, как происходит подключение:
через консоль:
$ ftp ub64amd (подключение к ftp с именем системы ub64amd)
Connected to ub64amd.
Name (ub64amd:ekzorchik): user1
(созданный пользователь)
331 Please specify the password.
Password: Aa1234567
(Пароль для учетной записи user1)
230 Login successful.
Remote system type is UNIX. Using binary mode to transfer files.
ftp> pwd
(отобразить текущий каталог)
ftp> ls (вывести листинг каталогов)
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r-- 1 1001 1002 179 Sep 15 2010 examples.desktop
226 Directory send OK.
ftp> quit
(завершить работу с FTP сервисом)
через GUI интерфейс:
Перейдем, в левом верхнем углу: «Places» — «Home Folder»
в строке адреса, нажмём сочетание клавиш «Ctrl + L» для отображения полного пути к строке адреса
и вместо /home/ekzorchik (в данный момент я из под него настраиваю FTP сервис), напишем
, где ub64amd — имя машины с поднятым FTP сервисом. (В вашем случаем может быть другим, также можно писать IP — адрес системы)
В появившемся окне вводим аутентификационные данные для подключения:
В случаем правильного ввода необходимых данных, таких как имя пользователя и пароля мы попадём на наш FTP:
Вот собственно и всё, задача по ограничению пользователей работающих с FTP достигнута. Результат подключения, как через консоль, так и посредством GUI интерфейса продемонстрирован. Удачи.
Используйте прокси ((заблокировано роскомнадзором, используйте vpn или proxy)) при использовании Telegram клиента:
Поблагодари автора и новые статьи
будут появляться чаще :)
Карта МКБ: 4432-7300-2472-8059
Большое спасибо тем кто благодарит автора за практические заметки небольшими пожертвованиями. С уважением, Олло Александр aka ekzorchik.
Как то раз появилась следующая задача: создать локального пользователя в ОС Linux, с ограниченным доступом к папкам и файлам, включая не только редактирование, но и просмотр, а также возможность использовать только разрешенные утилиты. Предусматривается только локальный доступ, сетевого доступа нет.
Что бы не изобретать велосипед, первым делом начал копать интернет, в результате чего были найдены следующие варианты:
- ограничения доступа через сетевые службы ssh, sftp (не подошло)
- разграничение прав доступа самой операционной системой linux (не подошло, хотелось бы универсальное решение)
- использование chroot (не подошло)
- использование сторонних утилит, например SELinux (не подошло, усложняет систему).
- нет возможности смены каталога командой cd
- нельзя сбрасывать или изменять значения переменных SHELL, PATH, ENV, BASH_ENV
- запрещено указывать команды содержащие / (косую черту)
- запрещено импортировать функции из основной оболочки
- запрещено перенаправлять вывод с использованием операторов >, <, |, <>, >&, &>, >>
- запрещено использовать команду exec для подмены команды и пр.
Конечно rbash из коробки, всех задач не решает, поэтому на примере рассмотрим создание пользователя и настройка его окружения для полного решения нашей задачи.
Далее все операции выполняются от суперпользователя (root).
1. Создаем ограниченную оболочку
2. Создаем пользователя
3. Изменяем права директории
4. Переходим в директорию и очищаем ее
5. Настраиваем оболочку и права
Файл .bashrc определяет поведение командной оболочки, в данный файл можно добавить alias для команд или дополнительные опции.
Для обеспечения безопасности выполните следующие команды:
Данный список можно продолжать…
6. Проверяем работу
7. Добавляем допустимые команды
Важно, пути в команде ln необходимо указывать полностью.
8. Для ограничения опций команды можно использовать обертки
9. Для работы с файлами и папками можно также создать обертку
с черным списком (разрешить все, кроме):
— создаем файл
blacklist — переменная содержащая черный список директорий или файлов (через пробел)
— добавляем команду для пользователя zuser
Данный скрипт разрешает выполнять команду ls с любыми ключами для каталогов и файлов не совпадающих с черным списком
с белым списком (запретить все, кроме):
— создаем файл
whitelist — переменная содержащая белый список директорий или файлов (через пробел)
— добавляем команду для пользователя zuser
Данный скрипт разрешает выполнять команду cat с указанными файлами в белом списке
Готово, в итоге получили следующий результат:
- мы создали пользователя zuser с оболочкой rbash
- отключили возможность использования автодополнения в консоли
- zuser может запускать утилиты только из директории /home/zuser/bin
- добавили пользователю zuser команду ping
- добавили пользователю zuser собственную команду user-info
- пользователю zuser ограничили через обертку выполнение команд ls и cat
Данный способ к сожалению не гарантирует 100% безопасность, и при определенных знаниях и квалификации пользователь может покинуть данную оболочку. Спасибо Jouretz arheops YaDr они в комментариях привели примеры обхода ограничений оболочки.
Ограничение пользователя SSH домашней директорией
Ограничение пользователя SSH домашней директорией
Сделал небольшое обновление хостинга. Очень часто бывает удобно и производить файловые операции на сервере, например закачивать по одному долго и неудобно, снимать дамп баз данных и делать прочие действия. Давать для этого полноценный ssh не очень интерсно, потому что пользователь сможет бродить по моей системе и, если у меня где-то выставлены не совсем правильные права, сможет получить данные, которые он получать не должен. И опять комбинация встроенных средств unix-like помогает нам успешно решить эту задачу.
Будем делать ssh chroot. Создадим юзера: root обязательно должен быть владельцем домашней директории пользователя.
Теперь внизу конфига sshd /etc/ssh/sshd_config, определим индивидуальные настройки для пользователя: Ну и перечитываем конфиг: Теперь можно попробовать зайти под логином пользователя и понять, что ssh не работает. А не работает потому что никаких команд в системе нет, то есть можно использовать только sftp. Но мы хотим, чтобы был доступен терминал с необходимым для работы набором команд. Поэтому можно, как это принято в мире unix, пойти двумя путями: Подмонтируем все что нужно в фс пользователя: Но при таком подходе некоторые данные будут доступны, которые, пользователю знать не обязятельно. Например, команда df или ifconfig.
Поэтому можно четко определить, что минимально необходимо пользователю и создать жесткие ссылки. Но этот способ не будет работать, если используется более одного раздела, а используется почти всегда используется более одного раздела, потому что нужна кластеризация, удаленные фс и тому подобное, поэтому делаем директорию /home/chrootuser и туда скопируем необходимый набор команд. У меня он получился такой: Теперь мы получили некий аналог директории /etc/skel только у нас не файлы, которые будут в домашней директории, а скелет системы, которую увидит пользователь. Дальше воспользуемся специальной фс union: Эта, крайне полезная фс, которая позволяет представлять расположенные в разных местах данные, представлять в некой директории. Эта фс имеет очень много самых невероятных возможностей, но нам сейчас необходимо, чтобы внутри домашней директории пользователя появились необходимые команды, кроме того эти команды должны быть с аттрибутом "только чтение". В противном случае злоумышленник может произвести замену, уже общих для всех пользователей, системных файлов.
Отлично, теперь мы смогли войти в систему. Набор команд ограничен, все что необходимо конечный пользователь может делать. Самое важное, что все это выполнено при помощи встроенных средств, которые будут обновляться вместе с системой и не нужно отдельно следить за дополнительным ПО.
Я сделал скрипт, которые позволяет все описанное выше несколько автоматизировать. Сделайте файл chcommands, сожержащий пути до необходимых программ. Скрипт скопирует все эти команды и необходимые библиотеки.
В завершение замечу, что необходимо исключить ситуации, когда по фтп файл создался с одними правами, а веб сервер созад файлы с другими. Для этого есть специальные модули, но это уже больше относится к теме о организации хостинга.
Представьте себе этот сценарий. Вы хотите разрешить пользователю выполнять только определенные задачи и выполнять определенные команды. Пользователь не должен изменять переменные / пути окружения. Он / она не может посещать другие каталоги, кроме своего домашнего каталога, и не может переключаться на других пользователей и т. Д. Пользователь может выполнять только несколько команд, назначенных системным администратором. Это возможно? Да! Здесь на помощь приходит Restricted Shell . Используя Restricted Shell, мы можем легко ограничить доступ пользователя к системе Linux. После того, как вы поместите пользователей в ограниченный режим оболочки, им разрешено выполнять только ограниченный набор команд. В этом кратком руководстве мы поговорим о том, как это сделать в Linux. Я тестировал это руководство на минимальном сервере CentOS 7. Однако он будет работать в большинстве Unix-подобных дистрибутивов.
Что такое Restricted Shell?
Оболочка с ограничениями ограничивает возможности пользователей выполнять большинство команд и изменять текущий рабочий каталог. Ограниченная оболочка налагает следующие ограничения на пользователей:Ограничьте доступ пользователей к системе Linux с помощью оболочки с ограничениями
Сначала создайте символическую ссылку под названием rbash из Bash, как показано ниже. Следующие команды следует запускать от имени пользователя root .
Установите пароль для нового пользователя.
Создайте каталог bin внутри домашней папки нового пользователя.
Теперь нам нужно указать, какие команды может запускать пользователь.
Здесь я позволю пользователю запускать только команды «ls» , «mkdir» и «ping» . Вы можете назначить любые команды по вашему выбору.
Для этого выполните следующие команды:
Теперь вы понимаете, почему мы создали каталог bin на предыдущем шаге. Пользователи не могут запускать никакие команды, кроме трех вышеуказанных команд.
Затем запретите пользователю изменять .bash_profile .
Отредактируйте файл /home/infoit/.bash_profile :
Измените PATH как показано ниже.
Нажмите клавишу ESC и введите : wq, чтобы сохранить и закрыть файл.
Теперь, когда пользователь входит в систему, ограниченная оболочка (rbash) будет запускаться как оболочка входа по умолчанию и читать .bash_profile , который установит PATH в $HOME/bin, чтобы пользователь мог запускать только ls , mkdir и команды ping . Оболочка с ограничениями не позволяет пользователю изменять PATH , а разрешения на .bash_profile не позволяют пользователю изменять среду, чтобы обойти ограничения во время следующего сеанса входа в систему.
Проверка Rbash
Теперь выйдите из системы от имени пользователя root и снова войдите в систему с вновь созданным пользователем, в нашем случае с ostechnix.
Затем запустите несколько команд, чтобы проверить, работает он или нет. Например, я хочу очистить Терминал.
Для этого я запустил:
Sample output:
Вы не можете использовать команду cd для перехода в другой каталог.
Пример вывода:
Пример вывода:
Кроме этих трех команд, пользователь ничего не может выполнять. Он / она полностью под вашим контролем.
Разрешить пользователям новые команды
Если вы хотите назначить пользователю больше команд, выйдите из системы текущего пользователя и снова войдите в систему как пользователь root и назначьте команды, как показано ниже.
Например, чтобы позволить пользователю (т.е. ostechnix) выполнять команду rm , выполните следующую команду от имени пользователя root .
Теперь пользователь может использовать команду «rm».
Для получения дополнительных сведений см. Справочные страницы по приведенной ниже ссылке.
Читайте также: