USBGUARD-RULES.CO(5)   USBGUARD-RULES.CO(5)

usbguard-rules.conf - فایل مجموعه قوانین USBGuard

فایل usbguard-rules.conf توسط دیمن USBGuard پس از پردازش فایل پیکربندی اصلی، usbguard-daemon.conf(5)، بارگذاری می‌شود. این دیمن انتظار دارد که فایل حاوی قوانینی باشد که به زبانی نوشته شده‌اند که در بخش «زبان قوانین» در ادامه شرح داده شده است.

دیمن USBGuard بر اساس یک خط‌مشی تعریف‌شده توسط مجموعه‌ای از قوانین، تصمیم می‌گیرد که کدام دستگاه USB را مجاز کند. هنگامی که یک دستگاه USB به سیستم متصل می‌شود، دیمن قوانین موجود را به صورت متوالی بررسی می‌کند. اگر قانون منطبقی پیدا شود، بر اساس هدف (target) قانون، دستگاه را مجاز (allow)، غیرمجاز و مسدود (block) یا حذف (reject) می‌کند. اگر هیچ قانون منطبقی یافت نشود، تصمیم بر اساس یک هدف پیش‌فرض ضمنی اتخاذ می‌شود. این پیش‌فرض ضمنی مسدود کردن دستگاه است تا زمانی که تصمیمی توسط کاربر گرفته شود. گرامر زبان قوانین که با ساختاری شبیه به BNF بیان شده، به شرح زیر است:

rule ::= target attributes.
target ::= "allow" | "block" | "reject".
attributes ::= attributes | attribute.
attributes ::= .

مشخصه‌های قانون مشخص می‌کنند که کدام دستگاه‌ها باید مطابقت داده شوند یا چه شرایطی باید برقرار باشد تا قانون اعمال شود. برای فهرست مشخصه‌های موجود، بخش «مشخصات دستگاه» و برای فهرست شرایط پشتیبانی‌شده، بخش «شرایط» را ببینید.

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

•allow - مجاز کردن دستگاه. دستگاه و رابط‌های آن اجازه برقراری ارتباط با سیستم را خواهند داشت.
•block - سلب مجوز دستگاه. دستگاه تا زمانی که مجاز نشود در حالت مسدود باقی خواهد ماند.
•reject - سلب مجوز و حذف دستگاه از سیستم. برای اینکه دستگاه دوباره برای سیستم قابل مشاهده شود، باید مجدداً به درگاه متصل گردد.

به جز هدف، تمام فیلدهای دیگر یک قانون اختیاری هستند. قانونی که در آن تنها هدف مشخص شده باشد، با هر دستگاهی مطابقت خواهد داشت. این قابلیت به مدیر خط‌مشی اجازه می‌دهد تا یک هدف پیش‌فرض صریح بنویسد. اگر هیچ قانونی از خط‌مشی بر دستگاه قابل اعمال نباشد، هدف ضمنی پیکربندی‌شده در usbguard-daemon.conf(5) استفاده خواهد شد. با این حال، اگر فردی بخواهد کاربرد یک قانون را به مجموعه‌ای از دستگاه‌ها یا فقط یک دستگاه محدود کند، می‌تواند این کار را با استفاده از مشخصه‌های دستگاه و شرایط قانون انجام دهد.

مشخصه‌های دستگاه (Device Attributes)

مشخصه‌های دستگاه مقادیر خاصی هستند که پس از اتصال دستگاه USB به سیستم، از آن خوانده می‌شوند. این که کدام مشخصه‌ها در دسترس هستند در ادامه تعریف شده است. برخی از مشخصه‌ها اشتقاقی هستند و برخی بر اساس مقادیری هستند که مستقیماً از دستگاه خوانده می‌شوند. همه مشخصه‌ها از دو شکل پشتیبانی می‌کنند:

•تک‌مقدار (single-valued) با ساختار:
name value
•چندمقدار (multi-valued) با ساختار:
name [operator] { value1 value2 ... }

که در آن operator (عملگر) اختیاری یکی از موارد زیر است:

all-of

مجموعه مشخصه‌های دستگاه باید شامل تمام مقادیر مشخص‌شده باشد تا قانون مطابقت یابد.

one-of

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

none-of

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

equals

مجموعه مشخصه‌های دستگاه باید دقیقاً شامل همان مجموعه از مقادیر باشد تا قانون مطابقت یابد.

equals-ordered

مجموعه مشخصه‌های دستگاه باید دقیقاً شامل همان مجموعه از مقادیر و با همان ترتیب باشد تا قانون مطابقت یابد.

match-all

