خطوات حماية nginx هامة وزيادة الأمان (كويب سيرفر) وتحسين الشبكة

رووح القلوب

عضو جديد
20 مارس 2009
246
1
0
السلام عليكم ورحمة الله وبركاته​

مبدئياً ماهو ال Nginx ومميزاته ؟
ال Nginx يعمل كويب سيرفر خفيف جدا - بروكسى للمواقع الكبيرة والتى تعمل ب Apache - بروكسى لل E-Mail ايضا .. يعمل على كل الأنظمة ( Unix-Linux-Mac OS X- Microsoft Windows -Solaris) ,, يستخدم بالمواقع الكبرى مثل Wordpress - sourceforge ...

زى اى برنامج له اعدادات وملفات اساسية

مسار الإعدادات
كود:
/usr/local/nginx/conf/
ملف الكونفج الخاص به
كود:
/usr/local/nginx/conf/nginx.conf
مسار اللوج
كود:
/usr/local/nginx/logs/
يستخدم ال Nginx HTTP بورت 80
يستخدم ال Nginx HTTPs بورت 443

الخطوات التالية لزيادة الأمان والحماية وتقليل نسبة الخطورة على الويب سيرفر:


1- نفعل SELinux
انظر
http://www.traidnt.net/vb/traidnt2310702/
افتراضيا SELinux لاتحمى nginx وهو ويب سيرفر ولكن هايتم عمل دا من خلال عمل كومبايل
كود:
yum -y install selinux-policy-targeted selinux-policy-devel
كود:
cd /opt
wget 'http://garr.dl.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.gz'
نفك الضغط
كود:
tar -zxvf se-ngix_1_0_10.tar.gz
كود:
cd se-ngix_1_0_10/nginx
make
كود:
/usr/sbin/semodule -i nginx.pp
- نقفل السيستم
كود:
getsebool -a | less
getsebool -a | grep off
getsebool -a | grep o
هانشوف الاعداد اللى يكون on نخليه off ده طبعا لإختيارك أيضاً


2- تقوية الشبكة وتحديد الصلاحيات بقدر الإمكان من خلال ملف sysctl.conf
كود:
vi /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
احفظ واقفل الملف

إختيارية (تطبق على أى سيرفر ): هذه خطوات أخرى لتحسين الشبكة للسيرفرات التى تتعامل بنقل ملفات كبيرة وتحتاج الى زيادة ال Buffer لأن الذاكرة دائما ( TCP) تحسب تلقائى من ذاكرة النظام ككل وغالباً بتكون قليلة .

ازاى نعرف القيم المحددة للارسال والاستقبال وتغيير هذه الاعدادات لتوفير سرعة افضل للشبكة ككل .. كالتالى :

معرفة حجم الذاكرة المخصصة ككل
كود:
cat /proc/sys/net/ipv4/tcp_mem
معرفة اقصى كمية من الممكن أن تستقبل (ذاكرة)
كود:
cat /proc/sys/net/core/rmem_default
cat /proc/sys/net/core/rmem_max
معرفة أقصى كمية من الممكن ان ترسل
كود:
cat /proc/sys/net/core/wmem_default
cat /proc/sys/net/core/wmem_max
الخطوة القادمة غير ضرورية للسيرفرات اللى ليس عليها ضغط .. لأن الافتراضى بيكون128k ودا غالبا بيكون كافى لويب سيرفر وphp وخلاص ومفيش ضغط .. التعديل دا هايزيد استهلاك الذاكرة لذا اكتفى بالخطوة السابقة باعدادات ملف sysctl.conf كما هى .

