ایمن سازی وب سرویس Nginx در لینوکس

Nginx یک وب سرور و پروکسی معکوس ( Reverse Proxy ) با کارایی بالا می باشد. از این رو ایمن سازی وب سرور Nginx اهمیت پیدا می کند.

 

این وب سرور بر روی سیستم عامل های UNIX, GNU/Linux ، Mac OS X ، Solaris و Microsoft Windows اجرا می شود.

امروزه Nginx حدود ۱۴ درصد از وب سرور های سطح اینترنت را تشکیل می دهد.

همچنین Nginx برای پاسخ به درخواست کاربران از متد های جدیدی استفاده می کند و به درخواست کاربران در وب سایت های پر ترافیک جهان مانند WordPress و Github پاسخ می دهد.

در این پست به بررسی نکاتی جهت افزایش امنیت Nginx در Linux می پردازیم …

کانفیگ و پورت پیش فرض Nginx

فایل پیشفرض پیکربندی وب سرور Nginx با نام nginx.conf در مسیرهای زیر موجود است :

/usr/local/nginx/conf/

/etc/nginx/

همچنین document ها در مسیر های زیر موجود می باشند :

/usr/local/nginx/html/

/var/www/html

و لاگ فایل Nginx نیز در مسیر های زیر قابل دسترسی است :

/usr/local/nginx/logs/

/var/log/nginx

و وضعیت پورت های آن به صورت زیر می باشد :

  • Nginx HTTP default port : TCP 80
  • Nginx HTTPS default port : TCP 443

می توانید تغییرات پیکربندی nginx را با دستور زیر تست کنید :

# nginx -t

که خروجی آن مانند زیر است :

the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful

برای بارگیری دوباره تغییرات پیکربندی دستور زیر را اجرا کنید :

# nginx -s reload

همچنین با دستور زیر می توانید وب سرور را متوقف کنید :

# nginx -s stop

۱- SELinux را فعال کنید

Security-Enhanced Linux (SELinux) یک ویژگی هسته لینوکس است که مکانیزمی را برای پشتیبانی از سیاست های امنیتی و کنترل دسترسی فراهم می کند.

که می تواند حملات بسیاری را قبل از اینکه دسترسی ریشه ( Root ) گرفته شود را متوقف کند.

نحوه فعال کردن SELinux در سیستم های CentOS / RHEL :

getsebool -a | less
getsebool -a | grep off
getsebool -a | grep on

۲- کانفیگ sysctl.conf در لینوکس

می توانید تنظیمات هسته و شبکه را در لینوکس با پیکربندی فایل /etc/sysctl.conf کنترل کنید.

# Avoid a smurf attack
net.ipv4.icmp_echo_ignore_broadcasts = 1
 
# Turn on protection for bad icmp error messages
net.ipv4.icmp_ignore_bogus_error_responses = 1
 
# Turn on syncookies for SYN flood attack protection
net.ipv4.tcp_syncookies = 1
 
# Turn on and log spoofed, source routed, and redirect packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
 
# No source routed packets here
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
 
# Turn on reverse path filtering
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
 
# Make sure no one can alter the routing tables
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
 
# Don't act as a router
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
 
 
# Turn on execshild
kernel.exec-shield = 1
kernel.randomize_va_space = 1
 
# Tuen IPv6
net.ipv6.conf.default.router_solicitations = 0
net.ipv6.conf.default.accept_ra_rtr_pref = 0
net.ipv6.conf.default.accept_ra_pinfo = 0
net.ipv6.conf.default.accept_ra_defrtr = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.default.dad_transmits = 0
net.ipv6.conf.default.max_addresses = 1
 
# Optimization for port usefor LBs
# Increase system file descriptor limit
fs.file-max = 65535
 
# Allow for more PIDs (to reduce rollover problems); may break some programs 32768
kernel.pid_max = 65536
 
# Increase system IP port limits
net.ipv4.ip_local_port_range = 2000 65000
 
# Increase TCP max buffer size setable using setsockopt()
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
 
# Increase Linux auto tuning TCP buffer limits
# min, default, and max number of bytes to use
# set max to at least 4MB, or higher if you use very high BDP paths
# Tcp Windows etc
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1

 

۳- ایمن سازی وب سرویس Nginx : حذف ماژول های اضافی Nginx

یکی از ساده ترین راه ها برای ایمن سازی وب سرویس Nginx حذف ماژول های اضافی است که ممکن است دارای آسیب پذیری باشند.

هر چقدر از ماژول های کمتری استفاده کنید ، ریسک به وجود آمدن آسیب پذیری کمتر می شود.

به عنوان مثال برای غیر فعال کردن ماژول های SSI و autoindex به این صورت عمل می کنیم :

# ./configure --without-http_autoindex_module --without-http_ssi_module
# make
# make install

همچنین با دستور زیر می توانید ببینید که هنگام اجرای وب سرور Nginx کدام یک از ماژول ها را می توانید فعال یا غیرفعال کنید :

# ./configure --help | less

خلاصه تمام ماژول هایی که مورد نیاز نیستند را حذف کنید .

۴- Monitoring nginx 

با فعال سازی وضعیت Stub  می توانید تعداد در خواست های کاربر را مشاهده کنید و اطلاعات اضافی دیگری را استخراج کنید.

 

۵- ایمن سازی وب سرویس Nginx : استفاده از HTTPS

کاربران خود را مجبور کنید تا بطور پیش فرض از HTTPS  استفاده کنند.

 

۶- ایمن سازی وب سرویس Nginx : فعال سازی فیلتر Cross-site scripting (XSS) 