مجموعه مشخصه‌های دستگاه باید زیرمجموعه‌ای از مقادیر مشخص‌شده باشد تا قانون مطابقت یابد.

اگر عملگر مشخص نشود، روی equals تنظیم می‌شود.

فهرست مشخصه‌ها:

id usb-device-id

مطابقت با یک شناسه دستگاه USB.

id [operator] { usb-device-id ... }

مطابقت با مجموعه‌ای از شناسه‌های دستگاه USB.

hash "value"

مطابقت با یک هش محاسبه‌شده از مقادیر مشخصه‌های دستگاه و داده‌های توصیف‌گر USB. این هش برای هر دستگاه توسط USBGuard محاسبه می‌شود.

hash [operator] { "value" ... }

مطابقت با مجموعه‌ای از هش‌های دستگاه.

parent-hash "value"

مطابقت با هش دستگاه والد.

parent-hash [operator] { "value" ... }

مطابقت با مجموعه‌ای از هش‌های دستگاه والد.

name "device-name"

مطابقت با مشخصه نام دستگاه USB.

name [operator] { "device-name" ... }

مطابقت با مجموعه‌ای از نام‌های دستگاه USB.

serial "serial-number"

مطابقت با مشخصه دستگاه iSerial در USB.

serial [operator] { "serial-number" ... }

مطابقت با مجموعه‌ای از مشخصه‌های دستگاه iSerial در USB.

via-port "port-id"

مطابقت با درگاه USB که دستگاه از طریق آن متصل شده است. توجه داشته باشید که برخی سیستم‌ها شماره‌گذاری درگاه ناپایداری دارند. درگاه ممکن است پس از راه‌اندازی مجدد سیستم یا هنگام بارگذاری مجدد برخی ماژول‌های هسته تغییر کند. اگر می‌خواهید مطمئن شوید که یک دستگاه از طریق یک دستگاه والد خاص متصل شده است، از مشخصه parent-hash استفاده کنید.

via-port [operator] { "port-id" ... }

مطابقت با مجموعه‌ای از درگاه‌های USB.

with-interface interface-type

مطابقت با نوع رابطی که دستگاه USB فراهم می‌کند.

with-interface [operator] { interface-type ... }

مطابقت دادن مجموعه‌ای از انواع رابط‌ها با مجموعه رابط‌هایی که دستگاه USB ارائه می‌دهد.

with-connect-type "connect-type"

مطابقت با مشخصه دستگاه USB به صورت port/connect_type.

with-connect-type [operator] { "connect-type" ... }

مطابقت با مجموعه‌ای از مشخصه‌های دستگاه USB به صورت port/connect_type.

label "label"

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

مقدار usb-device-id یک جفت جداشده با دونقطه به شکل vendor_id:product_id است. تمام دستگاه‌های USB این شناسه را توسط سازنده دریافت کرده‌اند و این مقدار باید نوع محصول USB را به طور منحصربه‌فرد مشخص کند. هر دو مقدار vendor_id و product_id اعدادی ۱۶ بیتی هستند که در مبنای شانزده‌شانزدهی (هگزادسیمال) نشان داده می‌شوند. امکان استفاده از نویسه ستاره برای مطابقت با هر شناسه دستگاه *:* یا هر شناسه محصول از یک سازنده خاص، به عنوان مثال 1234:* وجود دارد.

مقدار port-id یک شناسه درگاه USB وابسته به پلتفرم است. در لینوکس در مورد یک کنترل‌کننده USB (دقیق‌تر یک «root hub») به شکل "usbN" یا در مورد یک دستگاه USB به شکل "bus-port[.port[.port ...]]" (مثلاً 1-2، 1-2.1 و ...) است.

مقدار interface-type نمایانگر یک رابط USB است و باید به صورت سه عدد ۸ بیتی در مبنای شانزده‌شانزدهی جداشده با نویسه دونقطه قالب‌بندی شود، یعنی cc:ss:pp. این اعداد به ترتیب نشان‌دهنده کلاس رابط (cc)، زیرکلاس (ss) و پروتکل (pp) هستند که توسط USB-IF تعیین شده‌اند. برای جزئیات بیشتر به فهرست کلاس‌ها، زیرکلاس‌ها و پروتکل‌های تعیین‌شده مراجعه کنید. به جای شماره زیرکلاس و پروتکل، می‌توانید یک نویسه ستاره (*) بنویسید تا با تمام زیرکلاس‌ها یا پروتکل‌ها مطابقت یابد. تطبیق یک کلاس خاص با یک پروتکل خاص مجاز نیست؛ یعنی اگر از ستاره برای شماره زیرکلاس استفاده کنید، باید برای پروتکل نیز از ستاره استفاده نمایید.

