JAIL.CONF(5) پیکربندی Fail2Ban JAIL.CONF(5)

jail.conf - پیکربندی سرویس‌دهنده fail2ban

fail2ban.conf fail2ban.d/*.conf fail2ban.local fail2ban.d/*.local

jail.conf jail.d/*.conf jail.local jail.d/*.local

action.d/*.conf action.d/*.local action.d/*.py

filter.d/*.conf filter.d/*.local

برنامه Fail2ban دارای چهار نوع فایل پیکربندی است:

پیکربندی سراسری Fail2Ban (مانند ثبت لاگ‌ها و وقایع)
فیلترهایی که نحوه تشخیص شکست‌های احراز هویت را مشخص می‌کنند
اقداماتی که دستورات لازم برای مسدودسازی (ban) و رفع مسدودیت (unban) نشانی IP را تعریف می‌کنند
زندان‌هایی (Jails) که ترکیب فیلترها را با اقدامات تعریف می‌کنند.

فایل‌های *.conf توسط Fail2Ban توزیع می‌شوند. توصیه می‌شود فایل‌های *.conf بدون تغییر باقی بمانند تا ارتقای برنامه در آینده آسان‌تر شود. در صورت نیاز، سفارشی‌سازی‌ها باید در فایل‌های *.local ارائه شوند. به عنوان مثال، اگر می‌خواهید زندان [ssh-iptables-ipset] مشخص‌شده در jail.conf را فعال کنید، فایل jail.local را با محتوای زیر ایجاد نمایید:

[ssh-iptables-ipset]

enabled = true

در فایل‌های .local فقط تنظیماتی را مشخص کنید که مایل به تغییر آن‌ها هستید؛ باقی پیکربندی از فایل .conf متناظر که ابتدا تجزیه (parse) می‌شود فراخوانی خواهد شد.

علاوه بر .local، برای فایل‌های jail.conf یا fail2ban.conf می‌تواند یک دایرکتوری متناظر .d/ حاوی فایل‌های .conf تکمیلی وجود داشته باشد. برای مثال، ترتیب اولویت برای پیکربندی jail به این صورت خواهد بود:

jail.conf
jail.d/*.conf (به ترتیب الفبا)
jail.local
jail.d/*.local (به ترتیب الفبا).

به این معنی که تمامی فایل‌های .local پس از فایل‌های .conf در فایل پیکربندی اصلی و فایل‌های درون دایرکتوری .d تجزیه می‌شوند. تنظیمات موجود در فایلی که دیرتر تجزیه شود بر ورودی‌های یکسان در فایل‌هایی که قبلاً تجزیه شده‌اند اولویت دارد. فایل‌ها به ترتیب حروف الفبا مرتب می‌شوند، به عنوان مثال:

fail2ban.d/01_custom_log.conf - جهت استفاده از یک مسیر لاگ متفاوت

jail.d/01_enable.conf - جهت فعال‌سازی یک زندان خاص
jail.d/02_custom_port.conf - جهت تغییر پورت(های) یک زندان.

فایل‌های پیکربندی دارای بخش‌هایی هستند که با [نام بخش] مشخص می‌شوند، و همچنین شامل جفت‌های «نام = مقدار» می‌باشند. برای مواردی که چند مقدار را می‌پذیرند، مقادیر را با فاصله، یا در خطوط جداگانه با فاصله‌گذاری (indent) در ابتدای خط پیش از مقدار دوم مشخص کنید.

فایل‌های پیکربندی می‌توانند فایل‌های پیکربندی دیگر (تعریف‌کننده متغیرهای مشترک) را فراخوانی کنند، که این موضوع اغلب در فیلترها و اقدامات استفاده می‌شود. چنین مواردی در بخشی به نام [INCLUDES] تعریف می‌شوند:

نشان می‌دهد که فایل مشخص‌شده باید پیش از فایل جاری تجزیه شود.
نشان می‌دهد که فایل مشخص‌شده باید پس از فایل جاری تجزیه شود.

با استفاده از سازوکارهای «درون‌یابی رشته‌ای» (string interpolation) پایتون، تعاریف دیگر نیز مجاز هستند و می‌توانند بعداً درون تعاریف دیگر به صورت %(name)s استفاده شوند.

برنامه Fail2ban دارای ساختار نحوی پیشرفته‌تری است (مشابه درون‌یابی بسط‌یافته در پایتون). این درون‌یابی بسط‌یافته از %(section/parameter)s برای اشاره به مقداری از یک بخش دیگر استفاده می‌کند.
علاوه بر درون‌یابی میان بخش‌ها، مقدار پارامتر در بخش [DEFAULT] را می‌توان با %(default/parameter)s فراخوانی کرد.
همچنین Fail2ban از قابلیت دیگری به نام %(known/parameter)s پشتیبانی می‌کند (به معنای آخرین گزینه شناخته‌شده با نام parameter). این درون‌یابی امکان بسط دادن یک فیلتر پیش‌فرض یا عبارت باقاعده (regexp) زندان را در فایل .local فراهم می‌سازد (در مقایسه با تنظیم ساده failregex/ignoreregex که آن را رونویسی و جایگزین می‌کند)، به عنوان مثال:

baduseragents = IE|wget|%(my-settings/baduseragents)s
failregex = %(known/failregex)s
            useragent=%(baduseragents)s

علاوه بر درون‌یابی %(known/parameter)s که برای پارامترهای مقداردهی اولیه (init) فیلتر/اقدام کار نمی‌کند، می‌توان از برچسب درون‌یابی <known/parameter> استفاده کرد (به معنای آخرین تعریف اولیه‌سازی شناخته‌شده فیلترها یا اقدامات با نام parameter). این درون‌یابی امکان بسط دادن پارامترهای یک فیلتر یا اقدام پیش‌فرض را مستقیماً درون فایل jail.conf/jail.local در خود زندان بدون نیاز به ایجاد یک فایل جداگانه filter.d/*.local فراهم می‌کند، به عنوان مثال:

# filter.d/test.conf:
[Init]
test.method = GET
baduseragents = IE|wget
[Definition]
failregex = ^%(__prefix_line)<test.method>"estegexpseragent=(?:<baduseragents>)
# jail.local:
[test]
# use filter "test", overwrite method to "POST" and extend known bad agents with "badagent":
filter = test[test.method=POST, baduseragents="badagent|<known/baduseragents>"]

توضیحات (کامنت‌ها): از '#' برای خطوط توضیح و از '; ' (وجود فاصله مهم است) برای توضیحات درون‌خطی استفاده کنید.

مواردی که می‌توان در بخش [Definition] تنظیم کرد عبارتند از:

سطح جزئیات خروجی لاگ: CRITICAL، ERROR، WARNING، NOTICE، INFO، DEBUG، TRACEDEBUG، HEAVYDEBUG یا مقدار عددی متناظر (50-5). پیش‌فرض: INFO (معادل 20)
مقصد لاگ: نام فایل، SYSLOG، STDERR یا STDOUT. پیش‌فرض: در صورت عدم تنظیم در fail2ban.conf/fail2ban.local برابر STDOUT است.
نکته: اگر fail2ban به عنوان سرویس systemd اجرا می‌شود، برای ثبت لاگ در ژورنال systemd می‌توان logtarget را روی STDOUT تنظیم کرد.
تنها یک مقصد لاگ را می‌توان مشخص کرد. اگر logtarget را از مقدار پیش‌فرض تغییر دهید و از logrotate استفاده می‌کنید، چرخش لاگ را در فایل پیکربندی متناظر نیز تنظیم یا غیرفعال کنید (مانند /etc/logrotate.d/fail2ban در سیستم‌های دبیان).
نام فایل سوکت. پیش‌فرض: /var/run/fail2ban/fail2ban.sock
این فایل برای برقراری ارتباط با دیمن سرور fail2ban استفاده می‌شود. هنگام اجرای Fail2ban این فایل را حذف نکنید؛ چرا که پس از آن برقراری ارتباط با سرور ممکن نخواهد بود.
نام فایل PID. پیش‌فرض: /var/run/fail2ban/fail2ban.pid
این فایل برای ذخیره شناسه فرایند (PID) سرور fail2ban استفاده می‌شود.
گزینه‌ای برای مجاز شمردن رابط IPv6 - به صورت auto، yes (یا on، true، 1) یا no (یا off، false، 0). پیش‌فرض: auto
این مقدار می‌تواند برای اعلام به fail2ban درباره مجاز بودن یا نبودن IPv6 استفاده شود.
نام فایل پایگاه‌داده. پیش‌فرض: /var/lib/fail2ban/fail2ban.sqlite3
این گزینه محل ذخیره داده‌های ماندگار fail2ban را مشخص می‌کند. این داده‌های ماندگار به مسدودسازی‌ها امکان بازگردانی و ادامه خواندن فایل‌های لاگ از آخرین موقعیت خوانده‌شده را پس از راه‌اندازی مجدد fail2ban می‌دهد. مقدار None این قابلیت را غیرفعال می‌کند.
حداکثر تعداد تطابق‌های ذخیره‌شده در پایگاه‌داده به ازای هر بلیت. پیش‌فرض: 10
این گزینه حداکثر تعداد خطوط لاگ منطبق را که می‌توانند به ازای هر بلیت در پایگاه‌داده ذخیره شوند تنظیم می‌کند. این امر همچنین بر مقادیر قابل حل از طریق برچسب‌های <ipmatches> و <ipjailmatches> در اقدامات تأثیر می‌گذارد.
مدت زمان پاک‌سازی پایگاه‌داده بر حسب ثانیه. پیش‌فرض: 86400 (۲۴ ساعت)
این گزینه سنی را تعیین می‌کند که پس از آن مسدودسازی‌ها باید از پایگاه‌داده پاک شوند.

پارامترهای پیکربندی بخش [Thread] عبارتند از:
اندازه پشته هر ریسه در fail2ban. پیش‌فرض: 0 (پیش‌فرض پلتفرم یا پیکربندی‌شده)
این گزینه اندازه پشته (بر حسب KiB) را برای ریسه‌هایی که بعداً ایجاد می‌شوند مشخص می‌کند، و باید 0 یا یک مقدار صحیح مثبت حداقل برابر با 32 باشد.

گزینه‌های زیر برای هر زندانی قابل اعمال هستند. این گزینه‌ها در بخشی که نام زندان را مشخص می‌کند یا در بخش [DEFAULT] که مقادیر پیش‌فرض مورد استفاده در صورت عدم تعیین در بخش مجزا را مشخص می‌سازد، ظاهر می‌شوند.

همچنین می‌توان هر گزینه‌ای از فایل فیلتر را مستقیماً درون زندان مشخص کرد یا بازنویسی نمود (بخش FILTER FILES را ببینید).

نام فیلتر -- نام فایل فیلتر در /etc/fail2ban/filter.d/ بدون پسوند .conf/.local.
تنها یک فیلتر را می‌توان مشخص کرد.
نام فایل(های) لاگ مورد نظارت، جداشده با خط جدید.
الگوهای گلوب -- مسیرهای حاوی * و ؟ یا [0-9] -- می‌توانند استفاده شوند؛ با این حال تنها فایل‌هایی که هنگام شروع به کار برنامه با این الگوی گلوب تطابق دارند در نظر گرفته می‌شوند.

گزینه اختیاری 'tail' جداشده با فاصله را می‌توان به انتهای مسیر اضافه کرد تا فایل لاگ از انتها خوانده شود؛ در غیر این صورت گزینه پیش‌فرض 'head' فایل را از ابتدا می‌خواند.

اطمینان حاصل کنید که syslog یا برنامه‌ای که فایل لاگ را تولید می‌کند طوری پیکربندی نشده باشد که پیام‌های تکراری لاگ را به "*last message repeated 5 times*" فشرده سازد؛ در غیر این صورت تشخیص خطا با شکست مواجه می‌شود. این ویژگی در rsyslog با نام RepeatedMsgReduction شناخته می‌شود و باید برابر Off باشد.

اگر هیچ فایلی منطبق با logpath یافت نشود، در صورتی که skip_if_nologs روی true تنظیم شده باشد، زندان هنگام شروع fail2ban نادیده گرفته می‌شود؛ در غیر این صورت (پیش‌فرض: false) شروع fail2ban با خطای "Have not found any log file" مواجه خواهد شد، مگر اینکه موتور روی auto تنظیم شده باشد و زندان بتواند موتور را به systemd تغییر دهد (بخش auto در قسمت Backends را در زیر ببینید).
اگر هیچ فایلی منطبق با logpath یافت نشود، موتور auto را به systemd تغییر می‌دهد (بخش Backends را ببینید)، مگر اینکه با systemd_if_nologs = false غیرفعال شده باشد (پیش‌فرض true).
کدگذاری فایل‌های لاگ مورد استفاده برای رمزگشایی. مقدار پیش‌فرض "auto" از لوکال فعلی سیستم استفاده می‌کند.
اجبار کردن منطقه زمانی برای خطوط لاگی که فاقد آن هستند.

اگر این گزینه مشخص نشود، خطوط لاگی که منطقه زمانی صریحی در آن‌ها یافت نشده است توسط fail2ban بر اساس منطقه زمانی سیستم خودش تفسیر می‌شوند، که ممکن است نامناسب باشد. در حالی که بهترین روش این است که برنامه‌های تحت نظارت را برای درج اختلاف زمانی صریح پیکربندی کنید، این گزینه برای رسیدگی به مواردی در نظر گرفته شده که این کار امکان‌پذیر نیست.

مناطق زمانی پشتیبانی‌شده در این گزینه مواردی با آفست ثابت هستند: Z، UTC[+-]hhmm (همچنین می‌توانید از GMT به عنوان نام مستعار UTC استفاده کنید).

این گزینه بر روی خطوط لاگی که منطقه زمانی صریح دارند هیچ تأثیری ندارد. مثال‌ها:

logtimezone = UTC
logtimezone = UTC+0200
logtimezone = GMT-0100
اقدام مسدودسازی (پیش‌فرض iptables-multiport) که معمولاً در بخش [DEFAULT] برای تمام زندان‌ها مشخص می‌شود.
این پارامتر توسط جایگزینی استاندارد action استفاده خواهد شد و می‌تواند به طور متمرکز در بخش [DEFAULT] درون jail.local (جهت اعمال به تمام زندان‌ها به طور همزمان) یا به طور جداگانه در هر زندان که این جایگزینی در آن به کار می‌رود مجدداً تعریف شود.
مشابه banaction، اما برای برخی زندان‌های "allports" مانند "pam-generic" یا "recidive" (پیش‌فرض iptables-allports).
اقدام(های) موجود در /etc/fail2ban/action.d/ بدون پسوند .conf/.local.
می‌توان آرگومان‌هایی را به اقدامات ارسال کرد تا مقادیر پیش‌فرض بخش [Init] در فایل اقدام را بازنویسی کنند. آرگومان‌ها با ساختار زیر مشخص می‌شوند:

[name=value,name2=value,name3="values,values"]

مقادیر می‌توانند داخل علامت نقل قول نیز قرار گیرند (هنگامی که مقدار شامل "," یا فاصله باشد الزامی است). بیش از یک اقدام را می‌توان (در خطوط جداگانه) مشخص کرد.
آرگومان‌های ویژه اقدام می‌توانند بر پارامترهای شرطی نیز تأثیر بگذارند؛ بنابراین برای مثال جهت ارسال مقادیر مختلف به زنجیره‌های مختلف، ابتدا آرگومان مؤثر بر همه زنجیره‌ها را ارسال کنید، مانند blocktype، سپس مقدار مربوط به زنجیره IPv6 را ارسال نمایید، مانند blocktype?family=inet6. مثال‌ها:
# ارسال blocktype به صورت DROP برای تمام زنجیره‌ها:
banaction_allports = iptables-ipset[type=allports, blocktype=DROP]
# ارسال blocktype متفاوت برای زنجیره‌های IPv4 و IPv6:
banaction = iptables-ipset[type=multiport, blocktype="REJECT --reject-with icmp-host-unreachable", blocktype?family=inet6="REJECT --reject-with icmp6-host-unreachable"]
مقدار بولی (پیش‌فرض true) نشان می‌دهد که باید از مسدودسازی نشانی‌های IP خود سیستم جلوگیری شود.
فهرستی از IPها که نباید مسدود شوند. این فهرست می‌تواند شامل ماسک CIDR یا DNS (FQDN)، یا حتی رشته خام باشد (اگر زندان شناسه‌ها را به جای IPها مسدود کند). این گزینه علاوه بر ignoreself (در صورت true بودن) تأثیر می‌گذارد و نیازی به درج DNS یا IPهای هاست میزبان جاری در آن نیست. این گزینه همچنین می‌تواند شامل یک نام فایل (با پیشوند "file:") حاوی ورودی‌های قابل نادیده‌گیری باشد، که به صورت تنبل (lazy) در زمان اجرا بر حسب تقاضا در اولین مسدودسازی بارگذاری شده و پس از وقفه‌ای کوتاه با تغییر فایل به طور خودکار بازخوانی می‌شود.
دستوری که اجرا می‌شود تا تعیین کند آیا نشانی IP نامزد فعلی برای مسدودسازی (یا شناسه خطا برای شناسه‌های خام) نباید مسدود شود یا خیر. این گزینه در کنار گزینه‌های ignoreself و ignoreip عمل می‌کند. این دستور تنها در صورتی که نه ignoreself و نه ignoreip با معیارها تطابق نداشته باشند، ابتدا اجرا می‌شود.
اگر دستور با موفقیت به پایان برسد (کد خروج 0)، نشانی IP مسدود نخواهد شد. مانند ACTION FILES، برچسب‌هایی مانند <ip> می‌توانند در مقدار ignorecommand گنجانده شوند و قبل از اجرا جایگزین خواهند شد.
پارامترهای کش را (پیش‌فرض غیرفعال) برای بررسی نادیده‌گیری خطا فراهم می‌کند (کش کردن نتیجه حاصل از ignoreip، ignoreself و ignorecommand)، ساختار دستوری:
ignorecache = key="<F-USER>@<ip-host>", max-count=100, max-time=5m
ignorecommand = if [ "<F-USER>" = "technical" ] && [ "<ip-host>" = "my-host.example.com" ]; then exit 0; fi;
                exit 1
این کار نتیجه ignorecommand را (بدون فراخوانی مکرر آن) به مدت ۵ دقیقه (زمان کش) برای حداکثر ۱۰۰ ورودی (اندازه کش) با استفاده از مقادیر جایگزین‌شده مانند "user@host" به عنوان کلیدهای کش ذخیره می‌کند. تنظیم گزینه ignorecache با مقدار خالی، کش را غیرفعال می‌سازد.
مدت زمان مؤثر مسدودسازی (بر حسب ثانیه یا در قالب اختصاری زمان).
بازه زمانی (بر حسب ثانیه یا در قالب اختصاری زمان) پیش از زمان فعلی که خطاهای رخ‌داده در آن برای مسدودسازی شمرده می‌شوند.
تعداد خطاهایی که باید در آخرین findtime ثانیه رخ دهند تا نشانی IP مسدود شود.
موتور (بک‌اند) مورد استفاده برای تشخیص تغییرات در logpath.
پیش‌فرض آن "auto" است که ابتدا "pyinotify" و سپس "polling" را امتحان می‌کند و در صورت عدم یافتن فایلی منطبق با logpath ممکن است به "systemd" سوئیچ کند (بخش Backends را در زیر ببینید). هر یک از این موارد را می‌توان مشخص کرد. گزینه "pyinotify" تنها روی سیستم‌های لینوکسی دارای کتابخانه‌های پایتون "pyinotify" معتبر است.
استفاده از DNS برای ترجمه نام‌های میزبان (HOST) که در لاگ‌ها ظاهر می‌شوند. به طور پیش‌فرض روی "warn" تنظیم شده که نام‌های میزبان را به IP ترجمه می‌کند اما هشداری نیز ثبت می‌نماید. اگر در اینجا از DNS استفاده کنید ممکن است نشانی‌های IP نادرستی را به دلیل ماهیت نامتقارن DNS معکوس (که برنامه برای نوشتن نام دامنه در لاگ به کار برده) در مقایسه با DNS مستقیم که fail2ban برای ترجمه مجدد آن به IP استفاده می‌کند (اما لزوماً همان IP نیست) مسدود نمایید. در حالت ایده‌آل باید برنامه‌های خود را طوری پیکربندی کنید که IP واقعی را ثبت کنند. این مقدار می‌تواند برای جلوگیری از ثبت هشدار روی "yes" تنظیم شود یا روی "no" تا ترجمه DNS به طور کلی غیرفعال گردد (بنابراین ورودی‌هایی که در آن‌ها نام میزبان به جای IP ثبت شده نادیده گرفته می‌شوند).
عبارت باقاعده (Python regular expression) برای تجزیه بخش مشترکی که در هر پیام وجود دارد (برای جزئیات به prefregex در بخش FILTER FILES مراجعه کنید).
عبارت باقاعده (Python regular expression) که باید به failregexهای فیلتر اضافه شود (برای جزئیات به failregex در بخش FILTER FILES مراجعه کنید). اگر این عبارت برای دیگر کاربرانی که از برنامه شما استفاده می‌کنند مفید است، لطفاً عبارت باقاعده خود را با گزارش یک اشکال با توسعه‌دهندگان fail2ban به اشتراک بگذارید (بخش REPORTING BUGS را در زیر ببینید).
عبارت باقاعده‌ای که در صورت تطابق خط لاگ با آن، باعث می‌شود Fail2Ban آن خط را در نظر نگیرد. این خط حتی در صورت تطابق با failregex زندان یا هر یک از فیلترهای آن، نادیده گرفته خواهد شد.
حداکثر تعداد خطوط لاگ منطبق که زندان برای هر بلیت در حافظه نگه می‌دارد. به طور پیش‌فرض همان مقدار maxretry زندان (یا پیش‌فرض) است. این گزینه همچنین بر مقادیر قابل حل از طریق برچسب <matches> در اقدامات تأثیر می‌گذارد.

گزینه‌های موجود در زیر فهرست شده‌اند.

به طور خودکار مناسب‌ترین backend را انتخاب می‌کند، که از گزینه‌های مبتنی بر فایل مانند pyinotify یا polling برای نظارت بر فایل‌های منطبق با logpath شروع می‌شود، اما همچنین می‌تواند در صورت برقراری شرایط زیر به طور خودکار به موتور systemd تغییر یابد:
•
هیچ فایلی منطبق با logpath برای این زندان یافت نشود؛
•
گزینه systemd_if_nologs = false برای این زندان مشخص نشده باشد؛
•
گزینه journalmatch برای زندان یا فیلتر آن تنظیم شده باشد (در غیر این صورت بار پردازشی مجاز کردن تمام زندان‌های خودکار، حتی مواردی که هرگز برای نظارت بر ژورنال پیش‌بینی نشده‌اند، بسیار سنگین خواهد بود)؛

در صورتی که بتوانیم backend را به systemd تغییر دهیم، گزینه skip_if_nologs نادیده گرفته خواهد شد.
نیاز به نصب بودن pyinotify (نرم‌افزار نظارت بر تغییرات فایل) دارد. این موتور رویدادهای تغییر را از قابلیت توکار هسته لینوکس inotify که برای نظارت بر تغییرات فایل‌ها و دایرکتوری‌های تحت پیگیری استفاده می‌شود دریافت می‌کند، و بنابراین برای نظارت بر فایل‌های لاگ بسیار مناسب‌تر از polling است.
از الگوریتم پیمایش دوره‌ای (polling) استفاده می‌کند که نیازی به کتابخانه‌های اضافی ندارد.
از کتابخانه پایتون systemd برای دسترسی به ژورنال systemd استفاده می‌کند. تعیین logpath برای این موتور مجاز نیست و در عوض از journalmatch برگرفته از پیکربندی فیلتر مرتبط با زندان استفاده می‌کند. فلگ‌های اختصاصی متعددی از systemd را می‌توان به این موتور ارسال کرد، از جمله journalpath و journalfiles برای تعیین صریح مسیر دایرکتوری یا مجموعه‌ای از فایل‌ها، journalflags که به طور پیش‌فرض 1 (LOCAL_ONLY) است و ژورنال را تنها روی ماشین محلی باز می‌کند، و می‌تواند با journalflags=4 برای مستثنی کردن فایل‌های نشست کاربری به 4 (SYSTEM_ONLY) تنظیم شود، یا namespace.
توجه داشته باشید که journalflags، journalpath، journalfiles و namespace مانعة‌الجمع هستند. برای سایر تنظیمات و جزئیات بیشتر به مستندات python-systemd مراجعه کنید.

مثال‌ها:

backend = systemd[journalpath=/run/log/journal/machine-1]
backend = systemd[journalfiles="/path/to/system.journal, /path/to/user.journal"]
backend = systemd[journalflags=4, rotated=on]

برای جلوگیری از وضعیت «فایل‌های باز بیش از حد» (اتمام توصیف‌کننده‌ها)، fail2ban فایل‌های ژورنال چرخیده‌شده (rotated) را به طور پیش‌فرض نادیده می‌گیرد و پارامتر اختصاصی خود به نام rotated (پیش‌فرض false) را دارد، تا به طور خودکار مجموعه فایل‌های غیرچرخیده‌شده journalfiles متناظر با journalflags (و journalpath در صورت تنظیم) را بازیابی کند. بنابراین موتور systemd به طور پیش‌فرض مشابه موتورهای مبتنی بر فایل عمل می‌کند و تنها می‌تواند پیام‌های واقعی (چرخش‌نیافته) را بیابد و حداکثر تا نقطه زمانی آخرین چرخش می‌تواند به عقب جستجو کند (مانند findtime و غیره).
همین موضوع برای fail2ban-regex systemd-journal ... نیز صادق است، بنابراین به طور پیش‌فرض پیام‌های فایل‌های ژورنال چرخیده‌شده را نادیده می‌گیرد. برای جستجو در تمام ژورنال باید از fail2ban-regex systemd-journal[rotated=on] ... استفاده شود.

هر زندان می‌تواند تنها با یک فیلتر پیکربندی شود، اما می‌تواند چندین اقدام داشته باشد. به طور پیش‌فرض، نام یک اقدام همان نام فایل اقدام است، و در مورد اقدامات پایتون، پسوند ".py" حذف می‌شود. در جایی که قرار است چندین مورد از یک اقدام یکسان استفاده شوند، می‌توان گزینه actname را به اقدام اختصاص داد تا از تکرار جلوگیری شود، به عنوان مثال:

[ssh-iptables-ipset]
enabled = true
action = smtp.py[dest=chris@example.com, actname=smtp-chris]
         smtp.py[dest=sally@example.com, actname=smtp-sally]

ورودی‌های زمان در پیکربندی fail2ban (مانند findtime یا bantime) را می‌توان به صورت عدد صحیح بر حسب ثانیه یا به صورت رشته با استفاده از فرمت اختصاری ویژه ارائه داد (به عنوان مثال 600 معادل 10m است).

نشانه‌های اختصاری:
years?, yea?, yy?
months?, mon?
weeks?, wee?, ww?
days?, da, dd?
hours?, hou?, hh?
minutes?, min?, mm?
seconds?, sec?, ss?
علامت سوال (؟) به معنای اختیاری بودن کاراکتر است، بنابراین هم day و هم days قابل استفاده هستند.

می‌توانید چندین نشانه را در قالب ترکیب کنید (جداشده با فاصله یا بدون جداکننده)، به عنوان مثال: 1y 6mo یا 1d12h30m.
توجه داشته باشید که نشانه‌های m و همچنین mm به معنای دقیقه هستند؛ برای ماه از علامت اختصاری mo یا mon استفاده کنید.

قالب زمان را می‌توان با استفاده از fail2ban-client آزمایش کرد:

fail2ban-client --str2sec 1d12h

فایل‌های اقدام مشخص می‌کنند که چه دستوراتی برای مسدود کردن و رفع مسدودیت یک نشانی IP اجرا می‌شوند.

مشابه فایل‌های jail.conf، اگر تمایل به تغییرات محلی دارید، یک فایل [actionname].local در دایرکتوری /etc/fail2ban/action.d ایجاد کنید و تنظیمات لازم را بازنویسی نمایید.

فایل‌های اقدام دارای دو بخش Definition و Init هستند.

بخش [Init] تنظیمات مربوط به اقدام را فعال می‌کند. در jail.conf/jail.local این تنظیمات را می‌توان برای یک زندان خاص به عنوان گزینه‌های مشخصات اقدام در آن زندان بازنویسی کرد.

دستورات زیر می‌توانند در بخش [Definition] وجود داشته باشند:

دستور(هایی) که هنگام شروع به کار زندان اجرا می‌شوند.
دستور(هایی) که هنگام متوقف شدن زندان اجرا می‌شوند.
دستور(هایی) که پیش از هر اقدام دیگری اجرا می‌شوند. هدف آن بررسی مناسب و پایدار بودن محیط است.
دستور(هایی) که نشانی IP را پس از تطابق maxretry خط لاگ در آخرین findtime ثانیه مسدود می‌کنند.
دستور(هایی) که نشانی IP را پس از مدت زمان bantime از مسدودیت خارج می‌کنند.

بخش [Init] امکان تنظیمات ویژه هر اقدام را فراهم می‌آورد. در jail.conf/jail.local این موارد را می‌توان برای یک زندان خاص به عنوان گزینه‌های مربوط به آن زندان بازنویسی کرد. برچسب‌های ویژه‌ای که می‌توانند در بخش [Init] تنظیم شوند عبارتند از:

حداکثر مدت زمان بر حسب ثانیه که یک دستور می‌تواند قبل از متوقف شدن اجباری (kill) اجرا شود.

دستورات مشخص‌شده در بخش [Definition] از طریق یک پوسته سیستم (shell) اجرا می‌شوند، بنابراین تغییر مسیر شل و کنترل فرایند مجاز است. دستورات باید مقدار 0 را برگردانند، در غیر این صورت خطا ثبت خواهد شد. علاوه بر این، اگر actioncheck با وضعیتی غیر از 0 خارج شود، به عنوان نشانه‌ای از تغییر وضعیت فایروال در نظر گرفته شده و fail2ban باید مجدداً خود را مقداردهی اولیه کند (یعنی دستورات actionstop و actionstart را صادر نماید). برچسب‌ها درون <> قرار می‌گیرند. تمام عناصر بخش [Init] برچسب‌هایی هستند که در تمام دستورات اقدام جایگزین می‌شوند. برچسب‌ها را می‌توان توسط fail2ban-client با استفاده از دستور "set <JAIL> action <ACT>" اضافه کرد. <br> برچسبی است که همیشه نشان‌دهنده خط جدید (\n) است.

تعیین بیش از یک دستور مجاز است. هر دستور باید در یک خط جداگانه قرار گیرد و بدون خطوط خالی با فاصله(ها) تورفتگی داشته باشد. مثال زیر دو دستور را برای اجرا تعریف می‌کند:


actionban = iptables -I fail2ban-<name> --source <ip> -j DROP
echo ip=<ip>, match=<match>, time=<time> >> /var/log/fail2ban.log

برچسب‌های زیر در دستورات actionban، actionunban و actioncheck (هنگامی که قبل از actionban/actionunban فراخوانی می‌شوند) جایگزین می‌گردند:

نشانی IPv4 یا IPv6 که باید مسدود شود، مانند 192.168.0.2 یا 2001:db8::1
خانواده نشانی IP به صورت رشته، مانند inet4 یا inet6
رکورد معکوس DNS PTR برای نشانی IP، یا رشته خالی در صورت عدم دسترسی.
نام میزبان ترجمه‌شده از نشانی IP.
شناسه شکست (شناسه بلیت) برای این رویداد مسدودسازی.
تعداد دفعاتی که شکست در فایل لاگ برای این بلیت خاص رخ داده است، مانند 3
زمان یونیکس (epoch) مربوط به مسدودسازی، مانند 1357508484
مدت زمان مؤثر مسدودسازی بر حسب ثانیه برای این بلیت.
تعداد دفعاتی که این نشانی IP تاکنون مسدود شده است (شمارش تجمعی).
رشته متصل‌شده خطوط فایل لاگ مربوط به تطابق‌هایی که منجر به مسدودسازی شده‌اند. بسیاری از کاراکترهایی که توسط شل تفسیر می‌شوند برای جلوگیری از تزریق کد اسکیپ می‌شوند، با این وجود با احتیاط استفاده شود.
پرچمی که نشان می‌دهد آیا بلیت از پایگاه‌داده بازیابی شده است (1) یا یک مسدودسازی جدید است (0). می‌تواند در اقدامات برای صرف‌نظر کردن از برخی عملیات‌ها در مسدودسازی‌های بازیابی‌شده استفاده شود.
برچسب‌های تطابق با فرمت آزاد که از فیلتر با استفاده از ساختار <F-TAG>...</F-TAG> در failregex استخراج می‌شوند. به عنوان مثال، اگر فیلتر عبارت <F-USER>john</F-USER> را استخراج کند، برچسب <F-USER> حاوی "john" خواهد بود و می‌تواند در دستورات اقدام استفاده شود.
مشابه failures، اما مجموع تمام شکست‌ها برای آن نشانی IP در تمامی زندان‌ها از پایگاه‌داده ماندگار fail2ban. بنابراین برای عملکرد این برچسب پایگاه‌داده باید تنظیم شده باشد.
مشابه ipfailures، اما مجموع تنها بر اساس شکست‌های IP برای زندان فعلی محاسبه می‌شود.
مشابه matches، اما شامل تمام خطوط مربوط به IP است که در پایگاه‌داده ماندگار fail2ban در تمامی زندان‌ها وجود دارد. بنابراین پایگاه‌داده باید تنظیم شده باشد تا این برچسب عمل کند.
مشابه ipmatches، اما تطابق‌ها تنها به IP و زندان فعلی محدود می‌شوند.
نمایش رشته‌ای شیء خام بلیت. اساساً برای مقاصد اشکال‌زدایی مفید است.
تعداد نشانی‌های IP در حال حاضر مسدودشده در زندان در زمان اجرای این اقدام.
مجموع تجمعی دفعاتی که مسدودسازی در این زندان از زمان شروع fail2ban رخ داده است.
تعداد بلیت‌های خطای فعلی در مدیریت خطای زندان.
مجموع تجمعی خطاهایی که در این زندان از زمان شروع fail2ban شناسایی شده است.

اقدامات مبتنی بر پایتون نیز می‌توانند استفاده شوند، که در این حالت نام فایل باید [actionname].py باشد. فایل پایتون باید شامل متغیر Action باشد که به یک کلاس پایتون اشاره می‌کند. این کلاس باید حداقل واسط توصیف‌شده توسط fail2ban.server.action.ActionBase را پیاده‌سازی کند، که جهت سهولت پیاده‌سازی می‌توان از آن به ارث برد.

تعاریف فیلتر مواردی هستند که در /etc/fail2ban/filter.d/*.conf و filter.d/*.local قرار دارند.

این تعاریف برای شناسایی تلاش‌های ناموفق احراز هویت در فایل‌های لاگ و استخراج نشانی IP میزبان (یا نام میزبان در صورتی که usedns برابر true باشد) استفاده می‌شوند.

مشابه فایل‌های اقدام، فایل‌های فیلتر نیز فایل‌های ini هستند. بخش اصلی، بخش [Definition] است.

چندین تعریف فیلتر استاندارد وجود دارد که در بخش [Definition] استفاده می‌شوند:

عبارت باقاعده (Python regular expression) برای تجزیه یک بخش مشترک موجود در هر پیام است، که پس از یافتن تطابق توسط datepattern و قبل از آغاز جستجو برای هرگونه failregex یا ignoreregex اعمال می‌شود.
اگر این عبارت باقاعده تطابق نداشته باشد، پردازش فوراً با پیام بعدی آغاز شده و جستجو برای هیچ failregex رخ نمی‌دهد.
اگر prefregex شامل <F-CONTENT>...</F-CONTENT> باشد، بخشی از پیام که بین این برچسب‌ها قرار دارد استخراج شده و پس از آن به عنوان کل پیام برای جستجو با failregex یا ignoreregex استفاده می‌شود.
به عنوان مثال:
prefregex = ^%(__prefix_line)s (?:ERROR|FAILURE) <F-CONTENT>.+</F-CONTENT>$
failregex = ^user not found
            ^authentication failed
            ^unknown authentication method
می‌توانید از prefregex به منظورهای زیر استفاده کنید:
- مشخص کردن ۱ عبارت باقاعده مشترک برای تطبیق یک بخش عمومی موجود در تمام پیام‌ها (برای جلوگیری از تطابق‌های غیرضروری در هر failregex در صورتی که بیش از یک مورد دارید)؛
- برش دادن تنها بخش مورد نظر از پیام (جهت ساده‌سازی failregex) که بین برچسب‌های <F-CONTENT> و </F-CONTENT> قرار گرفته است؛
- جمع‌آوری شناسه خطا (به عنوان مثال پیشوندی که توسط برچسب <F-MLFID>...<F-MLFID/> تطبیق داده می‌شود) جهت شناسایی چندین پیام متعلق به یک نشست یکسان، که در آن یک پیام اتصال حاوی IP بوده و به دنبال آن پیام(های) خطایی می‌آیند که فاقد IP هستند؛ این کار یک روش جدید تجزیه چندخطی را به عنوان جایگزینی برای روش قدیمی (کند و نامناسب) چندخطی با استفاده از پنجره بافر (maxlines > 1 و <SKIPLINES>) ارائه می‌دهد؛
- نادیده گرفتن برخی پیام‌های نادرست، بیش از حد طولانی یا غیرضروری (معروف به ترافیک لاگ انگلی) که ممکن است در ژورنال نیز وجود داشته باشند، پیش از انجام جستجوی failregex.
عبارت باقاعده‌ای (regular expression) است که با تلاش‌های ناموفق تطابق می‌یابد. برچسب‌های جایگزینی استاندارد می‌توانند به عنوان بخشی از عبارت باقاعده استفاده شوند:
<HOST> - عبارت باقاعده مشترک برای نشانی‌های IP و نام‌های میزبان (در صورت فعال بودن usedns). برنامه Fail2Ban مشخص خواهد کرد که در واقع کدام یک از این موارد است.
<ADDR> - عبارت باقاعده برای نشانی‌های IP (هر دو خانواده).
<IP4> - عبارت باقاعده برای نشانی‌های IPv4.
<IP6> - عبارت باقاعده برای نشانی‌های IPv6.
<DNS> - عبارت باقاعده برای تطبیق نام‌های میزبان.
<CIDR> - عبارت باقاعده کمکی برای تطبیق CIDR (فرم عددی ساده ماسک شبکه).
<SUBNET> - عبارت باقاعده برای تطبیق نشانی‌های زیرشبکه (به صورت IP/CIDR؛ همچنین یک IP تکی نیز تطبیق می‌یابد، بنابراین بخش /CIDR اختیاری است).
<F-ID>...</F-ID> - گروه دریافت عبارت باقاعده آزاد که شناسه مورد استفاده برای مسدودسازی را هدف قرار می‌دهد (به جای نشانی IP یا نام میزبان).
<F-*>...</F-*> - گروه دریافت نام‌گذاری‌شده عبارت باقاعده آزاد ذخیره‌شده در بلیت، که می‌تواند در اقدام استفاده شود.
به عنوان مثال <F-USER>[^@]+</F-USER> یک نام کاربری را تطبیق داده و ذخیره می‌کند که می‌تواند با برچسب درون‌یابی <F-USER> در اقدام استفاده شود.
<F-ALT_*n>...</F-ALT_*n> - گروه دریافت نام‌گذاری‌شده جایگزین در عبارت باقاعده آزاد ذخیره‌شده در بلیت.
به عنوان مثال، اولین مقدار منطبق یافت‌شده که در عبارت باقاعده به عنوان <F-ALT_USER>، <F-ALT_USER1> یا <F-ALT_USER2> تعریف شده است، به صورت <F-USER> ذخیره خواهد شد (اگر تطابق مستقیم یافت نشود یا خالی باشد).

هر یک از برچسب‌های ذکرشده در بالا را می‌توان در prefregex و در failregex مشخص کرد؛ بنابراین در صورت تعیین در هر دو، مقدار منطبق در failregex مقدار منطبق در prefregex را بازنویسی می‌کند.

تمام برچسب‌های استاندارد مانند IP4 یا IP6 را می‌توان با عبارت باقاعده سفارشی با استفاده از ساختار <F-*>...</F-*> نیز مشخص کرد، به عنوان مثال (?:ip4:<F-IP4>\S+</F-IP4>|ip6:<F-IP6>\S+</F-IP6>).
برچسب‌های <ADDR>، <HOST> و <SUBNET> همچنین نشانی IP محصور در کروشه را تطبیق می‌دهند.

نکته: عبارت failregex پس از پردازش prefregex (در صورت تعیین) بر روی بخش باقی‌مانده پیام اعمال خواهد شد، که این پردازش نیز به نوبه خود پس از پردازش datepattern صورت می‌پذیرد (که طی آن رشته مهر زمانی منطبق با بهترین الگو، از پیام جدا می‌شود).

برای عبارت‌های باقاعده چندخطی (تجزیه با maxlines بزرگتر از 1) می‌توان از برچسب <SKIPLINES> برای جداسازی خطوط استفاده کرد. این کار به خطوط بین خطوط منطبق اجازه می‌دهد تا همچنان برای خطاهای دیگر جستجو شوند. این برچسب را می‌توان چندین بار استفاده کرد.
این یک روش منسوخ است و اگر خطوط حاوی شناسه مشترکی باشند، بهتر است از روش جدید (با برچسب‌های <F-MLFID>...<F-MLFID/>) استفاده شود.

عبارت باقاعده‌ای برای شناسایی ورودی‌های لاگ است که باید توسط Fail2Ban نادیده گرفته شوند، حتی اگر با failregex تطابق داشته باشند.
حداکثر تعداد خطوطی را مشخص می‌کند که باید برای تطبیق عبارت‌های باقاعده چندخطی در بافر نگهداری شوند. برای برخی قالب‌های لاگ نیازی به تغییر این مقدار نخواهد بود. لاگ‌های دیگر ممکن است در صورتی که فایل لاگ خاصی به طور مکرر نوشته می‌شود، نیاز به افزایش این مقدار داشته باشند.
یک الگو/عبارت باقاعده تاریخ سفارشی را به عنوان جایگزینی برای تشخیص‌دهنده‌های پیش‌فرض تاریخ مشخص می‌کند، به عنوان مثال %%Y-%%m-%%d %%H:%%M(?::%%S)?. برای مشاهده فهرستی از دستورالعمل‌های قالب معتبر، به مستندات کتابخانه پایتون برای رفتار strptime مراجعه کنید.
نکته: با توجه به جایگزینی رشته‌ای در فایل‌های پیکربندی، علامت‌های % باید با یک % دیگر در فایل‌های پیکربندی اسکیپ شوند (%%).
همچنین مقادیر ویژه Epoch (مهر زمانی یونیکس)، TAI64N و ISO8601 می‌توانند به عنوان datepattern استفاده شوند.
به طور معمول عبارت باقاعده تولیدشده برای datepattern علاوه بر این، مرزهای شروع کلمه و پایان کلمه را دریافت می‌کند تا از تطابق تصادفی در داخل کلمه‌ای در پیام جلوگیری شود. چندین پیشوند و کلمه با معنای خاص وجود دارند که می‌توان آن‌ها را با datepattern سفارشی جهت کنترل عبارت باقاعده حاصل مشخص کرد:
{DEFAULT} - می‌تواند برای افزودن الگوهای پیش‌فرض تاریخ fail2ban استفاده شود.
{DATE} - می‌تواند به عنوان بخشی از عبارت باقاعده استفاده شود که با الگوهای پیش‌فرض تاریخ جایگزین خواهد شد.
{^LN-BEG} - پیشوندی (مشابه ^) که مرز شروع کلمه را به مرز شروع خط تغییر می‌دهد (با نادیده گرفتن حداکثر ۲ کاراکتر). اگر به عنوان مقدار استفاده شود (نه به عنوان پیشوند)، تمام الگوهای پیش‌فرض تاریخ را نیز تنظیم می‌کند (مشابه {DEFAULT})، اما در ابتدای خط پیام مهار (anchor) می‌شود.
{UNB} - پیشوندی برای غیرفعال کردن مرزهای خودکار کلمه در عبارت باقاعده.
{NONE} - مقداری که به فرد اجازه می‌دهد خطاهایی را که کاملاً فاقد تاریخ-زمان در پیام لاگ هستند پیدا کند. فیلتر از زمان جاری (now) به عنوان مهر زمانی استفاده خواهد کرد (یا آخرین مهر زمانی شناخته‌شده از خط قبلی دارای مهر زمانی).
تطابق ژورنال systemd مورد استفاده برای فیلتر کردن ورودی‌های ژورنال را مشخص می‌کند. برای نحو تطابق‌ها و جزئیات بیشتر در مورد فیلدهای ویژه ژورنال، به journalctl(1) و systemd.journal-fields(7) مراجعه کنید. این گزینه تنها توسط موتورهای systemd و auto اعمال می‌شود و برای سوئیچ خودکار به systemd توسط موتور auto الزامی است.

مشابه اقدامات، فیلترها نیز ممکن است یک بخش [Init] داشته باشند (از نسخه 0.10 به بعد اختیاری است). تمام پارامترهای هر دو بخش [Definition] و [Init] را می‌توان در jail.conf یا jail.local (یا در filter.d/filter-name.local مربوطه) بازنویسی (تعریف مجدد یا بسط) کرد. هر گزینه‌ای که در زندان به فیلتر داده شود، مقدار مشخص‌شده در بخش [Init] را بازنویسی می‌کند، که آن نیز به نوبه خود مقدار موجود در بخش [Definition] را بازنویسی خواهد کرد. علاوه بر تنظیمات استاندارد فیلتر، از هر دو بخش می‌توان برای اولیه‌سازی گزینه‌های اختصاصی فیلتر استفاده کرد.

فیلترها همچنین می‌توانند بخشی به نام [INCLUDES] داشته باشند. این بخش برای خواندن سایر فایل‌های پیکربندی استفاده می‌شود.

before
نشان می‌دهد که این فایل پیش از بخش [Definition] خوانده می‌شود.
after
نشان می‌دهد که این فایل پس از بخش [Definition] خوانده می‌شود.

برنامه Fail2ban در ابتدا توسط Cyril Jaquier <cyril.jaquier@fail2ban.org> نوشته شد. در حال حاضر توسط Yaroslav O. Halchenko <debian@onerussian.com>، Daniel Black <daniel.subs@internode.on.net> و Steven Hiscocks <steven-fail2ban@hiscocks.me.uk> به همراه تعدادی از مشارکت‌کنندگان نگهداری و توسعه داده می‌شود. برای مشاهده فهرست کامل به فایل THANKS ارائه‌شده همراه با Fail2Ban مراجعه کنید. صفحه راهنما توسط Daniel Black و Yaroslav Halchenko نوشته شده است.

گزارش باگ‌ها به https://github.com/fail2ban/fail2ban/issues

حق نشر © 2013 متعلق به تیم Fail2Ban
حق نشر تغییرات متعلق به نویسندگان مربوطه آن‌ها است.
تحت مجوز عمومی گنو نسخه ۲ (GPL) یا (به انتخاب شما) هر نسخه جدیدتری منتشر شده است.

fail2ban-server(1)

November 2015 Fail2Ban