مقدمه: در این آموزش، شما یاد خواهید گرفت که چگونه امنیت وبسایت خود را با پیکربندی بلاکهای سرور و دستورات location در NGINX افزایش دهید. شما خواهید آموخت که چگونه آدرسهای IP خاص کلاینتها را مسدود کنید، دسترسی را بر اساس موقعیت جغرافیایی محدود کنید (محدودیت مبتنی بر جغرافیا)، و احراز هویت مبتنی بر رمز عبور را با استفاده از احراز هویت پایه HTTP پیادهسازی کنید. این اقدامات میتوانند حفاظت اضافی برای سرور وب شما فراهم کنند در حالی که به شما امکان کنترل دسترسی به صفحات وب خاص را میدهند.
پیشنیازها:
- یک سرور اوبونتو با دسترسی sudo
- NGINX نصبشده روی سرور شما
- درک پایه از NGINX و پیکربندی آن
توجه: برای محدودیت مبتنی بر رمز عبور، توصیه میشود که HTTPS را برای سرور خود فعال کنید. شما میتوانید از این آموزش برای راهاندازی HTTPS استفاده کنید.
قراردادهای فرمتبندی:
- در برخی از مثالهای پیکربندی، از سه نقطه (...) برای نشاندادن بخشهای حذفشده استفاده میشود.
- اصطلاح "سرور" به سرور اوبونتو شما با NGINX نصبشده اشاره دارد، در حالی که "بلاک سرور" به بلوک پیکربندی NGINX اشاره دارد که به این شکل است:
server {
...
}
مکانهای پیکربندی: شما باید از محل ذخیرهسازی فایلهای پیکربندی NGINX آگاه باشید:
/etc/nginxدایرکتوری پیکربندی NGINX است که تمام فایلهای پیکربندی در آن قرار دارند./etc/nginx/nginx.confفایل اصلی پیکربندی NGINX است، جایی که NGINX شروع به خواندن پیکربندی خود میکند./etc/nginx/sites-enabledجایی است که میتوانید فایلهای پیکربندی سرور HTTP(S) خود را قرار دهید. پس از راهاندازی یا بارگذاری مجدد NGINX، تمام فایلهای این دایرکتوری توسط NGINX بارگیری میشوند./etc/nginx/sites-availableجایی است که میتوانید فایلهای پیکربندی سرور HTTP(S) خود را قرار دهید، اما توسط NGINX بارگیری نمیشوند مگر اینکه یک پیوند نمادین در دایرکتوری/etc/nginx/sites-enabledایجاد کنید.
فایلهای لاگ: NGINX دو فایل لاگ پیشفرض ایجاد میکند:
/var/log/nginx/access.log: تمام درخواستها را ثبت میکند./var/log/nginx/error.log: شرایط خطا و اطلاعات وضعیت را ثبت میکند.
خطا در بارگذاری مجدد: اگر در هنگام بارگذاری مجدد پیکربندی NGINX با sudo systemctl reload nginx با خطایی مواجه شدید، میتوانید خطای خاص را با اجرای sudo nginx -t مشاهده کنید.
مرحله 1 - یافتن فایل بلاک سرور
برای پیکربندی محدودیتها، باید فایل بلاک سرور مربوط به دامنه خود را پیدا کنید. از دستور زیر برای لیست کردن فایلهای بلاک سرور استفاده کنید:
ls -al /etc/nginx/sites-available/
فرض کنید میخواهید محدودیتها را به یک بلاک سرور که به example.com پاسخ میدهد اضافه کنید، بلاک سرور با خط server_name example.com; را پیدا کنید. برای مثال:
server {
...
server_name example.com;
...
}
مطمئن شوید که دستور listen با پورتی که قصد محدود کردن آن را دارید مطابقت دارد (مثلاً listen 80; برای HTTP).
مرحله 2 - استفاده از آدرسهای IP برای اجازه یا مسدود کردن دسترسی
NGINX دستورات allow و deny را برای کنترل دسترسی بر اساس آدرسهای IP کلاینت فراهم میکند. شما میتوانید دسترسی به آدرسهای IP خاص، از جمله خودتان برای تست، را مسدود کنید.
مرحله 2.1 - یافتن آدرس IP عمومی شما برای مسدود کردن آدرس IP خود، ابتدا باید آدرس IP عمومی خود را تعیین کنید. دستور زیر را اجرا کنید:
curl -4 https://2ip.io
خروجی آدرس IP عمومی شما را نشان میدهد (مثلاً 15.1.1.1). اگر دستور با خطا مواجه شد، میتوانید آدرس IP خود را از طریق جستجوی گوگل پیدا کنید.
مرحله 2.2 - مسدود کردن دسترسی برای مسدود کردن آدرس IP خود، خط زیر را به context location مناسب در بلاک سرور خود اضافه کنید، و 15.1.1.1 را با آدرس IP عمومی خود جایگزین کنید:
deny 15.1.1.1); در اینجا یک مثال از پیکربندی آورده شده است:
server {
listen 80;
server_name example.com;
location / {
deny 15.1.1.1) } } پس از این تغییر، NGINX را برای اعمال پیکربندی مجدداً بارگذاری کنید:
sudo systemctl reload nginx
حالا اگر همان دستور را برای دسترسی به وبسایت خود از IP خود اجرا کنید:
curl -4 --head http://example.com
باید یک خطای HTTP 403 Forbidden دریافت کنید، که نشان میدهد دسترسی مسدود شده است.
توجه: شما میتوانید چندین دستور allow و deny را مشخص کنید. اولین دستوری که مطابقت داشته باشد اعمال میشود. برای مثال:
allow 15.1.1.1; allow 15.1.1.2; deny all; در این مثال، دسترسی برای 15.1.1.1 و 15.1.1.2 مجاز است، در حالی که تمام آدرسهای IP دیگر مسدود میشوند.
مرحله 3 - استفاده از ماژول Geo برای اجازه یا مسدود کردن دسترسی
ماژول geo در NGINX راهی انعطافپذیر برای کنترل دسترسی بر اساس موقعیتهای جغرافیایی با استفاده از پایگاهدادههای IP ارائه میدهد. برای فعال کردن این ویژگی:
- بسته
libnginx-mod-http-geoip2را نصب کنید:
sudo apt update && sudo apt install libnginx-mod-http-geoip2
- مطمئن شوید که
/etc/nginx/nginx.confشامل خط زیر باشد:
include /etc/nginx/modules-enabled/*.conf;
- یک پایگاهداده IP سازگار با GeoIP2 دانلود کنید. میتوانید از دستور ارائهشده استفاده کنید یا در وبسایت MaxMind یک حساب ایجاد کنید و پایگاهداده GeoLite2 Country را دانلود کنید:
cd /etc/nginx && sudo curl --fail -LO https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download/GeoLite2-Country.mmdb
- پیکربندی NGINX خود را برای شامل کردن دستورات GeoIP2 ویرایش کنید:
geoip2 /etc/nginx/GeoLite2-Country.mmdb {
$user_country country iso_code;
}
map $user_country $not_allowed {
CA 1; # Canada
US 1; # United States
default 0; # Allow all other countries
}
server {
listen 80;
server_name example.com;
location / {
if ($not_allowed) {
return 403 "You're not allowed to access.";
}
}
}
در این مثال، دسترسی برای کاربران از کانادا (CA) و ایالات متحده (US) مسدود شده است، در حالی که تمام کشورهای دیگر مجاز هستند.
NGINX را برای اعمال تغییرات مجدداً بارگذاری کنید:
sudo systemctl reload nginx
مرحله 4 - احراز هویت مبتنی بر رمز عبور (احراز هویت پایه HTTP)
برای محدود کردن دسترسی بر اساس نام کاربری و رمز عبور، میتوانید از احراز هویت پایه HTTP استفاده کنید. مطمئن شوید که HTTPS برای سرور شما فعال است.
- یک فایل برای ذخیره نامهای کاربری و رمزهای عبور هششده ایجاد کنید:
sudo touch /etc/nginx/users
- کاربران را با استفاده از دستور زیر اضافه کنید (
userوpasswordرا با نام کاربری و رمز عبور مورد نظر خود جایگزین کنید):
python3 -c 'from subprocess import *; import sys; print("Username: ", end="", file=sys.stderr); user = input();
passwd = run(["openssl", "passwd", "-6"], encoding="utf-8", stdout=PIPE).stdout.strip();
print("Username or password is empty. Try again!", file=sys.stderr) if user == "" or passwd == "" else print(user + ":" + passwd)' | sudo tee -a /etc/nginx/users
این دستور یک کاربر به فایل /etc/nginx/users اضافه میکند و نام کاربری و رمز عبور هششده را به صورت جفت user:password خروجی میدهد. رمز عبور به صورت متن ساده روی سرور ذخیره نمیشود.
- پیکربندی بلاک سرور خود را برای شامل کردن احراز هویت پایه HTTP تغییر دهید:
server {
server_name example.com;
location / {
}
auth_basic "Protected area!";
auth_basic_user_file /etc/nginx/users;
listen 443 ssl; # Managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # Managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Managed by Certbot
}
مطمئن شوید که example.com را با دامنه واقعی خود جایگزین کنید.
- NGINX را برای اعمال پیکربندی مجدداً بارگذاری کنید:
sudo systemctl reload nginx
میتوانید پیکربندی جدید را با curl تست کنید. دسترسی به سایت بدون نام کاربری و رمز عبور باید منجر به خطای HTTP 401 Unauthorized شود، در حالی که ارائه اعتبارنامههای معتبر باید دسترسی را فراهم کند.
محدود کردن دسترسی به یک URL خاص
برای محدود کردن دسترسی به یک URL خاص، دستورات auth_basic و auth_basic_user_file را مستقیماً به یک context location در بلاک سرور خود اضافه کنید. برای مثال:
server {
server_name example.com;
location / {
}
location /admin {
auth_basic "Protected area!";
auth_basic_user_file /etc/nginx/users;
}
listen 443 ssl; # Managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # Managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Managed by Certbot
}
در این مثال، URL /admin توسط احراز هویت پایه HTTP محافظت میشود.
ثبت جزئیات دسترسی نادرست
NGINX تلاشهای دسترسی نادرست را در فایل /var/log/nginx/error.log ثبت میکند. این شامل رمزهای عبور نادرست و نامهای کاربری وجود ندارد میشود، که دید بیشتری در مورد تلاشهای دسترسی غیرمجاز فراهم میکند.
نمونه ورودیهای لاگ:
- رمز عبور نادرست:
2023/03/28 12:06:49 [error] 1865#1865: *14 user "root": password mismatch, client: 15.1.1.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com" - نام کاربری وجود ندارد:
2023/03/28/12:08:21 [error] 1865#1865: *16 user "root" was not found in "/etc/nginx/users", client: 15.1.1.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com" نتیجهگیری: این آموزش شما را با دانش لازم برای افزایش امنیت وبسایت خود با استفاده از NGINX مجهز کرده است. با پیکربندی بلاکهای سرور، کنترل دسترسی بر اساس آدرسهای IP، پیادهسازی محدودیتهای جغرافیایی و راهاندازی احراز هویت مبتنی بر رمز عبور، میتوانید سرور وب خود را بهتر محافظت کنید و دسترسی به منابع خاص را کنترل کنید. انعطافپذیری و ویژگیهای قدرتمند NGINX آن را به ابزاری ارزشمند برای ایمنسازی برنامههای وب شما تبدیل میکند. برای راهنمایی بیشتر، به مستندات رسمی NGINX و آرشیو لیستهای پستی مراجعه کنید.
جستجو