اینکه قانونی که با یک دستگاه مطابقت دارد اعمال شود یا خیر، می‌تواند با استفاده از شرایط قانون بیشتر محدود گردد. اگر عبارت شرط در زمان ارزیابی قانون برقرار باشد، هدف قانون برای دستگاه اعمال می‌شود. یک عبارت شرط زمانی برقرار است که مقدار آن درست (true) ارزیابی شود. در غیر این صورت، ارزیابی قانون با قانون بعدی ادامه می‌یابد. شرایط یک قانون دارای ساختار نحوی زیر است:

if [!]condition
if [operator] { [!]conditionA [!]conditionB ... }

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

تفسیر عملگر مجموعه:

all-of

اگر تمام شرایط مشخص‌شده به عنوان درست (true) ارزیابی شوند، به درست ارزیابی می‌شود.

one-of

اگر یکی از شرایط مشخص‌شده به عنوان درست (true) ارزیابی شود، به درست ارزیابی می‌شود.

none-of

اگر هیچ‌یک از شرایط مشخص‌شده به عنوان درست (true) ارزیابی نشوند، به درست ارزیابی می‌شود.

equals

مشابه all-of.

equals-ordered

مشابه all-of.

فهرست شرایط:

localtime(time_range)

اگر زمان محلی در بازه زمانی مشخص‌شده باشد، به درست (true) ارزیابی می‌شود. time_range می‌تواند به صورت HH:MM[:SS] یا HH:MM[:SS]-HH:MM[:SS] نوشته شود.

allowed-matches(query)

اگر یک دستگاه مجاز با پرس‌وجوی مشخص‌شده (query) مطابقت داشته باشد، به درست (true) ارزیابی می‌شود. پرس‌وجو از ساختار نحوی قوانین استفاده می‌کند. شرایط درون پرس‌وجو ارزیابی نمی‌شوند.

rule-applied

اگر قانونی که در حال حاضر ارزیابی می‌شود قبلاً با دستگاهی مطابقت داشته باشد، به درست (true) ارزیابی می‌شود.

rule-applied(past_duration)

اگر قانونی که در حال حاضر ارزیابی می‌شود در مدت زمان گذشته که با پارامتر مشخص شده با دستگاهی مطابقت یافته باشد، به درست (true) ارزیابی می‌شود. past_duration می‌تواند به صورت HH:MM:SS، HH:MM یا SS نوشته شود.

rule-evaluated

اگر قانونی که در حال حاضر ارزیابی می‌شود قبلاً ارزیابی شده باشد، به درست (true) ارزیابی می‌شود.

rule-evaluated(past_duration)

اگر قانونی که در حال حاضر ارزیابی می‌شود در مدت زمان گذشته که با پارامتر مشخص شده ارزیابی شده باشد، به درست (true) ارزیابی می‌شود. past_duration می‌تواند به صورت HH:MM:SS، HH:MM یا SS نوشته شود.

random

با احتمال p(true)=0.5 به درست/نادرست ارزیابی می‌شود.

random(p_true)

با احتمال مشخص‌شده p(true)=p_true به درست ارزیابی می‌شود.

true

همواره به درست (true) ارزیابی می‌شود.

false

همواره به نادرست (false) ارزیابی می‌شود.

قانون جزئی قانونی بدون هدف (target) است. قوانین جزئی ممکن است توسط برخی دستورات ابزار خط فرمان usbguard استفاده شوند.

به منظور درک آسان مفهوم هر قانون، می‌توان از کامنت‌ها استفاده کرد. هر چیزی پس از نویسه "#" توسط تجزیه‌کننده قوانین نادیده گرفته می‌شود.

با استفاده از ابزار خط فرمان usbguard و زیردستور generate-policy آن، می‌توانید به جای نوشتن خط‌مشی از ابتدا، یک خط‌مشی اولیه برای سیستم خود ایجاد کنید. این ابزار برای تمام دستگاه‌های متصل به سیستم در زمان اجرا، یک خط‌مشی allow تولید می‌کند. این دستور گزینه‌های متعددی برای تنظیم خط‌مشی حاصل دارد؛ برای جزئیات بیشتر به usbguard(1) مراجعه کنید.

خط‌مشی روی خروجی استاندارد چاپ خواهد شد. بهتر است پیش از استفاده از قوانین تولیدشده در سیستم، آن‌ها را بازبینی کنید. گردش کار معمول برای تولید یک خط‌مشی اولیه می‌تواند به این صورت باشد:

$ sudo usbguard generate-policy > rules.conf
$ vi rules.conf
(review/modify the rule set)
$ sudo install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
$ sudo systemctl restart usbguard

