ivinnic
@ivinnic
Full-stack developer

Как валидно настроить права для nginx и php-fpm?

Добрый день!

По умолчанию nginx и php-fpm пользователь стоит www-data
Соответственно в папке сайта файлы должны принадлежать пользователю www-data или группе www-data

Но если я захожу в папку сайта как пользователь jack и создаю файл или папку, или запускаю git pull то соотвественно созданное имеет юзер и группу jack. Ну и nginx не имеет доступа.

Скажем у меня рабочий пользователь jack
Могу назначить владельца и группу jack на папку сайта а www-data добавить в группу jack и вроде бы решение. Но php-fpm будет создавать файлы под www-data и как то часть файлов будет с разными владельцами.

Как то не могу разобраться до конца как с этим работать правильно?

Буду благодарен если поделитесь опытом?

Спасибо
  • Вопрос задан
  • 1269 просмотров
Пригласить эксперта
Ответы на вопрос 3
Vamp
@Vamp
Добавьте пользователя jack в группу www-data (только группу сделайте дополнительной, а не основной), чтобы иметь доступ к файлам, генерируемым сайтом. Плюс к этому нужно выставить umask 0002 процессу php-fpm, чтобы php выставлял права на запись для своей группы в создаваемые сайтом файлы. Примеры как это сделать есть в интернете. Скрипты сайта и директории должны принадлежать пользователю jack с правми 755 для папок и 644 для файлов. А вот директории, в которые сайту необходимо писать для своего нормального функционирования (файловый кеш, скомпилированные шаблоны и прочие временные файлы), должны уже принадлежать пользователю www-data. Трогать пользователей в конфигурациях php и nginx не нужно.

Критически важно не давать пользователю www-data права на запись в скрипты и папки сайта. Благодаря чему уменьшается поверхность атаки. Чуть более подробно про безопасность можете прочитать в моём ответе на другой вопрос.

Также считается дурным тоном оставлять папку .git на продакшене.
Ответ написан
Sanes
@Sanes
!
Nginx тут не при чем. Это настраивается в пуле PHP-FPM.
PHP-FPM

[{{ username }}]
user = {{ username }}
group = {{ username }}
listen = /var/run/php/php{{ php }}-fpm-{{ username }}.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;php_flag[display_errors] = off
php_admin_value[error_log] = /var/www/{{ username }}/logs/fpm-php.{{ username }}.log
;php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 32M
php_admin_value[upload_max_filesize] = 100M
php_admin_value[post_max_size] = 100M
php_admin_value[open_basedir] = /var/www/{{ username }}/
php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source,stream_set_write_buffer,stream_socket_sendto,highlight_file,com_load_typelib
php_admin_value[upload_tmp_dir] = /var/www/{{ username }}/tmp
php_admin_value[soap.wsdl_cache_dir] = /var/www/{{ username }}/tmp

Nginx

server {
	listen 80;
	#listen [::]:80 default_server ipv6only=on;

	root /var/www/{{ username }}/www;
	index index.php index.html index.htm;

	server_name {{ domain }};

	location / {
		try_files $uri $uri/ =404;
        if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php?q=$1 last;
	    }
	}

	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		fastcgi_pass unix:/run/php/php{{ php }}-fpm-{{ username }}.sock;
		include fastcgi_params;
	}
	client_max_body_size 100M;
}

Ответ написан
VladimirAndreev
@VladimirAndreev
php web dev
1. Все файлы и папки от пользователя jack:jack, с правами 644 на файлы и 755 на директории.
2. Все директории, куда может писать сайт - создать от пользователя www-data:Jack, с теми же правами.
В целом, куда сайт должен писать - от www-data, куда не должен - прав не должно быть на уровне файловой системы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы