فهرست مقاله
- ۱۲ راهکار برای افزایش امنیت nginx
- ۱- Nginx را همیشه آپدیت کنید
- ۲- حذف ماژولهای غیر ضروری در Nginx
- ۳- غیرفعال کردن گزینه server_tokens
- ۴- مسدودسازی HTTP User Agents در Nginx
- ۵- غیرفعال کردن متدهای غیر ضروری HTTP در NGINX
- ۶- تعیین محدودیت سایز بافر در Nginx
- ۷- محدودسازی تعداد IP متصل شده به Nginx
- ۸- فعال کردن Log در Nginx
- ۹- جلوگیری از Image Hotlinking در Nginx
- ۱۰- غیرفعال کردن SSL و فقط فعالسازی TLS در Nginx
- ۱۱- ساخت Certificate در Nginx
- ۱۲- ریدایرکت HTTP به HTTPS
شاید بعد از شنیدن مزایای Nginx نسبت به Apache شما همتصمیم گرفته باشید که وب سرور خودتان را با Nginx جایگزین کنید و آن را تست نمایید، در این صورت آموزش تأمین امنیت nginx به طور حتم برای شما مفید خواهد بود.
در این آموزش ۱۲ راهکار عملی برای امن کردن وب سرور nginx را به شما آموزش خواهیم داد که بعضی از آنها به وب سرور Apache نیز شباهت خواهند داشت.
۱۲ راهکار برای افزایش امنیت nginx
۱- Nginx را همیشه آپدیت کنید
در این لحظه که این آموزش را برای شما مینویسم ورژن آخر Nginx نسخه استیبل ۱٫۱۴ میباشد. سعی کنید به طور مداوم نسبت به آپدیت سرویسهای سرور مخصوصاً وب سرور اقدامات لازم و سریع را داشته باشید.
از دو طریق مخزن لینوکس و سورس کد میتوانید برای نصب و آپدیت nginx اقدام کنید. نصب از طریق مخزن بسیار راحتتر و بیدردسرتر است ولی نصب از طریق سورس هم دارای مزایای خاص خود از جمله بروزتر بودن و قابلیت Optimize کردن ماژولها میباشد.
۲- حذف ماژولهای غیر ضروری در Nginx
اگر بر روی وب سرور Nginx شما ماژولهای غیر ضروری وجود دارد که از آنها استفاده نمیکنید میتوانید به صورت زیر آنها را حذف کنید.
./configure --without-module1 --without-module2 --without-module3
در این حالت به جای *module نام ماژول را قرار دهید و دوباره Nginx را کامپایل کنید. مثال عملی این دستور به شکل زیر خواهد بود.
configure --without-http_dav_module –without-http_spdy_module/.
۳- غیرفعال کردن گزینه server_tokens
گزینه server_tokens به هنگام بروز خطا در nginx ورژن آن را به کاربر نمایش خواهد داد. با آگاهی هکر از ورژن Nginx و در صورت وجود حفره امنیتی به راحتی با اکسپلویت کردن حفره مهاجم میتواند به سرور شما نفوذ کند.
پس ما در مرحله اول سعی میکنیم تا جای ممکن از دادن اطلاعاتی که هکر را برای نفوذ کمک کند خودداری کنیم و جلوی این مورد را بگیریم.
server { ;listen 192.168.0.25:80 ;Server_tokens off ;server_name modireserver.com www.modireserver.com ;access_log /var/www/logs/modireserver.access.log ;error_log /var/www/logs/modireserver.error.log error ;root /var/www/modireserver.com/public_html ;index index.html index.htm }
برای غیرفعال کردن server_tokens مقدار آن را برابر off قرار دهید و بعد از ذخیره فایل برای اعمال تغییرات سرویس nginx را ریست کنید.
۴- مسدودسازی HTTP User Agents در Nginx
برای افزایش امنیت nginx توسط این برنامه بدافزارها و اسپمرها میتوانند به وب سرور nginx حمله کرده و منابع سرور شما را از بین ببرند.
برای غیرفعال کردن لیست user agent های مخرب، یک فایل در مسیر زیر بسازید و درون آن به شکل گفته شده لیست agent ها را قرار دهید.
etc/nginx/blockuseragents.rules/
map $http_user_agent $blockedagent { ;default 0 ;~*malicious 1 ;~*bot 1 ;~*backdoor 1 ;~*crawler 1 ;~*bandit 1 }
سپس خط زیر را قبل بلاک server قرار دهید.
;include /etc/nginx/blockuseragents.rules
حالا سرویس nginx را ریست کنید. در صورتی که هر user agent با بلک لیست تعیین شده مطابقت داشته باشد دسترسی آن به سرور مسدود خواهد شد و این مورد تاثیر قابل توجهی در امنیت nginx خواهد داشت.
برای تست عملکرد این مورد کافی است هر یک از کدهای زیر که مربوط به دستورات لینوکس هستند را در ترمینال وارد کنید.
wget http://192.168.0.25/index.htmlwget --user-agent "I am a bandit haha" http://192.168.0.25/index.html
آی پی ۱۹۲٫۱۶۸٫۰٫۲۵ در این مثال شناسه IP سرور ماست این عدد را با آی پی سرور خود جایگزین کنید.
در دستور اول خروجی Response Code 200 را بر خواهد گرداند ولی دستور دوم به دلیل اینکه string تعریف شده در فایل blacklist ما یعنی bandit آمده وب سرور دسترسی کاربر را به وب سرور مسدود خواهد کرد و کد ۴۰۳ Forbidden نمایش داده خواهد شد.
۵- غیرفعال کردن متدهای غیر ضروری HTTP در NGINX
برای عملکرد مناسب یک وب سرور و پاسخ به درخواستهای ارسالی سمت سایت ها کار کردن متدهای HEAD,GET,POST کافی خواهد بود و بهتر است مابقی متدها جهت افزایش امنیت nginx غیرفعال شوند.
با قرار دادن کد زیر درون بلاک server هر درخواستی به سمت متدهای غیر مجاز بلاک شده و پیام ۴۴۴ برگردانده خواهد شد.
if ($request_method !~ ^(GET|HEAD|POST)$) { return 444;}
برای تست می توانید توسط ابزار CURL دستور زیر را به سمت سرور ارسال کنید. در این روش از متد DELETE استفاده شده که جز متدهای غیر مجاز محسوب میشود.
curl -X DELETE http://192.168.0.25/index.htmlcurl -X POST http://192.168.0.25/index.html
۶- تعیین محدودیت سایز بافر در Nginx
برای جلوگیری از حملات buffer overflow در وب سرور nginx کافی است یک فایل در مسیر زیر ایجاد کنید.
etc/nginx/conf.d/buffer.conf/
سپس درون این فایل خطوط زیر را قرار دهید.
;client_body_buffer_size 1k ;client_header_buffer_size 1k ;client_max_body_size 1k ;large_client_header_buffers 2 1k
این قطعه کدها برای اطمینان از اینکه درخواستهای ارسالی توسط کاربران موجب ایجاد حملات سرریز بافر نمی شوند قرار داده شده است.
حالا برای اینکه این فایل به فایل کانفیگ nginx شناسانده شود باید خط زیر را درون فایل کانفیگ قرار دهید.
;include /etc/nginx/conf.d/*.conf
۷- محدودسازی تعداد IP متصل شده به Nginx
با استفاده از کدهای زیر میتوان تعداد درخواستهای همزمان هر آی پی به سمت وب سرور را جهت افزایش امنیت nginx و جلوگیری از حملات ddos درون بلاک های مشخص قرار دهید.
;limit_conn_zone $binary_remote_addr zone=addr:5m ;limit_conn addr 1
توسط دستور زیر میتوانید بعد از اعمال تغییرات بر روی وب سرور تستی را پیادهسازی کنید.
ab -n 10 -c 2 http://192.168.0.25/index.html
۸- فعال کردن Log در Nginx
در روش قبلی برای امنیت nginx ما توسط ابزار ab یک تست بر روی سرور انجام دادیم ولی نتیجه را نتوانستیم مشاهده کنیم برای اینکار می توانید از مسیر فایل لاگ که درون بلاک server تعریف شده لاگ را مورد ارزیابی دقیق قرار دهید.
با دستور زیر و با کمک از grep سعی میکنیم خروجی را در حالت بهینه مشاهده کنیم.
grep addr /var/www/logs/modireserver.error.log --color=auto
۹- جلوگیری از Image Hotlinking در Nginx
این مشکل زمانی رخ میدهد که فردی از یک سایت دیگر به عکس درون سایت شما لینک دهد و آن را به کاربران خودش نمایش دهد.
این مورد باعث هدر رفتن پهنای باند بهترین هاست و یا قوی ترین سرورها نیط خواهد شد و باعث خوشحالی فردی است که بدون قرار دادن عکس درون سرور خود از منابع سرور شما به نفع خودش استفاده میکند.
اگر به طور مثال شما در یک دایرکتوری با نام img عکسهای خود را قرار میدهید میتوانید با قرار دادن قطعه کد زیر در بخش virtual host فایل کانفیگ Nginx هر دسترسی خارج از localhost به عکسها را غیرفعال کنید.
location /img { ;valid_referers none blocked 192.168.0.25 if ($invalid_referer) { ;return 403 } }
۱۰- غیرفعال کردن SSL و فقط فعالسازی TLS در Nginx
در هر زمانی که توانستید استفاده SSL بر روی سرور را غیرفعال و به جای آن از TLS استفاده کنید.
با قرار دادن کد زیر در بلاک های server و یا http میتوانید TLS را فعال کنید.
;ssl_protocols TLSv1 TLSv1.1 TLSv1.2
۱۱- ساخت Certificate در Nginx
برای شروع یک key و یک Certificate بسازید. اگر بخواهید میتوانید از رمزنگاریهای دیگر هم استفاده کنید.
openssl genrsa -aes256 -out modireserver.key 1024 openssl req -new -key modireserver.key -out modireserver.csr cp modireserver.key modireserver.key.org openssl rsa -in modireserver.key.org -out modireserver.key openssl x509 -req -days 365 -in modireserver.csr -signkey modireserver.key -out modireserver.crt
حالا کد زیر را درون یک بلاک مجزای server قرار دهید.
server { ;listen 192.168.0.25:443 ssl ;server_tokens off ;server_name modireserver.com www.modireserver.com ;root /var/www/modireserver.com/public_html ;ssl_certificate /etc/nginx/sites-enabled/certs/modireserver.crt ;ssl_certificate_key /etc/nginx/sites-enabled/certs/modireserver.key ;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 }
۱۲- ریدایرکت HTTP به HTTPS
بعد از تغییرات مرحله قبل نوبت آن است با ریدایرکت HTTP به HTTPS ترافیک های ارسالی را فقط به سمت یک پروتکل ارجاع دهیم.
خط زیر را درون اولین بلاک server قرار دهید.
;return 301 https://$server_name$request_uri
این کد ترافیک های ارسالی به سمت پروتکل HTTP را به صورت ریدایرکت ۳۰۱ به پروتکل HTTPS هدایت خواهد کرد.