You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

rspamd.lyx 127KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299
  1. #LyX 1.6.4 created this file. For more info see http://www.lyx.org/
  2. \lyxformat 345
  3. \begin_document
  4. \begin_header
  5. \textclass book
  6. \begin_preamble
  7. \usepackage{indentfirst}
  8. \frenchspacing
  9. \end_preamble
  10. \use_default_options false
  11. \language russian
  12. \inputencoding utf8
  13. \font_roman cmr
  14. \font_sans cmss
  15. \font_typewriter cmtt
  16. \font_default_family sfdefault
  17. \font_sc false
  18. \font_osf false
  19. \font_sf_scale 100
  20. \font_tt_scale 100
  21. \graphics default
  22. \paperfontsize default
  23. \spacing single
  24. \use_hyperref true
  25. \pdf_title "Rspamd"
  26. \pdf_author "Vsevolod Stakhov"
  27. \pdf_bookmarks true
  28. \pdf_bookmarksnumbered true
  29. \pdf_bookmarksopen false
  30. \pdf_bookmarksopenlevel 1
  31. \pdf_breaklinks false
  32. \pdf_pdfborder true
  33. \pdf_colorlinks true
  34. \pdf_backref false
  35. \pdf_pdfusetitle true
  36. \papersize a4paper
  37. \use_geometry false
  38. \use_amsmath 0
  39. \use_esint 0
  40. \cite_engine basic
  41. \use_bibtopic false
  42. \paperorientation portrait
  43. \secnumdepth 3
  44. \tocdepth 3
  45. \paragraph_separation indent
  46. \defskip medskip
  47. \quotes_language french
  48. \papercolumns 1
  49. \papersides 1
  50. \paperpagestyle fancy
  51. \tracking_changes false
  52. \output_changes false
  53. \author ""
  54. \author ""
  55. \end_header
  56. \begin_body
  57. \begin_layout Title
  58. Руководство по системе фильтрации спама rspamd.
  59. \end_layout
  60. \begin_layout Date
  61. 22.03.2010
  62. \end_layout
  63. \begin_layout Author
  64. Стахов Всеволод.
  65. \end_layout
  66. \begin_layout Standard
  67. \begin_inset CommandInset toc
  68. LatexCommand tableofcontents
  69. \end_inset
  70. \end_layout
  71. \begin_layout Standard
  72. \end_layout
  73. \begin_layout Chapter
  74. Общая информация и возможности rspamd
  75. \end_layout
  76. \begin_layout Standard
  77. Rspamd - это система, предназначенная для фильтрации спама.
  78. Изначально rspamd разрабатывался как фильтр для электронной почты, но он
  79. может применяться и для другого типа сообщений (например, для jabber или
  80. icq сообщений).
  81. В основе rspamd лежит концепция асинхронной обработки входящих сообщений.
  82. Для этого применяется библиотека libevent.
  83. Это накладывает определенные ограничения на возможности rspamd, так как
  84. для любой блокирующей операции (например, чтение из сетевого сокета) необходимо
  85. регистрировать отдельное событие и его обработчика, но дает преимущества
  86. в скорости работы системы и уменьшает различные служебные затраты (например,
  87. на создание процессов или потоков).
  88. Rspamd поддерживает встроенные фильтры на языке lua, что позволяет писать
  89. собственные фильтры без необходимости пересборки системы.
  90. Rspamd настраивается путем редактирования конфигурационного файла.
  91. Также имеется управляющий интерфейс, посредством которого можно различным
  92. образом управлять работой системы и получать ее текущее состояние.
  93. Rspamd поддерживает различные типы фильтров: фильтры на основе регулярных
  94. выражений, фильтры на основе DNS запросов, фильтры на основе статистики,
  95. фильтры по различным спискам и другие типы фильтров (например, фильтры,
  96. написанные на языке lua и выполняющие различные действия по анализу сообщений).
  97. Rspamd имеет протокол, совместимый с системой spamassassin (в дальнейшем
  98. протокол spamc), а также его расширение - rspamc, позволяющее передавать
  99. больше информации фильтру, что ускоряет обработку сообщений.
  100. Система rspamd состоит из двух основных частей: монитор процессов и процессы,
  101. осуществляющие обработку (workers).
  102. Монитор процессов отвечает за старт системы, открытие/закрытие журналов
  103. работы, а также обеспечивает непрерывную работу рабочих процессов и их
  104. перезапуск при необходимости.
  105. \end_layout
  106. \begin_layout Chapter
  107. Установка rspamd
  108. \end_layout
  109. \begin_layout Section
  110. Требования
  111. \end_layout
  112. \begin_layout Itemize
  113. GNU C компилятор (работоспособность проверялась на gcc 4.2.1)
  114. \end_layout
  115. \begin_layout Itemize
  116. cmake -
  117. \begin_inset CommandInset href
  118. LatexCommand href
  119. name "http://cmake.org/"
  120. target "http://cmake.org/"
  121. \end_inset
  122. используется для конфигурации сборки и генерации Makefile.
  123. Необходимая версия - не менее 2.6.
  124. \end_layout
  125. \begin_layout Itemize
  126. glib -
  127. \begin_inset CommandInset href
  128. LatexCommand href
  129. name "http://ftp.gnome.org/"
  130. target "http://ftp.gnome.org/pub/GNOME/sources/glib/2.20/"
  131. \end_inset
  132. используется для различного рода утилит и структур хранения данных (хеши,
  133. деревья, списки).
  134. Необходимая версия - не менее 2.16.
  135. \end_layout
  136. \begin_layout Itemize
  137. gmime -
  138. \begin_inset CommandInset href
  139. LatexCommand href
  140. name "http://ftp.acc.umu.se"
  141. target "http://ftp.acc.umu.se/pub/GNOME/sources/gmime/2.2/"
  142. \end_inset
  143. используется для разбора mime структуры сообщений.
  144. Необходимая версия 2.2.
  145. Работа с gmime 2.4 и старше не проверялась.
  146. \end_layout
  147. \begin_layout Itemize
  148. lua -
  149. \begin_inset CommandInset href
  150. LatexCommand href
  151. name "http://www.lua.org/"
  152. target "http://www.lua.org/download.html"
  153. \end_inset
  154. используется для работы lua плагинов (без liblua работа rspamd возможна,
  155. но без поддержки lua плагинов).
  156. Версия необходима не меньше, чем 5.1.
  157. \end_layout
  158. \begin_layout Itemize
  159. libevent -
  160. \begin_inset CommandInset href
  161. LatexCommand href
  162. name "http://www.monkey.org/~provos/libevent/"
  163. target "http://www.monkey.org/~provos/libevent/"
  164. \end_inset
  165. используется для кросс-платформенной обработки асинхронных событий, а также
  166. для определения DNS имен (также асинхронного).
  167. \end_layout
  168. \begin_layout Section
  169. Установка
  170. \end_layout
  171. \begin_layout Standard
  172. Для сборки rspamd необходимо скачать архив (самая свежая версия может быть
  173. найдена на
  174. \begin_inset CommandInset href
  175. LatexCommand href
  176. name "http://cebka.pp.ru/distfiles/"
  177. target "http://cebka.pp.ru/distfiles/"
  178. \end_inset
  179. ).
  180. После этого необходимо распаковать архив и скомпилировать код:
  181. \end_layout
  182. \begin_layout LyX-Code
  183. $ tar xzf rspamd-x.x.x.tar.gz
  184. \end_layout
  185. \begin_layout LyX-Code
  186. $ cd rspamd-x.x.x
  187. \end_layout
  188. \begin_layout LyX-Code
  189. $ cmake .
  190. \end_layout
  191. \begin_layout LyX-Code
  192. $ make
  193. \end_layout
  194. \begin_layout Standard
  195. Установка осуществляется стандартным
  196. \end_layout
  197. \begin_layout LyX-Code
  198. # make install
  199. \end_layout
  200. \begin_layout Standard
  201. В процессе установки копируются исполняемые файлы rspamd: bin/rspamd и bin/rspam
  202. c, а также примеры конфигурации и плагины, устанавливающиеся в каталог etc/rspam
  203. d/.
  204. Также для ОС FreeBSD устанавливается стартовый скрипт rspamd.sh в каталог
  205. etc/rc.d.
  206. \end_layout
  207. \begin_layout Section
  208. Запуск
  209. \end_layout
  210. \begin_layout Standard
  211. Rspamd запускается либо из стартового скрипта, либо непосредственно вызовом
  212. rspamd.
  213. Доступные опции командной строки:
  214. \end_layout
  215. \begin_layout Code
  216. -h: Показать справочную информацию и выйти
  217. \end_layout
  218. \begin_layout Code
  219. -t: Проверить конфигурационный файл и выйти
  220. \end_layout
  221. \begin_layout Code
  222. -C: Показать содержимое кеша символов и выйти
  223. \end_layout
  224. \begin_layout Code
  225. -V Показать все переменные rspamd и выйти
  226. \end_layout
  227. \begin_layout Code
  228. -f: Не выполнять демонизацию
  229. \end_layout
  230. \begin_layout Code
  231. -c: Указать путь до конфигурационного файла (по умолчанию используется
  232. /usr/local/etc/rspamd.conf)
  233. \end_layout
  234. \begin_layout Code
  235. -u: Пользователь, под которым осуществлять работу rspamd
  236. \end_layout
  237. \begin_layout Code
  238. -g: Группа, под которой осуществять работу rspamd
  239. \end_layout
  240. \begin_layout Standard
  241. Если rspamd запускается от суперпользователя, то после создания лог-файла,
  242. PID-файла, а также сокетов, принимающих соединения, осуществляется сброс
  243. привиллегий до пользователя и группы, указанных в опциях командной строки
  244. (таким образом, все рабочие процессы работают от указанного пользователя
  245. и группы).
  246. \end_layout
  247. \begin_layout Chapter
  248. Общие принципы работы
  249. \end_layout
  250. \begin_layout Standard
  251. Прежде чем приступать к настройке rspamd необходимо понять основные принципы
  252. функционирования системы.
  253. \end_layout
  254. \begin_layout Section
  255. Планирование и запуск рабочих процессов
  256. \end_layout
  257. \begin_layout Standard
  258. При запуске rspamd происходят следующие действия:
  259. \end_layout
  260. \begin_layout Enumerate
  261. Запускается главный процесс (rspamd main)
  262. \end_layout
  263. \begin_layout Enumerate
  264. Инициализируются конфигурационные параметры по умолчанию
  265. \end_layout
  266. \begin_layout Enumerate
  267. Читаются параметры командной строки
  268. \end_layout
  269. \begin_layout Enumerate
  270. Настраивается журналирование ошибок в терминал
  271. \end_layout
  272. \begin_layout Enumerate
  273. Читается и парсится конфигурационный файл
  274. \end_layout
  275. \begin_layout Enumerate
  276. Инициализируются модули
  277. \end_layout
  278. \begin_layout Enumerate
  279. Модули читают свои конфигурационные параметры
  280. \end_layout
  281. \begin_layout Enumerate
  282. Устанавливаются лимиты
  283. \end_layout
  284. \begin_layout Enumerate
  285. Настраивается журналирование, указанное в конфигурационном файле
  286. \end_layout
  287. \begin_layout Enumerate
  288. Происходит демонизация (если не указан флаг -f)
  289. \end_layout
  290. \begin_layout Enumerate
  291. Настраивается обработка сигналов головным процессом
  292. \end_layout
  293. \begin_layout Enumerate
  294. Записывается PID-файл
  295. \end_layout
  296. \begin_layout Enumerate
  297. Инициализируются lua плагины
  298. \end_layout
  299. \begin_layout Enumerate
  300. Инициализируется подсистема событий и mime парсер
  301. \end_layout
  302. \begin_layout Enumerate
  303. Загружается кеш символов
  304. \end_layout
  305. \begin_layout Enumerate
  306. Порождаются рабочие процессы (сброс привиллегий осуществляется сразу же
  307. после вызова fork)
  308. \end_layout
  309. \begin_layout Enumerate
  310. Начинается цикл обработки сигналов
  311. \end_layout
  312. \begin_layout Standard
  313. Головной процесс rspamd реагирует на следующие сигналы:
  314. \end_layout
  315. \begin_layout Itemize
  316. SIGTERM - послать всем рабочим процессам SIGTERM, дождаться их завершения
  317. и выйти
  318. \end_layout
  319. \begin_layout Itemize
  320. SIGINT - то же, что и SIGTERM
  321. \end_layout
  322. \begin_layout Itemize
  323. SIGHUP - переинициализировать журналирование и породить новые рабочие процессы,
  324. завершив старые (при этом, существующие рабочие процессы завершают работу,
  325. обработав уже полученные соединения)
  326. \end_layout
  327. \begin_layout Itemize
  328. SIGCHLD - головной процесс получает этот сигнал при завершении работы рабочего
  329. процесса.
  330. Если рабочий процесс завершился некорректно, то планируется его перезапуск
  331. через 2 секунды.
  332. \end_layout
  333. \begin_layout Itemize
  334. SIGUSR2 - приходит от рабочего процесса, когда тот успешно инициализируется
  335. \end_layout
  336. \begin_layout Itemize
  337. SIGALARM - сигнализирует о необходимости запуска рабочего процесса, который
  338. был запланирован после получения SIGCHLD
  339. \end_layout
  340. \begin_layout Standard
  341. Таким образом, головной процесс отвечает за инициализацию, конфигурацию,
  342. работу с PID-файлом, работу с журналированием, а также за порождение рабочих
  343. процессов.
  344. В ходе работы головной процесс постоянно следит за работой рабочих процессов
  345. и обеспечивает перезапуск некорректно завершившихся рабочих процессов.
  346. Для ротации файлов журналирования рабочему процессу необходимо послать
  347. сигнал SIGHUP.
  348. \end_layout
  349. \begin_layout Section
  350. Логика обработки сообщений
  351. \end_layout
  352. \begin_layout Standard
  353. Инициализация рабочего процесса предельно проста: происходит переинициализация
  354. libevent, а также инициализация DNS resolver'а.
  355. После этого рабочий процесс устанавливает обработчик готовности к чтению
  356. слушающего сокета (этот сокет создается в головном процессе и передается
  357. рабочему процессу как параметр).
  358. При готовности к чтению на слущающем сокете рабочий процесс создает новый
  359. объект типа worker_task и делается accept на слушающем сокете.
  360. После этого rspamd обрабатывает протокол rspamc (или же spamc) и читает
  361. сообщение.
  362. После окончания получения сообщения rspamd декодирует его содержимое и
  363. начинает обработку.
  364. Для более простого изложения принципов работы rspamd необходимо описать
  365. некоторые понятия:
  366. \end_layout
  367. \begin_layout Itemize
  368. Символ - это правило фильтрации rspamd, например, некоторое регулярное выражение
  369. или же запрос к DNS или же любое другое действие.
  370. Символ имеет собственный вес и имя.
  371. Таким образом, символ можно считать результатом работы одного правила фильтраци
  372. и.
  373. Если это правило сработало, то оно добавляет символ с определенным весом
  374. и атрибутами, если нет, то символ не добавляется.
  375. \end_layout
  376. \begin_layout Itemize
  377. Метрика - это набор логически связанных правил и связанных с ними символов.
  378. Такая группа имеет свой предел очков, после набора которых сообщение считается
  379. по этой метрике спамом.
  380. Очки формируются после подсчета весов символов, добавленных в метрику (при
  381. этом, разумеется, несработавшие правила символов не добавляют и их вес
  382. равен нулю) и обработки этих весов функцией консолидации.
  383. По умолчанию такой функцией является функция-факторизатор, которая просто
  384. считает вес каждого символа равным константе, заданной в конфигурационном
  385. файле для этого символа, например, следующие параметры в конфигурационном
  386. файле задают вес символа MIME_HTML_ONLY равный одному, а вес символа FAKE_HTML
  387. - восьми:
  388. \end_layout
  389. \begin_layout LyX-Code
  390. "MIME_HTML_ONLY" = 1;
  391. \end_layout
  392. \begin_layout LyX-Code
  393. "FAKE_HTML" = 8;
  394. \end_layout
  395. \begin_layout Itemize
  396. Модуль - это набор правил rspamd, который обеспечивает общие проверки.
  397. Например, модуль проверки регулярных выражений или модуль проверки URL'ей
  398. по
  399. \begin_inset Quotes eld
  400. \end_inset
  401. черным
  402. \begin_inset Quotes erd
  403. \end_inset
  404. спискам.
  405. Модули также могут быть написаны на языке LUA.
  406. Каждый модуль регистрирует символы, соответствующие сконфигурированным
  407. в нем правилам, в таблице символов заданной метрики (или метрики по умолчанию
  408. \begin_inset Quotes eld
  409. \end_inset
  410. default
  411. \begin_inset Quotes erd
  412. \end_inset
  413. ).
  414. \end_layout
  415. \begin_layout Itemize
  416. Таблица символов метрики - это таблица, хранящая данные о зарегистрированных
  417. символах, таблица отсортирована, чтобы обеспечить проверку самых
  418. \begin_inset Quotes eld
  419. \end_inset
  420. удобных
  421. \begin_inset Quotes erd
  422. \end_inset
  423. правил в первую очередь.
  424. Критерий
  425. \begin_inset Quotes eld
  426. \end_inset
  427. удобности
  428. \begin_inset Quotes erd
  429. \end_inset
  430. составляется из трех составляющих: веса правила, частоты его срабатывания
  431. и времени его выполнения.
  432. Чем больше вес, частота срабатывания и меньше время выполнения, тем раньше
  433. будет проверено это правило.
  434. \end_layout
  435. \begin_layout Itemize
  436. Классификатор - это алгоритм, обеспечивающий определение принадлежности
  437. сообщения к какому-либо классу.
  438. Класс определяется символом (например символ SPAM, имеющий вес 5 и символ
  439. HAM, имеющий вес -5).
  440. Принадлежность к классу обеспечивается либо статистически, путем разбора
  441. текста сообщения на токены и сравнения с известными токенами, хранящимися
  442. на диске в виде файла токенов (statfile), либо же иным алгоритмом (например,
  443. нейросетью).
  444. В результате работы классификатора определяется соответствие сообщения
  445. какому-либо классу и добавления соответствующего этому классу символа.
  446. Классификатор отличается от обычного модуля тем, что он не просто проверяет
  447. какие-либо характеристики сообщения, а сравнивает содержание сообщения
  448. с известными ему наборами.
  449. То есть, классификатор для его работы необходимо обучать на различных наборах.
  450. В настоящее время в rspamd реализован алгоритм классификации winnow и разбора
  451. на токены OSB.
  452. О них будет написано в дальнейшем.
  453. \end_layout
  454. \begin_layout Standard
  455. Обработка осуществляется по следующей логике:
  456. \end_layout
  457. \begin_layout Itemize
  458. для каждой метрики выбирается таблица символов и выбираются по очереди символы
  459. (по степени
  460. \begin_inset Quotes eld
  461. \end_inset
  462. удобности
  463. \begin_inset Quotes erd
  464. \end_inset
  465. )
  466. \end_layout
  467. \begin_layout Itemize
  468. для каждого символа вызывается соответствующее правило
  469. \end_layout
  470. \begin_layout Itemize
  471. после вызова очередного правила проверяется, не превысил ли результат метрики
  472. порогового результата
  473. \end_layout
  474. \begin_layout Itemize
  475. при превышении порога сообщение считается по этой метрике спамом и больше
  476. символов из этой метрики не проверяется
  477. \end_layout
  478. \begin_layout Itemize
  479. для сообщения проверяется принадлежность к какому-либо классу для корректировки
  480. результата
  481. \end_layout
  482. \begin_layout Itemize
  483. после определения принадлежности к классу происходит окончательный пересчет
  484. очков по метрике и при совпадении критериев автообучения происходит автообучени
  485. е классификатора
  486. \end_layout
  487. \begin_layout Standard
  488. После обработки сообщений для каждой из метрик выводится результат.
  489. Если используется протокол spamc, то считается только метрика
  490. \begin_inset Quotes eld
  491. \end_inset
  492. default
  493. \begin_inset Quotes erd
  494. \end_inset
  495. , а дополнительные метрики добавляются как заголовки вида X-Spam-Status:
  496. metric; result.
  497. Для протокола rspamc выводятся результаты всех метрик, что позволяет настраиват
  498. ь различные группы правил и осуществлять фильтрацию сообщений не только
  499. как spam/ham, а задавать различные критерии оценки.
  500. \end_layout
  501. \begin_layout Chapter
  502. Настройка rspamd
  503. \end_layout
  504. \begin_layout Section
  505. Общие правила настройки
  506. \end_layout
  507. \begin_layout Standard
  508. Файл конфигурации rspamd имеет следующий синтаксис:
  509. \end_layout
  510. \begin_layout LyX-Code
  511. param = value;
  512. \end_layout
  513. \begin_layout Standard
  514. Точка с запятой является обязательной в конце каждой директивы.
  515. Некоторые директивы являются составными и обрамляются фигурными скобками,
  516. например:
  517. \end_layout
  518. \begin_layout LyX-Code
  519. section {
  520. \end_layout
  521. \begin_deeper
  522. \begin_layout LyX-Code
  523. param = value;
  524. \end_layout
  525. \end_deeper
  526. \begin_layout LyX-Code
  527. };
  528. \end_layout
  529. \begin_layout Standard
  530. Также позволяется включать другие файлы (точка с запятой в конце директивы
  531. не нужна):
  532. \end_layout
  533. \begin_layout LyX-Code
  534. .include /path/to/file
  535. \end_layout
  536. \begin_layout Standard
  537. В конфигурационном файле допускается определять и использовать переменные:
  538. \end_layout
  539. \begin_layout LyX-Code
  540. $var = "some text";
  541. \end_layout
  542. \begin_layout LyX-Code
  543. param = "${var}";
  544. \end_layout
  545. \begin_layout Standard
  546. Приведенный фрагмент определяет переменную $var и присваивает параметру
  547. \begin_inset Quotes eld
  548. \end_inset
  549. param
  550. \begin_inset Quotes erd
  551. \end_inset
  552. значение
  553. \begin_inset Quotes eld
  554. \end_inset
  555. some text
  556. \begin_inset Quotes erd
  557. \end_inset
  558. .
  559. Переменные имеют глобальную область действия, обрамление переменных фигурными
  560. скобками при использовании (вида ${some_variable}) обязательно.
  561. Большинство строк конфигурационного файла обрамляется двойными кавычками.
  562. Одинарные кавычки применяются только при конфигурации модуля (это поведение
  563. подлежит пересмотру в следующих версиях):
  564. \end_layout
  565. \begin_layout LyX-Code
  566. .module 'name' {
  567. \end_layout
  568. \begin_deeper
  569. \begin_layout LyX-Code
  570. param = "value";
  571. \end_layout
  572. \end_deeper
  573. \begin_layout LyX-Code
  574. };
  575. \end_layout
  576. \begin_layout Subsection
  577. Определения списков
  578. \end_layout
  579. \begin_layout Standard
  580. В rspamd многие параметры задаются в виде списков.
  581. Списки задаются ссылкой на файл или же http ресурс.
  582. Основное отличие таких файлов в том, что rspamd проверяет изменения в таких
  583. файлах (примерно раз в минуту, используя случайный разброс) и перегружает
  584. списки при их модификации.
  585. Таким же образом организована загрузка списков через http, только вместо
  586. modification time используется HTTP 1.1 заголовок If-Modified-Since, в ответ
  587. на который http сервер может выдать ответ 304: Not modified, в таком случае
  588. rspamd не перечитывает список.
  589. Списками задаются те параметры, которые могут содержать много значений
  590. и которые могут часто меняться.
  591. Для того, чтобы не приходилось выполнять перезапуск rspamd списки перечитываютс
  592. я по мере их обновления.
  593. Определения списков выглядят следующим образом:
  594. \end_layout
  595. \begin_layout Itemize
  596. http список:
  597. \end_layout
  598. \begin_layout LyX-Code
  599. param = "http://test.ru:81/some/path.php";
  600. \end_layout
  601. \begin_layout LyX-Code
  602. param = "http://test.ru/some/other.txt";
  603. \end_layout
  604. \begin_layout Itemize
  605. file список:
  606. \end_layout
  607. \begin_layout LyX-Code
  608. param = "file:///var/run/rspamd/some.file";
  609. \end_layout
  610. \begin_layout Section
  611. Общие параметры конфигурации
  612. \end_layout
  613. \begin_layout Standard
  614. Общие параметры не принадлежат никакой секции и позволяют задавать общие
  615. настройки системы.
  616. \end_layout
  617. \begin_layout Itemize
  618. pidfile - путь до PID-файла:
  619. \end_layout
  620. \begin_layout LyX-Code
  621. pidfile = "/var/run/rspamd.pid";
  622. \end_layout
  623. \begin_layout Itemize
  624. statfile_pool_size - размер пула файлов статистики в памяти.
  625. Может быть с суффиксом, определяющим единицы измерение (по умолчанию байты):
  626. K - килобайты, M - мегабайты, G - гигабайты.
  627. \end_layout
  628. \begin_layout LyX-Code
  629. statfile_pool_size = 40M;
  630. \end_layout
  631. \begin_layout Itemize
  632. raw_mode - если этот параметр равен
  633. \begin_inset Quotes eld
  634. \end_inset
  635. yes
  636. \begin_inset Quotes erd
  637. \end_inset
  638. , то rspamd не осуществляет перекодировку сообщений в utf8, в этом режиме
  639. проверка сообщений осуществляется быстрее, но при этом одинаковые сообщения
  640. в разных кодировках будут обрабатываться как разные.
  641. \end_layout
  642. \begin_layout LyX-Code
  643. raw_mode = yes;
  644. \end_layout
  645. \begin_layout Itemize
  646. filters - строка, содержащая список включенных модулей, имена модулей разделяютс
  647. я запятыми и/или пробелами.
  648. \end_layout
  649. \begin_layout LyX-Code
  650. filters = "surbl,regexp,chartable,emails";
  651. \end_layout
  652. \begin_layout Section
  653. Настройка процессов
  654. \end_layout
  655. \begin_layout Standard
  656. Данные секции служат для определения параметров рабочих процессов.
  657. Общие параметры рабочего процесса:
  658. \end_layout
  659. \begin_layout Itemize
  660. type - тип рабочего процесса:
  661. \end_layout
  662. \begin_deeper
  663. \begin_layout Itemize
  664. normal - обычный процесс обработки сообщений
  665. \end_layout
  666. \begin_layout Itemize
  667. controller - управляющий процесс
  668. \end_layout
  669. \begin_layout Itemize
  670. lmtp - процесс обработки сообщений по протоколу lmtp
  671. \end_layout
  672. \begin_layout Itemize
  673. fuzzy - хранилище хешей
  674. \end_layout
  675. \end_deeper
  676. \begin_layout LyX-Code
  677. type = "normal";
  678. \end_layout
  679. \begin_layout Itemize
  680. bind_socket - параметры слушающего сокета процесса, может определять либо
  681. tcp сокет, либо unix сокет:
  682. \end_layout
  683. \begin_deeper
  684. \begin_layout Itemize
  685. host:port - осуществляет bind на указанные host и port
  686. \end_layout
  687. \begin_layout Itemize
  688. *:port - осуществляет bind на указанные port на всех локальных адресах
  689. \end_layout
  690. \begin_layout Itemize
  691. /path/to/socket - осуществляет bind на указанный unix socket
  692. \end_layout
  693. \end_deeper
  694. \begin_layout LyX-Code
  695. bind_socket = localhost:11334;
  696. \end_layout
  697. \begin_layout Itemize
  698. count - количество процессов данного типа.
  699. По умолчанию это число равно числу логических процессоров в системе.
  700. \end_layout
  701. \begin_layout LyX-Code
  702. count = 1;
  703. \end_layout
  704. \begin_layout Standard
  705. Для процессов типа
  706. \begin_inset Quotes eld
  707. \end_inset
  708. controller
  709. \begin_inset Quotes erd
  710. \end_inset
  711. можно также указать пароль для привиллегированных команд параметром password,
  712. а для процессов типа
  713. \begin_inset Quotes eld
  714. \end_inset
  715. fuzzy
  716. \begin_inset Quotes erd
  717. \end_inset
  718. необходимо указать путь к файлу, который будет использован как хранилище
  719. хешей параметром hashfile.
  720. Пример настройки рабочих процессов:
  721. \end_layout
  722. \begin_layout LyX-Code
  723. worker {
  724. \end_layout
  725. \begin_deeper
  726. \begin_layout LyX-Code
  727. type = "normal";
  728. \end_layout
  729. \begin_layout LyX-Code
  730. count = 1;
  731. \end_layout
  732. \begin_layout LyX-Code
  733. bind_socket = *:11333;
  734. \end_layout
  735. \end_deeper
  736. \begin_layout LyX-Code
  737. };
  738. \end_layout
  739. \begin_layout LyX-Code
  740. \end_layout
  741. \begin_layout LyX-Code
  742. worker {
  743. \end_layout
  744. \begin_deeper
  745. \begin_layout LyX-Code
  746. type = "controller";
  747. \end_layout
  748. \begin_layout LyX-Code
  749. bind_socket = localhost:11334;
  750. \end_layout
  751. \begin_layout LyX-Code
  752. count = 1;
  753. \end_layout
  754. \begin_layout LyX-Code
  755. password = "q1";
  756. \end_layout
  757. \end_deeper
  758. \begin_layout LyX-Code
  759. };
  760. \end_layout
  761. \begin_layout LyX-Code
  762. worker {
  763. \end_layout
  764. \begin_deeper
  765. \begin_layout LyX-Code
  766. type = "fuzzy";
  767. \end_layout
  768. \begin_layout LyX-Code
  769. bind_socket = localhost:11335;
  770. \end_layout
  771. \begin_layout LyX-Code
  772. count = 1;
  773. \end_layout
  774. \begin_layout LyX-Code
  775. hashfile = "/tmp/fuzzy.db";
  776. \end_layout
  777. \end_deeper
  778. \begin_layout LyX-Code
  779. };
  780. \end_layout
  781. \begin_layout Section
  782. Настройки журналирования
  783. \end_layout
  784. \begin_layout Standard
  785. Данные настройки определяют тип журналирования и его параметры.
  786. \end_layout
  787. \begin_layout Itemize
  788. log_type - тип журналирования:
  789. \end_layout
  790. \begin_deeper
  791. \begin_layout Itemize
  792. console - журналирование в stderr
  793. \end_layout
  794. \begin_layout Itemize
  795. syslog - журналирование через syslog
  796. \end_layout
  797. \begin_layout Itemize
  798. file - журналирование в файл
  799. \end_layout
  800. \end_deeper
  801. \begin_layout LyX-Code
  802. log_type = console;
  803. \end_layout
  804. \begin_layout Itemize
  805. log_level - уровень ведения журнала
  806. \end_layout
  807. \begin_deeper
  808. \begin_layout Itemize
  809. DEBUG - журналирование отладочной информации
  810. \end_layout
  811. \begin_layout Itemize
  812. INFO - журналирование информационных событий
  813. \end_layout
  814. \begin_layout Itemize
  815. WARN - журналирование только предупреждений
  816. \end_layout
  817. \begin_layout Itemize
  818. ERROR - журналирование только ошибок
  819. \end_layout
  820. \end_deeper
  821. \begin_layout LyX-Code
  822. log_level = INFO;
  823. \end_layout
  824. \begin_layout Itemize
  825. log_facility - используется для журналирования в syslog и определяет назначение
  826. сообщений.
  827. Более подробно об этом можно узнать из man syslog.
  828. \end_layout
  829. \begin_layout LyX-Code
  830. log_facility = "LOG_MAIL";
  831. \end_layout
  832. \begin_layout Itemize
  833. log_file - используется для журналирования в файл и путь к файлу журнала.
  834. \end_layout
  835. \begin_layout LyX-Code
  836. log_file = "/var/log/rspamd.log";
  837. \end_layout
  838. \begin_layout Standard
  839. Пример настройки журналирования:
  840. \end_layout
  841. \begin_layout LyX-Code
  842. logging {
  843. \end_layout
  844. \begin_deeper
  845. \begin_layout LyX-Code
  846. log_type = file;
  847. \end_layout
  848. \begin_layout LyX-Code
  849. log_level = INFO;
  850. \end_layout
  851. \begin_layout LyX-Code
  852. log_file = "/var/log/rspamd.log"
  853. \end_layout
  854. \end_deeper
  855. \begin_layout LyX-Code
  856. };
  857. \end_layout
  858. \begin_layout Section
  859. Настройки метрики
  860. \end_layout
  861. \begin_layout Standard
  862. Для настроек метрик используются секции
  863. \begin_inset Quotes eld
  864. \end_inset
  865. metric
  866. \begin_inset Quotes erd
  867. \end_inset
  868. .
  869. Основные параметры метрик:
  870. \end_layout
  871. \begin_layout Itemize
  872. name - имя метрики.
  873. \end_layout
  874. \begin_layout LyX-Code
  875. name = "default";
  876. \end_layout
  877. \begin_layout Itemize
  878. required_score - минимальное число очков, необходимое, чтобы сообщение считалось
  879. спамом по данной метрике.
  880. \end_layout
  881. \begin_layout LyX-Code
  882. required_score = 10;
  883. \end_layout
  884. \begin_layout Itemize
  885. cache_file - путь до файла, содержащего кеш символов метрики (используется,
  886. чтобы сохранить статистику
  887. \begin_inset Quotes eld
  888. \end_inset
  889. удобности
  890. \begin_inset Quotes erd
  891. \end_inset
  892. символов метрики, чтобы при перезапуске rspamd не терять накопленных данных).
  893. \end_layout
  894. \begin_layout LyX-Code
  895. cache_file = "/var/run/rspamd/metric.cache";
  896. \end_layout
  897. \begin_layout Standard
  898. Пример настройки метрики:
  899. \end_layout
  900. \begin_layout LyX-Code
  901. metric {
  902. \end_layout
  903. \begin_deeper
  904. \begin_layout LyX-Code
  905. name = "default";
  906. \end_layout
  907. \begin_layout LyX-Code
  908. required_score = 10.1;
  909. \end_layout
  910. \begin_layout LyX-Code
  911. cache_file = "/tmp/symbols.cache";
  912. \end_layout
  913. \end_deeper
  914. \begin_layout LyX-Code
  915. };
  916. \end_layout
  917. \begin_layout Section
  918. Настройка классификаторов
  919. \end_layout
  920. \begin_layout Standard
  921. Для настройки классификаторов используются секции
  922. \begin_inset Quotes eld
  923. \end_inset
  924. classifier
  925. \begin_inset Quotes erd
  926. \end_inset
  927. .
  928. Общие настройки классфикатора:
  929. \end_layout
  930. \begin_layout Itemize
  931. type - алгоритм классификатора (в настоящее время определен только
  932. \begin_inset Quotes eld
  933. \end_inset
  934. winnow
  935. \begin_inset Quotes erd
  936. \end_inset
  937. ).
  938. \end_layout
  939. \begin_layout LyX-Code
  940. type = "winnow";
  941. \end_layout
  942. \begin_layout Itemize
  943. tokenizer - алгоритм разбиения сообщения на токены (в настоящее время определен
  944. только
  945. \begin_inset Quotes eld
  946. \end_inset
  947. osb-text
  948. \begin_inset Quotes erd
  949. \end_inset
  950. ).
  951. \end_layout
  952. \begin_layout LyX-Code
  953. tokenizer = "osb-text";
  954. \end_layout
  955. \begin_layout Standard
  956. Также каждый классификатор может содержать определения классов и соответствующих
  957. им файлов токенов.
  958. Для этого используется подсекция statfile, содержащая следующие параметры:
  959. \end_layout
  960. \begin_layout Itemize
  961. symbol - имя класса и имя символа, используемого для данного класса.
  962. \end_layout
  963. \begin_layout LyX-Code
  964. symbol = "WINNOW_SPAM";
  965. \end_layout
  966. \begin_layout Itemize
  967. path - путь до файла.
  968. \end_layout
  969. \begin_layout LyX-Code
  970. path = "/var/run/rspamd/winnow.spam";
  971. \end_layout
  972. \begin_layout Itemize
  973. size - размер данного файла.
  974. Также может иметь суффикс размерности.
  975. \end_layout
  976. \begin_layout LyX-Code
  977. size = 100M;
  978. \end_layout
  979. \begin_layout Standard
  980. Внутри каждого определения класса можно использовать подсекцию autolearn,
  981. определяющую условия, при которых происходит автоматическое обучение данного
  982. класса.
  983. Секция имеет следующие параметры:
  984. \end_layout
  985. \begin_layout Itemize
  986. min_mark - минимальное число очков, при котором осуществляется обучение.
  987. \end_layout
  988. \begin_layout LyX-Code
  989. min_mark = 10.1;
  990. \end_layout
  991. \begin_layout Itemize
  992. max_mark - максимальное число очков, при котором осуществляется обучение.
  993. \end_layout
  994. \begin_layout LyX-Code
  995. max_mark = 0.1;
  996. \end_layout
  997. \begin_layout Standard
  998. Автообучение происходит, если данное сообщение отвечает данным критериям.
  999. То есть, логично обучать класификатор HAM сообщениями, указав максимальное
  1000. количество очков, близкое к нулю и SPAM сообщениями, указав минимальное
  1001. число очков, близкое к срабатыванию триггера SPAM для данной метрики.
  1002. Таким образом, классифицируемые как спам сообщения обучают класс SPAM,
  1003. а классифицируемые как HAM (то есть, на них не сработали правила метрики)
  1004. - обучают класс HAM.
  1005. \end_layout
  1006. \begin_layout Standard
  1007. Пример определения классификатора:
  1008. \end_layout
  1009. \begin_layout LyX-Code
  1010. classifier {
  1011. \end_layout
  1012. \begin_deeper
  1013. \begin_layout LyX-Code
  1014. type = "winnow";
  1015. \end_layout
  1016. \begin_layout LyX-Code
  1017. tokenizer = "osb-text";
  1018. \end_layout
  1019. \end_deeper
  1020. \begin_layout LyX-Code
  1021. \end_layout
  1022. \begin_deeper
  1023. \begin_layout LyX-Code
  1024. statfile {
  1025. \end_layout
  1026. \begin_deeper
  1027. \begin_layout LyX-Code
  1028. symbol = "WINNOW_SPAM";
  1029. \end_layout
  1030. \begin_layout LyX-Code
  1031. path = "/tmp/test.spam";
  1032. \end_layout
  1033. \begin_layout LyX-Code
  1034. size = 10M;
  1035. \end_layout
  1036. \begin_layout LyX-Code
  1037. \end_layout
  1038. \begin_layout LyX-Code
  1039. autolearn {
  1040. \end_layout
  1041. \begin_deeper
  1042. \begin_layout LyX-Code
  1043. min_mark = 10.0;
  1044. \end_layout
  1045. \end_deeper
  1046. \begin_layout LyX-Code
  1047. };
  1048. \end_layout
  1049. \end_deeper
  1050. \begin_layout LyX-Code
  1051. };
  1052. \end_layout
  1053. \begin_layout LyX-Code
  1054. \end_layout
  1055. \begin_layout LyX-Code
  1056. statfile {
  1057. \end_layout
  1058. \begin_deeper
  1059. \begin_layout LyX-Code
  1060. symbol = "WINNOW_HAM";
  1061. \end_layout
  1062. \begin_layout LyX-Code
  1063. path = "/tmp/test.ham";
  1064. \end_layout
  1065. \begin_layout LyX-Code
  1066. size = 10M;
  1067. \end_layout
  1068. \begin_layout LyX-Code
  1069. \end_layout
  1070. \begin_layout LyX-Code
  1071. autolearn {
  1072. \end_layout
  1073. \begin_deeper
  1074. \begin_layout LyX-Code
  1075. max_mark = 0.1;
  1076. \end_layout
  1077. \end_deeper
  1078. \begin_layout LyX-Code
  1079. };
  1080. \end_layout
  1081. \end_deeper
  1082. \begin_layout LyX-Code
  1083. };
  1084. \end_layout
  1085. \end_deeper
  1086. \begin_layout LyX-Code
  1087. };
  1088. \end_layout
  1089. \begin_layout Subsection
  1090. Настройка синхронизации статистики
  1091. \end_layout
  1092. \begin_layout Standard
  1093. Статистические данные можно синхронизировать между несколькими rspamd.
  1094. Для этого используется master/slave синхронизация и бинарный лог изменений
  1095. в статистическом файле.
  1096. Для настройки синхронизации используются следующие параметры при определении
  1097. статистического файла:
  1098. \end_layout
  1099. \begin_layout LyX-Code
  1100. statfile {
  1101. \end_layout
  1102. \begin_deeper
  1103. \begin_layout LyX-Code
  1104. ...
  1105. \end_layout
  1106. \begin_layout LyX-Code
  1107. binlog = "slave";
  1108. \end_layout
  1109. \begin_layout LyX-Code
  1110. binlog_master = "somehost:11334";
  1111. \end_layout
  1112. \begin_layout LyX-Code
  1113. ...
  1114. \end_layout
  1115. \end_deeper
  1116. \begin_layout LyX-Code
  1117. };
  1118. \end_layout
  1119. \begin_layout LyX-Code
  1120. ...
  1121. \end_layout
  1122. \begin_layout LyX-Code
  1123. statfile {
  1124. \end_layout
  1125. \begin_deeper
  1126. \begin_layout LyX-Code
  1127. ...
  1128. \end_layout
  1129. \begin_layout LyX-Code
  1130. binlog = "master";
  1131. \end_layout
  1132. \begin_layout LyX-Code
  1133. ...
  1134. \end_layout
  1135. \end_deeper
  1136. \begin_layout LyX-Code
  1137. };
  1138. \end_layout
  1139. \begin_layout Standard
  1140. При настройке slave для синхронизации указывается адрес master для данного
  1141. файла.
  1142. Этот адрес фактически является адресом контроллера, который сконфигурирован
  1143. работать с данным файлом как master.
  1144. Если rspamd настроен работать с данным файлом статистики как master, то
  1145. создается специальный файл с таким же именем, как файл статистики, но имеющим
  1146. суффикс .binlog.
  1147. В данный файл записываются ревизии и изменения, внесенные в файл статистики.
  1148. Данный файл хранит фиксированное число изменений и ротируется при переполнении.
  1149. Синхронизация производится всеми slave хостами с промежутком от 1-й до
  1150. 2-х минут.
  1151. При этом, нет разницы, в каком состоянии был файл статистики на slave хосте
  1152. - после синхронизации файл статистики на slave будет в точности совпадать
  1153. с файлом статистики на master'е.
  1154. Обновления файлов статистики являются инкрементальными, то есть передаются
  1155. только изменения, а не файлы целиком.
  1156. Синхронизация файлов статистики позволяет легко построить кластер rspamd,
  1157. которые работают и обучаются идентично (хотя обучение должно производиться
  1158. через контроллер мастера).
  1159. \end_layout
  1160. \begin_layout Section
  1161. Настройка коэффициентов символов
  1162. \end_layout
  1163. \begin_layout Standard
  1164. Для настройки коэффициентов применяется секция
  1165. \begin_inset Quotes eld
  1166. \end_inset
  1167. factors
  1168. \begin_inset Quotes erd
  1169. \end_inset
  1170. .
  1171. Данная секция состоит из набора определений вида
  1172. \end_layout
  1173. \begin_layout LyX-Code
  1174. "СИМВОЛ" = вес;
  1175. \end_layout
  1176. \begin_layout Standard
  1177. например:
  1178. \end_layout
  1179. \begin_layout LyX-Code
  1180. "R_UNDISC_RCPT" = 5;
  1181. \end_layout
  1182. \begin_layout LyX-Code
  1183. "MISSING_MID" = 3;
  1184. \end_layout
  1185. \begin_layout LyX-Code
  1186. "R_RCVD_SPAMBOTS" = 3;
  1187. \end_layout
  1188. \begin_layout LyX-Code
  1189. "R_TO_SEEMS_AUTO" = 3;
  1190. \end_layout
  1191. \begin_layout LyX-Code
  1192. "R_MISSING_CHARSET" = 5;
  1193. \end_layout
  1194. \begin_layout Standard
  1195. В секции
  1196. \begin_inset Quotes fld
  1197. \end_inset
  1198. factors
  1199. \begin_inset Quotes frd
  1200. \end_inset
  1201. также можно задать параметр grow_factor, который задает коэффициент приращения
  1202. при добавлении символов в метрику.
  1203. Работает это так: допустим, добавляется первый символ - его реальный вес
  1204. будет равен 1 * factor (то есть, если factor равен 1, то и реальный вес
  1205. будет равен 1), после чего следующий символ будет иметь реальный вес grow_facto
  1206. r * factor (например, если grow_factor = 1.1, то реальный вес будет 1.1 *
  1207. factor), далее следующий будет иметь вес (1 + ((grow_factor) - 1)*2)*factor
  1208. (то есть, при предыдущем grow_factor, реальный вес будет 1.2 * factor, следующий
  1209. символ 1.3, затем 1.4 и.т.д.).
  1210. Данная возможность позволяет увеличивать вес письмам, проходящим по нескольким
  1211. правилам.
  1212. Правила с отрицательным весом не увеличивают grow_factor и не модифицируются
  1213. им (то есть, реальный вес таких правил равен 1 * factor).
  1214. Пример задания параметра grow_factor:
  1215. \end_layout
  1216. \begin_layout LyX-Code
  1217. grow_factor = 1.1;
  1218. \end_layout
  1219. \begin_layout Standard
  1220. Также существует возможность создавать
  1221. \begin_inset Quotes fld
  1222. \end_inset
  1223. составные
  1224. \begin_inset Quotes frd
  1225. \end_inset
  1226. символы - символы, которые являются комбинацией других символов.
  1227. Это нужно для возможности указывать, что комбинация определенных символов
  1228. имеет больший (или, наоборот, меньший) вес, чем сумма весов нескольких
  1229. символов.
  1230. Составные символы представляют собой логические выражения из других символов,
  1231. например:
  1232. \end_layout
  1233. \begin_layout LyX-Code
  1234. composites {
  1235. \end_layout
  1236. \begin_deeper
  1237. \begin_layout LyX-Code
  1238. COMPOSITE_SYMBOL1 =
  1239. \begin_inset Quotes fld
  1240. \end_inset
  1241. SYMBOL1 & (SYMBOL2 | SYMBOL3)
  1242. \begin_inset Quotes frd
  1243. \end_inset
  1244. ;
  1245. \end_layout
  1246. \begin_layout LyX-Code
  1247. COMPOSITE_SYMBOL2 =
  1248. \begin_inset Quotes fld
  1249. \end_inset
  1250. SYMBOL3 & !SYMBOL4
  1251. \begin_inset Quotes frd
  1252. \end_inset
  1253. ;
  1254. \end_layout
  1255. \end_deeper
  1256. \begin_layout LyX-Code
  1257. };
  1258. \end_layout
  1259. \begin_layout Standard
  1260. При добавлении составного символа все символы, входящие в него, удаляются
  1261. из результата.
  1262. То есть, при срабатывании COMPOSITE_SYMBOL1 из предыдущего примера символы
  1263. SYMBOL1, SYMBOL2 и SYMBOL3 в ответе не появятся.
  1264. \end_layout
  1265. \begin_layout Section
  1266. Представления и настройки
  1267. \end_layout
  1268. \begin_layout Subsection
  1269. Представления
  1270. \end_layout
  1271. \begin_layout Standard
  1272. В rspamd существует возможность настройки правил, которые будут проверяться,
  1273. исходя из определенных критериев.
  1274. Представления настраиваются в конфигурационном файле rspamd и позволяют
  1275. разделить правила, исходя из входящих данных, например, заголовок From
  1276. письма или же по ip, откуда нам пришло данное письмо.
  1277. Представления проверяются при проверке любого правила и при совпадении
  1278. данных письма проверяются не все символы, а те, которые заданы данным представл
  1279. ением.
  1280. При настройки представлений задаются входные данные письма (from и ip)
  1281. и символы, которые должны проверяться.
  1282. Входные данные могут дублироваться, то есть, можно задать несколько from
  1283. и несколько ip, задаются эти параметры либо в виде регулярных выражений:
  1284. \end_layout
  1285. \begin_layout LyX-Code
  1286. from =
  1287. \begin_inset Quotes fld
  1288. \end_inset
  1289. /^.*@somedomain.com$
  1290. \begin_inset Quotes frd
  1291. \end_inset
  1292. ;
  1293. \end_layout
  1294. \begin_layout LyX-Code
  1295. from =
  1296. \begin_inset Quotes fld
  1297. \end_inset
  1298. /^.*@otherdoma[a-z]+.com$
  1299. \begin_inset Quotes frd
  1300. \end_inset
  1301. ;
  1302. \end_layout
  1303. \begin_layout Standard
  1304. либо в виде map:
  1305. \end_layout
  1306. \begin_layout LyX-Code
  1307. from =
  1308. \begin_inset Quotes fld
  1309. \end_inset
  1310. file:///usr/local/etc/rspamd/from.map
  1311. \begin_inset Quotes frd
  1312. \end_inset
  1313. ;
  1314. \end_layout
  1315. \begin_layout LyX-Code
  1316. ip =
  1317. \begin_inset Quotes fld
  1318. \end_inset
  1319. http://somehost:81/ip.map
  1320. \begin_inset Quotes frd
  1321. \end_inset
  1322. ;
  1323. \end_layout
  1324. \begin_layout Standard
  1325. Символы также могут быть заданы несколькими директивами symbols (которые
  1326. будут объединены в список):
  1327. \end_layout
  1328. \begin_layout LyX-Code
  1329. symbols =
  1330. \begin_inset Quotes fld
  1331. \end_inset
  1332. /^.*URIBL.*$/
  1333. \begin_inset Quotes frd
  1334. \end_inset
  1335. ;
  1336. \end_layout
  1337. \begin_layout Standard
  1338. Пример задания представления в конфигурационном файле:
  1339. \end_layout
  1340. \begin_layout LyX-Code
  1341. view {
  1342. \end_layout
  1343. \begin_deeper
  1344. \begin_layout LyX-Code
  1345. ip = "file:///usr/local/etc/rspamd/ip_internal.inc";
  1346. \end_layout
  1347. \begin_layout LyX-Code
  1348. skip_check = yes;
  1349. \end_layout
  1350. \begin_layout LyX-Code
  1351. from = "file:///usr/local/etc/rspamd/from_internal.inc";
  1352. \end_layout
  1353. \begin_layout LyX-Code
  1354. symbols = "/^.*URIBL.*$/";
  1355. \end_layout
  1356. \end_deeper
  1357. \begin_layout LyX-Code
  1358. };
  1359. \end_layout
  1360. \begin_layout Standard
  1361. Директива
  1362. \begin_inset Quotes fld
  1363. \end_inset
  1364. skip_check
  1365. \begin_inset Quotes frd
  1366. \end_inset
  1367. используется для пропуска всех проверок rspamd для данного представлений.
  1368. В результате при использовании протокола rspamc 1.1 вместо маркера спама
  1369. (True или False) будет маркер пропуска (Skip).
  1370. При использовании spamc или же rspamc 1.0 будет стандартный маркер False
  1371. (так как реально у письма будет 0 баллов).
  1372. \end_layout
  1373. \begin_layout Subsection
  1374. Пользовательские настройки
  1375. \end_layout
  1376. \begin_layout Standard
  1377. Пользовательские настройки, в отличие от представлений, дают возможность
  1378. выбора правил, а также настройки граничных значений баллов письма, исходя
  1379. из получателя письма.
  1380. При этом, настройки можно задавать индивидуально пользователю или же всему
  1381. домену пользователя.
  1382. Индивидуальные настройки пользователя перекрывают настройки домена.
  1383. При выборе настроек используются следующие данные (учитывая последовательность)
  1384. :
  1385. \end_layout
  1386. \begin_layout Enumerate
  1387. проверяется заголовок Deliver-To, передаваемый при использовании протокола
  1388. rspamc;
  1389. \end_layout
  1390. \begin_layout Enumerate
  1391. проверяется заголовок User, передаваемый MTA exim при использовании любого
  1392. протокола;
  1393. \end_layout
  1394. \begin_layout Enumerate
  1395. проверяется первый получатель письма из заголовка rspamc Rcpt;
  1396. \end_layout
  1397. \begin_layout Enumerate
  1398. проверяется первый получатель письма из заголовка mime To.
  1399. \end_layout
  1400. \begin_layout Standard
  1401. Необходимо обратить внимание , что при наличии нескольких получателей, будет
  1402. проверяться только первый из них, чтобы избегать двусмысленного поведения.
  1403. Сами настройки задаются в json файлах, так как данные файлы могут содержать
  1404. очень много информации о пользователях, и хранить это все в конфигурационном
  1405. файле нецелесообразно.
  1406. Для задания пользовательских настроек используется секция
  1407. \begin_inset Quotes fld
  1408. \end_inset
  1409. settings
  1410. \begin_inset Quotes frd
  1411. \end_inset
  1412. , которая содержит всего два параметра: user_settings и domain_settings.
  1413. Например:
  1414. \end_layout
  1415. \begin_layout LyX-Code
  1416. settings {
  1417. \end_layout
  1418. \begin_deeper
  1419. \begin_layout LyX-Code
  1420. user_settings = "http://somehost/users.php";
  1421. \end_layout
  1422. \begin_layout LyX-Code
  1423. domain_settings = "http://somehost/domains.php";
  1424. \end_layout
  1425. \end_deeper
  1426. \begin_layout LyX-Code
  1427. };
  1428. \end_layout
  1429. \begin_layout Standard
  1430. Формат соответствующих json файлов достаточно прост - это массив объектов,
  1431. задающих настройки.
  1432. Объект настройки содержит следующие параметры:
  1433. \end_layout
  1434. \begin_layout Itemize
  1435. name - имя пользователя или домена;
  1436. \end_layout
  1437. \begin_layout Itemize
  1438. metrics - объект, задающий предельные очки по метрикам, вида
  1439. \begin_inset Quotes fld
  1440. \end_inset
  1441. metric_name
  1442. \begin_inset Quotes frd
  1443. \end_inset
  1444. -> score;
  1445. \end_layout
  1446. \begin_layout Itemize
  1447. factors - объект, задающий индивидуальные настройки множителей вида
  1448. \begin_inset Quotes fld
  1449. \end_inset
  1450. symbol
  1451. \begin_inset Quotes frd
  1452. \end_inset
  1453. -> score;
  1454. \end_layout
  1455. \begin_layout Itemize
  1456. want_spam - булево значение, при задании его как true, rspamd отключает
  1457. проверки для данного пользователя.
  1458. \end_layout
  1459. \begin_layout Standard
  1460. Пример json настроек:
  1461. \end_layout
  1462. \begin_layout LyX-Code
  1463. [
  1464. \end_layout
  1465. \begin_deeper
  1466. \begin_layout LyX-Code
  1467. {
  1468. \end_layout
  1469. \begin_deeper
  1470. \begin_layout LyX-Code
  1471. "name":"somedomain.ru",
  1472. \end_layout
  1473. \begin_layout LyX-Code
  1474. "metrics":{"default":11},
  1475. \end_layout
  1476. \begin_layout LyX-Code
  1477. "factors":{"R_FUZZY":10.1},
  1478. \end_layout
  1479. \begin_layout LyX-Code
  1480. "want_spam":false
  1481. \end_layout
  1482. \end_deeper
  1483. \begin_layout LyX-Code
  1484. },
  1485. \end_layout
  1486. \begin_layout LyX-Code
  1487. {
  1488. \end_layout
  1489. \begin_deeper
  1490. \begin_layout LyX-Code
  1491. "name":"some.other.domain.com",
  1492. \end_layout
  1493. \begin_layout LyX-Code
  1494. "metrics":{"default":5.5},
  1495. \end_layout
  1496. \begin_layout LyX-Code
  1497. "factors":{"URIBL":20.3},
  1498. \end_layout
  1499. \begin_layout LyX-Code
  1500. "want_spam":false
  1501. \end_layout
  1502. \end_deeper
  1503. \begin_layout LyX-Code
  1504. }
  1505. \end_layout
  1506. \end_deeper
  1507. \begin_layout LyX-Code
  1508. ]
  1509. \end_layout
  1510. \begin_layout Standard
  1511. Файлы настроек перезагружаются по мере обновления, как и любые другие файлы
  1512. списков.
  1513. \end_layout
  1514. \begin_layout Chapter
  1515. Настройка модулей
  1516. \end_layout
  1517. \begin_layout Section
  1518. Настройка модуля surbl
  1519. \end_layout
  1520. \begin_layout Standard
  1521. Модуль surbl служит для проверки URL'ей в письме на различных
  1522. \begin_inset Quotes eld
  1523. \end_inset
  1524. черных
  1525. \begin_inset Quotes erd
  1526. \end_inset
  1527. списках.
  1528. Модуль делает следующее: для каждого из url, найденных в сообщении, извлекает
  1529. доменный компонент (2-го или 3-го уровня), добавляет суффикс имени surbl
  1530. и делает dns запрос.
  1531. При успешном определении такого имени добавляется символ.
  1532. Пример работы:
  1533. \end_layout
  1534. \begin_layout LyX-Code
  1535. URL (http://some.test.ru/index.html) -> test.ru + (insecure-bl.rambler.ru) ->
  1536. \end_layout
  1537. \begin_layout LyX-Code
  1538. resolve test.ru.insecure-bl.rambler.ru -> 127.0.0.1 -> add symbol
  1539. \end_layout
  1540. \begin_layout Standard
  1541. Параметры настройки:
  1542. \end_layout
  1543. \begin_layout LyX-Code
  1544. .module 'surbl' {
  1545. \end_layout
  1546. \begin_deeper
  1547. \begin_layout LyX-Code
  1548. # Определение суффикса SURBL
  1549. \end_layout
  1550. \begin_layout LyX-Code
  1551. # Символы '%b' заменяются на значение определенного бита
  1552. \end_layout
  1553. \begin_layout LyX-Code
  1554. suffix_%b_SURBL_MULTI = "multi.surbl.org";
  1555. \end_layout
  1556. \begin_layout LyX-Code
  1557. \end_layout
  1558. \begin_layout LyX-Code
  1559. # Суффикс для каждого из бит
  1560. \end_layout
  1561. \begin_layout LyX-Code
  1562. bit_2 = "SC"; # sc.surbl.org
  1563. \end_layout
  1564. \begin_layout LyX-Code
  1565. bit_4 = "WS"; # ws.surbl.org
  1566. \end_layout
  1567. \begin_layout LyX-Code
  1568. bit_8 = "PH"; # ph.surbl.org
  1569. \end_layout
  1570. \begin_layout LyX-Code
  1571. bit_16 = "OB"; # ob.surbl.org
  1572. \end_layout
  1573. \begin_layout LyX-Code
  1574. bit_32 = "AB"; # ab.surbl.org
  1575. \end_layout
  1576. \begin_layout LyX-Code
  1577. bit_64 = "JP"; # jp.surbl.org
  1578. \end_layout
  1579. \begin_layout LyX-Code
  1580. \end_layout
  1581. \begin_layout LyX-Code
  1582. # Имя метрики
  1583. \end_layout
  1584. \begin_layout LyX-Code
  1585. metric = "default";
  1586. \end_layout
  1587. \begin_layout LyX-Code
  1588. # Список доменов, для которых необходимо использовать 3 доменных
  1589. \end_layout
  1590. \begin_layout LyX-Code
  1591. # компонента, вместо двух
  1592. \end_layout
  1593. \begin_layout LyX-Code
  1594. 2tld = "file:///etc/rspamd/2tld.inc";
  1595. \end_layout
  1596. \begin_layout LyX-Code
  1597. # Список URL'ей, которые не будут проверяться этим модулем
  1598. \end_layout
  1599. \begin_layout LyX-Code
  1600. whitelist = "file:///etc/rspamd/surbl-whitelist.inc";
  1601. \end_layout
  1602. \end_deeper
  1603. \begin_layout LyX-Code
  1604. };
  1605. \end_layout
  1606. \begin_layout Standard
  1607. Некоторые пояснения по данной конфигурации.
  1608. Модуль SURBL может осуществлять проверку битов в полученном от DNS сервера
  1609. ответе, и вставлять соответствующий символ.
  1610. Это используется для проверки сразу нескольких списков одним DNS запросе.
  1611. Тогда ответ сервера содержит списки, в которых встретился данный URL в
  1612. виде битов адреса.
  1613. Более подробно с этим можно ознакомиться тут:
  1614. \begin_inset CommandInset href
  1615. LatexCommand href
  1616. name "http://www.surbl.org/lists.html#multi"
  1617. target "http://www.surbl.org/lists.html#multi"
  1618. \end_inset
  1619. .
  1620. Список 2tld используется для задания списка доменов, для которых необходимо
  1621. проверять не два уровня доменного имени, а три.
  1622. Например, это актуально для виртуальных хостингов или же специальных зон
  1623. для доменов третьего уровня, например org.ru или pp.ru.
  1624. \end_layout
  1625. \begin_layout Section
  1626. Настройка модуля regexp
  1627. \end_layout
  1628. \begin_layout Standard
  1629. Модуль regexp является очень важным в работе rspamd, так как определяет
  1630. все правила фильтрации сообщений по регулярным выражениям.
  1631. Модуль работает с логическими выражениями из регулярных выражений, поэтому
  1632. его настройка выглядит достаточно запутанной.
  1633. Однако, если пользоваться переменными, то логика работы становится более
  1634. понятной.
  1635. При настройке самого модуля используются простые директивы вида:
  1636. \end_layout
  1637. \begin_layout Code
  1638. ИМЯ_СИМВОЛА = "логическое выражение"
  1639. \end_layout
  1640. \begin_layout Standard
  1641. Само логическое выражение содержит различные регулярные выражения и функции,
  1642. объединенные символами логики:
  1643. \end_layout
  1644. \begin_layout Itemize
  1645. & - логическое
  1646. \begin_inset Quotes eld
  1647. \end_inset
  1648. И
  1649. \begin_inset Quotes erd
  1650. \end_inset
  1651. \end_layout
  1652. \begin_layout Itemize
  1653. | - логическое
  1654. \begin_inset Quotes eld
  1655. \end_inset
  1656. ИЛИ
  1657. \begin_inset Quotes erd
  1658. \end_inset
  1659. \end_layout
  1660. \begin_layout Itemize
  1661. ! - логическое отрицание
  1662. \end_layout
  1663. \begin_layout Standard
  1664. Приоритет операций может изменяться скобками, например:
  1665. \end_layout
  1666. \begin_layout LyX-Code
  1667. A & B | C - выполняется слева направо A & B затем | C
  1668. \end_layout
  1669. \begin_layout LyX-Code
  1670. A & (B | C) - выполняется как (B | C) затем & A
  1671. \end_layout
  1672. \begin_layout Standard
  1673. Сами регулярные выражения совместимы с perl regular expressions.
  1674. Их синтаксис можно изучить в соответствующей литературе:
  1675. \begin_inset CommandInset href
  1676. LatexCommand href
  1677. name "http://perldoc.perl.org/perlre.html"
  1678. target "http://perldoc.perl.org/perlre.html"
  1679. \end_inset
  1680. .
  1681. У rspamd есть дополнительные флаги, определяющие, в какой части сообщения
  1682. искать заданное регулярное выражение:
  1683. \end_layout
  1684. \begin_layout Itemize
  1685. r - "сырой" незакодированный в utf8 regexp
  1686. \end_layout
  1687. \begin_layout Itemize
  1688. H - ищет по заголовкам сообщения
  1689. \end_layout
  1690. \begin_layout Itemize
  1691. M - ищет по всему сообщению (в "сыром" виде, то есть без mime декодинга)
  1692. \end_layout
  1693. \begin_layout Itemize
  1694. P - ищет по всем текстовым mime частям
  1695. \end_layout
  1696. \begin_layout Itemize
  1697. U - ищет по url
  1698. \end_layout
  1699. \begin_layout Itemize
  1700. X - ищет по "сырым" хедерам (опять же без декодирования)
  1701. \end_layout
  1702. \begin_layout Standard
  1703. Если в регулярном выражении встречаются символы двойной кавычки (
  1704. \begin_inset Quotes eld
  1705. \end_inset
  1706. ) или же слэша (/), то их необходимо экранировать обратным слэшем (при этом
  1707. сам обратный слэш экранировать необязательно):
  1708. \end_layout
  1709. \begin_layout LyX-Code
  1710. \backslash
  1711. "
  1712. \backslash
  1713. /
  1714. \end_layout
  1715. \begin_layout Standard
  1716. Для поиска по заголовкам формат регулярного выражения несколько меняется:
  1717. \end_layout
  1718. \begin_layout LyX-Code
  1719. Имя_заголовка=/регулярное_выражение/H
  1720. \end_layout
  1721. \begin_layout Standard
  1722. При поиске по заголовкам происходит поиск заголовков с таким именем и сравнение
  1723. их значений с регулярным выражением, пока это выражение не будет найдено,
  1724. либо пока не будут проверены все заголовки с таким именем.
  1725. Для multipart сообщений происходит поиск заголовков по всем частям сообщения.
  1726. Это справедливо для всех функций, работающих с заголовками.
  1727. Поиск по
  1728. \begin_inset Quotes eld
  1729. \end_inset
  1730. сырым
  1731. \begin_inset Quotes erd
  1732. \end_inset
  1733. заголовкам происходит без учета mime частей - только по заголовкам самого
  1734. сообщения.
  1735. При этом, хотя и не происходит декодирования заголовков, но происходит
  1736. их де-фолдинг (фолдинг - перенос заголовков по строчкам).
  1737. Модуль regexp также может использовать внутри логических выражений встроенные
  1738. функции rspamd.
  1739. Встроенные функции всегда возвращат логическое значение (истина или ложь)
  1740. и могут принимать аргументы (в том числе аргументы, являющиеся логическими
  1741. выражениями).
  1742. Список встроенных функций:
  1743. \end_layout
  1744. \begin_layout Itemize
  1745. header_exists - принимает в качестве аргумента имя хедера, возвращает true,
  1746. если такой заголовок существует
  1747. \end_layout
  1748. \begin_layout Itemize
  1749. compare_parts_distance - принимает в качестве аргумента число от 0 до 100,
  1750. которое отражает разницу в процентах между частями письма.
  1751. Функция работает с сообщениями, содержащими 2 текстовые части (text/plain
  1752. и text/html) и возвращает true тогда, когда эти части различаются более
  1753. чем на n процентов.
  1754. Если аргумент не указан, то по умолчанию ищется различие в 100% (полностью
  1755. разные части).
  1756. \end_layout
  1757. \begin_layout Itemize
  1758. compare_transfer_encoding - сравнивает Content-Transfer-Encoding с заданной
  1759. строкой
  1760. \end_layout
  1761. \begin_layout Itemize
  1762. content_type_compare_param - сравнивает параметр content-type заголовка
  1763. с регулярным выражением или строкой:
  1764. \end_layout
  1765. \begin_layout LyX-Code
  1766. content_type_compare_param(Charset, /windows-
  1767. \backslash
  1768. d+/)
  1769. \end_layout
  1770. \begin_layout LyX-Code
  1771. content_type_compare_param(Charset, ascii)
  1772. \end_layout
  1773. \begin_layout Itemize
  1774. content_type_has_param - проверяет, есть ли в заголовке content-type определенны
  1775. й параметр
  1776. \end_layout
  1777. \begin_layout Itemize
  1778. content_type_is_subtype - сравнивает подтип content-type с регулярным выражением
  1779. или строкой
  1780. \end_layout
  1781. \begin_layout Itemize
  1782. content_type_is_type - сравнивает тип content-type с регулярным выражением
  1783. или строкой
  1784. \end_layout
  1785. \begin_layout LyX-Code
  1786. content_type_is_type(text)
  1787. \end_layout
  1788. \begin_layout LyX-Code
  1789. content_type_is_subtype(/?.html/)
  1790. \end_layout
  1791. \begin_layout Itemize
  1792. regexp_match_number - принимает в качестве первого параметра число, которое
  1793. означает порог сработавших регэкспов и список регэкспов или функций, которые
  1794. должны проверяться.
  1795. Если число сработавших регэкспов или функций больше порога, функция возвращает
  1796. TRUE, иначе - FALSE, например:
  1797. \end_layout
  1798. \begin_layout LyX-Code
  1799. regexp_match_number(2, ${__RE1}, ${__RE2}, header_exists(Subject))
  1800. \end_layout
  1801. \begin_layout Itemize
  1802. has_only_html_part - функция возвращает TRUE, если в сообщении есть только
  1803. одна HTML часть
  1804. \end_layout
  1805. \begin_layout Itemize
  1806. compare_recipients_distance - вычисляет процент схожих получателей письма.
  1807. Принимает аргумент - порог в процентах похожести.
  1808. \end_layout
  1809. \begin_layout Itemize
  1810. is_recipients_sorted - возвращает TRUE, если список получателей сортирован
  1811. (работает только если число получателей >= 5).
  1812. \end_layout
  1813. \begin_layout Itemize
  1814. is_html_balanced - возвращает TRUE, если теги всех html частей сбалансированы
  1815. \end_layout
  1816. \begin_layout Itemize
  1817. has_html_tag - возвращает TRUE, если заданный html тег найден
  1818. \end_layout
  1819. \begin_layout Standard
  1820. Данные функции были созданы для решения задач, которые сложно или же невозможно
  1821. решить при помощи обычных регулярных выражений.
  1822. При конфигурации модуля regexp целесообразно определить все логические
  1823. выражения в отдельных переменных, подключить их при помощи директивы .include
  1824. и задавать символы как:
  1825. \end_layout
  1826. \begin_layout LyX-Code
  1827. СИМВОЛ="${переменная}";
  1828. \end_layout
  1829. \begin_layout Standard
  1830. иначе конфигурация модуля будет практически нечитаемой из-за обилия регулярных
  1831. выражений.
  1832. \end_layout
  1833. \begin_layout Section
  1834. Настройка модуля spf
  1835. \end_layout
  1836. \begin_layout Standard
  1837. Модуль spf предназначен для проверки spf записей для отправителя письма.
  1838. Технология SPF позволяет определить в DNS TXT запись для данного домена
  1839. с определениями, с каких ip адресов или сетей допустима отправка почты
  1840. для данного домена.
  1841. Также spf позволяет создавать
  1842. \begin_inset Quotes fld
  1843. \end_inset
  1844. черные списки
  1845. \begin_inset Quotes frd
  1846. \end_inset
  1847. для данного домена - адреса, с которых запрещена отправка почты для домена.
  1848. Rspamd может получать spf записи, и проверять, возможна ли отправка почты
  1849. данного домена с данного ip.
  1850. При этом возможно добавление 3-х символов:
  1851. \end_layout
  1852. \begin_layout Itemize
  1853. FAIL - отправка запрещена
  1854. \end_layout
  1855. \begin_layout Itemize
  1856. SOFTFAIL - отправка явно не разрешена, но и явно не запрещена
  1857. \end_layout
  1858. \begin_layout Itemize
  1859. ALLOW - отправка явно разрешена
  1860. \end_layout
  1861. \begin_layout Standard
  1862. Для задания этих символов можно использовать настройки модуля spf:
  1863. \end_layout
  1864. \begin_layout LyX-Code
  1865. .module 'spf' {
  1866. \end_layout
  1867. \begin_deeper
  1868. \begin_layout LyX-Code
  1869. symbol_fail = "SPF_FAIL";
  1870. \end_layout
  1871. \begin_layout LyX-Code
  1872. symbol_softfail = "SPF_SOFTFAIL";
  1873. \end_layout
  1874. \begin_layout LyX-Code
  1875. symbol_allow = "SPF_ALLOW";
  1876. \end_layout
  1877. \end_deeper
  1878. \begin_layout LyX-Code
  1879. };
  1880. \end_layout
  1881. \begin_layout Standard
  1882. Коэффициенты для данных символов лучше определить следующим образом: высокий
  1883. вес для символа FAIL, достаточно низкий вес для символа SOFTFAIL и отрицательны
  1884. й вес для символа ALLOW.
  1885. \end_layout
  1886. \begin_layout Chapter
  1887. Cтатистические алгоритмы
  1888. \end_layout
  1889. \begin_layout Section
  1890. Winnow и OSB
  1891. \end_layout
  1892. \begin_layout Standard
  1893. В rspamd используется алгоритм ортогональных разреженных биграмм (OSB),
  1894. который основан на следующем принципе:
  1895. \end_layout
  1896. \begin_layout Code
  1897. \begin_inset listings
  1898. inline false
  1899. status open
  1900. \begin_layout Quotation
  1901. \end_layout
  1902. \begin_layout Quotation
  1903. \end_layout
  1904. \begin_layout Quotation
  1905. н -----------------------------------
  1906. \end_layout
  1907. \begin_layout Quotation
  1908. а -----------------------------------
  1909. \end_layout
  1910. \begin_layout Quotation
  1911. б -----------------------------------
  1912. \end_layout
  1913. \begin_layout Quotation
  1914. о | w1 | w2 | w3 | w4 | w5 |
  1915. \end_layout
  1916. \begin_layout Quotation
  1917. р | | | | | | --> выходные токены
  1918. \end_layout
  1919. \begin_layout Quotation
  1920. ы -----------------------------------
  1921. \end_layout
  1922. \begin_layout Quotation
  1923. / Текущий набор хешей и весов
  1924. \end_layout
  1925. \begin_layout Quotation
  1926. /
  1927. \end_layout
  1928. \begin_layout Quotation
  1929. Входные токены
  1930. \end_layout
  1931. \end_inset
  1932. \end_layout
  1933. \begin_layout Standard
  1934. То есть, процесс преобразования можно представить следующим образом: для
  1935. каждого набора весов (w1..w5) составляется набор хешей.
  1936. Токены образуются из текста.
  1937. Например, возьмем некое письмо и наложим на него окно:
  1938. \end_layout
  1939. \begin_layout LyX-Code
  1940. "Мама мыла раму."
  1941. \end_layout
  1942. \begin_layout LyX-Code
  1943. |________|
  1944. \end_layout
  1945. \begin_layout Standard
  1946. В данном окне создаются 2 токена:
  1947. \end_layout
  1948. \begin_layout Standard
  1949. h("Мама"), h("мыла"), где h - хеш функция.
  1950. \end_layout
  1951. \begin_layout Standard
  1952. Дальше окно двигается вправо на один токен и опять создаются 2 токена: h("мыла")
  1953. , h("раму")
  1954. \end_layout
  1955. \begin_layout Standard
  1956. В rspamd используется окно в 5 токенов и используются пары:
  1957. \end_layout
  1958. \begin_layout LyX-Code
  1959. 1 - 5 -- h1
  1960. \end_layout
  1961. \begin_layout LyX-Code
  1962. 2 - 5 -- h2
  1963. \end_layout
  1964. \begin_layout LyX-Code
  1965. 3 - 5 -- h3
  1966. \end_layout
  1967. \begin_layout LyX-Code
  1968. 4 - 5 -- h4
  1969. \end_layout
  1970. \begin_layout Standard
  1971. Каждый такой токен состоит из двух хешей (h1 и h2).
  1972. То есть каждое слово текста может давать до 5-ти токенов.
  1973. Это делается для того, чтобы в статистических алгоритмах учитывать не индивидуа
  1974. льные слова, и их сочетания, чтобы уменьшить ошибку.
  1975. \end_layout
  1976. \begin_layout Standard
  1977. После этого мы должны вычислить принадлежность потока выходных токенов к
  1978. некоторому классу.
  1979. Для этого используется алгоритм Winnow.
  1980. Идея алгоритма очень проста:
  1981. \end_layout
  1982. \begin_layout Enumerate
  1983. Каждый возможный входной токен имеет вес 1.0 (то есть, нас интересуют только
  1984. те токены, которые не равны 1.0)
  1985. \end_layout
  1986. \begin_layout Enumerate
  1987. Для обучения проделываем следующие шаги:
  1988. \end_layout
  1989. \begin_deeper
  1990. \begin_layout Enumerate
  1991. генерируем набор токенов путем OSB алгоритма
  1992. \end_layout
  1993. \begin_layout Enumerate
  1994. удаляем все дупликаты
  1995. \end_layout
  1996. \begin_layout Enumerate
  1997. если данный входной набор принадлежит классу (например, спам или неспам),
  1998. то умножаем вес каждого встреченного токена на т.н.
  1999. Promotion Constant, которая равна 1,23
  2000. \end_layout
  2001. \begin_layout Enumerate
  2002. если данный входной набор не принадлежит классу, то умножаем каждый найденный
  2003. токен на Demotion Constant в данном классе, которая равна 0,83
  2004. \end_layout
  2005. \begin_layout Enumerate
  2006. абсолютно неважно, сколько раз встречался данный токен во входном потоке,
  2007. мы его умножаем на promotion или demotion только один раз
  2008. \end_layout
  2009. \end_deeper
  2010. \begin_layout Enumerate
  2011. Для классификации потока мы поступаем следующим образом:
  2012. \end_layout
  2013. \begin_deeper
  2014. \begin_layout Enumerate
  2015. генерируем набор токенов путем OSB алгоритма
  2016. \end_layout
  2017. \begin_layout Enumerate
  2018. удаляем все дупликаты
  2019. \end_layout
  2020. \begin_layout Enumerate
  2021. суммируем веса всех токенов, найденных в каждом из файлов данных статистики
  2022. (при этом те токены, которые мы не нашли, имеют вес 1)
  2023. \end_layout
  2024. \begin_layout Enumerate
  2025. затем мы делим полученную сумму на число токенов и смотрим, какой из классов
  2026. (файлов данных) набрал больше очков и делаем заключение о принадлежности
  2027. входного текста к классу
  2028. \end_layout
  2029. \end_deeper
  2030. \begin_layout Standard
  2031. Файлы данных статистики представляют собой следующие структуры:
  2032. \end_layout
  2033. \begin_layout LyX-Code
  2034. {
  2035. \end_layout
  2036. \begin_deeper
  2037. \begin_layout LyX-Code
  2038. Header,
  2039. \end_layout
  2040. \begin_layout LyX-Code
  2041. { feature_block1..feature_blockN }
  2042. \end_layout
  2043. \end_deeper
  2044. \begin_layout LyX-Code
  2045. }
  2046. \end_layout
  2047. \begin_layout Standard
  2048. Заголовок файла очень прост:
  2049. \end_layout
  2050. \begin_layout LyX-Code
  2051. struct {
  2052. \end_layout
  2053. \begin_deeper
  2054. \begin_layout LyX-Code
  2055. char magic[3] = { 'r', 's', 'd' };
  2056. \end_layout
  2057. \begin_layout LyX-Code
  2058. u_char version[2] = { '1', '0' };
  2059. \end_layout
  2060. \begin_layout LyX-Code
  2061. uint64_t create_time;
  2062. \end_layout
  2063. \end_deeper
  2064. \begin_layout LyX-Code
  2065. }
  2066. \end_layout
  2067. \begin_layout Standard
  2068. Каждый feature_block состоит из 4-х полей:
  2069. \end_layout
  2070. \begin_layout LyX-Code
  2071. struct {
  2072. \end_layout
  2073. \begin_deeper
  2074. \begin_layout LyX-Code
  2075. uint32_t hash1;
  2076. \end_layout
  2077. \begin_layout LyX-Code
  2078. uint32_t hash2;
  2079. \end_layout
  2080. \begin_layout LyX-Code
  2081. double value;
  2082. \end_layout
  2083. \begin_layout LyX-Code
  2084. uint32_t last_access;
  2085. \end_layout
  2086. \end_deeper
  2087. \begin_layout LyX-Code
  2088. }
  2089. \end_layout
  2090. \begin_layout Standard
  2091. Итого 16 байт на каждый feature.
  2092. 0-е значения показывают свободную ячейку.
  2093. Значение hash1 используется в качестве индекса:
  2094. \end_layout
  2095. \begin_layout LyX-Code
  2096. idx = hash1 % filesize;
  2097. \end_layout
  2098. \begin_layout Standard
  2099. Где filesize - размер в количестве feature_block'ов.
  2100. При этом данный токен должен помещаться в заданную ячейку или ячейку за
  2101. ним.
  2102. При этом образуется цепочка токенов:
  2103. \end_layout
  2104. \begin_layout Standard
  2105. \begin_inset listings
  2106. inline false
  2107. status open
  2108. \begin_layout Plain Layout
  2109. idx
  2110. \end_layout
  2111. \begin_layout Plain Layout
  2112. \backslash
  2113. \end_layout
  2114. \begin_layout Plain Layout
  2115. | занят | занят | занят | свободен |
  2116. \end_layout
  2117. \begin_layout Plain Layout
  2118. \backslash
  2119. -----^
  2120. \backslash
  2121. -----^
  2122. \backslash
  2123. -----^
  2124. \end_layout
  2125. \end_inset
  2126. При этом, длина такой цепочки должна быть лимитирована некоторым разумным
  2127. числом, например 128.
  2128. Тогда максимальное время доступа будет не более 128-и итераций.
  2129. Если мы не нашли за 128 итераций свободную ячейку, то мы можем поместить
  2130. новый токен на место того, который меньше всего использовался (min (last_access
  2131. )).
  2132. При этом при доступе к ячейке необходимо обновлять last_access:
  2133. \end_layout
  2134. \begin_layout Code
  2135. last_access = now - creation_time.
  2136. \end_layout
  2137. \begin_layout Standard
  2138. Такая организация позволяет замещать только наименее используемые токены.
  2139. \end_layout
  2140. \begin_layout Chapter
  2141. Протокол rspamc
  2142. \end_layout
  2143. \begin_layout Standard
  2144. Формат запроса схож с http:
  2145. \end_layout
  2146. \begin_layout LyX-Code
  2147. COMMAND RSPAMC/1.0
  2148. \end_layout
  2149. \begin_layout Standard
  2150. При этом допустимы следующие команды:
  2151. \end_layout
  2152. \begin_layout Itemize
  2153. CHECK - проверить сообщение и выдать результат по каждой из метрик (не выводя
  2154. символов)
  2155. \end_layout
  2156. \begin_layout Itemize
  2157. SYMBOLS - проверить сообщение, выдать результат по каждой из метрик и символы
  2158. по каждой из метрик
  2159. \end_layout
  2160. \begin_layout Itemize
  2161. PROCESS - проверить сообщение, выдать результат по каждой из метрик, а затем
  2162. вывести исходное сообщение
  2163. \end_layout
  2164. \begin_layout Itemize
  2165. PING - не принимая сообщение выдать готовность к работе
  2166. \end_layout
  2167. \begin_layout Standard
  2168. Также в зависимости от подключенных плагинов могут быть доступны другие
  2169. команды протокола, например URLS (вывести все найденные в сообщении url'и)
  2170. или EMAILS.
  2171. \end_layout
  2172. \begin_layout Standard
  2173. Формат ответа:
  2174. \end_layout
  2175. \begin_layout LyX-Code
  2176. SPAMD/1.1 0 EX_OK
  2177. \end_layout
  2178. \begin_layout LyX-Code
  2179. \backslash
  2180. /
  2181. \backslash
  2182. /
  2183. \end_layout
  2184. \begin_layout LyX-Code
  2185. Версия Код ошибки
  2186. \end_layout
  2187. \begin_layout LyX-Code
  2188. Spam: False ; 2 / 5
  2189. \end_layout
  2190. \begin_layout Standard
  2191. Это формат совместимости с sa-spamd (без метрик).
  2192. Новый формат ответа:
  2193. \end_layout
  2194. \begin_layout LyX-Code
  2195. RSPAMD/1.0 0 EX_OK
  2196. \end_layout
  2197. \begin_layout LyX-Code
  2198. Metric: Name; Spam_Result; Spam_Mark / Spam_Mark_Required
  2199. \end_layout
  2200. \begin_layout LyX-Code
  2201. Metric: Name2 ; Spam_Result2 ; Spam_Mark2 / Spam_Mark_Required2
  2202. \end_layout
  2203. \begin_layout Standard
  2204. Заголовков типа metric может быть несколько.
  2205. Формат вывода символов:
  2206. \end_layout
  2207. \begin_layout LyX-Code
  2208. SYMBOL1, SYMBOL2, SYMBOL3 -- формат совместимости с sa-spamd
  2209. \end_layout
  2210. \begin_layout LyX-Code
  2211. Symbol: Name; Param1,Param2,Param3 -- формат rspamd
  2212. \end_layout
  2213. \begin_layout Standard
  2214. Формат ответа зависит от формата запроса:
  2215. \end_layout
  2216. \begin_layout LyX-Code
  2217. PROCESS SPAMC/1.2
  2218. \end_layout
  2219. \begin_layout LyX-Code
  2220. \backslash
  2221. /
  2222. \backslash
  2223. /
  2224. \end_layout
  2225. \begin_layout LyX-Code
  2226. Команда Версия
  2227. \end_layout
  2228. \begin_layout Standard
  2229. В любом из режимов работы поддерживаются следующие заголовки:
  2230. \end_layout
  2231. \begin_layout Itemize
  2232. Content-Length - длина сообщения
  2233. \end_layout
  2234. \begin_layout Itemize
  2235. Helo - HELO, полученный от клиента
  2236. \end_layout
  2237. \begin_layout Itemize
  2238. From - MAIL FROM
  2239. \end_layout
  2240. \begin_layout Itemize
  2241. IP - IP клиента
  2242. \end_layout
  2243. \begin_layout Itemize
  2244. Recipient-Number - число реципиентов
  2245. \end_layout
  2246. \begin_layout Itemize
  2247. Rcpt - реципиент
  2248. \end_layout
  2249. \begin_layout Itemize
  2250. Queue-ID - идентификатор очереди
  2251. \end_layout
  2252. \begin_layout Standard
  2253. Эти значения могут использоваться в фильтрах rspamd.
  2254. \end_layout
  2255. \begin_layout Chapter
  2256. Клиент rspamc
  2257. \end_layout
  2258. \begin_layout Standard
  2259. Клиент rspamc представляет собой программу, написанную на perl и предназначенную
  2260. для работы с системой rspamd.
  2261. Rspamc принимает следующие аргументы:
  2262. \end_layout
  2263. \begin_layout Itemize
  2264. -с: определяет путь к конфигурационному файлу rspamd, используется для работы
  2265. с локальным rspamd
  2266. \end_layout
  2267. \begin_layout Itemize
  2268. -h: определяет адрес удаленного rspamd сервера
  2269. \end_layout
  2270. \begin_layout Itemize
  2271. -p: определяет порт для удаленного rspamd сервера
  2272. \end_layout
  2273. \begin_layout Itemize
  2274. -P: определяет пароль для работы с привиллегированными командами rspamd
  2275. \end_layout
  2276. \begin_layout Itemize
  2277. -s: определяет имя символа для обучения классификатора
  2278. \end_layout
  2279. \begin_layout Standard
  2280. Последним аргументом rspamc принимает команду.
  2281. Если команда не задана, то используется команда SYMBOLS.
  2282. Команды, принимаемые rspamc:
  2283. \end_layout
  2284. \begin_layout Itemize
  2285. команды по обработке сообщений:
  2286. \end_layout
  2287. \begin_deeper
  2288. \begin_layout Itemize
  2289. symbols - по данной команде проверяется сообщение, переданное через stdin
  2290. rspamc
  2291. \end_layout
  2292. \begin_layout Itemize
  2293. check - по данной команде выводится только результат по метрикам без символов
  2294. \end_layout
  2295. \begin_layout Itemize
  2296. process - возвращает не только символы, но и исходное сообщение
  2297. \end_layout
  2298. \begin_layout Itemize
  2299. urls - выводит все найденные url'и
  2300. \end_layout
  2301. \begin_layout Itemize
  2302. emails - выводит все найденные адреса e-mail в сообщении
  2303. \end_layout
  2304. \end_deeper
  2305. \begin_layout Itemize
  2306. команды по работе с управляющим интерфейсом
  2307. \end_layout
  2308. \begin_deeper
  2309. \begin_layout Itemize
  2310. stat - выводит статистику работы
  2311. \end_layout
  2312. \begin_layout Itemize
  2313. learn - обучает классификатор по определенному классу (указанному опцией
  2314. -s)
  2315. \end_layout
  2316. \begin_layout Itemize
  2317. shutdown - останавливает систему rspamd
  2318. \end_layout
  2319. \begin_layout Itemize
  2320. uptime - выводит время работы rspamd
  2321. \end_layout
  2322. \begin_layout Itemize
  2323. counters - выводит значения счетчиков символов
  2324. \end_layout
  2325. \begin_layout Itemize
  2326. fuzzy_add - добавляет fuzzy hash в хранилище
  2327. \end_layout
  2328. \begin_layout Itemize
  2329. fuzzy_del - удаляет fuzzy hash из хранилища
  2330. \end_layout
  2331. \end_deeper
  2332. \begin_layout Chapter
  2333. LUA API плагинов
  2334. \end_layout
  2335. \begin_layout Standard
  2336. Rspamd позволяет реализовывать различную логику в виде lua плагинов, для
  2337. чего используется директива modules.
  2338. Данная директива позволяет задавать пути к каталогам, содержащим скрипты
  2339. на lua:
  2340. \end_layout
  2341. \begin_layout LyX-Code
  2342. modules {
  2343. \end_layout
  2344. \begin_deeper
  2345. \begin_layout LyX-Code
  2346. module_path =
  2347. \begin_inset Quotes fld
  2348. \end_inset
  2349. /some/path/
  2350. \begin_inset Quotes frd
  2351. \end_inset
  2352. ;
  2353. \end_layout
  2354. \end_deeper
  2355. \begin_layout LyX-Code
  2356. };
  2357. \end_layout
  2358. \begin_layout Standard
  2359. При инициализации rspamd загружает все файлы вида *.lua и выполняет их (при
  2360. ошибке в коде плагинов rspamd запускаться не будет, выдавая ошибку конфигурации
  2361. , при указанной опции -t будет проверяться не только синтаксис конфигурационного
  2362. файла, но и синтаксис плагинов).
  2363. При этом, определяется глобальная переменная rspamd_config, позволяющая
  2364. извлекать опции конфигурации и регистрировать правила и соответствующие
  2365. им символы.
  2366. Таким образом, каждый lua плагин условно можно разделить на две части:
  2367. исполняемый код, выполняющий настройку опций модуля, регистрирующий функции
  2368. правил (callbacks), и собственно обработчики правил.
  2369. \end_layout
  2370. \begin_layout Section
  2371. Настройка lua модуля
  2372. \end_layout
  2373. \begin_layout Standard
  2374. Для извлечения параметров конфигурации и регистрации обработчиков правил
  2375. применяется глобальная переменная rspamd_config, которая обладает рядом
  2376. полезных методов:
  2377. \end_layout
  2378. \begin_layout Itemize
  2379. get_module_opt (module_name, option_name) - возвращает значение опции option_nam
  2380. e для модуля с именем module_name.
  2381. То есть, если в конфигурационном файле есть следующая запись:
  2382. \end_layout
  2383. \begin_layout LyX-Code
  2384. module 'test' {
  2385. \end_layout
  2386. \begin_deeper
  2387. \begin_layout LyX-Code
  2388. param =
  2389. \begin_inset Quotes fld
  2390. \end_inset
  2391. value
  2392. \begin_inset Quotes frd
  2393. \end_inset
  2394. ;
  2395. \end_layout
  2396. \end_deeper
  2397. \begin_layout LyX-Code
  2398. };
  2399. \end_layout
  2400. \begin_deeper
  2401. \begin_layout Standard
  2402. То вызов rspamd_config:get_module_opt('test', 'param') вернет строку 'value';
  2403. \end_layout
  2404. \end_deeper
  2405. \begin_layout Itemize
  2406. get_all_opts (module_name) - возвращает таблицу из всех опций для данного
  2407. модуля, ключом служит имя опции:
  2408. \end_layout
  2409. \begin_layout LyX-Code
  2410. local opts = rspamd_config:get_all_opts('test')
  2411. \end_layout
  2412. \begin_layout LyX-Code
  2413. if opts then
  2414. \end_layout
  2415. \begin_deeper
  2416. \begin_layout LyX-Code
  2417. var = opts['param']
  2418. \end_layout
  2419. \begin_layout LyX-Code
  2420. for k,v in pairs opts do
  2421. \end_layout
  2422. \begin_deeper
  2423. \begin_layout LyX-Code
  2424. print (
  2425. \begin_inset Quotes fld
  2426. \end_inset
  2427. Param:
  2428. \begin_inset Quotes frd
  2429. \end_inset
  2430. ..
  2431. k ..
  2432. \begin_inset Quotes fld
  2433. \end_inset
  2434. Value:
  2435. \begin_inset Quotes frd
  2436. \end_inset
  2437. ..
  2438. v)
  2439. \end_layout
  2440. \end_deeper
  2441. \begin_layout LyX-Code
  2442. end
  2443. \end_layout
  2444. \end_deeper
  2445. \begin_layout LyX-Code
  2446. end
  2447. \end_layout
  2448. \begin_layout Itemize
  2449. get_metric (name) - возвращает объект метрики с данным именем
  2450. \end_layout
  2451. \begin_layout Itemize
  2452. register_function(name, callback) - регистрирует функцию lua для использования
  2453. в логических выражениях rspamd, callback в данном случае - строка с именем
  2454. функции, пример применения:
  2455. \end_layout
  2456. \begin_layout LyX-Code
  2457. function some_func(task, arg1, arg2)
  2458. \end_layout
  2459. \begin_deeper
  2460. \begin_layout LyX-Code
  2461. return false
  2462. \end_layout
  2463. \end_deeper
  2464. \begin_layout LyX-Code
  2465. end
  2466. \end_layout
  2467. \begin_layout LyX-Code
  2468. rspamd_config:register_function('lua_func', 'some_func')
  2469. \end_layout
  2470. \begin_layout Standard
  2471. Объект метрики используется для регистрации символов:
  2472. \end_layout
  2473. \begin_layout Itemize
  2474. register_symbol (symbol, initial_weight, callback) - symbol определяет имя
  2475. символа, initial_weight - изначальный вес, callback - строка с именем функции:
  2476. \end_layout
  2477. \begin_layout LyX-Code
  2478. local m = rspamd_config:get_metric('default')
  2479. \end_layout
  2480. \begin_layout LyX-Code
  2481. if m then
  2482. \end_layout
  2483. \begin_deeper
  2484. \begin_layout LyX-Code
  2485. m:register_symbol('TEST', 1.0, 'some_callback')
  2486. \end_layout
  2487. \end_deeper
  2488. \begin_layout LyX-Code
  2489. end
  2490. \end_layout
  2491. \begin_layout Standard
  2492. После регистрации обработчика символа этот обработчик будет вызываться rspamd
  2493. обычным образом, используя планировщик символов (это подробно описано в
  2494. 3.2).
  2495. \end_layout
  2496. \begin_layout Section
  2497. Обработчик правила
  2498. \end_layout
  2499. \begin_layout Standard
  2500. Обработчик правила - это функция, реализующая логику правила.
  2501. В качестве параметра она принимает объект task, из которого можно извлечь
  2502. различную информацию о сообщении.
  2503. После выполнения логики работы обработчик может вставить символ, используя
  2504. тот же объект task.
  2505. Таким образом типичная функция-обработчик выглядит следующим образом:
  2506. \end_layout
  2507. \begin_layout LyX-Code
  2508. function some_callback(task)
  2509. \end_layout
  2510. \begin_deeper
  2511. \begin_layout LyX-Code
  2512. if some_condition(task) then
  2513. \end_layout
  2514. \begin_deeper
  2515. \begin_layout LyX-Code
  2516. task:insert_result(metric, symbol, 1)
  2517. \end_layout
  2518. \end_deeper
  2519. \begin_layout LyX-Code
  2520. end
  2521. \end_layout
  2522. \end_deeper
  2523. \begin_layout LyX-Code
  2524. end
  2525. \end_layout
  2526. \begin_layout Standard
  2527. Функция insert_result принимает в качестве параметров имя метрики, имя символа,
  2528. вес и необязательный список строковых параметров, которые будут ассоциированы
  2529. с этим символом.
  2530. Объект task предоставляет ряд функций, позволяющих создать логику правила
  2531. фильтрации:
  2532. \end_layout
  2533. \begin_layout Itemize
  2534. get_received_headers() - возвращает массив из обработанных заголовков Received
  2535. в виде таблицы:
  2536. \end_layout
  2537. \begin_deeper
  2538. \begin_layout Itemize
  2539. h['from_hostname'] - hostname, откуда получено сообщение
  2540. \end_layout
  2541. \begin_layout Itemize
  2542. h['from_ip'] - ip, откуда получено сообщение
  2543. \end_layout
  2544. \begin_layout Itemize
  2545. h['real_hostname'] - hostname, распознанное самим релеем
  2546. \end_layout
  2547. \begin_layout Itemize
  2548. h['real_ip'] - ip, который соответствует real_hostname
  2549. \end_layout
  2550. \begin_layout Itemize
  2551. h['by_hostname'] - hostname самого релея
  2552. \end_layout
  2553. \begin_layout Standard
  2554. received заголовки в массиве идут в обратном порядке, то есть, первые релеи
  2555. письма будут первыми элементами массива
  2556. \end_layout
  2557. \end_deeper
  2558. \begin_layout Itemize
  2559. get_raw_headers() - возвращает строку, содержащую все заголовки сообщения
  2560. в неразобранном виде
  2561. \end_layout
  2562. \begin_layout Itemize
  2563. get_text_parts() - возвращает массив объектов типа text_part
  2564. \end_layout
  2565. \begin_layout Itemize
  2566. get_urls() - возвращает массив строк, содержащих извлеченные из сообщения
  2567. URL'и
  2568. \end_layout
  2569. \begin_layout Itemize
  2570. get_message() - возвращает объект типа сообщение
  2571. \end_layout
  2572. \begin_layout Itemize
  2573. get_recipients() - возвращает массив получателей письма, переданных в ходе
  2574. smtp диалога (командами RCPT TO:)
  2575. \end_layout
  2576. \begin_layout Itemize
  2577. get_from() - возвращает адрес отправителя письма, переданных в ходе smtp
  2578. диалога (команда MAIL FROM:)
  2579. \end_layout
  2580. \begin_layout Itemize
  2581. get_helo() - возвращает значение HELO
  2582. \end_layout
  2583. \begin_layout Itemize
  2584. get_from_ip() - возвращает ip адрес, откуда нам пришло данное письмо
  2585. \end_layout
  2586. \begin_layout Standard
  2587. Объект
  2588. \begin_inset Quotes fld
  2589. \end_inset
  2590. message
  2591. \begin_inset Quotes frd
  2592. \end_inset
  2593. применяется для манипуляций с заголовками:
  2594. \end_layout
  2595. \begin_layout Itemize
  2596. get_header(headername) - возвращает массив всех значений заголовков с таким
  2597. именем (может быть массив из одного элемента, если такой заголовок в сообщении
  2598. представлен единожды)
  2599. \end_layout
  2600. \begin_layout Itemize
  2601. set_header(headername, headervalue) - устанавливает заданный заголовок
  2602. \end_layout
  2603. \begin_layout Standard
  2604. Объект text_part предназначен для манипуляций с текстовым содержимым сообщения:
  2605. \end_layout
  2606. \begin_layout Itemize
  2607. get_content() - возвращает текстовое содержимое части
  2608. \end_layout
  2609. \begin_layout Itemize
  2610. is_html() - возвращает true, если данная часть представляет собой HTML
  2611. \end_layout
  2612. \begin_layout Itemize
  2613. is_empty() - возвращает true, если данная часть не содержит текста
  2614. \end_layout
  2615. \begin_layout Itemize
  2616. get_fuzzy() - возвращает строку с нечетким хешем для данного сообщения
  2617. \end_layout
  2618. \begin_layout Standard
  2619. Пример функции-обработчика:
  2620. \end_layout
  2621. \begin_layout LyX-Code
  2622. function received_cb (task)
  2623. \end_layout
  2624. \begin_deeper
  2625. \begin_layout LyX-Code
  2626. local recvh = task:get_received_headers()
  2627. \end_layout
  2628. \begin_layout LyX-Code
  2629. for _,rh in ipairs(recvh) do
  2630. \end_layout
  2631. \begin_deeper
  2632. \begin_layout LyX-Code
  2633. if rh['real_ip'] then
  2634. \end_layout
  2635. \begin_deeper
  2636. \begin_layout LyX-Code
  2637. local parts = task:get_text_parts()
  2638. \end_layout
  2639. \begin_layout LyX-Code
  2640. for _,part in ipairs(parts) do
  2641. \end_layout
  2642. \begin_deeper
  2643. \begin_layout LyX-Code
  2644. if not part:is_empty() then
  2645. \end_layout
  2646. \begin_deeper
  2647. \begin_layout LyX-Code
  2648. local text = part:get_content()
  2649. \end_layout
  2650. \begin_layout LyX-Code
  2651. if some_filter(text) then
  2652. \end_layout
  2653. \begin_layout LyX-Code
  2654. task:insert_result(metric, symbol, 1)
  2655. \end_layout
  2656. \begin_layout LyX-Code
  2657. end
  2658. \end_layout
  2659. \end_deeper
  2660. \begin_layout LyX-Code
  2661. end
  2662. \end_layout
  2663. \end_deeper
  2664. \begin_layout LyX-Code
  2665. end
  2666. \end_layout
  2667. \end_deeper
  2668. \begin_layout LyX-Code
  2669. end
  2670. \end_layout
  2671. \end_deeper
  2672. \begin_layout LyX-Code
  2673. end
  2674. \end_layout
  2675. \end_deeper
  2676. \begin_layout LyX-Code
  2677. end
  2678. \end_layout
  2679. \begin_layout Section
  2680. Использование DNS
  2681. \end_layout
  2682. \begin_layout Standard
  2683. Для многих задач фильтрации сообщений используются различные DNS запросы,
  2684. поэтому lua интерфейс предоставляет возможность планирования DNS запросов,
  2685. используя объект task:
  2686. \end_layout
  2687. \begin_layout Itemize
  2688. resolve_dns_a(host, callback) - выполняет прямое преобразование имени host,
  2689. после чего вызывает обработчик callback
  2690. \end_layout
  2691. \begin_layout Itemize
  2692. resolve_dns_ptr(ip, callback) - то же, что и предыдущее, но выполняет обратное
  2693. преобразование ip
  2694. \end_layout
  2695. \begin_layout Standard
  2696. Так как DNS преобразования осуществляются асинхронно, то необходимо задавать
  2697. обработчик, который будет вызываться по завершению DNS запроса.
  2698. Обработчик имеет следующий вид:
  2699. \end_layout
  2700. \begin_layout LyX-Code
  2701. function dns_cb(task, to_resolve, results, err)
  2702. \end_layout
  2703. \begin_layout Itemize
  2704. task - объект task
  2705. \end_layout
  2706. \begin_layout Itemize
  2707. to_resolve - строка, содержащая имя хоста или ip, для которого выполнялось
  2708. преобразование
  2709. \end_layout
  2710. \begin_layout Itemize
  2711. results - массив, содержащий ip адреса (для прямого преобразования) или
  2712. же имя хоста (для обратного).
  2713. В случае ошибки этот параметр имеет значение nil
  2714. \end_layout
  2715. \begin_layout Itemize
  2716. err - строка, описывающая ошибку (или nil, если преобразование успешно завершило
  2717. сь)
  2718. \end_layout
  2719. \begin_layout Standard
  2720. Пример функции-обработчика результатов DNS запроса:
  2721. \end_layout
  2722. \begin_layout LyX-Code
  2723. function dns_cb(task, to_resolve, results, err)
  2724. \end_layout
  2725. \begin_deeper
  2726. \begin_layout LyX-Code
  2727. if results then
  2728. \end_layout
  2729. \begin_deeper
  2730. \begin_layout LyX-Code
  2731. local _,_,rbl = string.find(to_resolve, '%d+
  2732. \backslash
  2733. .%d+
  2734. \backslash
  2735. .%d+
  2736. \backslash
  2737. .%d+
  2738. \backslash
  2739. .(.+)')
  2740. \end_layout
  2741. \begin_layout LyX-Code
  2742. task:insert_result(metric, symbol, 1, rbl)
  2743. \end_layout
  2744. \end_deeper
  2745. \begin_layout LyX-Code
  2746. end
  2747. \end_layout
  2748. \end_deeper
  2749. \begin_layout LyX-Code
  2750. end
  2751. \end_layout
  2752. \begin_layout Section
  2753. Использование файлов-списков
  2754. \end_layout
  2755. \begin_layout Standard
  2756. В lua плагинах можно задавать и использовать файлы списков, как это описано
  2757. в п.
  2758. 4.1.
  2759. Это полезно, когда в lua необходимо использовать некоторые данные, которые
  2760. бы асинхронно обновлялись в процессе работы rspamd.
  2761. API по работе со списками сожержит следующие функции:
  2762. \end_layout
  2763. \begin_layout Itemize
  2764. rspamd_config:add_radix_map (string) - добавляет определение списка, содержащего
  2765. ip адреса и сети.
  2766. При удачном добавлении возвращается объект типа rspamd_radix, который может
  2767. использоваться в обработчиках символов для определения наличия в каком-либо
  2768. списке заданного ip;
  2769. \end_layout
  2770. \begin_layout Itemize
  2771. rspamd_config:add_hash_map (string) - добавляет определение списка строк
  2772. (доменов), при успешном добавлении возвращает объект типа rspamd_hash.
  2773. \end_layout
  2774. \begin_layout Standard
  2775. Использовать списки целесообразно в функциях-обработчкиках, так как сразу
  2776. же после добавления эти списки могут оказаться пустыми.
  2777. Объекты, возвращаемые функциями, регистрирующими файлы списков, имеют метод
  2778. get_key, позволяющий определить наличие какого-либо элемента в списке.
  2779. Для списков ip адресов этот объект принимает целое число, для списка строк
  2780. - строку.
  2781. Простой пример использования списков.
  2782. \end_layout
  2783. \begin_layout Standard
  2784. Регистрация:
  2785. \end_layout
  2786. \begin_layout LyX-Code
  2787. local radix_list = nil
  2788. \end_layout
  2789. \begin_layout LyX-Code
  2790. local host_list = nil
  2791. \end_layout
  2792. \begin_layout LyX-Code
  2793. radix_list = rspamd_config:add_radix_map ('http://somehost/ip.list')
  2794. \end_layout
  2795. \begin_layout LyX-Code
  2796. host_list = rspamd_config:add_hash_map ('http://otherhost/host.list')
  2797. \end_layout
  2798. \begin_layout Standard
  2799. Использование в обработчике символа:
  2800. \end_layout
  2801. \begin_layout LyX-Code
  2802. function check_whitelist (task)
  2803. \end_layout
  2804. \begin_deeper
  2805. \begin_layout LyX-Code
  2806. -- check client's ip
  2807. \end_layout
  2808. \begin_layout LyX-Code
  2809. local ipn = task:get_from_ip_num()
  2810. \end_layout
  2811. \begin_layout LyX-Code
  2812. if ipn and radix_list then
  2813. \end_layout
  2814. \begin_deeper
  2815. \begin_layout LyX-Code
  2816. local key = radix_list:get_key(ipn)
  2817. \end_layout
  2818. \begin_layout LyX-Code
  2819. if key then
  2820. \end_layout
  2821. \begin_deeper
  2822. \begin_layout LyX-Code
  2823. task:insert_result(metric, symbol_ip, 1)
  2824. \end_layout
  2825. \end_deeper
  2826. \begin_layout LyX-Code
  2827. end
  2828. \end_layout
  2829. \end_deeper
  2830. \begin_layout LyX-Code
  2831. end
  2832. \end_layout
  2833. \begin_layout LyX-Code
  2834. \end_layout
  2835. \begin_layout LyX-Code
  2836. -- check client's from domain
  2837. \end_layout
  2838. \begin_layout LyX-Code
  2839. local from = task:get_from()
  2840. \end_layout
  2841. \begin_layout LyX-Code
  2842. if from and host_list then
  2843. \end_layout
  2844. \begin_deeper
  2845. \begin_layout LyX-Code
  2846. -- extract domain part
  2847. \end_layout
  2848. \begin_layout LyX-Code
  2849. local _,_,domain = string.find(from, '@(.+)>?$')
  2850. \end_layout
  2851. \begin_layout LyX-Code
  2852. local key = host_list:get_key(domain)
  2853. \end_layout
  2854. \begin_layout LyX-Code
  2855. if key then
  2856. \end_layout
  2857. \begin_deeper
  2858. \begin_layout LyX-Code
  2859. task:insert_result(metric, symbol_from, 1)
  2860. \end_layout
  2861. \end_deeper
  2862. \begin_layout LyX-Code
  2863. end
  2864. \end_layout
  2865. \end_deeper
  2866. \begin_layout LyX-Code
  2867. end
  2868. \end_layout
  2869. \end_deeper
  2870. \begin_layout LyX-Code
  2871. end
  2872. \end_layout
  2873. \begin_layout Chapter
  2874. Perl API rspamd
  2875. \end_layout
  2876. \begin_layout Standard
  2877. Для обработки сообщений системой rspamd было создано простое perl api для
  2878. проверки сообщений системой rspamd и обучения системы rspamd.
  2879. Данное API содержится в модуле Mail::Rspamd::Client.
  2880. Использование API достаточно тривиально:
  2881. \end_layout
  2882. \begin_layout LyX-Code
  2883. #!/usr/bin/perl -w
  2884. \end_layout
  2885. \begin_layout LyX-Code
  2886. \end_layout
  2887. \begin_layout LyX-Code
  2888. use Mail::Rspamd::Client;
  2889. \end_layout
  2890. \begin_layout LyX-Code
  2891. \end_layout
  2892. \begin_layout LyX-Code
  2893. my $testmsg;
  2894. \end_layout
  2895. \begin_layout LyX-Code
  2896. while (<>) {
  2897. \end_layout
  2898. \begin_deeper
  2899. \begin_layout LyX-Code
  2900. $testmsg .= $_;
  2901. \end_layout
  2902. \end_deeper
  2903. \begin_layout LyX-Code
  2904. }
  2905. \end_layout
  2906. \begin_layout LyX-Code
  2907. my $client = new Mail::Rspamd::Client(
  2908. \end_layout
  2909. \begin_deeper
  2910. \begin_layout LyX-Code
  2911. {
  2912. \end_layout
  2913. \begin_deeper
  2914. \begin_layout LyX-Code
  2915. port => 11333,
  2916. \end_layout
  2917. \begin_layout LyX-Code
  2918. hosts => ['localhost:11333',],
  2919. \end_layout
  2920. \begin_layout LyX-Code
  2921. ip => '127.0.0.1'
  2922. \end_layout
  2923. \end_deeper
  2924. \begin_layout LyX-Code
  2925. }
  2926. \end_layout
  2927. \end_deeper
  2928. \begin_layout LyX-Code
  2929. );
  2930. \end_layout
  2931. \begin_layout LyX-Code
  2932. \end_layout
  2933. \begin_layout LyX-Code
  2934. if ($client->ping()) {
  2935. \end_layout
  2936. \begin_deeper
  2937. \begin_layout LyX-Code
  2938. print "Ping is ok
  2939. \backslash
  2940. n";
  2941. \end_layout
  2942. \end_deeper
  2943. \begin_layout LyX-Code
  2944. }
  2945. \end_layout
  2946. \begin_layout LyX-Code
  2947. my $result = $client->check($testmsg);
  2948. \end_layout
  2949. \begin_layout LyX-Code
  2950. \end_layout
  2951. \begin_layout LyX-Code
  2952. if ($result && $result->{'default'}->{'isspam'} eq 'True') {
  2953. \end_layout
  2954. \begin_deeper
  2955. \begin_layout LyX-Code
  2956. print "spam
  2957. \backslash
  2958. n";
  2959. \end_layout
  2960. \end_deeper
  2961. \begin_layout LyX-Code
  2962. } else {
  2963. \end_layout
  2964. \begin_deeper
  2965. \begin_layout LyX-Code
  2966. print "ham
  2967. \backslash
  2968. n";
  2969. \end_layout
  2970. \end_deeper
  2971. \begin_layout LyX-Code
  2972. }
  2973. \end_layout
  2974. \begin_layout Standard
  2975. Результаты обработки сообщения возвращаются в виде ссылки на хеш, который
  2976. индексирован по метрикам.
  2977. Каждая из метрик, в свою очередь, также является ссылкой на хеш, содержащий
  2978. поля:
  2979. \end_layout
  2980. \begin_layout Itemize
  2981. isspam - строка 'True' или 'False'
  2982. \end_layout
  2983. \begin_layout Itemize
  2984. score - вес сообщения
  2985. \end_layout
  2986. \begin_layout Itemize
  2987. threshold - предельный вес данной метрики
  2988. \end_layout
  2989. \begin_layout Itemize
  2990. symbols - массив символов для данного сообщения
  2991. \end_layout
  2992. \begin_layout Standard
  2993. Модуль имеет внутреннюю логику работы с несколькими серверами rspamd, выбирая
  2994. каждый раз случайный сервер, а также помечая долго не работающие сервера,
  2995. исключая их из списка активных на некоторое время.
  2996. При создании Mail::Rspamd::Client также можно указать параметр from (значение
  2997. SMTP команды mail from), параметр rcpt (массив SMTP команд rcpt to) и user
  2998. (авторизированный пользователь SMTP).
  2999. Полный список параметров:
  3000. \end_layout
  3001. \begin_layout Itemize
  3002. username - имя пользователя (строка)
  3003. \end_layout
  3004. \begin_layout Itemize
  3005. ip - ip адрес, с которого пришло сообщение (строка)
  3006. \end_layout
  3007. \begin_layout Itemize
  3008. subject - тема письма (для не mime сообщений)
  3009. \end_layout
  3010. \begin_layout Itemize
  3011. timeout - время ожидания в секундах (число)
  3012. \end_layout
  3013. \begin_layout Itemize
  3014. password - пароль для команд котроллера (строка)
  3015. \end_layout
  3016. \begin_layout Itemize
  3017. statfile - имя символа файла статистики для обучения (строка)
  3018. \end_layout
  3019. \begin_layout Itemize
  3020. weight - вес сообщения для команд fuzzy_add и learn (число)
  3021. \end_layout
  3022. \begin_layout Itemize
  3023. imap_search - строка поиска по IMAP (строка)
  3024. \end_layout
  3025. \begin_layout Standard
  3026. Для выполнения команды на всех серверах используется команда do_all_cmd,
  3027. возвращающая хеш вида host => %results.
  3028. \end_layout
  3029. \begin_layout Chapter
  3030. Использование HTTP Redirector
  3031. \end_layout
  3032. \begin_layout Standard
  3033. HTTP редиректор представляет собой утилиту, которая умеет проверять различные
  3034. способы HTTP редиректов и выдавать реальный URL для любого заданного.
  3035. Данная утилита предназначена для проверки URL'ей вида tinyurl.com, youfrog.com
  3036. и прочих сервисов
  3037. \begin_inset Quotes fld
  3038. \end_inset
  3039. коротких
  3040. \begin_inset Quotes frd
  3041. \end_inset
  3042. URL'ей.
  3043. HTTP редиректор работает как обычный HTTP сервер и принимает стандартные
  3044. запросы вида:
  3045. \end_layout
  3046. \begin_layout LyX-Code
  3047. GET /url_to_resolve HTTP/1.0
  3048. \end_layout
  3049. \begin_layout LyX-Code
  3050. \end_layout
  3051. \begin_layout Standard
  3052. Для работы URL редиректор требует ряд perl модулей:
  3053. \end_layout
  3054. \begin_layout Itemize
  3055. HTTP::Request - обработка HTTP запросов;
  3056. \end_layout
  3057. \begin_layout Itemize
  3058. POE (Component::Server::TCP Filter::HTTPD Component::Client::HTTP) - для
  3059. асинхронной обработки соединений;
  3060. \end_layout
  3061. \begin_layout Itemize
  3062. HTML::HeadParser - для парсинга HTTP заголовков;
  3063. \end_layout
  3064. \begin_layout Itemize
  3065. SWF::Element - для обработки SWF (adobe flash) редиректов;
  3066. \end_layout
  3067. \begin_layout Itemize
  3068. Cache::Memcached::Fast - для хранения кеша URL'ей;
  3069. \end_layout
  3070. \begin_layout Itemize
  3071. Digest::SHA256 - для индексации хеша;
  3072. \end_layout
  3073. \begin_layout Itemize
  3074. Proc::Daemon, Proc::PidUtil - для демонизации и управления процессом;
  3075. \end_layout
  3076. \begin_layout Itemize
  3077. URI::Escape - для нормализации URL'ей.
  3078. \end_layout
  3079. \begin_layout Standard
  3080. Настройка утилиты осуществляется правкой скрипта rspamd-redirector, конфигурацио
  3081. нные параметры находятся в хеше %cfg:
  3082. \end_layout
  3083. \begin_layout LyX-Code
  3084. our %cfg = (
  3085. \end_layout
  3086. \begin_deeper
  3087. \begin_layout LyX-Code
  3088. port => 8080, # Порт для приема соединений
  3089. \end_layout
  3090. \begin_layout LyX-Code
  3091. max_size => 102400, # Максимальный размер принимаемых
  3092. данных
  3093. \end_layout
  3094. \begin_layout LyX-Code
  3095. http_timeout => 5, # Таймаут соединений (секунды)
  3096. \end_layout
  3097. \begin_layout LyX-Code
  3098. max_rec => 5, # Максимум подзапросов
  3099. \end_layout
  3100. \begin_layout LyX-Code
  3101. pidfile => '/var/run/rspamd/redirector.pid',# Путь до файла pid'а
  3102. \end_layout
  3103. \begin_layout LyX-Code
  3104. logfile => '/var/log/rspamd-redirector.log',# Путь до log файла
  3105. \end_layout
  3106. \begin_layout LyX-Code
  3107. do_log => 0, # Включить логирование запросов
  3108. \end_layout
  3109. \begin_layout LyX-Code
  3110. debug => 0, # Включить отладочную информацию
  3111. \end_layout
  3112. \begin_layout LyX-Code
  3113. memcached_servers => # Сервера кеша URL'ей
  3114. \end_layout
  3115. \begin_deeper
  3116. \begin_layout LyX-Code
  3117. [
  3118. \end_layout
  3119. \begin_deeper
  3120. \begin_layout LyX-Code
  3121. { address => 'localhost:11211', weight => 2.5 },
  3122. \end_layout
  3123. \end_deeper
  3124. \begin_layout LyX-Code
  3125. ],
  3126. \end_layout
  3127. \end_deeper
  3128. \begin_layout LyX-Code
  3129. digest_bits => 256, # Число бит в ключе кеша
  3130. \end_layout
  3131. \begin_layout LyX-Code
  3132. cache_expire => 3600, # Время в секундах хранения
  3133. записи кеша
  3134. \end_layout
  3135. \begin_layout LyX-Code
  3136. user => '@RSPAMD_USER@', # Пользователь
  3137. \end_layout
  3138. \begin_layout LyX-Code
  3139. group => '@RSPAMD_GROUP@', # Группа
  3140. \end_layout
  3141. \end_deeper
  3142. \begin_layout LyX-Code
  3143. );
  3144. \end_layout
  3145. \begin_layout Standard
  3146. Для работы с redirector'ом необходимо учитывать следующее: при определенни
  3147. редиректа rspamd-redirector делает полноценный http запрос, то есть, если
  3148. мы будем пытаться разрешить запросы с различными GET параметрами в URL
  3149. (например http://some_evil_host/unsubscribe?email=good@email.com), то тем
  3150. самым можем занести
  3151. \begin_inset Quotes fld
  3152. \end_inset
  3153. хорошие
  3154. \begin_inset Quotes frd
  3155. \end_inset
  3156. адреса в списки спамеров.
  3157. Кроме этого, появляется возможность организовать атаку на некоторый http
  3158. сервер, послав много писем, содержащих его адрес.
  3159. Поэтому проверять редиректы можно только у проверенных доменов.
  3160. Для этого используются настройки модуля surbl в самом rspamd (так как именно
  3161. модуль surbl отвечает за работу с редиректором):
  3162. \end_layout
  3163. \begin_layout LyX-Code
  3164. .module 'surbl' {
  3165. \end_layout
  3166. \begin_deeper
  3167. \begin_layout LyX-Code
  3168. ...
  3169. \end_layout
  3170. \begin_layout LyX-Code
  3171. redirector = "localhost:8080";
  3172. \end_layout
  3173. \begin_layout LyX-Code
  3174. # Connect timeout for redirector
  3175. \end_layout
  3176. \begin_layout LyX-Code
  3177. redirector_connect_timeout = "1s";
  3178. \end_layout
  3179. \begin_layout LyX-Code
  3180. # IO timeout for redirector
  3181. \end_layout
  3182. \begin_layout LyX-Code
  3183. redirector_read_timeout = "10s";
  3184. \end_layout
  3185. \begin_layout LyX-Code
  3186. # Maps for hosts that should be checked with redirector
  3187. \end_layout
  3188. \begin_layout LyX-Code
  3189. redirector_hosts_map = "http://some_host/redirector.hosts";
  3190. \end_layout
  3191. \begin_layout LyX-Code
  3192. ...
  3193. \end_layout
  3194. \end_deeper
  3195. \begin_layout LyX-Code
  3196. };
  3197. \end_layout
  3198. \begin_layout Standard
  3199. При этом список redirector_hosts_map содержит домены, которые будут перед
  3200. проверкой по surbl листам проверяться на наличие редиректов (то есть, именно
  3201. в том виде, что будет при surbl запросе - 2 или 3 компонента имени хоста).
  3202. Кеш URL'ей обязателен для работы редиректора, так как в противном случае
  3203. массовая рассылка с одинаковым URL'ем приведет к большому числу http запросов.
  3204. Кроме этого, кеш URL'ей существенно ускоряет работу редиректора.
  3205. Лог файл редиректора позволяет увидеть, какие редиректы были распознаны
  3206. и их тип: HTTP редирект, HTML редирект (тег meta refresh), JavaScript редирект
  3207. (location = ...), SWF редирект или же кешированный редирект (найденный в memcached
  3208. ).
  3209. Взаимодействие с редиректором возможно не только из rspamd, но и из любого
  3210. другого приложения, работающего по HTTP протоколу.
  3211. \end_layout
  3212. \begin_layout Chapter
  3213. Хранилище нечетких хешей
  3214. \end_layout
  3215. \begin_layout Standard
  3216. Нечеткий хеш (fuzzy hash) отличается от обычного тем, что при небольшом
  3217. изменении в исходном тексте, он также меняется незначительно.
  3218. Традиционный (криптографический) хеш в таком случае меняется сильно.
  3219. Эта особенность позволяет использовать нечеткие хеши для определения степени
  3220. похожести текстов (у похожих текстов будут похожие нечеткие хеши).
  3221. Эта операция является более быстрой, чем сравнение текстов, кроме этого,
  3222. нечеткие хеши можно хранить, сравнивая с ними впоследствие полученные сообщения.
  3223. В rspamd есть возможность использования хранилища нечетких хешей для проверки
  3224. сообщений.
  3225. При этом считаются хеши всех текстовых частей сообщения, а затем эти хеши
  3226. проверяются на наличие в хранилище (с определенным процентом ошибки).
  3227. Для хранилища хешей создается специальный процесс fuzzy, который работает
  3228. с рабочим процессом rspamd по UDP протоколу.
  3229. Несколько хранилищ создают общее хранилище хешей, каждый из элементов которого
  3230. содержит часть хешей.
  3231. При добавлении или удалении нового хранилища в общее хранилище, все данные
  3232. хешей теряются (возможно, это будет устранено в будущем).
  3233. При проверке хеша выбирается одно из хранилищ (соответственно хешу) и на
  3234. него шлется запрос.
  3235. При записи хеша выбирается то же самое хранилище, что и при проверке.
  3236. Запись и удаление хеша из общего хранилища обеспечивается командами fuzzy_add
  3237. и fuzzy_del на любом из контроллеров, использующих данное хранилище.
  3238. Это можно делать, например, используя клиент rspamc:
  3239. \end_layout
  3240. \begin_layout LyX-Code
  3241. rspamc fuzzy_add < message_to_add.eml
  3242. \end_layout
  3243. \begin_layout LyX-Code
  3244. rspamd fuzzy_del < message_to_del.eml
  3245. \end_layout
  3246. \begin_layout Standard
  3247. Настройка хранилища обеспечивается созданием записи для процесса fuzzy storage:
  3248. \end_layout
  3249. \begin_layout LyX-Code
  3250. worker {
  3251. \end_layout
  3252. \begin_deeper
  3253. \begin_layout LyX-Code
  3254. type = "fuzzy";
  3255. \end_layout
  3256. \begin_layout LyX-Code
  3257. # Bind socket for fuzzy interface
  3258. \end_layout
  3259. \begin_layout LyX-Code
  3260. bind_socket = *:11335;
  3261. \end_layout
  3262. \begin_layout LyX-Code
  3263. count = 1;
  3264. \end_layout
  3265. \begin_layout LyX-Code
  3266. # Path to filesystem storage
  3267. \end_layout
  3268. \begin_layout LyX-Code
  3269. hashfile = "/tmp/fuzzy.db";
  3270. \end_layout
  3271. \begin_layout LyX-Code
  3272. # Expire time for hashes in storage (h - for hours, d - for days)
  3273. \end_layout
  3274. \begin_layout LyX-Code
  3275. expire = "10d";
  3276. \end_layout
  3277. \end_deeper
  3278. \begin_layout LyX-Code
  3279. };
  3280. \end_layout
  3281. \begin_layout Standard
  3282. Для увеличения производительности хранилища можно заменить нечеткий поиск
  3283. на поиск точного соответствия, а также установкой libJudy (
  3284. \begin_inset CommandInset href
  3285. LatexCommand href
  3286. name "judy arrays"
  3287. target "http://judy.sourceforge.net"
  3288. \end_inset
  3289. ).
  3290. После этого необходимо пересобрать rspamd (libJudy обнаруживается автоматически
  3291. ) и указать в настройках fuzzy worker'а параметр:
  3292. \end_layout
  3293. \begin_layout LyX-Code
  3294. use_judy = "yes";
  3295. \end_layout
  3296. \begin_layout Standard
  3297. Настройка hashfile используется для указания файла, в который периодически
  3298. будут записываться полученные в хранилище хеши (частота синхронизации с
  3299. файлом зависит от интенсивности модификаций в хранилище, также синхронизация
  3300. происходит при завершении процесса fuzzy storage).
  3301. Для настройки клиентской части хранилища используется модуль fuzzy_check:
  3302. \end_layout
  3303. \begin_layout LyX-Code
  3304. .module 'fuzzy_check' {
  3305. \end_layout
  3306. \begin_deeper
  3307. \begin_layout LyX-Code
  3308. metric = "default";
  3309. \end_layout
  3310. \begin_layout LyX-Code
  3311. symbol = "R_FUZZY";
  3312. \end_layout
  3313. \begin_layout LyX-Code
  3314. # List of fuzzy storage servers, separated by ',' or ';' or simple by spaces
  3315. \end_layout
  3316. \begin_layout LyX-Code
  3317. servers = "localhost:11335;some_host:11335";
  3318. \end_layout
  3319. \end_deeper
  3320. \begin_layout LyX-Code
  3321. };
  3322. \end_layout
  3323. \begin_layout Standard
  3324. После настройки клиентской части с указанными серверами начинает работать
  3325. как рабочий процесс (для проверки сообщений), так и контроллер (для записи/удал
  3326. ения хешей из хранилища).
  3327. \end_layout
  3328. \begin_layout Chapter
  3329. CGI интерфейс rspamd
  3330. \end_layout
  3331. \begin_layout Standard
  3332. Rspamd имеет простой интерфейс для управления кластером серверов при помощи
  3333. веб браузера.
  3334. Интерфейс позволяет выполнять основные команды (проверка сообщений, обучение
  3335. rspamd, операции с fuzzy хешами, статистика) на выбранных серверах.
  3336. Для передачи сообщения rspamd используется либо поле текстового ввода,
  3337. либо непосредственная загрузка файла.
  3338. Если используется поле текстового ввода и сообщение вводится в него без
  3339. mime заголовков (например, для обучения), то интерфейс автоматически вставляет
  3340. заголовки по умолчанию и передает составленное таким образом сообщение
  3341. для обработки rspamd.
  3342. Запуск CGI интерфейса возможен двумя способами: как standalone сервера
  3343. и как cgi скрипта.
  3344. Первый способ подходит для тестовой работы или же для использования в один
  3345. поток.
  3346. Второй способ лишен этиго недостатка, но требует наличия настроенного веб
  3347. сервера.
  3348. Для работы с rspamd используется модуль Mail::Rspamd::Client, описанный
  3349. ранее.
  3350. Аргументы запуска CGI интерфейса:
  3351. \end_layout
  3352. \begin_layout Itemize
  3353. -standalone - запуск в виде standalone http сервера
  3354. \end_layout
  3355. \begin_layout Itemize
  3356. -port - порт для запуска
  3357. \end_layout
  3358. \begin_layout Itemize
  3359. -host - имя хоста для запуска standalone сервера
  3360. \end_layout
  3361. \begin_layout Itemize
  3362. -cfg - имя файла, содержащего список серверов, с которыми будет работать
  3363. CGI интерфейс
  3364. \end_layout
  3365. \end_body
  3366. \end_document