LINUX.ORG.RU
ФорумAdmin

Как сделать, чтобы пользователь www-data имел доступ ко всему, что создаёт пользователь git?

 , ,


0

2

У меня установлен git. Я с компьютера редактирую файлы, а затем делаю

git add .
git commit -m "fromlocal"
git push origin master:master
pause

чтобы файлы оказались на сервере.

Всё хорошо до момента, папка я не создам папку и отправлю её на сервер. В данном случае есть папка video2, созданная на моём компьютере и отправленная через git. Если я захочу выполнить PHP скрипт, который записывает что-то в эту папку, то получу ошибку: Warning: file_put_contents(video2/2.dav): Failed to open stream: Permission denied

Если я сделаю chown -R www-data /var/www, то ошибка уйдёт до того момента, пока я снова не грузану на сервер новую папку.

ChatGPT предложил добавить пользователя www-data в группу git. После этого я потерял доступ к ssh у пользователя git. Когда удалил его из группы - всё вернулось.

$ groups git
git : git www-data
$ groups www-data
www-data : www-data
$ ls -l /var/www/web/cam
total 44
-rw-rw-r-- 1 www-data git 20340 Mar 21 16:07 engine.php
-rw-rw-r-- 1 www-data git    47 Mar 21 02:04 index.php
-rw-rw-r-- 1 www-data git   821 Mar 21 04:57 mjpg.php
-rw-rw-r-- 1 www-data git   276 Mar 21 15:37 test.php
drwxrwxr-x 2 www-data git  4096 Mar 21 15:49 video
drwxrwxr-x 2 git      git  4096 Mar 21 16:43 video2
-rw-rw-r-- 1 www-data git   385 Mar 21 02:10 webapp.php

Перемещено hobbit из general

Ответ на: комментарий от MrBackToPython

ChatGPT предложил добавить пользователя www-data в группу git.

Первое, что приходит в голову, это добавить пользователя www-data в группу git

t184256 ★★★★★
()

Без контекста и без объяснени, почему добавление в группулевого юзера что-то поломало: я бы setfacl’ом налепил недостающих прав да и дело с концом.

t184256 ★★★★★
()
Ответ на: комментарий от accountnujen

Покажи команды, которые ты вводишь.

anonymous
()
Ответ на: комментарий от accountnujen

Репорт уровня «когда я смотрю налево перед переходом дороги, справа её перебегает слон». Кроме как «так не должно быть» и «нет никакой связи» нам сказать нечего.

t184256 ★★★★★
()
Ответ на: комментарий от Aster

Автор не может нормально написать что делал, хотя пришёл за помощью, и те, у кого он эту помощь просит должны теперь гадать?

ChatGPT предложил добавить пользователя www-data в группу git.

Он пишет, что ему ИИ предложил добавить пользователя www-data в группу git, а не пользователя git в группу www-data.

Но что сделал именно автор темы неизвестно.

Вот и я теперь гадаю, стараясь привести к некоторой ясной картине всё, что здесь написано автором и остальными гадающими.

Это же весело.

anonymous
()

Как сделать, чтобы пользователь www-data имел доступ ко всему, что создаёт пользователь git?

Не надо так делать. Хотя я, как и остальные, не понимаю почему у тебя сломался доступ после добавления www-data в группу, но даже если б он не ломался - это плохое решение.

Правильное - это хранить где-то настройки прав для конкретных директорий (например ту же video2) и применять их после обновления файлов гитом.

firkax ★★★★★
()

Сделай скрипт для деплоя, в котором укажи все директории, которым нужно сделать chown. Делать writable для пыха сами же пхп файлы это небезопасная практика. Одним днём тебя через нее поимеют. Аналогично плохая практика держать пхп скрипты в world readable директории. Есть же стандартный layout директорий

src/
web/
vendor/
logs/
tmp/
...
cobold ★★★★★
()
Ответ на: комментарий от anonymous

Вот и я теперь гадаю, стараясь привести к некоторой ясной картине всё, что здесь написано автором и остальными гадающими.