دستور زیر را در فایل nginx.conf بنویسید تا فیلتر XSS فعال شود.

add_header X-XSS-Protection "1; mode=block";

 

۷- غیر فعال کردن Sniffing نوع محتوا در برخی مرورگر ها

دستور زیر را در فایل nginx.conf بنویسید:

add_header X-Content-Type-Options nosniff;

 

۸- ایمن سازی وب سرویس Nginx : جلوگیری از clickjacking

دستور زیر را در فایل nginx.conf بنویسید:

add_header X-Frame-Options SAMEORIGIN;

 

۹- ایمن سازی وب سرویس Nginx : آپدیت نگه داشتن نرم افزار ها

شما باید دائما نرم افزار ها و هسته ی سیستم عامل لینوکسی خود را آپدیت کنید.

بنا به نوع توزیع لینوکسی خود می توانید از پکیج منیجرهای زیر استفاده کنید :

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo yum update

 

۱۰- اتصالات خروجی Nginx را محدود کنید

کرکرها (Cracker) فایل های محلی روی سرور را با استفاده از ابزار هایی مانند wget دانلود می کنند.

برای بستن اتصالات خارجی از iptables استفاده کنید. rule زیر را به iptables خود اضافه کنید : 

/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

 

۱۱- محدود سازی تعداد درخواست های هر IP در فایروال

یک وب سرور باید به دقت هر درخواست را پردازش کند و محدود سازی در مورد درخواست ها داشته باشد.

iptables و pf می توانند در خواست های کاربران را قبل از رسیدن به Nginx کنترل کنند.

 

۱۲- ایمن سازی وب سرویس Nginx : ایمن سازی PHP و Nginx

PHP یکی از زبان های برنامه نویسی محبوب تحت وب می باشد . جهت ایمن سازی PHP نصب شده بر روی Nginx فایل /etc/php.ini را ادیت کنید :

# Disallow dangerous functions
disable_functions = phpinfo, system, mail, exec
 
## Try to limit resources  ##
 
# Maximum execution time of each script, in seconds
max_execution_time = 30
 
# Maximum amount of time each script may spend parsing request data
max_input_time = 60
 
# Maximum amount of memory a script may consume (8MB)
memory_limit = 8M
 
# Maximum size of POST data that PHP will accept.
post_max_size = 8M
 
# Whether to allow HTTP file uploads.
file_uploads = Off
 
# Maximum allowed size for uploaded files.
upload_max_filesize = 2M
 
# Do not expose PHP error messages to external users
display_errors = Off
 
# Turn on safe mode
safe_mode = On
 
# Only allow access to executables in isolated directory
safe_mode_exec_dir = php-required-executables-path
 
# Limit external access to PHP environment
safe_mode_allowed_env_vars = PHP_
 
# Restrict PHP information leakage
expose_php = Off
 
# Log all errors
log_errors = On
 
# Do not register globals for input data
register_globals = Off
 
# Minimize allowable PHP post size
post_max_size = 1K
 
# Ensure PHP redirects appropriately
cgi.force_redirect = 0
 
# Disallow uploading unless necessary
file_uploads = Off
 
# Enable SQL safe mode
sql.safe_mode = On
 
# Avoid Opening remote files
allow_url_fopen = Off

 

۱۳- ایمن سازی وب سرویس Nginx : پیکربندی SSL در Nginx

HTTP یک پروتکل رمز نگاری داده های کاربر و سایت می باشد که از مانیتورینگ اطلاعات کاربر جلوگیری می کند.

 

۱۴- محدودیت های دایرکتوری

شما می توانید برای دسترسی به دایرکتوری ها محدودیت اعمال کنید.

محدود سازی بر اساس IP

location /docs/ {
  ## block one workstation
  deny    192.168.1.1;

  ## allow anyone in 192.168.1.0/24
  allow   192.168.1.0/24;

  ## drop rest of the world
  deny    all;
}

محدود سازی با رمز عبور

# mkdir /usr/local/nginx/conf/.htpasswd/
# htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd vivek

فایل پیکربندی nginx.conf را نیز باید ویرایش کنید :

### Password Protect /personal-images/ and /delta/ directories ###
location ~ /(personal-images/.*|delta/.*) {
  auth_basic  "Restricted";
  auth_basic_user_file   /usr/local/nginx/conf/.htpasswd/passwd;
}

بعد از ایجاد پرونده رمز عبور با دستور زیر می توانید کاربران را اضافه کنید :

# htpasswd -s /usr/local/nginx/conf/.htpasswd/passwd userName

 

۱۵- ایمن سازی وب سرویس Nginx : جلوگیری از Hotlink خوردن تصاویر

همانطور که شما در وب سایتتان از تصاویر روی هاست خود استفاده می کنید، فرد دیگری نیز می تواند با ارسال درخواست به هاست و سرور شما از آن تصاویر استفاده کند.

که می تواند منابع سرور شما را اشغال کند؛ برای جلوگیری از این عمل از دستور زیر استفاده نمایید :

# Stop deep linking or hot linking
location /images/ {
  valid_referers none blocked www.example.com example.com;
   if ($invalid_referer) {
     return   403;
   }
}

 

۱۶- بلاک کردن اسپم های ارجاعی

اسپم های ارجاعی برای سئوی (SEO) سایت شما خطرناک است. لذا می تواند Spam Score سایت را افزایش داده و افت رتبه داشته باشید. 

با کد زیر می توانید از آن جلوگیری کنید :

## Deny certain Referers ###
     if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) )
     {
         # return 404;
         return 403;
     }
##

 

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *