TGViewer
ServerAdmin.ru ServerAdmin.ru @srv_admin · 32.6K subscribers
Post #3848 10.7K
В работе веб сервера иногда есть необходимость разработчикам получить доступ к исходникам сайта напрямую. Проще всего и безопаснее это сделать по протоколу sftp. Эта на первый взгляд простая задача на деле может оказаться не такой уж и простой с множеством нюансов. В зависимости от настроек веб сервера, может использоваться разный подход. Я сейчас рассмотрю один из них, а два других упомяну в самом конце. Подробно рассказывать обо всех методах очень длинно получится.

Для примера возьму классический стек на базе nginx (angie) + php-fpm. Допустим, у нас nginx и php-fpm работают от пользователя www-data, исходники сайта лежат в /var/www/html. Владельцем файлов и каталогов будет пользователь и группа www-data. Типичная ситуация. Нам надо дать доступ разработчику напрямую к исходникам, чтобы он мог вносить изменения в код сайта.

Сразу предвижу комментарии на тему того, что так делать неправильно и в код лезть напрямую не надо. Я был бы только рад, если бы туда никто не лазил. Мне так проще управлять и настраивать. Но иногда надо и выбирать не приходится. Разработчиков выбираю не я, как и их методы работы.

Первым делом добавляю в систему нового пользователя, для которого не будет установлен shell. Подключаться он сможет только по sftp:

# useradd -s /sbin/nologin webdev
# passwd webdev

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

Находим в файле /etc/ssh/sshd_config строку и комментируем её:

#Subsystem   sftp  /usr/lib/openssh/sftp-server

Вместо неё добавляем:

Subsystem sftp internal-sftp -u 002
Match User webdev          
ChrootDirectory /var/www      
ForceCommand internal-sftp -u 002

Перезапускаем sshd:

# systemctl restart sshd

Если сейчас попробовать подключиться пользователем webdev, то ничего не получится. Особенность настройки ChrootDirectory в sshd в том, что у указанной директории владелец должен быть root, а у всех остальных не должно быть туда прав на запись. В данном случае нам это не помешает, но в некоторых ситуациях возникают неудобства. На остальных директориях внутри ChrootDirectory права доступа и владельцы могут быть любыми.

# chown root:root /var/www
# chmod 0755 /var/www

Теперь пользователь webdev может подключиться по sftp. Он сразу попадёт в директорию /var/www и не сможет из неё выйти дальше в систему. Осталось решить вопрос с правами. Я сделал так. Добавил пользователя webdev в группу www-data, а пользователя www-data в группу webdev:

# usermod -aG www-data webdev
# usermod -aG webdev www-data

Благодаря указанной umask 002 в настройках sshd все созданные пользователем webdev файлы будут иметь права 664 и каталоги 775. То есть будет полный доступ и у пользователя, и у группы. Так что веб сервер сможет нормально работать с этими файлами, и наоборот.

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

Если же вы заранее планируете прямой доступ к исходникам сайта или сайтов разными людьми или сервисами, то сделать лучше по-другому. Сразу создавайте под каждый сайт отдельного системного пользователя. Запускайте под ним php-fpm пул. Для каждого сайта он будет свой. Владельцем исходников сайта делайте этого пользователя и его группу. А пользователя, под которым работает веб сервер, добавьте в группу этого пользователя. Это более удобный, практичный и безопасный способ. Я его описывал в своей статье.

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

#webserver
  • 👍 92
  • 👎 8
More from @srv_admin
  1. Oct 16, 2026Сегодня у нас очередная пятница, так что можно поговорить на отвлечённые темы. Затрону одн…
  2. Oct 15, 2026Выделенный сервер для сайта от 5 810 ₽/мес. Если VPS уже не хватает, а переплачивать за мо…
  3. Oct 15, 2026Небольшая рекомендация по теме Zabbix. У них есть партнёр - initMAX. Это довольно популярн…
  4. Oct 14, 2026Один мой знакомый, читатель и автор своего небольшого канала поделился любопытной практиче…
  5. Oct 14, 2026Что будет, если убрать репликацию с диска?☁️ В K2 Cloud проверили и запустили сетевые нере…
  6. Oct 14, 2026Рассказываю про небольшой трюк, который я лично на днях проделал для решения небольшой зад…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →