Ограниченная оболочка для управления файлами и git-репозиториями

8

Подумайте о компании веб-хостинга, которая хочет позволить пользователям управлять файлами и репозиториями git через ssh. Это включает в себя:

  • защищенная копия (scp)
  • создание, копирование, перемещение / переименование и удаление файлов
  • выполнение небольшого набора команд для управления исходным кодом и редактирования текста (git, vim, nano)

Мы хотели бы реализовать это и рассмотрели следующие варианты:

Это позволит использовать часть scp, но использование git не представляется возможным. В Launchpad есть патч , но я не уверен, что с ним делать. Существует также git-shell , но она не позволяет редакторам. Может быть, vim даже слишком много, потому что он может быть использован для выполнения большего количества кода, поэтому мы можем отбросить его (vim или текстовые редакторы полностью, если это необходимо), если его слишком много.

Мы в основном хотим заблокировать оболочку, чтобы пользователь мог управлять (и редактировать) файлы и репозитории git, но пользователь не должен иметь возможности выполнять какие-либо другие программы в системе. Самой большой проблемой было бы злоупотребление сетевыми и вычислительными ресурсами, но использование системы в качестве прокси-сервера. Вы называете это. Есть ли способ сделать это, или у нас может быть даже неправильный подход к этой проблеме?

Phillipp
источник

Ответы:

8

У вас есть два дополнительных способа реализовать это:

Предоставление пользователям разрешений на gitудаленное использование репозиториев

Используется gitolite3для предоставления схемы репозиториев Hub-Live (это подробно описано здесь ), для которой в основном требуется наличие bareрепозитория (репозитория- концентратора ), позволяющего пользователям извлекать / извлекать и извлеченную версию того же репо. ( живой репо), расположенный на соответствующем пути, скажем /srv/www/html, например.

Мне нравится использовать gitolite3для управления репозитарием концентратор , но это не является обязательным требованием, хотя довольно удобно иметь детальный контроль доступа, привязанный к вашему выбору LDAP, если это необходимо. gitolite3может обеспечить детальный контроль вплоть до уровня филиала.

Также рекомендуется ограничивать возможности gitolite3пользователя с помощью sudoи обрабатывать перехваты с помощью sudoвызовов. Это рабочий пример использования gitolite3хуков (не стесняйтесь их адаптировать - или улучшать / исправлять - в соответствии с вашими потребностями):

  • Соответствующее содержание /etc/sudoersили /etc/sudoers.d/gitolite3будет что-то вроде:

    Cmnd_Alias        GITOLITE_CMDS = /usr/bin/git, /bin/chown, /bin/find, /usr/bin/xargs, /bin/chmod, /sbin/restorecon, /usr/local/sbin/publisher-hub2live
    Cmnd_Alias GITOLITE_APACHE_CMDS = /usr/sbin/apachectl graceful
    Defaults:gitolite3 !requiretty
    Defaults:gitolite3 lecture=never
    gitolite3                ALL = (root)NOPASSWD: GITOLITE_CMDS
    gitolite3       APACHE_HOSTS = (root)NOPASSWD: GITOLITE_APACHE_CMDS
    
  • Хаб Репо post-updateКрюк:

    #!/bin/sh
    
    echo "****"
    echo "**** Calling publisher-hub2live script [Hub's post-update hook]"
    echo "****"
    
    sudo /usr/local/sbin/publisher-hub2live "/srv/www/html" "root:apache" "2750" "640"
    
    exit 0
    
  • publisher-hub2live сценарий:

    #!/bin/sh
    
    echo "****"
    echo "**** Pulling changes into Live [publisher-hub2live]"
    echo "****"
    
    cd "$1" || exit
    umask 0022
    unset GIT_DIR
    /usr/bin/git pull hub master
    
    # custom actions here
    # e.g call grunt tasks
    /bin/chown -R "$2" "$1"
    /bin/find "$1" -type d -exec chmod "$3" {} +
    /bin/find "$1" -type f -exec chmod "$4" {} +
    /bin/chmod u+x "$1"/.git/hooks/post-commit
    /sbin/restorecon -R -v "$1"
    exec /usr/bin/git update-server-info
    
    exit 0
    

Ограничение возможности выполнения неавторизованных команд в оболочке входа

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

Это не обязательно, но это помогает, если ваши пользователи зарегистрированы в LDAP, и вы уже развернули механизмы для выполнения аутентификации LDAP, будь то с помощью модуля PAM или с помощью freeIPA и sssd.

Для реализации этого сценария в настоящее время я делаю следующее (имейте в виду, что для такого рода ограничений необходимо выполнение нескольких условий, в противном случае ограничение можно легко обойти):

  • Пользователи не принадлежат к wheelгруппе, единственной авторизованной для использования su(применяется через PAM). Обычно существует не-LDAP пользователь ( sysadm), который позволяет доверенным администраторам выполнять действия в случае аварийного восстановления или недоступности LDAP.
  • Пользователям предоставляется надлежащая защита rbashс доступной только для чтения переменной PATH, указывающей на частную ~/bin, этот ~/bin/каталог содержит ссылки на все разрешенные команды, например:

    $ ll ~/bin
    total 0
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear*
    lrwxrwxrwx. 1 root dawud  7 Sep 17 08:58 df -> /bin/df*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep*
    lrwxrwxrwx. 1 root dawud  8 Sep 17 08:58 env -> /bin/env*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep*
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 git -> /usr/bin/git*
    lrwxrwxrwx. 1 root dawud  9 Sep 17 08:58 grep -> /bin/grep*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo*
    lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail*
    lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
    
  • что пользователи получают ограниченный, только для чтения окружающей среды (думаю такие вещи , как LESSSECURE, TMOUT, HISTFILEпеременных). Это делается для того, чтобы избежать shellпобегов из таких команд, как lessи обеспечить возможность аудита.

  • единственный разрешенный редактор - rvimпо той же причине. Пользователи могут только выполнять sudoedit, которые настроены для запуска rvimв sudoконфигурации:

    Defaults editor=/usr/bin/rvim
    
  • если установлены ограничения MAC (в конкретном используемом дистрибутиве GNU / Linux включен SELinux), пользователи сопоставляются с пользователем SELinux staff_uи получают права на выполнение команд от имени другого пользователя в соответствии с требованиями sudo. Необходимо sudorulesразрешить тщательный анализ конкретной разрешенной версии, чтобы пользователь не смог обойти эти ограничения, а также может быть развернут в существующей инфраструктуре LDAP (это одна из функций freeIPA).

  • пользователи /home, /tmpи, возможно /var/tmp, полиинстанцируются через /etc/security/namespace.conf:

    /tmp       /tmp/.inst/tmp.inst-$USER-     tmpdir:create   root
    /var/tmp   /tmp/.inst/var-tmp.inst-$USER- tmpdir:create   root
    $HOME      $HOME/$USER.inst/              tmpdir:create   root
    

    Полиинсталляция каталогов не является новой функцией, она доступна уже довольно давно. В качестве ссылки см. Эту статью с 2006 года . На самом деле, многие модули уже используют pam_namespaceпо умолчанию, но конфигурация по умолчанию в /etc/security/namespace.confне включает полианализацию. Также /etc/security/namespace.initследует сделать все скелетные файлы доступными только для чтения пользователям и принадлежать им root.

Таким образом, вы можете выбрать, могут ли пользователи выполнять какую-либо команду от своего имени (через ссылку в личном ~/binкаталоге, предоставляемую через /etc/skel, как описано выше), от имени другого пользователя (через sudo) или вообще без нее.

Дауд
источник