اطلاعیه

بستن
No announcement yet.

راهنمای امن کردن و بهبود Performance در وب سرور Nginx

بستن
X
 
  • فیلتر کردن
  • زمان
  • نمایش
Clear All
پست های جدید

    راهنمای امن کردن و بهبود Performance در وب سرور Nginx

    بر اساس چیزهای فوق العاده ای که درباره Nginx شنیده اید، احتمالا بخواهید کار با آن را تجربه کنید. حتی شاید بعد از مطالعه چند مقاله در این زمینه که ما در این سایت منتشر کرده ایم، آنقدر از آن خوشتان بیاید که تصمیم به جایگزین کردن Nginx با Apache خود بگیرید.
    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Nginx-Security-Hardening-Tips.png نمایش ها:	1 اندازه:	14.6 KB شناسه:	20057


    در این صورت، مطمئنم از این راهنما با آغوش باز استقبال خواهید کرد چرا که قصد داریم 12 نکته برای افزایش امنیت سرورهای Nginx شما (اعم از تمام راه های به روزرسانی Nginx با استفاده از TLS و تغیر مسیر از HTTP به HTTPS) ارائه دهیم و شما متوجه خواهید شد که بعضی از آن موارد بسیار شبیه آنچه با Apache انجام می دهید است.

    همچنین توصیه میشود مطالعه کنید.

    13 ترفند برای امن کردن وب سرور آپاچی در لینوکس

    25 ترفند موثر از فایل ".htaccess" برای امن کردن و بهبود Performance سایت ها در Apache

    پسورد گذاشتن روی (فولدر، پوشه، دایرکتوری) در وب سرور انجین ایکس


    محیط تست Nginx
    ما در این آموزش از محیط زیر استفاده می کنیم :
    • Debian GNU/Linux 8.1 - jessie.
    • IP address: 192.168.0.25 برای (tecmintlovesnginx.com)

    و

    192.168.0.26 برای (nginxmeanspower.com)

    همانطور که در بخش هاست های مجازی IP-based توضیح داده شد.
    راه اندازی Virtual Hosting بر پایه Name و بر پایه IP در وب سرور Nginx
    • Nginx ورژن : nginx/1.6.2.
    • برای راحتی کار شما می توانید فایل کانفیگ نهایی را از اینجا دریافت کنید. (Pastebin link)


    با توجه به موارد بالا، شروع کنیم.


    نکته شماره 1 : Nginx را آپدیت نگه دارید

    در حال حاضر، آخرین ورژن Nginx در CentOS (در EPEL) و در ریپازیتوری Debian، به ترتیب 1.6.3 و 1.6.2-5 هستند.
    اگرچه نصب نرم افزار از مخازن راحت تر از کامپایل برنامه از source code است، اما گزینه ی دوم دو مزیت دارد :

    1) به شما اجازه می دهد تا برای Nginx ماژول های اضافی نصب کنید (همچون mod_security)
    و
    2) همیشه یک ورژن جدیدتر از ریپازیتوری ها فراهم می کند (1.9.9 تا امروز). این نکات همیشه در وب سایت Nginx دردسترس می باشد.

    همچنین توصیه میشود مطالعه کنید.

    مقابله با حملات DDOS و Brute Force با استفاده از ماژول های Mod_Security و Mod_evasive



    نکته شماره 2 : ماژول های غیرضروری در Nginx را حذف کنید

    برای حذف ماژول های نصب شده از سورس در Nginx به شرح زیر عمل کنید :
    کد:
    # ./configure --without-module1 --without-module2 --without-module3
    برای مثال :
    کد:
    # ./configure  --without-http_dav_module --withouthttp_spdy_module
    همانطور که احتمالا حدس می زنید، حذف ماژول های Nginx نصب شده از سورس، نیاز به اجرای دوباره ی compilation دارد.


    پیغام هشدار : دستورالعمل های کانفیگ توسط ماژول ها فراهم می شود. مطمئن شوید، ماژولی که حاوی دستور مورد نیازتان هست راغیرفعال نکنید. شما باید قبل از اینکه تصمیمی در رابطه با غیرفعال کردن ماژول ها بگیرید، nginx docs را برای لیست دستورات موجود در هر ماژول چک کنید.



    نکته شماره 3 : دستور server_tokens در Nginx را غیرفعال نمائید

    دستور server_tokens به Nginx می گوید تا ورژن فعلی خود را در صفحات error نمایش دهد. بدیهی است که شما به دلیل جلوگیری از حملات ناشی از آسیب پذیری های شناخته شده در آن ورژن خاص web server خود، نمی خواهید آن اطلاعات را با دنیا به اشتراک بگذارید،.

    برای غیرفعال کردن دستور server_tokens، داخل یک server block آنرا off کنید :
    کد:
    server {
    listen       192.168.0.25:80;
    Server_tokens        off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    access_log  /var/www/logs/tecmintlovesnginx.access.log;
    error_log  /var/www/logs/tecmintlovesnginx.error.log error;
    root   /var/www/tecmintlovesnginx.com/public_html;
    index  index.html index.htm;
    }
    Nginx را Restart کنید تا تغییرات اعمال شود.

    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Hide-Nginx-Version.png نمایش ها:	1 اندازه:	6.7 KB شناسه:	20045



    نکته شماره 4 : HTTP User Agents در Nginx را Deny کنید

    HTTP user agent، نرم افزاری است که برای content negotiation در مقابل یک web server استفاده می شود. همچنین شامل malware botها و crawlerهایی که ممکن است به تحت تاثیر قرار دادن عملکرد web server شما با اتلاف منابع سیستم منتهی شود.

    برای راحتی بیشتر، لیست undesired user agents را حفظ کنید، یک فایل ( بطور مثال /etc/nginx/blockuseragents.rules) با محتویات زیر بسازید :
    کد:
    map $http_user_agent $blockedagent {
    default         0;
            ~ malicious     1;
            ~ bot           1;
            ~ backdoor      1;
            ~ crawler       1;
            ~ bandit        1;
    }
    سپس، قبل از تعریف server block خط زیر را قرار دهید:
    کد:
    include /etc/nginx/blockuseragents.rules;
    و اگر رشته user agent در black list در بالا تعریف شده باشد، یک دستور شرطی جواب 403 را بر می گرداند :

    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Disable-User-Agents-in-Nginx.png نمایش ها:	1 اندازه:	5.2 KB شناسه:	20046


    Nginx را Restart کنید و همه user agentهایی که string شان با مورد بالا تطابق دارد، دسترسی به web server شما را بلاک خواهد کرد. 192.168.0.25 را با IP سرور خود جایگزین کنید و string متفاوتی برای سوئیچ --user-agent از دستور wget را انتخاب کنید:
    کد:
    # wget http://192.168.0.25/index.html
    # wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html
    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Block-User-Agents-in-Nginx.png نمایش ها:	1 اندازه:	25.1 KB شناسه:	20047



    نکته شماره 5 : متدهای ناخواسته HTTP در Nginx را غیرفعال کنید
    متدهای http همانند افعال یک جمله ، action های دلخواه را که روی یک resource مربوط به nginx انجام می شوند را نمایش می دهد.
    برای وب سایت ها و برنامه های رایج، شما باید تنها GET، POST و HEAD را مجاز کنید و تمام دستورات دیگر را غیرفعال کنید.
    برای انجام این کار، خطوط زیر را داخل یک server block قرار دهید.

    پاسخ 444 HTTP به معنی یک پاسخ خالی (empty response) است و اغلب برای فریب دادن malware attackها در Nginx استفاده می شود :
    کد:
    if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 444;
    }
    برای تست، از curl برای ارسال درخواست DELETE استفاده کنید و خروجی را زمانی که به طور منظم GET را ارسال می کنید؛ مقایسه کنید :
    کد:
    # curl -X DELETE http://192.168.0.25/index.html
    # curl -X POST http://192.168.0.25/index.html
    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Disable-Unwanted-HTTP-Requests.png نمایش ها:	1 اندازه:	12.7 KB شناسه:	20048



    نکته شماره 6 : محدودیت های Buffer Size در Nginx را تنظیم کنید

    برای جلوگیری از حملات buffer overflow در مقابل Nginx web server شما، دستورات زیر را در یک فایل جداگانه قرار دهید (برای مثال، فایل جدیدی به نام /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;
    دستورات بالا، اطمینان می دهند که درخواست های ساخته شده برای web server شما، منجر به buffer overflow در سیستم شما نخواهد شد. برای جزئیات بیشتر به docs (بر روی آنچه هریک از آنها انجام می دهد) مراجعه کنید.

    سپس یک دستور include در فایل کانفیگ اضافه کنید:
    کد:
    include /etc/nginx/conf.d/*.conf;
    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Set-Buffer-Size-in-Nginx.png نمایش ها:	1 اندازه:	2.3 KB شناسه:	20049



    دستور شماره 7 : تعداد کانکشن های IP در Nginx را محدود کنید

    برای محدود کردن کانکشن ها IP، از دستورات limit_conn_zone (در یک http context یا در حداقل خروجی server block) و limit_conn (در یک http، server block یا location context) استفاده کنید.

    با این حال، به خاطر داشته باشید که همه کانکشن ها قابل شمارش نیستند - اما تنها آنهایی که درخواست پردازش شده از server و request headerکامل دارند؛ خوانده می شوند.

    برای مثال، بگذارید حداکثر کانکشن ها معادل 1 تنظیم شود (بله، این اغراق آمیز است، اما در این مورد، کار را به نحوه احسن انجام می دهد) در یک zone به نام addr (می توانید هر نامی که می خواهید را بر روی آن بگذارید) :
    کد:
    limit_conn_zone $binary_remote_addr zone=addr:5m;
    limit_connaddr 1;
    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Limit-Number-of-HTTP-Requests-in-Nginx.png نمایش ها:	1 اندازه:	5.3 KB شناسه:	20050


    یک تست ساده با Apache Benchmark (اجرای Nginx Load) و درمجموع 10 کانکشن با 2 درخواست همزمان به ما کمک می کند تا نکته مورد نظرخودمان را نشان دهیم :
    کد:
    # ab -n 10 -c 2 http://192.168.0.25/index.html
    برای اطلاعات بیشتر، نکته بعد را ببینید.



    نکته شماره 8 : Monitor Logها را برای Nginx نصب کنید

    وقتی تست توضیح داده شده در نکته قبل را اجرا کردید، error logای که برای server block تعریف شده است را چک کنید :

    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Monitor-Nginx-Logs.png نمایش ها:	1 اندازه:	6.9 KB شناسه:	20051


    ممکن است بخواهید از grep برای فیلتر لاگ ها به منظور failed requestهای ایجاد شده برای تعریف addr zone در نکته شماره 7 استفاده کنید :
    کد:
    # grepaddr /var/www/logs/tecmintlovesnginx.error.log --color=auto
    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Nginx-Log-Monitoring.png نمایش ها:	1 اندازه:	34.4 KB شناسه:	20052


    به همین ترتیب، شما می توانید access log را برای کسب اطلاعات مورد علاقه، فیلتر کنید، از جمله :
    • Client IP
    • نوع مرورگر
    • منابع مورد درخواست
    • نوع HTTP request
    • پاسخگویی به درخواست Server block (اگر چندیدن virtual host همزمان به یک فایل لاگین کنند، مفید خواهد بود).


    و اگر هرگونه فعالیت غیرمعمول و یا ناخواسته را تشخیص دادید؛ اقدامی مناسب کنید.



    نکته شماره 9 : مانع از Image Hotlinking در Nginx شوید

    Image hotlinking زمانی رخ می دهد که یک نفر در سایت های دیگر، image ی را از سایت شما به نمایش بگذارد. این امر سبب افزایش استفاده از پهنای باند شما (که برای آن هزینه کرده اید) می شود، در حالی که فرد دیگری با خوشحالی تصویری را به نمایش می گذارد که آن را جزو دارایی خود می داند. به عبارت دیگر، ضرر دوبرابر برای شما است.

    به عنوان مثال، فرض کنید یک زیر دایرکتوری به نام img در server block خود دارید که تمام تصاویر مورد استفاده در آن virtual host را در آن ذخیره کرده اید. برای جلوگیری از دیگر سایت ها برای استفاده از تصاویر شما، لازم است location block زیر را در virtual host تعریف شده خود، قرار دهید :
    کد:
    location /img/ {
    valid_referers none blocked 192.168.0.25;
    if ($invalid_referer) {
    return   403;
       }
    }
    سپس فایل index.html را در هر یک از virtual hostهای زیر، تغییر دهید :
    کد:
    192.168.0.25
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=”utf-8″>
    <title>Tecmint loves Nginx</title>
    </head>
    <body>
    <h1>Tecmint loves Nginx!</h1>
    <img src=”img/nginx.png” />
    </body>
    </html>
    ########################

    کد:
    192.168.0.26
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=”utf-8″>
    <title>Nginx means power</title>
    </head>
    <body>
    <h1>Nginx means power!</h1>
    <img src=”http://192.168.0.25/img/nginx.png” />
    </body>
    </html>
    اکنون هریک از سایت ها را در browser باز کنید و همانطور که می بینید، تصاویر به درستی در 192.168.0.25 نمایش داده می شود اما در 192.168.0.26 به صفحه ای با پاسخ 403 منتقل می شوید :

    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Disable-Nginx-Image-Hotlinking.png نمایش ها:	1 اندازه:	19.3 KB شناسه:	20053


    دقت کنید که این نکته به بروزر ریموت که فیلد مربوطه را ارسال میکند بستگی دارد.




    نکته شماره 10 : SSL را غیرفعال و تنها TLS را در Nginx فعال کنید

    درصورت امکان، هر کاری که مانع SSL در هر یک از ورژن های آن و در عوض استفاده از TLS می شود؛ انجام دهید. ssl_protocolهای زیر باید در یک سرور یا http context در فایل virtual host شما قرار گیرد و یا یک فایل جداگانه با دستور include (برخی افراد از یک فایل به نام ssl.conf استفاده می کنند، اما این کاملا به خود شما بستگی دارد) بسازید :
    کد:
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    برای مثال :

    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Disable-SSL-and-Enable-TLS-in-Nginx.png نمایش ها:	1 اندازه:	5.6 KB شناسه:	20054



    نکته شماره 11 : Certificateهایی در Nginx ایجاد کنید

    در ابتدا، یک key و یک certificate ایجاد کنید. در صورت تمایل از یک نوع متفاوت از رمزگذاری استفاده کنید :
    کد:
    # opensslgenrsa -aes256 -out tecmintlovesnginx.key 1024
    # opensslreq -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr
    # cptecmintlovesnginx.key tecmintlovesnginx.key.org
    # opensslrsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key
    # openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkeytecmintlovesnginx.key -out tecmintlovesnginx.crt
    سپس خطوط زیر را در یک server block جداگانه به منظور آماده سازی برای نکته بعدی، اضافه کنید (http --> https redirection) و همینطور دستورات مربوط به SSL برای block جدید را جابجا کنید :
    کد:
    server {
    listen 192.168.0.25:443 ssl;
    server_tokens off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    root   /var/www/tecmintlovesnginx.com/public_html;
    ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt;
    ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    }
    در نکته بعد، نحوه استفاده سایت مان از یک self-signed cert و TLS را بررسی می کنیم.



    نکته شماره 12 : HTTP traffic را به HTTPS در Nginx تغییر مسیر دهید

    خط زیر را به اولین server block اضافه کنید :
    کد:
    return 301 https://$server_name$request_uri;
    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Nginx-Redirect-HTTP-to-HTTPS.png نمایش ها:	1 اندازه:	4.2 KB شناسه:	20055


    دستور بالا، پاسخ 301 (انتقال دائم- Moved permanently) را برمی گرداند، که هر زمان که درخواستی برای پورت 80 ویرچوال هاست شما ایجاد می شود، برای تغییر مسیر دائمی URLاستفاده می شود، و درخواست برای server blockای که ما در نکته قبل اضافه کردیم را تغییر مسیر (Redirect) می دهد.

    تصویر زیر، تغییر مسیر (Redirect) را نشان می دهد و حقیقت اینکه ما برای رمزنگاری از TLS 1.2 و AES-256 استفاده می کنیم را تایید می کند :

    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Verify-TLS-Nginx-Encryption.png نمایش ها:	1 اندازه:	11.6 KB شناسه:	20056


    همچنین توصیه میشود مطالعه کنید.

    آموزش نصب وب سرور انجین ایکس در Ubuntu 16

    آموزش نصب وب سرور انجین ایکس در Debian 9

    آموزش نصب وب سرور انجین ایکس در RedHat/CentOS 7.0 & Fedora 24


    خلاصه :
    در این پست ترفندهایی برای برقراری امنیت در nginx را مطرح کردیم.
    اگر شما هم نکات امنیتی دیگری می دانید باعث خوشحالیست که با ما به اشتراک بگذارید.

    موفق باشید.
    آخرین ویرایش توسط Habili; در تاریخ/ساعت 01-11-2020, 07:27 PM.

    #2
    توی مورد سوم وقتی من Server_tokens off; رو میذارم بعد از اینکه سرویس nginx رو ریست میدم با این ارور مواجه میشم :
    کد:
    [root@test.com ~]# service nginx restart
    nginx: [emerg] "server_tokens" directive is not allowed here in /etc/nginx/nginx.conf:5
    nginx: configuration file /etc/nginx/nginx.conf test failed

    من قلبی بزرگ با رویاهایی بزرگ دارم. دانسته هایمان را با هم به اشتراک بگذاریم.

    کامنت

    درباره انجمن منطقه لینوکسی ها

    انجمن منطقه لینوکسی ها با هدف ارتقاء سطح علمی کاربران در سطح جهانی و همچنین کمک به بالا بردن سطح علمی عمومی در زمینه های تخصصی فوق پایه گذاری شده است. انجمن منطقه لینوکسی ها از طریق کارشناسان و متخصصان پاسخگوی سوالات گوناگون کاربران مبتدی یا پیشرفته میباشد تا حد امکان تلاش شده که محیطی متنوع و کاربر پسند و به دور از هرگونه حاشیه جهت فعالیت کاربران در این انجمن ایجاد شود. لذا ما به صورت مستمر برای پیشرفت کمی و کیفی محتوی و اطلاعات انجمنمان میکوشیم که این برای ما ارزشمند و حائز اهمیت است. کلیه حقوق،اطلاعات و مقالات در این انجمن متعلق به سایت منطقه لینوکسی ها میباشد، و هرگونه نسخه برداری بدون ذکر منبع مورد پیگرد قانونی خواهد شد.

    شبکه های اجتماعی

    ایمیل مدیریت

    Habili@linux-zone.org

    در حال انجام ...
    X