ساخت وب سایت های ایزوله شده در NGINX با PHP-FPM

ساخت وب سایت های ایزوله شده در NGINX با PHP-FPM

با توجه به اینکه ممکن است یکی از وب سایت های روی سرور شخصی شما مورد نفوذ قرار بگیرد و … توصیه میشود که هر وب سایت را در یک محیط jailed  شده قرار دهید تا در صورتی که حتی وب سایت شما مورد نفوذ قرار گرفت ، شخص نفوذگر نتواند به دیگر وب سایت های روی سرور نفوذ کند …

( این آموزش برای سرور های بدون کنترل پنل کاربردی است . )

 

ابتدا اقدام به اضافه کردن مخازن  Nginx  میکنیم .

 

/etc/apt/sources.list

deb http://nginx.org/packages/mainline/debian/ stretch nginx

deb-src http://nginx.org/packages/mainline/debian/ stretch nginx

 

حال اقدام به اضافه کردن کلید هایی که پکیچ nginx  با آن sign  شده میکنیم :

 

[email protected]:~# wget -O- -q http://nginx.org/keys/nginx_signing.key | apt-key add –

 

 

حال برای نصب آن اقدام نمایید

 

[email protected]:~# apt-get [email protected]:~# apt-get install nginx

 

 

نوبت به نصب php-fpm  میرسد :

 

[email protected]:~# apt-get install php7.0-fpm

 

 

اقدامات زیر برای تک تک یوزر هایی که قرار است روی این سرور قرار بگیرند نیاز است

 

[email protected]:~# mkdir /home/[email protected]:~# useradd -b /home/www -k /dev/null -m username

 

[email protected]:~# cd /home/www/<username>
[email protected]:~# mkdir chroot
[email protected]:~# mkdir chroot/data
[email protected]:~# mkdir chroot/log
[email protected]:~# mkdir chroot/tmp
[email protected]:~# mkdir chroot/tmp/misc
[email protected]:~# mkdir chroot/tmp/session
[email protected]:~# mkdir chroot/upload
[email protected]:~# mkdir chroot/wsdl

[email protected]:/home/www/<username># chown -R root:<username> chroot/
[email protected]:/home/www/<username># chmod 0010 chroot/
[email protected]:/home/www/<username># chmod 0070 chroot/data
[email protected]:/home/www/<username># chmod 0030 chroot/log
[email protected]:/home/www/<username># chmod 0010 chroot/tmp
[email protected]:/home/www/<username># chmod 0030 chroot/tmp/*

 

حال اقدام برای ایجاد pool  اختصاصی php-fpm  برای هر یوزر میکنیم :

 

nono /etc/php/7.0/fpm/pool.d/<username>.conf

 

username.confusername.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

 

یک فایل تست ایجاد و پرمیشن /مالکیت ها را ست میکنیم

 

[email protected]:/home/www/<username>/chroot/data# chown <username>:<username> test.php

[email protected]:/home/www/<username>/chroot/data# chmod 0640 test.php

[email protected]:/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 های جدا ایجاد و ران شده است .

 

pools

واکنش شما چیست؟
+1
1
+1
+1
+1
+1
+1
+1
2
برچسب‌ها:,

نظر دهید

آدرس ایمیل شما منتشر نخواهد‌شد.