با توجه به اینکه ممکن است یکی از وب سایت های روی سرور شخصی شما مورد نفوذ قرار بگیرد و … توصیه میشود که هر وب سایت را در یک محیط jailed شده قرار دهید تا در صورتی که حتی وب سایت شما مورد نفوذ قرار گرفت ، شخص نفوذگر نتواند به دیگر وب سایت های روی سرور نفوذ کند …
( این آموزش برای سرور های بدون کنترل پنل کاربردی است . )
ابتدا اقدام به اضافه کردن مخازن Nginx میکنیم .
deb http://nginx.org/packages/mainline/debian/ stretch nginx
deb-src http://nginx.org/packages/mainline/debian/ stretch nginx
حال اقدام به اضافه کردن کلید هایی که پکیچ nginx با آن sign شده میکنیم :
root@webhost:~# wget -O- -q http://nginx.org/keys/nginx_signing.key | apt-key add –
حال برای نصب آن اقدام نمایید
root@webhost:~# apt-get updateroot@webhost:~# apt-get install nginx
نوبت به نصب php-fpm میرسد :
root@webhost:~# apt-get install php7.0-fpm
اقدامات زیر برای تک تک یوزر هایی که قرار است روی این سرور قرار بگیرند نیاز است
root@webhost:~# mkdir /home/wwwroot@webhost:~# useradd -b /home/www -k /dev/null -m username
root@webhost:~# cd /home/www/<username> root@webhost:~# mkdir chroot root@webhost:~# mkdir chroot/data root@webhost:~# mkdir chroot/log root@webhost:~# mkdir chroot/tmp root@webhost:~# mkdir chroot/tmp/misc root@webhost:~# mkdir chroot/tmp/session root@webhost:~# mkdir chroot/upload root@webhost:~# mkdir chroot/wsdl root@webhost:/home/www/<username># chown -R root:<username> chroot/ root@webhost:/home/www/<username># chmod 0010 chroot/ root@webhost:/home/www/<username># chmod 0070 chroot/data root@webhost:/home/www/<username># chmod 0030 chroot/log root@webhost:/home/www/<username># chmod 0010 chroot/tmp root@webhost:/home/www/<username># chmod 0030 chroot/tmp/*
حال اقدام برای ایجاد pool اختصاصی php-fpm برای هر یوزر میکنیم :
nono /etc/php/7.0/fpm/pool.d/<username>.conf
[<username>] user = $pool group = $pool listen = /var/run/php-fpm-$pool.sock listen.owner = nginx listen.group = nginx pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 pm.status_path = /php-fpm-status ping.path = /php-fpm-ping access.log = /home/www/$pool/chroot/log/php-fpm-pool.log slowlog = /home/www/$pool/chroot/log/php-fpm-slow.log request_slowlog_timeout = 15s request_terminate_timeout = 20s chroot = /home/www/$pool/chroot/ chdir = / ; Flags & limits php_flag[display_errors] = off php_admin_flag[log_errors] = on php_admin_flag[expose_php] = off php_admin_value[memory_limit] = 32M php_admin_value[post_max_size] = 24M php_admin_value[upload_max_filesize] = 20M php_admin_value[cgi.fix_pathinfo] = 0 php_admin_value[disable_functions] = apache_child_terminate,apache_get_modules,apache_get_version,apache_getenv,apache_lookup_uri,apache_note,apache_request_headers,apache_reset_timeout,apache_response_headers,apache_setenv,getallheaders,virtual,chdir,chroot,exec,passthru,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,shell_exec,system,chgrp,chown,disk_free_space,disk_total_space,diskfreespace,filegroup,fileinode,fileowner,lchgrp,lchown,link,linkinfo,lstat,pclose,popen,readlink,symlink,umask,cli_get_process_title,cli_set_process_title,dl,gc_collect_cycles,gc_disable,gc_enable,get_current_user,getmygid,getmyinode,getmypid,getmyuid,php_ini_loaded_file,php_ini_scanned_files,php_logo_guid,php_sapi_name,php_uname,sys_get_temp_dir,zend_logo_guid,zend_thread_id,highlight_file,php_check_syntax,show_source,sys_getloadavg,closelog,define_syslog_variables,openlog,pfsockopen,syslog,nsapi_request_headers,nsapi_response_headers,nsapi_virtual,pcntl_alarm,pcntl_errno,pcntl_exec,pcntl_fork,pcntl_get_last_error,pcntl_getpriority,pcntl_setpriority,pcntl_signal_dispatch,pcntl_signal,pcntl_sigprocmask,pcntl_sigtimedwait,pcntl_sigwaitinfo,pcntl_strerror,pcntl_wait,pcntl_waitpid,pcntl_wexitstatus,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,posix_access,posix_ctermid,posix_errno,posix_get_last_error,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_initgroups,posix_isatty,posix_kill,posix_mkfifo,posix_mknod,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname,setproctitle,setthreadtitle,shmop_close,shmop_delete,shmop_open,shmop_read,shmop_size,shmop_write,opcache_compile_file,opcache_get_configuration,opcache_get_status,opcache_invalidate,opcache_is_script_cached,opcache_reset ; Session php_admin_value[session.entropy_length] = 1024 php_admin_value[session.cookie_httponly] = on php_admin_value[session.hash_function] = sha512 php_admin_value[session.hash_bits_per_character] = 6 php_admin_value[session.gc_probability] = 1 php_admin_value[session.gc_divisor] = 1000 php_admin_value[session.gc_maxlifetime] = 1440 ; Pathes php_admin_value[include_path] = . php_admin_value[open_basedir] = /data/:/tmp/misc/:/tmp/upload/:/dev/urandom php_admin_value[sys_temp-dir] = /tmp/misc php_admin_value[upload_tmp_dir] = /tmp/upload php_admin_value[session.save_path] = /tmp/session php_admin_value[soap.wsdl_cache_dir] = /tmp/wsdl php_admin_value[sendmail_path] = /bin/sendmail -f -i php_admin_value[session.entropy_file] = /dev/urandom php_admin_value[openssl.capath] = /etc/ssl/certs
یک فایل تست ایجاد و پرمیشن /مالکیت ها را ست میکنیم
root@webhost:/home/www/<username>/chroot/data# chown <username>:<username> test.php
root@webhost:/home/www/<username>/chroot/data# chmod 0640 test.php
root@webhost:/home/www/<username>/chroot/data# usermod -a -G <username> nginx
حال برای ساخت virtualhost اقدام میفرمایید :
/etc/nginx/conf.d/<username>.conf
.username.conf
server { listen 0.0.0.0:80; listen [::]:80; server_name <username>.web.example.com; root /home/www/<username>/chroot/data; index index.html index.htm index.php; location / { try_files $uri $uri/ =404; } location ~ \.php$ { try_files $uri =404; include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php-fpm-<username>.sock; fastcgi_param SCRIPT_FILENAME /data$fastcgi_script_name; } }
در آخر اقدام به ریستارت php-fpm , nginx میکنیم
systemctl restart php7.0-fpm
systemctl restart nginx
نکته : بجای username نام کاربر مورد نظر را قرار دهید …
در تصویر زیر مشاهده میفرمایید که هر php-pool های جدا ایجاد و ران شده است .