Ограничение пользователя 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/maxroot обязательно должен быть владельцем домашней директории пользователя.
Теперь внизу конфига 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)
Roman:
мар 27, 2013 at 12:55
Автор, извини конечно, но ты тормоз. Кто захочет-тот скопирует при помощи FireBug или просмотрит исходный код страницы. Неужели ты думаешь что очень интересно перепечатывать конфиги посимвольно в свои? Вряд ли я когда то вернусь на этот сайт. Выпиливать js при помощи FireBug тоже не особо интересно.
makky:
мая 10, 2013 at 08:30
Самое важное для меня, чтобы вы поняли как это работает и смогли повторить без бездумного копипаста. Но штуку эту отключил, наверное и правда погорячился с ней.
Добавление комментариев закрыто.