web-dev-qa-db-ja.com

複数のユーザーのためのnginxとphpを使用したFreeBSDの適切な権限

Nginxを使用してマルチユーザーのFreeBSDサーバーをセットアップしようとしています。

これまでの私の手順は次のとおりです。

/usr/local/etc/nginx/nginx.confファイルで、nginxがwwwグループの一部であるwwwユーザーとして機能するようにuser www www;を設定しました。また、user = wwwgroup = www/usr/local/etc/php-fpm.confを設定しました。

私が達成したいのは、(管理者として)ユーザーをシステムに追加し、ユーザーが使用できるように/usr/local/wwwにユーザー用のフォルダー(およびもちろんnginx.confの対応するサーバーエントリ)を作成できることです。共有ホスティング環境に少し似ています(自動セットアップなし)。

Nginxとphpをインストールした後、最初のテストユーザーanonを作成し、彼用のフォルダー/usr/local/www/anonsiteを作成しました。

次に、chown anon:www anonsiteを実行して彼を所有者にし、グループをwwwに設定すると、フォルダーのアクセス許可は次のようになります:drwxr-xr-x 3 anon www 4 Apr 11 22:00 anonsite

このフォルダーにanonとしてinfo.phpを作成し、ブラウザーでそれを指すようになりました。次に、ダウンロードと抽出をテストしました grav ですが、空白のページしか表示されません(権限の設定が間違っているためだと思います)。 php-fpm.conf user=anonを変更すると、意図したとおりに機能します。または、ダウンロードしたgravフォルダーを抽出した後、chmod -R g+w /usr/local/www/anonsiteを使用すると、同様に機能します。

そして、これは私が現在立ち往生していて頭を包むことができないところです。これらの「修正」はどちらも、私には間違っているか悪い習慣のように思えます。セットアップを使用している共有ホストプロバイダーと比較すると、そこにあるwebrootフォルダーにはdrwxr-x--- 5 username Apache 4096 Apr 2 05:00 username権限しかなく、gravテストセットアップを抽出した後、すぐに機能します(これは、Apacheの動作方法によるものでしょうか? )。

誰かが私にそれが事実である理由を説明し、おそらくこれを適切に設定するための手順、または私が間違っていることを私に説明してもらえますか?

私が試したアプローチは、全体的に悪い習慣と見なされていますか?

1
Jessica Nowak

nginxは、ファイルのグループ所有者をnginxユーザーとして明示的に設定しなくても、必要に応じてファイルを読み取ることができる可能性があります。
そしてphp-fpmの場合、nginxユーザーをリスナーとして設定するだけです。
php-fpm.d/php-fpm-user1.conf

[grav]
user = user1
group = use1

listen = /var/run/php-fpm-user1.sock

listen.owner = www
listen.group = www

pm = dynamic 
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

php.ini
cgi.fix_pathinfo=0

nginx.conf

user www;
worker_processes auto;
worker_rlimit_nofile 8192; # should be bigger than worker_connections
pid /run/nginx.pid;

events {
    use kqueue; # No epoll on FreeBSD
    worker_connections 8000;
    multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    keepalive_timeout 30; # longer values are better for each ssl client, but take up a worker connection longer
    types_hash_max_size 2048;
    server_tokens off;

    # maximum file upload size
    # update 'upload_max_filesize' & 'post_max_size' in /etc/php5/fpm/php.ini accordingly
    client_max_body_size 32m;
    # client_body_timeout 60s; # increase for very long file uploads

    # set default index file (can be overwritten for each site individually)
    index index.html;

    # load MIME types
    include mime.types; # get this file from https://github.com/h5bp/server-configs-nginx
    default_type application/octet-stream; # set default MIME type

    # logging
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # turn on gzip compression
    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 256;
    gzip_types
        application/atom+xml
        application/javascript
        application/json
        application/ld+json
        application/manifest+json
        application/rss+xml
        application/vnd.geo+json
        application/vnd.ms-fontobject
        application/x-font-ttf
        application/x-web-app-manifest+json
        application/xhtml+xml
        application/xml
        font/opentype
        image/bmp
        image/svg+xml
        image/x-icon
        text/cache-manifest
        text/css
        text/plain
        text/vcard
        text/vnd.rim.location.xloc
        text/vtt
        text/x-component
        text/x-cross-domain-policy;

    # disable content type sniffing for more security
    add_header "X-Content-Type-Options" "nosniff";

    # force the latest IE version
    add_header "X-UA-Compatible" "IE=Edge";

    # enable anti-cross-site scripting filter built into IE 8+
    add_header "X-XSS-Protection" "1; mode=block";

}
server {
    #listen 80;
    index index.html index.php;

    ## Begin - Server Info
    root /home/user1/www/html;
    server_name localhost;
    ## End - Server Info

    ## Begin - Index
    # for subfolders, simply adjust:
    # `location /subfolder {`
    # and the rewrite to use `/subfolder/index.php`
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    ## End - Index

    ## Begin - Security
    # deny all direct access for these folders
    location ~* /(\.git|cache|bin|logs|backup|tests)/.*$ { return 403; }
    # deny running scripts inside core system folders
    location ~* /(system|vendor)/.*\.(txt|xml|md|html|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ { return 403; }
    # deny running scripts inside user folder
    location ~* /user/.*\.(txt|md|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ { return 403; }
    # deny access to specific files in the root folder
    location ~ /(LICENSE\.txt|composer\.lock|composer\.json|nginx\.conf|web\.config|htaccess\.txt|\.htaccess) { return 403; }
    ## End - Security

    ## Begin - PHP
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php-fpm-user1.sock;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
    ## End - PHP
}`
1
Stuart Gray