Покажи команды, которые ты вводишь.

всё, что я ввожу, есть в вопросе.

где-то в конфиге ssh есть DenyGroups www-data ?

нет, только host, ip, user и сам ключ

accountnujen
() автор топика
Ответ на: комментарий от accountnujen

Вероятно (могу только предполагать), проблема в том, что домашний каталог для git прописан как /var/www/web/cam (или где-то внутри /var/www), при этом владельцем и домашним каталогом является /var/www у пользователя www-data и права на доступ предоставлены только ему:

...
-rw------- . www-data www-data . . . /var/www
...

, исключая группы. Как только прописываете владельца всех подкаталогов у /var/www на www-data, то в каталоге .ssh аналогично меняется владелец, и, смею предположить, права на authorized_keys остаются только для владельца -rw-------, коим становится www-data, а не git.

Для решения проблемы отсутствия доступа у git после смены владельца - оставить юзера git как владельца своим домашним каталогом (chown -R git /var/www/web/cam например), для домашнего у www-data сменить права для доступа группам на чтение:

...
-rw-r----- . www-data www-data . . . /var/www
...

В этом случае правильно, git должен состоять в группе www-data.

И использовать git для бинарных файлов (видео) такое себе, но это не мое дело.

MrBackToPython
()
Последнее исправление: MrBackToPython (всего исправлений: 3)
Ответ на: комментарий от MrBackToPython

что домашний каталог для git прописан как /var/www/web/cam

нет, домашний каталог в папке home. Пользователь git - это пользователь созданный через adduser git

И использовать git для бинарных файлов (видео) такое себе, но это не мое дело

git не видит бинарники. он работает с php скриптами, которые обрабатывают эти бинарники. после обработки бинарники удаляются

Для решения проблемы отсутствия доступа у git после смены владельца - оставить юзера git как владельца своим домашним каталогом (chown -R git /var/www/web/cam например), для домашнего у www-data сменить права для доступа группам на чтение:

я получаю хрень, когда php не может записывать в папку /var/www/web/cam/video . А если я выдаю права только www-data, то я уже пару раз ловил вот такие ошибки

warning: unable to unlink 'cam/log/engine_23-03-2024_04-59-04.html': Permission denied
warning: unable to unlink 'cam/log/engine_23-03-2024_05-25-20.html': Permission denied
warning: unable to unlink 'cam/log/stream.html': Permission denied
error: unable to create file cam/log/.gitkeep: Permission denied

у меня замкнутый круг. я сейчас нахожусь в крайне непоследовательной ситуации. У меня есть владелец папки www-data. Внутри этой папки пользователь, который находится внутри этой же группы www-data, создаёт другую папку и www-data теряет над ней контроль. Где логика? Если 100% земли принадлежит мне, то какого лешего баня, построенная на моём участке, не принадлежит мне? Да, её строили узбеки, я давал им ключи от калитки, но я не переписывал на них баню. Баня моя. Х*ли меня в неё не пускают?

accountnujen
() автор топика
Последнее исправление: accountnujen (всего исправлений: 1)
Ответ на: комментарий от accountnujen

нет, домашний каталог в папке home.

Тогда не очень ясно про отвал git пользователя, после добавления его в группу. Либо и правда есть в конфигурации sshd (например, в подкаталоге /etc/ssh/sshd_config.d/ в одном из файлов) строка DenyGroups www-data. Но не суть.

Где логика? Если 100% земли принадлежит мне, то какого лешего баня, построенная на моём участке, не принадлежит мне?

А логика здесь проста. Отправляя изменения через git используется пользователь, с которого выполнен вход на сервер (например, git). Следственно, на каталоги будут установлены/восстановлены - пользователь git и права для него, которые указаны при commit’е.

Поэтому и предлагаю добавить пользователя www-data в группу git, и дополнительно перед коммитом и отправкой изменений на сервер указывать правильные права для пользовательской ГРУППЫ на файлы и каталоги (для каталогов добавляя - на запись и на исполнение, для файлов - а тут все зависит от того, как они используются).

