It-e.RU
Цифровой двигатель вашего бизнеса.

Ограничение пользователя SSH домашней директорией

Ограничение пользователя SSH домашней директорией

Ограничение пользователя SSH домашней директорией


Сделал небольшое обновление хостинга. Очень часто бывает удобно и производить файловые операции на сервере, например закачивать по одному долго и неудобно, снимать дамп баз данных и делать прочие действия. Давать для этого полноценный ssh не очень интерсно, потому что пользователь сможет бродить по моей системе и, если у меня где-то выставлены не совсем правильные права, сможет получить данные, которые он получать не должен. И опять комбинация встроенных средств unix-like помогает нам успешно решить эту задачу.

Будем делать ssh chroot. Создадим юзера:

  pw useradd max -d /usr/home/max -s /bin/sh
  passwd max
  mkdir /usr/home/max
  chown root:max /usr/home/max 
root обязательно должен быть владельцем домашней директории пользователя.
Теперь внизу конфига sshd /etc/ssh/sshd_config, определим индивидуальные настройки для пользователя:
        Match User max
                ChrootDirectory /usr/home/max
                X11Forwarding no
                AllowTcpForwarding no
Ну и перечитываем конфиг:
        $ /etc/rc.d/sshd reload
Теперь можно попробовать зайти под логином пользователя и понять, что ssh не работает. А не работает потому что никаких команд в системе нет, то есть можно использовать только sftp. Но мы хотим, чтобы был доступен терминал с необходимым для работы набором команд. Поэтому можно, как это принято в мире unix, пойти двумя путями: Подмонтируем все что нужно в фс пользователя:
 
 mount_nullfs /bin /home/max/bin
 mount_nullfs /sbin /home/max/sbin
 mount_nullfs /lib /usr/home/max/lib
 mount_nullfs /libexec /home/max/libexec
 mount_nullfs /usr/bin /home/max/usr/bin
 mount_nullfs /usr/sbin /home/max/usr/sbin
 mount_nullfs /usr/lib /usr/home/max/usr/lib
 mount_nullfs /usr/libexec /usr/home/max/usr/libexec
 mount_nullfs /usr/local/bin /home/max/usr/local/bin
 mount_nullfs /usr/local/sbin /home/max/usr/local/sbin
 mount_nullfs /usr/local/lib /usr/home/max/usr/local/lib
 mount_nullfs /usr/local/libexec /usr/home/max/usr/local/libexec
Но при таком подходе некоторые данные будут доступны, которые, пользователю знать не обязятельно. Например, команда df или ifconfig.

Поэтому можно четко определить, что минимально необходимо пользователю и создать жесткие ссылки. Но этот способ не будет работать, если используется более одного раздела, а используется почти всегда используется более одного раздела, потому что нужна кластеризация, удаленные фс и тому подобное, поэтому делаем директорию /home/chrootuser и туда скопируем необходимый набор команд. У меня он получился такой:
/bin/cat
/bin/chmod
/bin/cp
/bin/csh
/bin/date
/bin/echo
/bin/ln
/bin/ls
/bin/mkdir
/bin/mv
/bin/pwd
/bin/rm
/bin/rmdir
/bin/sh
/usr/bin/awk
/usr/bin/bzip2
/usr/bin/diff
/usr/bin/du
/usr/bin/ee
/usr/bin/fetch
/usr/bin/find
/usr/bin/grep
/usr/bin/gunzip
/usr/bin/gzip
/usr/bin/less
/usr/bin/sed
/usr/bin/sort
/usr/bin/tail
/usr/bin/tar
/usr/bin/touch
/usr/bin/vi
/usr/local/bin/bash
/usr/local/bin/mc
/usr/local/bin/mcedit
/usr/local/bin/mcmfmt
/usr/local/bin/mysql
/usr/local/bin/mysqldump
/usr/local/bin/unrar
/usr/local/bin/unzip
Теперь мы получили некий аналог директории /etc/skel только у нас не файлы, которые будут в домашней директории, а скелет системы, которую увидит пользователь. Дальше воспользуемся специальной фс union:
    mount_unionfs -o branch=RO /home/chrootuser /home/max
Эта, крайне полезная фс, которая позволяет представлять расположенные в разных местах данные, представлять в некой директории. Эта фс имеет очень много самых невероятных возможностей, но нам сейчас необходимо, чтобы внутри домашней директории пользователя появились необходимые команды, кроме того эти команды должны быть с аттрибутом "только чтение". В противном случае злоумышленник может произвести замену, уже общих для всех пользователей, системных файлов.
Отлично, теперь мы смогли войти в систему. Набор команд ограничен, все что необходимо конечный пользователь может делать. Самое важное, что все это выполнено при помощи встроенных средств, которые будут обновляться вместе с системой и не нужно отдельно следить за дополнительным ПО.

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

#!/bin/sh
chpath=/usr/home/chrootuser

mkdir -p /usr/home/max/home/max/www
mkdir -p /usr/home/max/home/max/mysql
mkdir -p /usr/home/max/home/max/mail
chown -R max:max /usr/home/max/home
chmod -R 770 /usr/home/max/home


mkdir /usr/home/chrootuser/etc
mkdir /usr/home/chrootuser/tmp
cp  /etc/termcap.small /home/chrootuser/etc/
cp  /etc/termcap /home/chrootuser/etc/
chmod -R 777 /usr/home/chrootuser/tmp
mkdir /usr/home/chrootuser/libexec
cp /libexec/ld-elf.so.1 /usr/home/chrootuser/libexec/
mkdir -p /usr/home/max/usr/local/libexec/mc/mkdir -p /usr/home/chrootuser/usr/local/share/  
cp -R /usr/local/share/mc /usr/home/chrootuser/usr/local/share/
cp -R /usr/local/libexec/mc/extfs.d /home/chrootuser/usr/local/libexec/mc/
mkdir -p /home/chrootuser/usr/local/etc/mc
cp -R /usr/local/etc/mc /home/chrootuser/usr/local/etc/

for c in `cat chcommands`
 do
        mkdir -p $chpath`dirname $c`
        cp $c $chpath`dirname $c`

        for i in `ldd $c | awk '{print $3}'`
         do
                mkdir -p $chpath`dirname $i`
                echo
                echo $i --- $c --- $dname
                echo
                cp $i $chpath$i
        done
done

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

Пожалуйста, уважайте труд автора, при копировании материалов сохраняйте ссылку на источник!

Комментарии (2)

  1. Roman:
    мар 27, 2013 at 12:55

    Автор, извини конечно, но ты тормоз. Кто захочет-тот скопирует при помощи FireBug или просмотрит исходный код страницы. Неужели ты думаешь что очень интересно перепечатывать конфиги посимвольно в свои? Вряд ли я когда то вернусь на этот сайт. Выпиливать js при помощи FireBug тоже не особо интересно.

  2. makky:
    мая 10, 2013 at 08:30

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



Добавление комментариев закрыто.