:::: MENU ::::

تنظیم htaccess برای امنیت تارنما

فایل htaccessیکی از راه‌های امن کردن تارنما تنظیم کردن فایل htaccess است. htaccess مخفف Hypertext Access است و اون جوری که آپاچی می‌گه «فایلی است که تنظیم‌های [کلی] رو بر اساس هر پوشه تغییر می‌ده». لازمه بدونید که این فایل برای سرورهایی است که از Apache Web Server استفاده می‌کنند. توی این نوشته به کاربردهای دیگه‌ی این فایل اشاره نمی‌کنم چون -حداقل به نظرم- ربطی به مسائل امنیتی ندارند، کارهایی چون Redirect کردن دامنه‌های non-www به www یا فشرده کردن تارنما با Gzip یا تنظیم‌های مربوط به cache.

چه جور فایل htaccess رو بسازیم؟

کافیه فایلی با نام خالی و پسوند htaccess بسازیم. تفاوت این فایل به فایل‌های دیگه توی این است که htaccess خودش پسوند است و نه نام. پس برای ساختنش باید اول یه نقطه بذاریم و بعد بنویسیم htaccess.

کجا فایل htaccess رو بسازیم؟

چه جور فایل htaccess را بسازیمتوی هر پوشه‌ای می‌شه این فایل رو ساخت و بر اساس نیازی که داریم اون فایل رو تنظیم کرد اما معمول است که فایل رو توی پوشه‌ی اصلی می‌گذارند. اگه تنظیم‌های هر زیرپوشه با زیرپوشه‌ی دیگه فرق می‌کنه می‌شه برای هر کدوم یه فایل جدا ساخت. برای نمونه اگه می‌خواید فایل‌های با پسوند php یه پوشه خونده بشه ولی یه پوشه‌ی دیگه نه بهتره که فایل‌های جدا داشته باشید. البته این فایل هم مثل خیلی از منطق‌های برنامه‌نویسی دیگه از ویژگی وراثت بهره می‌گیره.

فایل htaccess به چه درد می‌خوره؟

۱- بازنویسی (Rewrite) که پراستفاده‌ترین کاربرد این فایل است

یه پیوند شبیه mydomain.com/?p=38 می‌تونه سیستم مدیریت محتوایی که استفاده می‌کنید رو لو بده. به علاوه برای موتورهای جست‌وجو قابل فهم نیست که بدون مراجعه به صفحه متوجه بشه محتوای این صفحه چیه. پس با یه تیر دو نشون بزنید و پیوندی بسازید شبیه mydomain.com/it-is-about-htaccess.htm. لازمه بگم که تنها با ساختن این فایل این اتفاق نمی‌افته، باید تنظیم‌های دیگه‌ای داخل سیستم مدیریت محتوا انجام بدید. این تنظیم برای هر سیستم مدیریت محتوا فرق داره که تنظیم‌های پیش‌فرض مربوط به وردپرس، جوملا و دروپال رو ته همین نوشته می‌ذارم. این رو هم اضافه کنم که امکان داشتن پیوند به صورت Uni-Code وجود داره. پس می‌تونید پیوندهایی زبان و خط فارسی هم داشته باشید.

به هر حال برای تنظیم دستی یا برای تارنماهایی که از مدیریت محتوا استفاده نمی‌کنند باید از دستور زیر استفاده کرد:

RewriteEngine on
RewriteRule ^about/$ /pages/about.html [L]
RewriteRule ^features/$ /features.php [L]
RewriteRule ^buy/$ /buy.html [L]
RewriteRule ^contact/$ /pages/contact.htm [L]

نخستین خط این دستور می‌گه وقتی کاربر صفحه‌ی about/anything رو خواست به pages/about.html تبدیل کن و نشونش بده. [L] ته دستور هم یعنی اگر این خط صادق بود نیاز به خوندن بقیه‌ی خط‌ها نیست و از حلقه بیا بیرون. چیزی شبیه break است. همین جوری می‌شه بقیه‌ی خط‌ها رو هم معنی کرد.