MrBackToPython
()
Последнее исправление: MrBackToPython (всего исправлений: 2)
Ответ на: комментарий от MrBackToPython

Либо и правда есть в конфигурации sshd

папка sshd_config.d пустая, однако:

$ cat /etc/passwd | grep www-data
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

по всей видимости, что если www-data становится участником группы - все участники группы получают nologin.

перед коммитом и отправкой изменений на сервер указывать правильные права для пользовательской ГРУППЫ на файлы и каталоги

не холхоз, не? Давай опустим мою реализацию с синхронизацией файлов. Давай просто представим. Вот есть у нас пользователь Admin. Ему подконтрольна папка D:/work. Внутри этой папки может работать пользователь Vasya (папка расшарена по локальной сети): создавать, читать, удалять. Почему если Vasya создаст папку D:/work/docs, то Admin не может в ней ничего писать? Ведь D:/work принадлежит Админу.

accountnujen
() автор топика
Ответ на: комментарий от accountnujen

хрень вообще какая-то. ну вот я делаю: устанавливаю права 770

chown -R 770 /var/www # владелец может всё, группа может всё, остальные идут лесом

Далле делаю git владельцем всего, что в /var/www

chown -R git:www-data /var/www # Владелец git, а группа www-data

Открываю сайт - ошибка 404.

Делаю тогда наоборот:

chown -R git:www-data /var/www # Владелец www-data, группа git

сайт открывается без ошибки. Почему, когда владелец группы www-data - сам пользователь www-data доступа не имеет? Это же нелогично.

Ну и сразу, чтобы не было глупых вопросов:

listen = /var/run/php/cloud.sock
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
accountnujen
() автор топика
Ответ на: комментарий от kostik87

Включи на файловой системе расширение acl и через setfacl назначь права.

я выше писал, что делал. безрезультатно

accountnujen
() автор топика
Ответ на: комментарий от kostik87

nginx

2024/03/23 22:08:32 [crit] 697#697: *1981 stat() "/var/www/web/index.php" failed (13: Permission denied)

а где логи php смотреть? если /var/log/php8.3-fpm.log , то там ничего нет, вчерашний перезапуск

accountnujen
() автор топика
Ответ на: комментарий от accountnujen
ls -ls /var/www/html/index.php
4 -rw-r--r-- 1 root root 22 Mar 23 22:25 /var/www/html/index.php

В index.php вызов

<?php
phpinfo(); 
?>

WEB-сервер nginx.

Всё отрабатывает.

У тебя проблема в скриптах которые делают что-то ещё.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от accountnujen

Так /var/www является домашним для пользователя www-data. Будет отказ вообще в каких-либо обращениях к каталогу и подкаталогам, если сменить владельца у домашнего каталога.

Внутри, у подкаталогов менять только владельца на git и оставлять группу www-data, тогда может сработать

MrBackToPython
()
Последнее исправление: MrBackToPython (всего исправлений: 1)
Ответ на: комментарий от MrBackToPython

Всё отрабатывает. У тебя проблема в скриптах которые делают что-то ещё.

Я ради интереса дал всей папке root root и сайт также не работает, однако у меня есть ещё один мой сервер. И там даже если выдать root root, то всё открывается, однако там права 775 (по смыслу почти как у тебя), то есть все пользователи могут читать. Тут же возникает вопрос: а кто у нас там такой умный помимо www-data, кому нужно файл читать? Вот ты ради интереса забери права на чтение.

chmod -R 770 /var/www

и посмотри, будет ли у тебя что-то работать? у тебя тоже ничего не откроется, убеждён.

Внутри, у подкаталогов менять только владельца на git и оставлять группу www-data, тогда может сработать

Я же пишу, что именно так и не работает. Меня это тоже смущает, что всё непоследовательно. Работает только если владелец файла www-data. Если владелец файла root (кто угодно), а группа www-data, то я ловлю 404 ошибку.

accountnujen
() автор топика
Ответ на: комментарий от accountnujen

