company_banner

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
    

    Разработчик обещал поправить этот баг

    Ссылки:


    Страница продукта на github.com
    Southbridge
    Обеспечиваем стабильную работу highload-проектов

    Comments 21

      0
      Выполнять свои программы при этом запрещается? Пользователи на это соглашаются?
        0
        allowed_cmd_path — каталоги, в которых пользователю разрешено запускать исполняемые файлы или свои программы.
          +4
          Что ему помешает запустить из своей программы bash?
          • UFO just landed and posted this here
              +1
              Lshell умеет залезать в сторонние программы?
              Интересно было бы услышать как. Все, что я могу представить сложно и не надежно.
                +2
                $ vi
                :!mc
                :!bash
                :!whatever
                  0
                  чёрт, промахнулся и проворонил время редактирования коммента:(
                +1
                $ vi
                :!mc
                :!bash
                :!whatever
                  0
                  mv /bin/sh ~/cgi-bin/my_super_program
                  ./my_super_program

                  Зачем нужен этот велосипед, неужели нельзя просто нормально настроить права доступа?
            +1
            Единственный значительный недочет который я обнаружил

            А ещё, насколько мне известно, он не умеет в WinSCP.

            Лечится патчем, который почему-то никак не примут в апстрим. Если вдруг кто столкнётся, будет полезно, т.к. лично у меня не сразу получилось застравить WinSCP с ним работать
              0
              Насколько я помню, выполнение команд напрямую через команду ssh не затрагивает shell юзера. Скорей всего для ssh надо еще ограничить запуск команд только lshell-ом.
                +1
                Да, извините сразу забыл указать это, уже поправил
                затем достаточно добавить шел пользователю
                user:x:502:502::/home/user:/usr/bin/lshell
                  0
                  Затрагивает, в таком случае коммагда запускается как "$SHELL -c command", чтобы проверить попробуйте установить в качестве shell /bin/false.
                    0
                    Что-то мне подсказывает что через ssh можно запускать и через shell и напрямую. Там, вроде-бы есть соответствующие параметры ssh.
                      0
                      через конфигурацию сервера — да, но на клиенте это была бы уязвимость.
                  +1
                  Естественно, «обычного ftp не хватает», кто им кроме старперов и ньюфагов пользуется? Жутко бесят некоторые хостинги, которых нужно упрашивать дать доступ по ssh. Благо своё всё давно на выделенках, но иногда просят помочь чуваки с хостингами «скажите спасибо, что есть mysql».
                    0
                    Давным-давно на StackOverflow была реклама ObserveIT: эта вещь записывает SSH-сеансы и позволяет просмотреть, что там понаделали.
                    Очень удобно, рекомендую посмотреть livedemo на их сайте.

                    А вообще, у основных потребителей lshell мозга не хватит даже на то, чтобы почистить authorized_keys для рута 8).
                      +2
                      Никогда не используйте этот мусор. Оно дырявое насковозь:

                      Решето и побег из курятника
                      vladislav@dt1:~$ getent passwd testuser
                      testuser:x:1002:1003:,,,:/home/testuser:/usr/bin/lshell
                      vladislav@dt1:~$ su - testuser
                      Пароль: 
                      You are in a limited shell.
                      Type '?' or 'help' to get the list of allowed commands
                      testuser:~$ ?
                      cd  clear  echo  exit  help  history  ll  lpath  ls  lsudo
                      testuser:~$ ls
                      examples.desktop
                      testuser:~$ which bash
                      *** forbidden command: which
                      testuser:~$ ls'usb'
                      Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
                      Bus 001 Device 006: ID 046d:c05a Logitech, Inc. M90/M100 Optical Mouse
                      Bus 001 Device 002: ID 046d:c31c Logitech, Inc. Keyboard K120
                      Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
                      testuser:~$ echo && 'bash'
                      
                      testuser@dt1:~$ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
                      testuser@dt1:~$ reboot --help
                      reboot [OPTIONS...] [ARG]
                      
                      Reboot the system.
                      
                           --help      Show this help
                           --halt      Halt the machine
                        -p --poweroff  Switch off the machine
                           --reboot    Reboot the machine
                        -f --force     Force immediate halt/power-off/reboot
                        -w --wtmp-only Don't halt/power-off/reboot, just write wtmp record
                        -d --no-wtmp   Don't write wtmp record
                           --no-wall   Don't send wall message before halt/power-off/reboot
                      



                      Помимо очевидной проблемы с наивным кодом я усматриваю здесь ещё другую проблему. Группа Centos-admin рекомендует читателям и интегрируют клиентам такой дырявый шлак. Возникает большой вопрос насчёт их профессиональной пригодности.
                        0
                        Ещё два вектора атаки для побега:
                        https://github.com/ghantoos/lshell/issues/148
                        https://github.com/ghantoos/lshell/issues/149
                          0
                          https://github.com/ghantoos/lshell/issues/151

                          Больше, больше дыр. Автору стоило бы удалить это поделие и не позориться. Регексами синтаксис баша парсить, ну да, конечно.
                            –1
                            Заводя баги в багтрэкере дебиана, я предлагал как раз такое решение: заменить пакет на симлинк в /usr/sbin/nologin

                      Only users with full accounts can post comments. Log in, please.