مثال‌های زیر نشان می‌دهند که برای پیاده‌سازی خط‌مشی داده‌شده چه مواردی را در فایل rules.conf قرار دهید.

1.مجاز کردن دستگاه‌های ذخیره‌سازی بزرگ USB (فلش‌درایوهای USB) و مسدود کردن بقیه موارد

این خط‌مشی هر دستگاهی را که صرفاً یک دستگاه ذخیره‌سازی داده نباشد، مسدود می‌کند. دستگاه‌هایی که رابط صفحه‌کلید مخفی در یک فلش‌درایو USB دارند مسدود خواهند شد. فقط دستگاه‌هایی با یک رابط ذخیره‌سازی بزرگ مجاز به تعامل با سیستم‌عامل خواهند بود. این خط‌مشی از یک قانون منفرد تشکیل شده است:

allow with-interface equals { 08:*:* }

مسدودسازی در این حالت ضمنی است زیرا ما قانون block ننوشته‌ایم. مسدودسازی ضمنی برای کاربران میزکار مفید است. یک اپلت میزکار که به رویدادهای USBGuard گوش می‌دهد، در صورت اعمال یک هدف ضمنی، می‌تواند از کاربر برای تصمیم‌گیری سوال کند.

2.اجازه به یک دستگاه Yubikey خاص برای اتصال از طریق یک درگاه خاص (و رد کردن هر چیز دیگر روی آن درگاه)
allow 1050:0011 name "Yubico Yubikey II" serial "0001234567" via-port "1-2" hash "044b5e168d40ee0245478416caf3d998"
reject via-port "1-2"

ما می‌توانستیم صرفاً از هش برای مطابقت دستگاه استفاده کنیم. با این حال، استفاده از مشخصه‌های name و serial راهنمای مفیدی برای بازبینی‌های بعدی خط‌مشی فراهم می‌کند. از سوی دیگر، هش خاص‌ترین مقداری است که می‌توانیم برای شناسایی یک دستگاه استفاده کنیم. اگر می‌خواهید قانونی فقط با یک دستگاه مطابقت داشته باشد، این مشخصه بهترین گزینه برای استفاده است.

3.رد کردن دستگاه‌هایی با ترکیب مشکوک از رابط‌ها

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

allow with-interface equals { 08:*:* }
reject with-interface all-of { 08:*:* 03:00:* }
reject with-interface all-of { 08:*:* 03:01:* }
reject with-interface all-of { 08:*:* e0:*:* }
reject with-interface all-of { 08:*:* 02:*:* }

این خط‌مشی تمام دستگاه‌های فلش‌درایو USB دارای رابطی از کلاس‌های HID/Keyboard، Communications و Wireless را رد می‌کند. توجه داشته باشید که حالت مجاز پیش‌فرض رویکرد اشتباهی است و نباید مجموعه‌ای از دستگاه‌ها را رد کرده و بقیه را مجاز بگذارید. خط‌مشی فوق فرض می‌کند که مسدودسازی حالت پیش‌فرض است. رد کردن مجموعه‌ای از دستگاه‌ها که «بد» در نظر گرفته می‌شوند رویکرد خوبی برای محدود کردن مواجهه سیستم‌عامل با چنین دستگاه‌هایی تا حد امکان است.

4.مجاز کردن دستگاه USB صرفاً صفحه‌کلید تنها در صورتی که هنوز دستگاه USB دیگری با رابط صفحه‌کلید مجاز نشده باشد
allow with-interface one-of { 03:00:01 03:01:01 } if !allowed-matches(with-interface one-of { 03:00:01 03:01:01 })
5.«رولت روسی» بازی کردن با دستگاه‌های USB
allow if random(0.1666)
reject

usbguard-daemon(8), usbguard-daemon.conf(5)

اگر اشکالی در این نرم‌افزار پیدا کردید یا مایلید ویژگی جدیدی درخواست دهید، لطفاً یک تیکت در نشانی https://github.com/USBGuard/usbguard/issues/new ثبت کنید.

‏USBGuard در اصل توسط Daniel Kopeček نوشته شده است. افراد بسیاری در توسعه آن مشارکت داشته‌اند.

وبگاه اصلی: https://usbguard.github.io

مجوز GPLv2+: گنو GPL نسخه ۲ یا بالاتر http://gnu.org/licenses/gpl.html. این نرم‌افزار آزاد است: شما می‌توانید آزادانه آن را تغییر داده و بازتوزیع کنید. در حدود مجاز قانون، هیچ ضمانتی وجود ندارد.

09/05/2026