۲- جلوگیری از بازدید تارنما (بر اساس IP یا Referrer

زمانی که می‌دونید یه سری اسپمر، هکر یا بازدیدکننده‌ی مشکوک بیش از حد معمول به صفحه‌ی شما رجوع می‌کنن یا تارنمایی به شما ارجاع می‌ده که مشکوک است (شاید برای DDoS) می‌شه از این شیوه استفاده کرد. کدها رو باید به این صورت بنویسید:

order allow, deny
deny from 1.1.1.1
deny from 2.2.2.
allow from all

اگه بخوایم دستور رو ترجمه کنیم می‌شه این: آدرس ۱.۱.۱.۱ و تمام آدرس‌های با کلاس ۲.۲.۲ (یعنی از ۲.۲.۲.۰ تا ۲.۲.۲.۲۵۵) اجازه‌ی دست‌رسی ندارند اما بقیه دارند.

order allow, deny
deny from all
allow from 1.1.1.1

بر اساس چیزی که بالا گفته شد ترجمه‌ی این ساده است و می‌شه خیلی سریع فهمید که هیچ کس جز آدرس ۱.۱.۱.۱ امکان ورود نداره.

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

RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} otherdomain\.com [NC,OR]
RewriteCond %{HTTP_REFERER} anotherdomain\.com
RewriteRule .* - [F]

پیش از توضیح باید دقت کنیم که mod_rewrite سرور فعال باشه. با این دستور می‌گیم که همه‌ی بازدیدهای ورودی از otherdomain.com یا anotherdomain.com رو مسدود کن و صفحه‌ی مربوط به خطای ۴۰۳ رو نشون بده. اما معنی NC و OR و F چیه. مشخصه که OR برای اینه که بخواید پیوندهای دیگه‌ای هم به فهرست اضافه کنید و NC به این معنی است که نام دامنه به حروف کوچک و بزرگ حساس نباشد (not case-sensitive). در آخر [F] یعنی خطای Forbidden یا همون خطای ۴۰۳ رو نشون بده.