كود:
echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf
echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf
ايضا هانحتاج لزيادة الحجم الأدنى والبداية والأقصى بالبايت
كود:
echo 'net.ipv4.tcp_rmem= 10240 87380 12582912' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_wmem= 10240 87380 12582912' >> /etc/sysctl.conf
ايضا يمكن تفعيل window scaling وده بيكون اختيار لتوسيع نافذة النقل
كود:
echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf
تفعيل ايضا التالى
كود:
echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf
لا نستفيد ايضا بان TCP يعمل كاش لاتصالات مقفولة للفترات .. لان الكاش فى الحالات دى له اتجاهين والغرض من الكاش معروف ان لما الاتصال يتم مرة اخرى يستخدم اللى موجود بالفعل من اول مرة اتصل وتم عمل الكاش له ودا المفروض فى المجمل بيسرع الاداء .. ولكن فى معظم الأوقات بيسبب ضعف فى اداء الشبكة بشكل كبير ... لذلك انا اوقفه
كود:
echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf
الآن اعادة تحميل الاعدادات
كود:
sysctl -p
اذا حبيت تشوف التعديلات
كود:
tcpdump -ni eth0
3- نرجع لل NGINX ونلغى الموديولات الغير مطلوبة
كود:
./configure --without-http_autoindex_module --without-http_ssi_module
make
make install
اذا تحب تلغى اكثر ضيف مع اول سطر
نفذا التالى وشوف ايه الموديولات اللى تحب تفعيلها او تعطيلها ونفذ
كود:
./configure --help | less
تقدر تعمل كومبيل الان له لكن قبل ذلك اضف ذلك فى nginx.conf
كود:
server_tokens off
دا طبعا لإلغاء ظهور نسخة السيرفر المستخدمة فى صفحات الخطأ المعروفة .

4- التحكم فى الهجمات الفلوو المتكرر
كود:
vi /usr/local/nginx/conf/nginx.conf
عدل الخيارات التالية كما تريد او كما تراها
كود:
  client_body_buffer_size  1K;
  client_header_buffer_size 1k;
  client_max_body_size 1k;
  large_client_header_buffers 2 1k;
لكن اذا سيرفرك به مواقع كتير مثل المنتديات والمدونات خليها 4k او 8 لأن اذا الحجم كان اكبر من القيمة هايعطيله صفحة خطأ Request Entity Too Large" (413) ده برده للعلم .

الاختيار الرابع بيساعد فى المكافحة ضد العناكب السيئة وال DoS

ايضا تعديل قيم الفصل او اغلاقه للاتصال .. وده بيحسن فى الاداء بشكل عام وبيقطع الاتصال الزائد عن الحد بيه وبيحافظ على سرعة مناسبة جدا
كود:
  client_body_timeout   10;
  client_header_timeout 10;
  keepalive_timeout     5 5;
  send_timeout          10;
الخطوة السابقة التعديل على القيم فيها حسب ماتناسب احتياجات سيرفرك ( أهل مكة أدرى بشعابها )

5- تحديد وغلق الاتصالات من اى بى واحد لبورت 80 لفترة اذا تكرر 15 مرة فى فترة بلغت 60 ثانية
كود:
/sbin/iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
/sbin/iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60  --hitcount 15 -j DROP
service iptables save
* دائما راجع ملفات اللوج وتظل متابع دائما
كود:
grep "/login.php??" /usr/local/nginx/logs/access_log
grep "...etc/passwd" /usr/local/nginx/logs/access_log
egrep -i "denied|error|warn" /usr/local/nginx/logs/error_log
بعض النقاط ايضا .. دائما يكون الويب سيرفر بيوزر بمفرده مش للرووت .. الصلاحيات ايضا لايمكن ان تدع هذا المسار بتصريحات write او اذا كان فى يوزر له بيكون المسار باسمه على سبيل المثال nginx
كود:
find /nginx -user nginx
كود:
find /usr/local/nginx/html  -user nginx
كود:
ls -l /usr/local/nginx/html/
بتدى الصلاحية بشكل عادى جدا

حذف الباك اب للملفات التى انشأت من vi او اى محرر اخر
كود:
# find /nginx -name '.?*' -not -name .ht* -or -name '*~' -or -name '*.bak*' -or -name '*.old*'
# find /usr/local/nginx/html/ -name '.?*' -not -name .ht* -or -name '*~' -or -name '*.bak*' -or -name '*.old*'
اذا اردتم ايضا شل سكربت به بعض اوامر iptables للحماية ايضا وتقليل الصلاحيات بشكل كبير من الممكن ارفقه لمن يريد .

بالنهاية اتمنى الإفادة القصوى لاخوتى .. اغلب هذه الاعدادات تتطلب مستوى جيد من الخبرة وكلها مستقاة من عدة مواقع ومواضيع لدى رايت مشاركتها افضل .