Я ради интереса дал всей папке root root и сайт также не работает

Зачем? Процесс HTTP сервера работает же от пользователя www-data, но никак не root, он тогда точно не будет иметь прав и возможности прочитать данные

MrBackToPython
()
Ответ на: комментарий от accountnujen

Если владелец файла root (кто угодно), а группа www-data, то я ловлю 404 ошибку

Потому что домашний каталог пользователя www-data должен пренадлежать ТОЛЬКО ЕМУ, а внутренние подкаталоги и файлы - не обязательно

MrBackToPython
()
Ответ на: комментарий от MrBackToPython

Потому что домашний каталог пользователя www-data должен пренадлежать ТОЛЬКО ЕМУ

нет.

chown -R git:www-data /var/www
chown www-data:www-data /var/www

403 Forbidden ошибка, как видите уже другая, но суть остаётся прежней.

Чтобы убрать ошибку - я должен сделать

chown -R www-data:www-data /var/www

но я хочу иметь у пользователя git права на всю херню

accountnujen
() автор топика
Ответ на: комментарий от accountnujen

Назначь через setfacl права для пользователя www-data и для пользователя git.

В setfacl есть понятие прав по умолчанию, т.е. наследуемых прав.

Тебе нужно настроить права по умолчанию, чтобы для пользователя www-data были права rwx и одновременно для пользователя git были права rwx.

А командой chown выстави владельцем www-data при авторизации по ssh ключам с директорией .ssh в домашней директории пользователя git нужно напротив убрать наследование и доступ в неё должен иметь только пользователь git.

anonymous
()
Ответ на: комментарий от accountnujen

Как ты хочешь сделать делается через полноценный GIT сервис с функцией CICD.

anonymous
()
Ответ на: комментарий от accountnujen

Символ «+» указывает, что есть расширенные права, выставленные через setfacl.

anonymous
()
Ответ на: комментарий от accountnujen

Как-то резко 403 за место какой-то из 404 появилась. Плутае, плутаем и плутаем…

но я хочу иметь у пользователя git права на всю херню

Сменить у www-data оболочку на любой из shell’ов, создать в sshd

Match www-data
    PasswordAuthentication no
    PubkeyAuthentication no

и добавить пользователя git в группу www-data

MrBackToPython
()
Ответ на: комментарий от MrBackToPython

Символ «+» указывает, что есть расширенные права, выставленные через setfacl.

вот это достал из истории.

setfacl -m u:www-data:rwx /var/www
setfacl -d -m u:www-data:rw /var/www
setfacl -R -m u:www-data:rw /var/www

затем сделал вот это

setfacl -bR /var/www

и плюс ушёл, как и 403-404 ошибка. Разумеется главная проблема не ушла. Если я от имени git создам папку в дочерней к www-data директории, то www-data не будет иметь к ней доступ.

Как-то резко 403 за место какой-то из 404 появилась. Плутае, плутаем и плутаем…

плутаем…

и добавить пользователя git в группу www-data

ну это же сюр! ну тогда уже создать нового пользователя, которого прописать в php сокет (если я правильно понял, что тот, кто в сокете прописан - тот и выполняет) и одновременно от его имени грузить файлы с ПК. Грубо говоря, git прописать в сокет.

accountnujen
() автор топика
Ответ на: комментарий от accountnujen

Сделай по другому и не мучайся. Положи SSH ключи для пользователя www-data в /var/www/.ssh. Сделай пользователя www-data владельцем файлов в /var/www/html рекурсивно.

Проинициализируй от пользователя www-data там где тебе нужно относительно /var/www/web гит. Настрой на своей машине, откуда делаешь push на сервер удалённое подключение от имени пользователя www-data, т.е. вместо git@server сделай www-data@server. И далее делай push.

anonymous
()
Ответ на: комментарий от anonymous

По сути тебе даже инициализировать не нужно просто сменить рекурсивно владельца на www-data и переподключить remote на локальной машине относительно домашней директории www-data.

anonymous
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.