نکته‌ای که باید به ذهن بسپارید اینه که Options +FollowSymlinks رو در صورتی uncomment کنید (یعنی علامت # رو از ابتدای خط بردارید) که خطای ۵۰۰ بگیرید. خطای ۵۰۰ یعنی فایل httpd.conf تنظیم نیست. اگه بخواید اون رو تنظیم کنید و میزبان اشتراکی (Shared Host) دارید باید به پیشتیبانی بگید تا تنظیم رو براتون انجام بده و گاهی پروسه‌ی وقت‌گیر و فرسایشی است که با uncomment کرد این خط کمی از دردسرها کم می‌شه.
رمز گذاشتن روی فایل و پوشه با استفاده از htaccess

۳- رمز گذاشتن روی فایل و پوشه

با این کار برای دست‌رسی به فایل‌ها و زیرپوشه‌ها نیاز به شناسه و رمز داریم. با این وجود واضح است که اگر این تنظیم رو برای htaccess توی ریشه (root) انجام بدیم برای دست‌رسی به تارنما نیاز به رمز است. شاید ایده‌ی بدی نباشه برای دست‌رسی به پوشه‌ها و فایل‌هایی که مربوط به بخش مدیریت می‌شوند (مانند wp-login.php در وردپرس) از این شیوه استفاده کنیم.

AuthName "A Name for Section"
AuthUserFile /path/to/password/file/.htpasswd
AuthType Basic
require valid-user

توی خط اول یه اسم به صفحه می‌دیم، بعد مسیر فایل شناسه و رمز رو می‌گیم، نوع تصدیقی (authentication) که باید استفاده کنه رو مشخص می‌کنیم و در پایان هم می‌گیم چه کسایی حق دست‌رسی به پوشه رو دارند. AuthType Basic همیشه ثابت است اما می‌شه require valid-user رو به require user username تغییر داد و گفت تنها کاربری که می‌تونه استفاده کنه کی است. مسیر فایل رمزها هر جایی روی میزبان می‌تواند باشد اما نام فایل باید خالی و پسوند آن باید htpasswd باشد و محتوای این فایل چیزی شبیه زیر.

username:password
ali:Drf4f5f4mh5

یعنی در هر خط نام کاربری سپس : و پس از آن رمز را می‌نویسیم و به خط بعد می‌رویم. برای رمزگذاری روی رمزها می‌شه از شیوه‌ی MD5 استفاده کرد که این تارنما اون رو تولید می‌کنه.

چند حقه‌ی خوب برای htaccess

۱- جلوگیری از دست‌رسی به یک فایل خاص یا با پسوند خاص

ساده‌ترین نوع هک کردن یه تارنما اینه که از طریق فایل htaccess تارنما رو به یه جای دیگه redirect کنن. کار دیگه‌ای که می‌کنند اینه که محتوای فایل تنظیم‌ها (Configuration) رو عوض کنند. درسته که با تنظیم سطح دست‌رسی به فایل (Permission) می‌شه این مشکل رو حل کرد اما بعضی وقت‌ها محدودیت‌های هست که نمی‌شه سطح دست‌رسی رو تغییر داد.


order allow,deny
deny from all

ترجمه‌ی این چند خط که برای فایل تنظیم‌های وردپرس استفاده می‌شود این است که هیچ کسی اجازه‌ی دست‌رسی به فایل wp-config.php را ندارد. با این شیوه می‌شود چنین محدودیتی را برای هر فایل دیگه‌ای قائل شد.

order deny,allow
deny from all

allow from all

با این دستور دست‌رسی به همه‌ی فایل‌ها جز xml و css و jpg (یا jpeg) و png و gif و js مسدود می‌شود.


deny from all

با این دستور دست‌رسی به پوشه‌ی /var/www/mydomain.com/folder مسدود می‌شود.

۲- محدود کردن گشت و گذار در پوشه‌های تارنما

با این کار امکان گشت و گذار در پوشه‌هایی که فایل index در آن‌ها وجود ندارد گرفته می‌شود. برای این کار کافی است دستور زیر را در htaccess بگذارید تا امکان فهرست کردن زیرپوشه‌ها را محدود کند.

Options -Indexes

این دستور می‌گه که هیچ فایلی رو در هیچ یک از زیرپوشه‌ها (مشروط بر این که فایل index نداشته باشند) نمایش نده.

IndexIgnore /images/*
IndexIgnore /banners/*
IndexIgnore /videos/private.avi

در حالی که این دستور می‌گه نمایش فایل‌ها توی پوشه‌های banners و images رو مشروط بر نداشتن فایل index مسدود کن و خط آخر می‌گه تنها فایل private.avi رو نشون نده و هر چیز دیگه‌ای توی این پوشه بود رو نشون بده.

IndexIgnore *.zip *.jpg *.gif

اما این دستور می‌گوید تنها فایل‌های با پسوند zip و jpg و gif را نمایش نده.

Options +Indexes

و این دستور می‌گه که اجازه‌ی فهرست کردن محتویات پوشه را بده. اگر دقت کنید تنها اختلاف این دستور با دستور نخست این قسمت در یک + و – است. زمانی از این دستور استفاده می‌کنیم که تنظیم‌های کلی امکان فهرست کردن را بسته باشند.

۳- جلوگیری از استفاده از فایل‌های با پسوند خاص (Hotlinking)

مسئله خیلی ساده است، نمی‌خواید کسی فایلی (مانند عکس) رو توی دامنه یا صفحه‌ی دیگه‌ای استفاده کنه. برای این کار کافیه کد زیر رو به کار ببرید و جای mydomain.com آدرس تارنمای خودتون رو بذارید.

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?mydomain [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

این چند خط می‌گه که هیچ دامنه‌ای جز mydomain.com حق استفاده از فایل‌های با پسوند jpg و jpeg و png و gif رو نداره. به عبارت دیگه قابل دست‌رسی مستقیم نیستند یعنی کسی نمی‌تونه از جای دیگه‌ای بهشون پیوندی (لینک) بده. تنها نکته‌ای که نباید فراموش بشه اینه که باید حداقل نام دامنه‌ی خودتون توی خطی که رنگی شده باشه چون در غیر این صورت تارنمای خودتون هم هیچ عکسی رو نشون نمی‌ده. اگر خواستید به تارنمای دیگه‌ای اجازه‌ی استفاده از عکس‌ها رو بدید کافیه اون رو هم به لیست اضافه کنید.

کار دیگه‌ای که می‌شه کرد اینه که به جای اون یه صفحه‌ی دیگه نشون بده. برای این کار کافیه کد زیر رو بذارید. توی این مثال ۲ تا دامنه حق دارند به عکس‌ها پیوند (لینک) بدن و به بقیه‌ی دامنه‌ها تصویر hotlink.jpg نشون داده می‌شه.

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?myfriend.com/.*$ [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ http://www.mydomain.com/hotlink.jpg [NC,R,L]

۴- لیست سیاهی برای روبات‌ها

بعضی از روبات‌ها برای اسپم و پیام گذاشتن و دزدیدن رایانامه طراحی شده‌اند. می‌شه اونا رو لیست کرد و گفت حق ورود به تارنما رو ندارند:

RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^Anarchie [OR]
RewriteCond %{HTTP_USER_AGENT} ^ASPSeek [OR]
RewriteCond %{HTTP_USER_AGENT} ^attach [OR]
RewriteCond %{HTTP_USER_AGENT} ^autoemailspider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xenu [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus.*Webster [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule ^.* - [F,L]

تنها نکته‌ای که داره محل قرار گرفتن [OR] است. آخرین خط معرفی روبات‌ها (یعنی خط یکی مونده به آخر) [OR] نداره :)

۵- محدود کردن اندازه‌ی فایل‌های قابل بارگذاری

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

LimitRequestBody 1310720

تنها نکته‌ای که داره اینه که حجم رو باید به بایت بگید و این عدد باید بین ۰ بایت تا ۲ گیگابایت (یعنی ۲۱۴۷۴۸۳۶۴۸ بایت) باشه.

۶- ایمن کردن پوشه‌ها با جلوگیری از اجرای اسکریپت‌های اجرایی

واضحه که اجرا شدن اسکریپت‌هایی می‌تونه دردسرهایی رو برای تارنما و میزبان شما ایجاد کنه. می‌شه توی پوشه‌هایی که نیازی به اجرای اسکریپت نیست (مانند جایی که عکس‌ها نگهداری می‌شه) از اجرای اسکریپت‌های مخرب جلوگیری کرد.

AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI

توی خط نخست دستور می‌گیم که چه پسوندهایی رو به عنوان اسکریپت در نظر بگیره و توی خط دوم اجازه‌ی اجرا کردن اسکریپت‌ها رو می‌گیریم.

۷- تعیین سطح دست‌رسی (chmod) به فایل‌ها

کاری که بعضی هکرها می‌کنند تغییر سطح دست‌رسی فایل‌ها است. چه جور می‌شه جلوی این کار رو گرفت؟

# rw-r----
chmod .htpasswd files 640
# rw-rw---
chmod .htaccess files 644
# rwx-----
chmod php files 700

خیلی ساده می‌گه که فایل اولی باید دست‌رسی «خواندن-نوشتن / خواندن / خواندن» داشته باشه و دومی دست‌رسی «خواندن-نوشتن / خواندن / هیچ». این سطح دست‌رسی‌ها در حالی است که همه‌ی فایل‌های php دست‌رسی «خواندن-نوشتن-اجرا / هیچ / هیچ» دارند. همیشه یادتون باشه که دست‌رسی 777 یا rwxrwxrwx یعنی هر کسی هر کاری دوست داره انجام بده.

خیلی خلاصه بگم که توی نمایش رشته‌ای (مثل rw-r–r-x) سطح دست‌رسی هر سه حرف مربوط به یه گروه است: سه حرف نخست، صاحب فایل (Owner)، سه حرف دوم گروه‌ها (Group) و سه حرف سوم دیگران (Public). پس برای هر گروه سه حرف r مخفف read و w مخفف write و x مخفف execute است. حالا همین سطح دست‌رسی‌ها توی نمایش عددی (مثل 645) تبدیل می‌شند به ۴ برای خواندن، ۳ برای نوشتن و یک برای اجرا که در هر جمع عددی این‌ها در هر گروه حاصلی دربر داره. برای نمونه ۶ به معنی خواندن و نوشتن است.

۸- حفاظت از فایل htaccess

تمام این دستورها رو توی فایل htaccess انجام دادیم. اگر کسی به این فایل دست‌رسی داشته باشه می‌تونه هر چی رشته بودیم رو پنبه کنه. باید یه جوری جلوی دست‌رسی به این فایل رو گرفت. هر چند که توی قسمت نخست حقه‌ها به یه شکل دیگه توضیح دادم اما این جا به شکل خاص این کار رو می‌کنیم.

 order allow,deny
 deny from all
 satisfy all

یا این یکی که به صورت هم‌زمان هم از فایل htaccess محافظت می‌کنه و هم از wp-config.php


Order allow,deny
Deny from all
Satisfy All

این [php]some code[/php] دستور می‌گه که به هر فایلی که پسوند اون با hta شروع می‌شه رو مسدود کن. دستور آخر (satisfy) می‌گه همه‌ی شرط‌ها باید باشند یا به عبارت دیگه بیش‌ترین محدودیت. رو قائل بشیم یا از نظر منطقی بین همه‌ی محدودیت‌ها AND داشته باشیم.

خلاقیت به خرج بدیم

پرواضحه که می‌شه این دستورها رو ادغام کرد و بسط داد. یه مثال بزنم تا ببینید.


LimitRequestBody 20971520
order allow,deny
deny from 1.1.1.1
deny from 2.2.2.
allow from all

فایل پیش‌فرض htaccess وردپرس، جوملا و دروپال

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

چون فایل htaccess دروپال و جوملا طولانیه بهتره مستقیم به پروژه برید و از اون‌جا فایل لازم رو بگیرید.

دریافت فایل htaccess جوملا / دریافت فایل htaccess دروپال

پی‌نوشت:

– برای دیدن بقیه‌ی flagها می‌تونید از این پیوند استفاده کنید.

– هیچ کدوم عکس‌ها از من نیستند.


پیام