Вернуться назад

Lshell вместо chroot ssh

Все часто сталкиваются с тем, что, порой, обычного ftp разработчикам не хватает и необходимо предоставить доступ ssh. Вот и у насклиенты иногда просят предоставить ограниченный доступ ssh. Раньше мы пользовались chroot ssh, а его настройка не самая простая задача, но недавно я познакомился с замечательным продуктом lshell.

Lshell — limited shell

Пользовательский шел, позволяющий легко и просто запереть пользователя в заданных директориях и ограничить выполняемые команды. Он есть в репозиториях CentOS и Debian, установить его можно так:

yum install lshell
apt-get install lshell

Если же есть потребность в последней версии:

wget https://github.com/ghantoos/lshell/releases/download/0.9.16/lshell-0.9.16.tar.gz
tar xvfz lshell-0.9.16.tar.gz
cd  lshell-0.9.16
python setup.py install --no-compile --install-scripts=/usr/bin/

затем достаточно добавить шел пользователю

user:x:502:502::/home/user:/usr/bin/lshell

Конфигурационный файл

/etc/lshell.conf:

# lshell.py configuration file
#
# $Id: lshell.conf,v 1.27 2010/10/18 19:05:17 ghantoos Exp $

[global]
## log directory (default /var/log/lshell/ )
logpath: /var/log/lshell/
## set log level to 0, 1, 2, 3 or 4 (0: no logs, 1: least verbose,
## 4: log all commands)
loglevel: 2
## configure log file name (default is %u i.e. username.log)
#logfilename: %y%m%d-%u
#logfilename: syslog

## in case you are using syslog, you can choose your logname
#syslogname: myapp

[default]
## a list of the allowed commands or ‘all’ to allow all commands in user’s PATH
allowed: [‘ls’,’echo’,’cd’,’ll’]

## a list of forbidden character or commands
forbidden: [‘;’, ‘&’, ‘|’,’`’,’>’,'<‘, ‘$(‘, ‘${‘]

## a list of allowed command to use with sudo(8)
#sudo_commands: [‘ls’, ‘more’]

## number of warnings when user enters a forbidden value before getting
## exited from lshell, set to -1 to disable.
warning_counter: 2

## command aliases list (similar to bash’s alias directive)
aliases: {‘ll’:’ls -l’, ‘vi’:’vim’}

## introduction text to print (when entering lshell)
#intro: «== My personal intro ==\nWelcome to lshell\nType ‘?’ or ‘help’ to get the list of allowed commands»

## configure your promt using %u or %h (default: username)
#prompt: «%u@%h»

## a value in seconds for the session timer
#timer: 5

## list of path to restrict the user «geographicaly»
#path: [‘/home/bla/’,’/etc’]

## set the home folder of your user. If not specified the home_path is set to
## the $HOME environment variable
#home_path: ‘/home/bla/’

## update the environment variable $PATH of the user
#env_path: ‘:/usr/local/bin:/usr/sbin’

## add environment variables
#env_vars: {‘foo’:1, ‘bar’:’helloworld’}

## allow or forbid the use of scp (set to 1 or 0)
#scp: 1

## forbid scp upload
#scp_upload: 0

## forbid scp download
#scp_download: 0

## allow of forbid the use of sftp (set to 1 or 0)
#sftp: 1

## list of command allowed to execute over ssh (e.g. rsync, rdiff-backup, etc.)
#overssh: [‘ls’, ‘rsync’]

## logging strictness. If set to 1, any unknown command is considered as
## forbidden, and user’s warning counter is decreased. If set to 0, command is
## considered as unknown, and user is only warned (i.e. *** unknown synthax)
#strict: 1

## force files sent through scp to a specific directory
#scpforce: ‘/home/bla/uploads/’

## history file maximum size
#history_size: 100

## set history file name (default is /home/%u/.lhistory)
#history_file: «/home/%u/.lshell_history»

Как видно, конфигурационный файл по умолчанию разделен на глобальную [global] секцию и секцию по умолчанию [default]. Так же есть возможность задавать конфигурацию для конкретного пользователя: [user]
настройки указанные в секции пользователя, имеют больший приоритет, по сравнения с секцией [default]
Рассмотрим пример секции для пользователя:

[user]
allowed: [‘ls’,’echo’,’cd’,’ll’,’cp’,’mv’]
strict: 1
warning_counter: 2
#timer: 5
path: [‘/var/www/site1′,’/var/www/site2’]
#allowed_cmd_path: [‘/home/user/bin’]
scp: 1
sftp: 1
overssh: [‘ls’, ‘rsync’]

allowed — разрешенные команды
warning_counter — количество запрещенных действия, прежде чем пользователя выкинет из терминала (работает если только включен strict )
timer — таймаут в секундах после которого пользователя выкинет из терминала
path — каталоги, которые позволительно посещать пользователю, помимо домашнего
allowed_cmd_path — каталоги, в которых пользователю разрешено запускать исполняемые файлы
scp — запретить или разрешить пользователю использовать scp
sftp — запретить или разрешить пользователю sftp
overssh — Список разрешенных команд, которые разрешено использовать пользователю, посылая их через ssh

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

cd /путь && <команда>

выдает ошибку. К примеру:

user:~$ cd /home/user && ls
lshell: /home/user && ls: No such file or directory


igel
Дата: 25 января 2019 г. в 00:52:29

Автор: igel