Geen omschrijving

post_init.py 106KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743
  1. # IRIS Source Code
  2. # Copyright (C) 2021 - Airbus CyberSecurity (SAS)
  3. # ir@cyberactionlab.net
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU Lesser General Public
  7. # License as published by the Free Software Foundation; either
  8. # version 3 of the License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. # Lesser General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU Lesser General Public License
  16. # along with this program; if not, write to the Free Software Foundation,
  17. # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. import json
  19. from pathlib import Path
  20. import glob
  21. import os
  22. import random
  23. import secrets
  24. import string
  25. import socket
  26. import time
  27. from alembic import command
  28. from alembic.config import Config
  29. from sqlalchemy import create_engine, exc, or_, text
  30. from sqlalchemy_utils import create_database
  31. from sqlalchemy_utils import database_exists
  32. from app import app
  33. from app import bc
  34. from app import celery
  35. from app import db
  36. from app.datamgmt.iris_engine.modules_db import iris_module_disable_by_id
  37. from app.datamgmt.manage.manage_groups_db import add_case_access_to_group
  38. from app.datamgmt.manage.manage_users_db import add_user_to_group
  39. from app.datamgmt.manage.manage_users_db import add_user_to_organisation
  40. from app.iris_engine.access_control.utils import ac_add_user_effective_access
  41. from app.iris_engine.demo_builder import create_demo_cases
  42. from app.iris_engine.access_control.utils import ac_get_mask_analyst
  43. from app.datamgmt.manage.manage_groups_db import get_group_by_name
  44. from app.iris_engine.access_control.utils import ac_get_mask_full_permissions
  45. from app.iris_engine.module_handler.module_handler import check_module_health
  46. from app.iris_engine.module_handler.module_handler import instantiate_module_from_name
  47. from app.iris_engine.module_handler.module_handler import register_module
  48. from app.models.models import create_safe_limited
  49. from app.models.alerts import Severity, AlertStatus, AlertResolutionStatus
  50. from app.models.authorization import CaseAccessLevel
  51. from app.models.authorization import Group
  52. from app.models.authorization import Organisation
  53. from app.models.authorization import User
  54. from app.models.cases import Cases, CaseState
  55. from app.models.cases import Client
  56. from app.models.models import AnalysisStatus, CaseClassification, ReviewStatus, ReviewStatusList, EvidenceTypes
  57. from app.models.models import AssetsType
  58. from app.models.models import EventCategory
  59. from app.models.models import IocType
  60. from app.models.models import IrisHook
  61. from app.models.models import IrisModule
  62. from app.models.models import Languages
  63. from app.models.models import OsType
  64. from app.models.models import ReportType
  65. from app.models.models import ServerSettings
  66. from app.models.models import TaskStatus
  67. from app.models.models import Tlp
  68. from app.models.models import create_safe
  69. from app.models.models import create_safe_attr
  70. from app.models.models import get_by_value_or_create
  71. from app.models.models import get_or_create
  72. from app.iris_engine.demo_builder import create_demo_users
  73. log = app.logger
  74. # Get the database host and port from environment variables
  75. db_host = app.config.get('PG_SERVER')
  76. db_port = int(app.config.get('PG_PORT'))
  77. # Get the retry parameters from environment variables
  78. retry_count = int(app.config.get('DB_RETRY_COUNT'))
  79. retry_delay = int(app.config.get('DB_RETRY_DELAY'))
  80. def connect_to_database(host: str, port: int) -> bool:
  81. """Attempts to connect to a database at the specified host and port.
  82. Args:
  83. host: A string representing the hostname or IP address of the database server.
  84. port: An integer representing the port number to connect to.
  85. Returns:
  86. A boolean value indicating whether the connection was successful.
  87. """
  88. # Create a new socket object
  89. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  90. try:
  91. # Try to connect to the database
  92. s.connect((host, port))
  93. # If the connection was successful, close the socket and return True
  94. s.close()
  95. return True
  96. except socket.error:
  97. # If the connection failed, close the socket and return False
  98. s.close()
  99. return False
  100. def run_post_init(development=False):
  101. """Runs post-initiation steps for the IRIS application.
  102. Args:
  103. development: A boolean value indicating whether the application is running in development mode.
  104. """
  105. # Log the IRIS version and post-initiation steps
  106. log.info(f'IRIS {app.config.get("IRIS_VERSION")}')
  107. log.info("Running post initiation steps")
  108. if os.getenv("IRIS_WORKER") is None:
  109. create_directories()
  110. # Attempt to connect to the database with retries
  111. log.info("Attempting to connect to the database...")
  112. for i in range(retry_count):
  113. log.info("Connecting to database, attempt " + str(i+1) + "/" + str(retry_count))
  114. conn = connect_to_database(db_host, db_port)
  115. if conn:
  116. break
  117. log.info("Retrying in " + str(retry_delay) + "seconds...")
  118. time.sleep(retry_delay)
  119. # If the connection is still not established, exit the script
  120. if not conn:
  121. log.info("Failed to connect to database after " + str(retry_count) + " attempts.")
  122. exit(1)
  123. # Setup database before everything
  124. #log.info("Adding pgcrypto extension")
  125. #pg_add_pgcrypto_ext()
  126. # Setup database before everything
  127. with app.app_context():
  128. log.info("Creating all Iris tables")
  129. db.create_all(bind_key=None)
  130. db.session.commit()
  131. log.info("Creating Celery metatasks tables")
  132. create_safe_db(db_name="iris_tasks")
  133. db.create_all(bind_key="iris_tasks")
  134. db.session.commit()
  135. log.info("Running DB migration")
  136. alembic_cfg = Config(file_='app/alembic.ini')
  137. alembic_cfg.set_main_option('sqlalchemy.url', app.config['SQLALCHEMY_DATABASE_URI'])
  138. command.upgrade(alembic_cfg, 'head')
  139. # Create base server settings if they don't exist
  140. srv_settings = ServerSettings.query.first()
  141. if srv_settings is None:
  142. log.info("Creating base server settings")
  143. create_safe_server_settings()
  144. srv_settings = ServerSettings.query.first()
  145. prevent_objects = srv_settings.prevent_post_objects_repush
  146. # Create base languages, OS types, IOC types, attributes, report types, TLP, event categories, assets,
  147. # analysis status, case classification, task status, severities, alert status, case states, and hooks
  148. log.info("Creating base languages")
  149. create_safe_languages()
  150. log.info("Creating base os types")
  151. create_safe_os_types()
  152. if not prevent_objects:
  153. log.info("Creating base IOC types")
  154. create_safe_ioctypes()
  155. log.info("Creating base attributes")
  156. create_safe_attributes()
  157. log.info("Creating base report types")
  158. create_safe_report_types()
  159. log.info("Creating base TLP")
  160. create_safe_tlp()
  161. log.info("Creating base events categories")
  162. create_safe_events_cats()
  163. if not prevent_objects:
  164. log.info("Creating base assets")
  165. create_safe_assets()
  166. log.info("Creating base analysis status")
  167. create_safe_analysis_status()
  168. if not prevent_objects:
  169. log.info("Creating base case classification")
  170. create_safe_classifications()
  171. log.info("Creating base tasks status")
  172. create_safe_task_status()
  173. log.info("Creating base severities")
  174. create_safe_severities()
  175. log.info("Creating base alert status")
  176. create_safe_alert_status()
  177. log.info("Creating base evidence types")
  178. create_safe_evidence_types()
  179. log.info("Creating base alert resolution status")
  180. create_safe_alert_resolution_status()
  181. if not prevent_objects:
  182. log.info("Creating base case states")
  183. create_safe_case_states()
  184. log.info("Creating base review status")
  185. create_safe_review_status()
  186. log.info("Creating base hooks")
  187. create_safe_hooks()
  188. # Create initial authorization model, administrative user, and customer
  189. log.info("Creating initial authorisation model")
  190. def_org, gadm, ganalysts = create_safe_auth_model()
  191. log.info("Creating first administrative user")
  192. admin, pwd = create_safe_admin(def_org=def_org, gadm=gadm)
  193. if not srv_settings.prevent_post_mod_repush:
  194. log.info("Registering default modules")
  195. register_default_modules()
  196. log.info("Creating initial customer")
  197. client = create_safe_client()
  198. log.info("Creating initial case")
  199. create_safe_case(
  200. user=admin,
  201. client=client,
  202. groups=[gadm, ganalysts]
  203. )
  204. # Setup symlinks for custom_assets
  205. log.info("Creating symlinks for custom asset icons")
  206. custom_assets_symlinks()
  207. # If demo mode is enabled, create demo users and cases
  208. if app.config.get('DEMO_MODE_ENABLED') == 'True':
  209. log.warning("============================")
  210. log.warning("| THIS IS DEMO INSTANCE |")
  211. log.warning("| DO NOT USE IN PRODUCTION |")
  212. log.warning("============================")
  213. users_data = create_demo_users(def_org, gadm, ganalysts,
  214. int(app.config.get('DEMO_USERS_COUNT', 10)),
  215. app.config.get('DEMO_USERS_SEED'),
  216. int(app.config.get('DEMO_ADM_COUNT', 4)),
  217. app.config.get('DEMO_ADM_SEED'))
  218. create_demo_cases(users_data=users_data,
  219. cases_count=int(app.config.get('DEMO_CASES_COUNT', 20)),
  220. clients_count=int(app.config.get('DEMO_CLIENTS_COUNT', 4)))
  221. # Log completion message
  222. log.info("Post-init steps completed")
  223. log.warning("===============================")
  224. log.warning(f"| IRIS IS READY on port {os.getenv('INTERFACE_HTTPS_PORT')} |")
  225. log.warning("===============================")
  226. # If an administrative user was created, log their credentials
  227. if pwd is not None:
  228. log.info(f'You can now login with user {admin.user} and password >>> {pwd} <<< '
  229. f'on {os.getenv("INTERFACE_HTTPS_PORT")}')
  230. def create_safe_db(db_name):
  231. """Creates a new database with the specified name if it does not already exist.
  232. Args:
  233. db_name: A string representing the name of the database to create.
  234. """
  235. # Create a new engine object for the specified database
  236. engine = create_engine(app.config["SQALCHEMY_PIGGER_URI"] + db_name)
  237. # Check if the database already exists
  238. if not database_exists(engine.url):
  239. # If the database does not exist, create it
  240. create_database(engine.url)
  241. # Dispose of the engine object
  242. engine.dispose()
  243. def create_safe_hooks():
  244. # --- Alert
  245. create_safe(db.session, IrisHook, hook_name='on_postload_alert_create',
  246. hook_description='Triggered on alert creation, after commit in DB')
  247. create_safe(db.session, IrisHook, hook_name='on_postload_alert_delete',
  248. hook_description='Triggered on alert deletion, after commit in DB')
  249. create_safe(db.session, IrisHook, hook_name='on_postload_alert_update',
  250. hook_description='Triggered on alert update, after commit in DB')
  251. create_safe(db.session, IrisHook, hook_name='on_postload_alert_resolution_update',
  252. hook_description='Triggered on alert resolution update, after commit in DB')
  253. create_safe(db.session, IrisHook, hook_name='on_postload_alert_status_update',
  254. hook_description='Triggered on alert status update, after commit in DB')
  255. create_safe(db.session, IrisHook, hook_name='on_postload_alert_escalate',
  256. hook_description='Triggered on alert escalation, after commit in DB')
  257. create_safe(db.session, IrisHook, hook_name='on_postload_alert_merge',
  258. hook_description='Triggered on alert merge, after commit in DB')
  259. create_safe(db.session, IrisHook, hook_name='on_postload_alert_unmerge',
  260. hook_description='Triggered on alert unmerge, after commit in DB')
  261. create_safe(db.session, IrisHook, hook_name='on_manual_trigger_alert',
  262. hook_description='Triggered upon user action')
  263. # --- Case
  264. create_safe(db.session, IrisHook, hook_name='on_preload_case_create',
  265. hook_description='Triggered on case creation, before commit in DB')
  266. create_safe(db.session, IrisHook, hook_name='on_postload_case_create',
  267. hook_description='Triggered on case creation, after commit in DB')
  268. create_safe(db.session, IrisHook, hook_name='on_preload_case_delete',
  269. hook_description='Triggered on case deletion, before commit in DB')
  270. create_safe(db.session, IrisHook, hook_name='on_postload_case_delete',
  271. hook_description='Triggered on case deletion, after commit in DB')
  272. create_safe(db.session, IrisHook, hook_name='on_postload_case_update',
  273. hook_description='Triggered on case update, after commit in DB')
  274. create_safe(db.session, IrisHook, hook_name='on_manual_trigger_case',
  275. hook_description='Triggered upon user action')
  276. # --- Assets
  277. create_safe(db.session, IrisHook, hook_name='on_preload_asset_create',
  278. hook_description='Triggered on asset creation, before commit in DB')
  279. create_safe(db.session, IrisHook, hook_name='on_postload_asset_create',
  280. hook_description='Triggered on asset creation, after commit in DB')
  281. create_safe(db.session, IrisHook, hook_name='on_preload_asset_update',
  282. hook_description='Triggered on asset update, before commit in DB')
  283. create_safe(db.session, IrisHook, hook_name='on_postload_asset_update',
  284. hook_description='Triggered on asset update, after commit in DB')
  285. create_safe(db.session, IrisHook, hook_name='on_preload_asset_delete',
  286. hook_description='Triggered on asset deletion, before commit in DB')
  287. create_safe(db.session, IrisHook, hook_name='on_postload_asset_delete',
  288. hook_description='Triggered on asset deletion, after commit in DB')
  289. create_safe(db.session, IrisHook, hook_name='on_manual_trigger_asset',
  290. hook_description='Triggered upon user action')
  291. # --- Notes
  292. create_safe(db.session, IrisHook, hook_name='on_preload_note_create',
  293. hook_description='Triggered on note creation, before commit in DB')
  294. create_safe(db.session, IrisHook, hook_name='on_postload_note_create',
  295. hook_description='Triggered on note creation, after commit in DB')
  296. create_safe(db.session, IrisHook, hook_name='on_preload_note_update',
  297. hook_description='Triggered on note update, before commit in DB')
  298. create_safe(db.session, IrisHook, hook_name='on_postload_note_update',
  299. hook_description='Triggered on note update, after commit in DB')
  300. create_safe(db.session, IrisHook, hook_name='on_preload_note_delete',
  301. hook_description='Triggered on note deletion, before commit in DB')
  302. create_safe(db.session, IrisHook, hook_name='on_postload_note_delete',
  303. hook_description='Triggered on note deletion, after commit in DB')
  304. create_safe(db.session, IrisHook, hook_name='on_manual_trigger_note',
  305. hook_description='Triggered upon user action')
  306. # --- iocs
  307. create_safe(db.session, IrisHook, hook_name='on_preload_ioc_create',
  308. hook_description='Triggered on ioc creation, before commit in DB')
  309. create_safe(db.session, IrisHook, hook_name='on_postload_ioc_create',
  310. hook_description='Triggered on ioc creation, after commit in DB')
  311. create_safe(db.session, IrisHook, hook_name='on_preload_ioc_update',
  312. hook_description='Triggered on ioc update, before commit in DB')
  313. create_safe(db.session, IrisHook, hook_name='on_postload_ioc_update',
  314. hook_description='Triggered on ioc update, after commit in DB')
  315. create_safe(db.session, IrisHook, hook_name='on_preload_ioc_delete',
  316. hook_description='Triggered on ioc deletion, before commit in DB')
  317. create_safe(db.session, IrisHook, hook_name='on_postload_ioc_delete',
  318. hook_description='Triggered on ioc deletion, after commit in DB')
  319. create_safe(db.session, IrisHook, hook_name='on_manual_trigger_ioc',
  320. hook_description='Triggered upon user action')
  321. # --- events
  322. create_safe(db.session, IrisHook, hook_name='on_preload_event_create',
  323. hook_description='Triggered on event creation, before commit in DB')
  324. create_safe(db.session, IrisHook, hook_name='on_postload_event_create',
  325. hook_description='Triggered on event creation, after commit in DB')
  326. create_safe(db.session, IrisHook, hook_name='on_preload_event_duplicate',
  327. hook_description='Triggered on event duplication, before commit in DB')
  328. create_safe(db.session, IrisHook, hook_name='on_preload_event_update',
  329. hook_description='Triggered on event update, before commit in DB')
  330. create_safe(db.session, IrisHook, hook_name='on_postload_event_update',
  331. hook_description='Triggered on event update, after commit in DB')
  332. create_safe(db.session, IrisHook, hook_name='on_preload_event_delete',
  333. hook_description='Triggered on event deletion, before commit in DB')
  334. create_safe(db.session, IrisHook, hook_name='on_postload_event_delete',
  335. hook_description='Triggered on event deletion, after commit in DB')
  336. create_safe(db.session, IrisHook, hook_name='on_manual_trigger_event',
  337. hook_description='Triggered upon user action')
  338. # --- evidence
  339. create_safe(db.session, IrisHook, hook_name='on_preload_evidence_create',
  340. hook_description='Triggered on evidence creation, before commit in DB')
  341. create_safe(db.session, IrisHook, hook_name='on_postload_evidence_create',
  342. hook_description='Triggered on evidence creation, after commit in DB')
  343. create_safe(db.session, IrisHook, hook_name='on_preload_evidence_update',
  344. hook_description='Triggered on evidence update, before commit in DB')
  345. create_safe(db.session, IrisHook, hook_name='on_postload_evidence_update',
  346. hook_description='Triggered on evidence update, after commit in DB')
  347. create_safe(db.session, IrisHook, hook_name='on_preload_evidence_delete',
  348. hook_description='Triggered on evidence deletion, before commit in DB')
  349. create_safe(db.session, IrisHook, hook_name='on_postload_evidence_delete',
  350. hook_description='Triggered on evidence deletion, after commit in DB')
  351. create_safe(db.session, IrisHook, hook_name='on_manual_trigger_evidence',
  352. hook_description='Triggered upon user action')
  353. # --- tasks
  354. create_safe(db.session, IrisHook, hook_name='on_preload_task_create',
  355. hook_description='Triggered on task creation, before commit in DB')
  356. create_safe(db.session, IrisHook, hook_name='on_postload_task_create',
  357. hook_description='Triggered on task creation, after commit in DB')
  358. create_safe(db.session, IrisHook, hook_name='on_preload_task_update',
  359. hook_description='Triggered on task update, before commit in DB')
  360. create_safe(db.session, IrisHook, hook_name='on_postload_task_update',
  361. hook_description='Triggered on task update, after commit in DB')
  362. create_safe(db.session, IrisHook, hook_name='on_preload_task_delete',
  363. hook_description='Triggered on task deletion, before commit in DB')
  364. create_safe(db.session, IrisHook, hook_name='on_postload_task_delete',
  365. hook_description='Triggered on task deletion, after commit in DB')
  366. create_safe(db.session, IrisHook, hook_name='on_manual_trigger_task',
  367. hook_description='Triggered upon user action')
  368. # --- global tasks
  369. create_safe(db.session, IrisHook, hook_name='on_preload_global_task_create',
  370. hook_description='Triggered on global task creation, before commit in DB')
  371. create_safe(db.session, IrisHook, hook_name='on_postload_global_task_create',
  372. hook_description='Triggered on global task creation, after commit in DB')
  373. create_safe(db.session, IrisHook, hook_name='on_preload_global_task_update',
  374. hook_description='Triggered on task update, before commit in DB')
  375. create_safe(db.session, IrisHook, hook_name='on_postload_global_task_update',
  376. hook_description='Triggered on global task update, after commit in DB')
  377. create_safe(db.session, IrisHook, hook_name='on_preload_global_task_delete',
  378. hook_description='Triggered on task deletion, before commit in DB')
  379. create_safe(db.session, IrisHook, hook_name='on_postload_global_task_delete',
  380. hook_description='Triggered on global task deletion, after commit in DB')
  381. create_safe(db.session, IrisHook, hook_name='on_manual_trigger_global_task',
  382. hook_description='Triggered upon user action')
  383. # --- reports
  384. create_safe(db.session, IrisHook, hook_name='on_preload_report_create',
  385. hook_description='Triggered on report creation, before generation in DB')
  386. create_safe(db.session, IrisHook, hook_name='on_postload_report_create',
  387. hook_description='Triggered on report creation, before download of the document')
  388. create_safe(db.session, IrisHook, hook_name='on_preload_activities_report_create',
  389. hook_description='Triggered on activities report creation, before generation in DB')
  390. create_safe(db.session, IrisHook, hook_name='on_postload_activities_report_create',
  391. hook_description='Triggered on activities report creation, before download of the document')
  392. # --- comments
  393. create_safe(db.session, IrisHook, hook_name='on_postload_asset_commented',
  394. hook_description='Triggered on event commented, after commit in DB')
  395. create_safe(db.session, IrisHook, hook_name='on_postload_asset_comment_update',
  396. hook_description='Triggered on event comment update, after commit in DB')
  397. create_safe(db.session, IrisHook, hook_name='on_postload_asset_comment_delete',
  398. hook_description='Triggered on event comment deletion, after commit in DB')
  399. create_safe(db.session, IrisHook, hook_name='on_postload_evidence_commented',
  400. hook_description='Triggered on evidence commented, after commit in DB')
  401. create_safe(db.session, IrisHook, hook_name='on_postload_evidence_comment_update',
  402. hook_description='Triggered on evidence comment update, after commit in DB')
  403. create_safe(db.session, IrisHook, hook_name='on_postload_evidence_comment_delete',
  404. hook_description='Triggered on evidence comment deletion, after commit in DB')
  405. create_safe(db.session, IrisHook, hook_name='on_postload_task_commented',
  406. hook_description='Triggered on task commented, after commit in DB')
  407. create_safe(db.session, IrisHook, hook_name='on_postload_task_comment_update',
  408. hook_description='Triggered on task comment update, after commit in DB')
  409. create_safe(db.session, IrisHook, hook_name='on_postload_task_comment_delete',
  410. hook_description='Triggered on task comment deletion, after commit in DB')
  411. create_safe(db.session, IrisHook, hook_name='on_postload_ioc_commented',
  412. hook_description='Triggered on IOC commented, after commit in DB')
  413. create_safe(db.session, IrisHook, hook_name='on_postload_ioc_comment_update',
  414. hook_description='Triggered on IOC comment update, after commit in DB')
  415. create_safe(db.session, IrisHook, hook_name='on_postload_ioc_comment_delete',
  416. hook_description='Triggered on IOC comment deletion, after commit in DB')
  417. create_safe(db.session, IrisHook, hook_name='on_postload_event_commented',
  418. hook_description='Triggered on event commented, after commit in DB')
  419. create_safe(db.session, IrisHook, hook_name='on_postload_event_comment_update',
  420. hook_description='Triggered on event comment update, after commit in DB')
  421. create_safe(db.session, IrisHook, hook_name='on_postload_event_comment_delete',
  422. hook_description='Triggered on event comment deletion, after commit in DB')
  423. create_safe(db.session, IrisHook, hook_name='on_postload_note_commented',
  424. hook_description='Triggered on note commented, after commit in DB')
  425. create_safe(db.session, IrisHook, hook_name='on_postload_note_comment_update',
  426. hook_description='Triggered on note comment update, after commit in DB')
  427. create_safe(db.session, IrisHook, hook_name='on_postload_note_comment_delete',
  428. hook_description='Triggered on note comment deletion, after commit in DB')
  429. create_safe(db.session, IrisHook, hook_name='on_postload_alert_commented',
  430. hook_description='Triggered on alert commented, after commit in DB')
  431. create_safe(db.session, IrisHook, hook_name='on_postload_alert_comment_update',
  432. hook_description='Triggered on alert comment update, after commit in DB')
  433. create_safe(db.session, IrisHook, hook_name='on_postload_alert_comment_delete',
  434. hook_description='Triggered on alert comment deletion, after commit in DB')
  435. def pg_add_pgcrypto_ext():
  436. """Adds the pgcrypto extension to the PostgreSQL database.
  437. This extension provides cryptographic functions for PostgreSQL.
  438. """
  439. # Set the application context
  440. with app.app_context():
  441. # Open a connection to the iris_db database
  442. with db.engine.connect() as con:
  443. # Execute a SQL command to create the pgcrypto extension if it does not already exist
  444. con.execute(text('CREATE EXTENSION IF NOT EXISTS pgcrypto CASCADE;'))
  445. db.session.commit()
  446. log.info("pgcrypto extension added")
  447. def create_safe_languages():
  448. """Creates new Language objects if they do not already exist.
  449. This function creates new Language objects with the specified name and code
  450. if they do not already exist in the database.
  451. """
  452. # Create new Language objects for each language
  453. create_safe(db.session, Languages, name="french", code="FR")
  454. create_safe(db.session, Languages, name="english", code="EN")
  455. create_safe(db.session, Languages, name="german", code="DE")
  456. create_safe(db.session, Languages, name="bulgarian", code="BG")
  457. create_safe(db.session, Languages, name="croatian", code="HR")
  458. create_safe(db.session, Languages, name="danish", code="DK")
  459. create_safe(db.session, Languages, name="dutch", code="NL")
  460. create_safe(db.session, Languages, name="estonian", code="EE")
  461. create_safe(db.session, Languages, name="finnish", code="FI")
  462. create_safe(db.session, Languages, name="greek", code="GR")
  463. create_safe(db.session, Languages, name="hungarian", code="HU")
  464. create_safe(db.session, Languages, name="irish", code="IE")
  465. create_safe(db.session, Languages, name="italian", code="IT")
  466. create_safe(db.session, Languages, name="latvian", code="LV")
  467. create_safe(db.session, Languages, name="lithuanian", code="LT")
  468. create_safe(db.session, Languages, name="maltese", code="MT")
  469. create_safe(db.session, Languages, name="polish", code="PL")
  470. create_safe(db.session, Languages, name="portuguese", code="PT")
  471. create_safe(db.session, Languages, name="romanian", code="RO")
  472. create_safe(db.session, Languages, name="slovak", code="SK")
  473. create_safe(db.session, Languages, name="slovenian", code="SI")
  474. create_safe(db.session, Languages, name="spanish", code="ES")
  475. create_safe(db.session, Languages, name="swedish", code="SE")
  476. create_safe(db.session, Languages, name="indian", code="IN")
  477. create_safe(db.session, Languages, name="chinese", code="CN")
  478. create_safe(db.session, Languages, name="korean", code="KR")
  479. create_safe(db.session, Languages, name="arabic", code="AR")
  480. create_safe(db.session, Languages, name="japanese", code="JP")
  481. create_safe(db.session, Languages, name="turkish", code="TR")
  482. create_safe(db.session, Languages, name="vietnamese", code="VN")
  483. create_safe(db.session, Languages, name="thai", code="TH")
  484. create_safe(db.session, Languages, name="hebrew", code="IL")
  485. create_safe(db.session, Languages, name="czech", code="CZ")
  486. create_safe(db.session, Languages, name="norwegian", code="NO")
  487. create_safe(db.session, Languages, name="brazilian", code="BR")
  488. create_safe(db.session, Languages, name="ukrainian", code="UA")
  489. create_safe(db.session, Languages, name="catalan", code="CA")
  490. create_safe(db.session, Languages, name="serbian", code="RS")
  491. create_safe(db.session, Languages, name="persian", code="IR")
  492. create_safe(db.session, Languages, name="afrikaans", code="ZA")
  493. create_safe(db.session, Languages, name="albanian", code="AL")
  494. create_safe(db.session, Languages, name="armenian", code="AM")
  495. def create_safe_events_cats():
  496. """Creates new EventCategory objects if they do not already exist.
  497. This function creates new EventCategory objects with the specified name
  498. if they do not already exist in the database.
  499. """
  500. # Create new EventCategory objects for each category
  501. create_safe(db.session, EventCategory, name="Unspecified")
  502. create_safe(db.session, EventCategory, name="Legitimate")
  503. create_safe(db.session, EventCategory, name="Remediation")
  504. create_safe(db.session, EventCategory, name="Initial Access")
  505. create_safe(db.session, EventCategory, name="Execution")
  506. create_safe(db.session, EventCategory, name="Persistence")
  507. create_safe(db.session, EventCategory, name="Privilege Escalation")
  508. create_safe(db.session, EventCategory, name="Defense Evasion")
  509. create_safe(db.session, EventCategory, name="Credential Access")
  510. create_safe(db.session, EventCategory, name="Discovery")
  511. create_safe(db.session, EventCategory, name="Lateral Movement")
  512. create_safe(db.session, EventCategory, name="Collection")
  513. create_safe(db.session, EventCategory, name="Command and Control")
  514. create_safe(db.session, EventCategory, name="Exfiltration")
  515. create_safe(db.session, EventCategory, name="Impact")
  516. def create_safe_classifications():
  517. """Creates new CaseClassification objects if they do not already exist.
  518. This function reads the MISP classification taxonomy from a JSON file and creates
  519. new CaseClassification objects with the specified name, name_expanded, and description
  520. if they do not already exist in the database.
  521. """
  522. # Read the MISP classification taxonomy from a JSON file
  523. log.info("Reading MISP classification taxonomy from resources/misp.classification.taxonomy.json")
  524. with open(Path(__file__).parent / 'resources' / 'misp.classification.taxonomy.json') as data_file:
  525. data = json.load(data_file)
  526. # Iterate over each classification in the taxonomy
  527. for c in data.get('values'):
  528. predicate = c.get('predicate')
  529. entries = c.get('entry')
  530. # Iterate over each entry in the classification
  531. for entry in entries:
  532. # Create a new CaseClassification object with the specified name, name_expanded, and description
  533. create_safe(db.session, CaseClassification,
  534. name=f"{predicate}:{entry.get('value')}",
  535. name_expanded=f"{predicate.title()}: {entry.get('expanded')}",
  536. description=entry['description'])
  537. def create_safe_analysis_status():
  538. """Creates new AnalysisStatus objects if they do not already exist.
  539. This function creates new AnalysisStatus objects with the specified name
  540. if they do not already exist in the database.
  541. """
  542. # Create new AnalysisStatus objects for each status
  543. create_safe(db.session, AnalysisStatus, name='Unspecified')
  544. create_safe(db.session, AnalysisStatus, name='To be done')
  545. create_safe(db.session, AnalysisStatus, name='Started')
  546. create_safe(db.session, AnalysisStatus, name='Pending')
  547. create_safe(db.session, AnalysisStatus, name='Canceled')
  548. create_safe(db.session, AnalysisStatus, name='Done')
  549. def create_safe_task_status():
  550. """Creates new TaskStatus objects if they do not already exist.
  551. This function creates new TaskStatus objects with the specified status name,
  552. status description, and Bootstrap color if they do not already exist in the database.
  553. """
  554. # Create new TaskStatus objects for each status
  555. create_safe(db.session, TaskStatus, status_name='To do', status_description="", status_bscolor="danger")
  556. create_safe(db.session, TaskStatus, status_name='In progress', status_description="", status_bscolor="warning")
  557. create_safe(db.session, TaskStatus, status_name='On hold', status_description="", status_bscolor="muted")
  558. create_safe(db.session, TaskStatus, status_name='Done', status_description="", status_bscolor="success")
  559. create_safe(db.session, TaskStatus, status_name='Canceled', status_description="", status_bscolor="muted")
  560. def create_safe_severities():
  561. """Creates new Severity objects if they do not already exist.
  562. This function creates new Severity objects with the specified severity name
  563. and severity description if they do not already exist in the database.
  564. """
  565. # Create new Severity objects for each severity level
  566. create_safe(db.session, Severity, severity_name='Unspecified', severity_description="Unspecified")
  567. create_safe(db.session, Severity, severity_name='Informational', severity_description="Informational")
  568. create_safe(db.session, Severity, severity_name='Low', severity_description="Low")
  569. create_safe(db.session, Severity, severity_name='Medium', severity_description="Medium")
  570. create_safe(db.session, Severity, severity_name='High', severity_description="High")
  571. create_safe(db.session, Severity, severity_name='Critical', severity_description="Critical")
  572. def create_safe_alert_status():
  573. """Creates new AlertStatus objects if they do not already exist.
  574. This function creates new AlertStatus objects with the specified status name
  575. and status description if they do not already exist in the database.
  576. """
  577. # Create new AlertStatus objects for each status
  578. create_safe(db.session, AlertStatus, status_name='Unspecified', status_description="Unspecified")
  579. create_safe(db.session, AlertStatus, status_name='New', status_description="Alert is new and unassigned")
  580. create_safe(db.session, AlertStatus, status_name='Assigned', status_description="Alert is assigned to a user and "
  581. "pending investigation")
  582. create_safe(db.session, AlertStatus, status_name='In progress', status_description="Alert is being investigated")
  583. create_safe(db.session, AlertStatus, status_name='Pending', status_description="Alert is in a pending state")
  584. create_safe(db.session, AlertStatus, status_name='Closed', status_description="Alert closed, no action taken")
  585. create_safe(db.session, AlertStatus, status_name='Merged', status_description="Alert merged into an existing case")
  586. create_safe(db.session, AlertStatus, status_name='Escalated', status_description="Alert converted to a new case")
  587. def create_safe_evidence_types():
  588. """Creates new Evidence Types objects if they do not already exist.
  589. This function creates new Evidence Types objects with the specified type name
  590. and type description if they do not already exist in the database.
  591. """
  592. # Create new EvidenceType objects for each status
  593. create_safe(db.session, EvidenceTypes, name='Unspecified', description="Unspecified")
  594. create_safe(db.session, EvidenceTypes, name='HDD image - Generic', description="Generic copy of an hard drive")
  595. create_safe(db.session, EvidenceTypes, name='HDD image - DD - Other', description="DD copy of an hard drive")
  596. create_safe(db.session, EvidenceTypes, name='HDD image - DD - Windows', description="DD copy of an hard drive")
  597. create_safe(db.session, EvidenceTypes, name='HDD image - DD - Unix', description="DD copy of an hard drive")
  598. create_safe(db.session, EvidenceTypes, name='HDD image - DD - MacOS', description="DD copy of an hard drive")
  599. create_safe(db.session, EvidenceTypes, name='HDD image - E01 - Other', description="E01 acquisition of an hard drive")
  600. create_safe(db.session, EvidenceTypes, name='HDD image - E01 - Windows', description="E01 acquisition of an hard drive")
  601. create_safe(db.session, EvidenceTypes, name='HDD image - E01 - Unix', description="E01 acquisition of an hard drive")
  602. create_safe(db.session, EvidenceTypes, name='HDD image - E01 - MacOS', description="E01 acquisition of an hard drive")
  603. create_safe(db.session, EvidenceTypes, name='HDD image - AFF4 - Other', description="AFF4 acquisition of an hard drive")
  604. create_safe(db.session, EvidenceTypes, name='HDD image - AFF4 - Windows', description="AFF4 acquisition of an hard drive")
  605. create_safe(db.session, EvidenceTypes, name='HDD image - AFF4 - Unix', description="AFF4 acquisition of an hard drive")
  606. create_safe(db.session, EvidenceTypes, name='HDD image - AFF4 - MacOS', description="AFF4 acquisition of an hard drive")
  607. create_safe(db.session, EvidenceTypes, name='SSD image - Generic', description="Generic copy of an solid state drive")
  608. create_safe(db.session, EvidenceTypes, name='SSD image - DD - Other', description="DD copy of an solid state drive")
  609. create_safe(db.session, EvidenceTypes, name='SSD image - DD - Windows', description="DD copy of an solid state drive")
  610. create_safe(db.session, EvidenceTypes, name='SSD image - DD - Unix', description="DD copy of an solid state drive")
  611. create_safe(db.session, EvidenceTypes, name='SSD image - DD - MacOS', description="DD copy of an solid state drive")
  612. create_safe(db.session, EvidenceTypes, name='SSD image - E01 - Other', description="EO1 copy of a solid state drive")
  613. create_safe(db.session, EvidenceTypes, name='SSD image - E01 - Windows', description="EO1 copy of a solid state drive")
  614. create_safe(db.session, EvidenceTypes, name='SSD image - E01 - Unix', description="EO1 copy of a solid state drive")
  615. create_safe(db.session, EvidenceTypes, name='SSD image - E01 - MacOS', description="EO1 copy of MacOS on a solid state drive")
  616. create_safe(db.session, EvidenceTypes, name='SSD image - AFF4 - Other', description="AFF4 copy of an solid state drive")
  617. create_safe(db.session, EvidenceTypes, name='SSD image - AFF4 - Windows', description="AFF4 copy of an solid state drive")
  618. create_safe(db.session, EvidenceTypes, name='SSD image - AFF4 - Unix', description="AFF4 copy of an solid state drive")
  619. create_safe(db.session, EvidenceTypes, name='SSD image - AFF4 - MacOS', description="AFF4 copy of an solid state drive")
  620. create_safe(db.session, EvidenceTypes, name='VM image - Generic', description="Generic copy of a VM ")
  621. create_safe(db.session, EvidenceTypes, name='VM image - Linux Server', description="Copy of a Linux Server VM")
  622. create_safe(db.session, EvidenceTypes, name='VM image - Windows Server', description="Copy of a Windows Server VM")
  623. create_safe(db.session, EvidenceTypes, name='VM image - Windows Server', description="Copy of a Windows Server VM")
  624. create_safe(db.session, EvidenceTypes, name='Phone Image - Android', description="Copy of an Android phone")
  625. create_safe(db.session, EvidenceTypes, name='Phone Image - iPhone', description="Copy of an iPhone")
  626. create_safe(db.session, EvidenceTypes, name='Phone backup - Android (adb)', description="adb backup of an Android")
  627. create_safe(db.session, EvidenceTypes, name='Phone backup - iPhone (iTunes)', description="iTunes backup of an iPhone")
  628. create_safe(db.session, EvidenceTypes, name='Tablet Image - Android', description="Copy of an Android tablet")
  629. create_safe(db.session, EvidenceTypes, name='Tablet Image - iPad', description="Copy of an iPad tablet")
  630. create_safe(db.session, EvidenceTypes, name='Tablet backup - Android (adb)', description="adb backup of an Android tablet")
  631. create_safe(db.session, EvidenceTypes, name='Tablet backup - iPad (iTunes)', description="iTunes backup of an iPad")
  632. create_safe(db.session, EvidenceTypes, name='Collection - Velociraptor', description="Velociraptor collection")
  633. create_safe(db.session, EvidenceTypes, name='Collection - ORC', description="ORC collection")
  634. create_safe(db.session, EvidenceTypes, name='Collection - KAPE', description="KAPE collection")
  635. create_safe(db.session, EvidenceTypes, name="Memory acquisition - Physical RAM", description="Physical RAM acquisition")
  636. create_safe(db.session, EvidenceTypes, name="Memory acquisition - VMEM", description="vmem file")
  637. create_safe(db.session, EvidenceTypes, name="Logs - Linux", description="Standard Linux logs")
  638. create_safe(db.session, EvidenceTypes, name="Logs - Windows EVTX", description="Standard Windows EVTX logs")
  639. create_safe(db.session, EvidenceTypes, name="Logs - Windows EVT", description="Standard Windows EVT logs")
  640. create_safe(db.session, EvidenceTypes, name="Logs - MacOS", description="Standard MacOS logs")
  641. create_safe(db.session, EvidenceTypes, name="Logs - Generic", description="Generic logs")
  642. create_safe(db.session, EvidenceTypes, name="Logs - Firewall", description="Firewall logs")
  643. create_safe(db.session, EvidenceTypes, name="Logs - Proxy", description="Proxy logs")
  644. create_safe(db.session, EvidenceTypes, name="Logs - DNS", description="DNS logs")
  645. create_safe(db.session, EvidenceTypes, name="Logs - Email", description="Email logs")
  646. create_safe(db.session, EvidenceTypes, name="Executable - Windows (PE)", description="Generic Windows executable")
  647. create_safe(db.session, EvidenceTypes, name="Executable - Linux (ELF)", description="Generic Linux executable")
  648. create_safe(db.session, EvidenceTypes, name="Executable - MacOS (Mach-O)", description="Generic MacOS executable")
  649. create_safe(db.session, EvidenceTypes, name="Executable - Generic", description="Generic executable")
  650. create_safe(db.session, EvidenceTypes, name="Script - Generic", description="Generic script")
  651. create_safe(db.session, EvidenceTypes, name="Generic - Data blob", description="Generic blob of data")
  652. def create_safe_alert_resolution_status():
  653. """Creates new AlertResolutionStatus objects if they do not already exist.
  654. This function creates new AlertResolutionStatus objects with the specified resolution_status_name
  655. and resolution_status_description if they do not already exist in the database.
  656. """
  657. create_safe(db.session, AlertResolutionStatus, resolution_status_name='False Positive',
  658. resolution_status_description="The alert was a false positive")
  659. create_safe(db.session, AlertResolutionStatus, resolution_status_name='True Positive With Impact',
  660. resolution_status_description="The alert was a true positive and had an impact")
  661. create_safe(db.session, AlertResolutionStatus, resolution_status_name='True Positive Without Impact',
  662. resolution_status_description="The alert was a true positive but had no impact")
  663. create_safe(db.session, AlertResolutionStatus, resolution_status_name='Not Applicable',
  664. resolution_status_description="The alert is not applicable")
  665. create_safe(db.session, AlertResolutionStatus, resolution_status_name='Unknown',
  666. resolution_status_description="Unknown resolution status")
  667. create_safe(db.session, AlertResolutionStatus, resolution_status_name='Legitimate',
  668. resolution_status_description="The alert is acceptable and expected")
  669. def create_safe_case_states():
  670. """Creates new CaseState objects if they do not already exist.
  671. This function creates new CaseState objects with the specified state name,
  672. state description, and protected status if they do not already exist in the database.
  673. """
  674. # Create new CaseState objects for each state
  675. create_safe(db.session, CaseState, state_name='Unspecified', state_description="Unspecified", protected=True)
  676. create_safe(db.session, CaseState, state_name='In progress', state_description="Case is being investigated")
  677. create_safe(db.session, CaseState, state_name='Open', state_description="Case is open", protected=True)
  678. create_safe(db.session, CaseState, state_name='Containment', state_description="Containment is in progress")
  679. create_safe(db.session, CaseState, state_name='Eradication', state_description="Eradication is in progress")
  680. create_safe(db.session, CaseState, state_name='Recovery', state_description="Recovery is in progress")
  681. create_safe(db.session, CaseState, state_name='Post-Incident', state_description="Post-incident phase")
  682. create_safe(db.session, CaseState, state_name='Reporting', state_description="Reporting is in progress")
  683. create_safe(db.session, CaseState, state_name='Closed', state_description="Case is closed", protected=True)
  684. def create_safe_review_status():
  685. """Creates new ReviewStatus objects if they do not already exist.
  686. This function creates new ReviewStatus objects with the specified status name
  687. if they do not already exist in the database.
  688. """
  689. create_safe(db.session, ReviewStatus, status_name=ReviewStatusList.no_review_required)
  690. create_safe(db.session, ReviewStatus, status_name=ReviewStatusList.not_reviewed)
  691. create_safe(db.session, ReviewStatus, status_name=ReviewStatusList.pending_review)
  692. create_safe(db.session, ReviewStatus, status_name=ReviewStatusList.review_in_progress)
  693. create_safe(db.session, ReviewStatus, status_name=ReviewStatusList.reviewed)
  694. def create_safe_assets():
  695. """Creates new AssetsType objects if they do not already exist.
  696. This function creates new AssetsType objects with the specified asset name,
  697. asset description, and asset icons if they do not already exist in the database.
  698. """
  699. # Create new AssetsType objects for each asset type
  700. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Account",
  701. asset_description="Generic Account", asset_icon_not_compromised="user.png",
  702. asset_icon_compromised="ioc_user.png")
  703. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Firewall", asset_description="Firewall",
  704. asset_icon_not_compromised="firewall.png", asset_icon_compromised="ioc_firewall.png")
  705. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Linux - Server",
  706. asset_description="Linux server", asset_icon_not_compromised="server.png",
  707. asset_icon_compromised="ioc_server.png")
  708. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Linux - Computer",
  709. asset_description="Linux computer", asset_icon_not_compromised="desktop.png",
  710. asset_icon_compromised="ioc_desktop.png")
  711. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Linux Account",
  712. asset_description="Linux Account", asset_icon_not_compromised="user.png",
  713. asset_icon_compromised="ioc_user.png")
  714. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Mac - Computer",
  715. asset_description="Mac computer", asset_icon_not_compromised="desktop.png",
  716. asset_icon_compromised="ioc_desktop.png")
  717. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Phone - Android",
  718. asset_description="Android Phone", asset_icon_not_compromised="phone.png",
  719. asset_icon_compromised="ioc_phone.png")
  720. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Phone - IOS",
  721. asset_description="Apple Phone", asset_icon_not_compromised="phone.png",
  722. asset_icon_compromised="ioc_phone.png")
  723. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows - Computer",
  724. asset_description="Standard Windows Computer",
  725. asset_icon_not_compromised="windows_desktop.png",
  726. asset_icon_compromised="ioc_windows_desktop.png")
  727. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows - Server",
  728. asset_description="Standard Windows Server", asset_icon_not_compromised="windows_server.png",
  729. asset_icon_compromised="ioc_windows_server.png")
  730. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows - DC",
  731. asset_description="Domain Controller", asset_icon_not_compromised="windows_server.png",
  732. asset_icon_compromised="ioc_windows_server.png")
  733. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Router", asset_description="Router",
  734. asset_icon_not_compromised="router.png", asset_icon_compromised="ioc_router.png")
  735. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Switch", asset_description="Switch",
  736. asset_icon_not_compromised="switch.png", asset_icon_compromised="ioc_switch.png")
  737. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="VPN", asset_description="VPN",
  738. asset_icon_not_compromised="vpn.png", asset_icon_compromised="ioc_vpn.png")
  739. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="WAF", asset_description="WAF",
  740. asset_icon_not_compromised="firewall.png", asset_icon_compromised="ioc_firewall.png")
  741. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - Local",
  742. asset_description="Windows Account - Local", asset_icon_not_compromised="user.png",
  743. asset_icon_compromised="ioc_user.png")
  744. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - Local - Admin",
  745. asset_description="Windows Account - Local - Admin", asset_icon_not_compromised="user.png",
  746. asset_icon_compromised="ioc_user.png")
  747. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - AD",
  748. asset_description="Windows Account - AD", asset_icon_not_compromised="user.png",
  749. asset_icon_compromised="ioc_user.png")
  750. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - AD - Admin",
  751. asset_description="Windows Account - AD - Admin", asset_icon_not_compromised="user.png",
  752. asset_icon_compromised="ioc_user.png")
  753. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - AD - krbtgt",
  754. asset_description="Windows Account - AD - krbtgt", asset_icon_not_compromised="user.png",
  755. asset_icon_compromised="ioc_user.png")
  756. get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - AD - Service",
  757. asset_description="Windows Account - AD - krbtgt", asset_icon_not_compromised="user.png",
  758. asset_icon_compromised="ioc_user.png")
  759. def create_safe_client():
  760. """Creates a new Client object if it does not already exist.
  761. This function creates a new Client object with the specified client name
  762. and client description if it does not already exist in the database.
  763. """
  764. # Create a new Client object if it does not already exist
  765. client = get_or_create(db.session, Client,
  766. name="IrisInitialClient")
  767. return client
  768. def create_safe_auth_model():
  769. """Creates new Organisation, Group, and User objects if they do not already exist.
  770. This function creates a new Organisation object with the specified name and description,
  771. and creates new Group objects with the specified name, description, auto-follow status,
  772. auto-follow access level, and permissions if they do not already exist in the database.
  773. It also updates the attributes of the existing Group objects if they have changed.
  774. """
  775. # Create new Organisation object
  776. def_org = get_or_create(db.session, Organisation, org_name="Default Org",
  777. org_description="Default Organisation")
  778. # Create new Administrator Group object
  779. try:
  780. gadm = get_or_create(db.session, Group, group_name='Administrators', group_description='Administrators',
  781. group_auto_follow=True, group_auto_follow_access_level=CaseAccessLevel.full_access.value,
  782. group_permissions=ac_get_mask_full_permissions())
  783. except exc.IntegrityError:
  784. db.session.rollback()
  785. log.warning('Administrator group integrity error. Group permissions were probably changed. Updating.')
  786. gadm = Group.query.filter(
  787. Group.group_name == 'Administrators'
  788. ).first()
  789. # Update Administrator Group object attributes
  790. if gadm.group_permissions != ac_get_mask_full_permissions():
  791. gadm.group_permissions = ac_get_mask_full_permissions()
  792. if gadm.group_auto_follow_access_level != CaseAccessLevel.full_access.value:
  793. gadm.group_auto_follow_access_level = CaseAccessLevel.full_access.value
  794. if gadm.group_auto_follow is not True:
  795. gadm.group_auto_follow = True
  796. db.session.commit()
  797. # Create new Analysts Group object
  798. try:
  799. ganalysts = get_or_create(db.session, Group, group_name='Analysts', group_description='Standard Analysts',
  800. group_auto_follow=False,
  801. group_auto_follow_access_level=CaseAccessLevel.full_access.value,
  802. group_permissions=ac_get_mask_analyst())
  803. except exc.IntegrityError:
  804. db.session.rollback()
  805. log.warning('Analysts group integrity error. Group permissions were probably changed. Updating.')
  806. ganalysts = get_group_by_name('Analysts')
  807. # Update Analysts Group object attributes
  808. if ganalysts.group_permissions != ac_get_mask_analyst():
  809. ganalysts.group_permissions = ac_get_mask_analyst()
  810. if ganalysts.group_auto_follow is not False:
  811. ganalysts.group_auto_follow = False
  812. if ganalysts.group_auto_follow_access_level != CaseAccessLevel.full_access.value:
  813. ganalysts.group_auto_follow_access_level = CaseAccessLevel.full_access.value
  814. db.session.commit()
  815. return def_org, gadm, ganalysts
  816. def create_safe_admin(def_org, gadm):
  817. """Creates a new admin user if one does not already exist.
  818. This function creates a new admin user with the specified username, email, and password
  819. if one does not already exist in the database. If an admin user already exists, it updates
  820. the email address of the existing user if it has changed.
  821. """
  822. # Get admin username and email from app config
  823. admin_username = app.config.get('IRIS_ADM_USERNAME')
  824. if admin_username is None:
  825. admin_username = 'administrator'
  826. admin_email = app.config.get('IRIS_ADM_EMAIL')
  827. if admin_email is None:
  828. admin_email = 'administrator@localhost'
  829. # Check if admin user already exists
  830. user = User.query.filter(or_(
  831. User.user == admin_username,
  832. User.email == admin_email
  833. )).first()
  834. password = None
  835. if not user:
  836. # Generate a new password if one was not provided in the app config
  837. password = app.config.get('IRIS_ADM_PASSWORD')
  838. if password is None:
  839. password = ''.join(random.choices(string.printable[:-6], k=16))
  840. log.info(f'Creating first admin user with username "{admin_username}"')
  841. # Create new User object for admin user
  842. user = User(
  843. user=admin_username,
  844. name=admin_username,
  845. email=admin_email,
  846. password=bc.generate_password_hash(password.encode('utf8')).decode('utf8'),
  847. active=True
  848. )
  849. # Generate a new API key if one was not provided in the app config
  850. api_key = app.config.get('IRIS_ADM_API_KEY')
  851. if api_key is None:
  852. api_key = secrets.token_urlsafe(nbytes=64)
  853. user.api_key = api_key
  854. db.session.add(user)
  855. db.session.commit()
  856. # Add admin user to admin group and default organisation
  857. add_user_to_group(user_id=user.id, group_id=gadm.group_id)
  858. add_user_to_organisation(user_id=user.id, org_id=def_org.org_id)
  859. log.warning(f">>> Administrator password: {password}")
  860. db.session.commit()
  861. else:
  862. if not os.environ.get('IRIS_ADM_PASSWORD'):
  863. # Prevent leak of user set password in logs
  864. log.warning(">>> Administrator already exists")
  865. if user.email != admin_email:
  866. # Update email address of existing admin user if it has changed
  867. log.warning(f'Email of administrator will be updated via config to {admin_email}')
  868. user.email = admin_email
  869. db.session.commit()
  870. return user, password
  871. def create_safe_case(user, client, groups):
  872. """Creates a new case if one does not already exist for the specified client.
  873. This function creates a new case with the specified name, description, SOC ID, user, and client
  874. if one does not already exist in the database for the specified client. It also adds the specified
  875. user and groups to the case with full access level.
  876. """
  877. # Check if a case already exists for the client
  878. case = Cases.query.filter(
  879. Cases.client_id == client.client_id
  880. ).first()
  881. if not case:
  882. # Create a new case for the client
  883. case = Cases(
  884. name="Initial Demo",
  885. description="This is a demonstration.",
  886. soc_id="soc_id_demo",
  887. user=user,
  888. client_id=client.client_id
  889. )
  890. # Validate the case and save it to the database
  891. case.validate_on_build()
  892. case.save()
  893. db.session.commit()
  894. # Add the specified user and groups to the case with full access level
  895. for group in groups:
  896. add_case_access_to_group(group=group,
  897. cases_list=[case.case_id],
  898. access_level=CaseAccessLevel.full_access.value)
  899. ac_add_user_effective_access(users_list=[user.id],
  900. case_id=1,
  901. access_level=CaseAccessLevel.full_access.value)
  902. return case
  903. def create_safe_report_types():
  904. """Creates new ReportType objects if they do not already exist.
  905. This function creates new ReportType objects with the specified names if they do not already
  906. exist in the database.
  907. """
  908. create_safe(db.session, ReportType, name="Investigation")
  909. create_safe(db.session, ReportType, name="Activities")
  910. def create_safe_attributes():
  911. """Creates new Attribute objects if they do not already exist.
  912. This function creates new Attribute objects with the specified display name, description,
  913. object type, and content if they do not already exist in the database.
  914. """
  915. create_safe_attr(db.session, attribute_display_name='IOC',
  916. attribute_description='Defines default attributes for IOCs', attribute_for='ioc',
  917. attribute_content={})
  918. create_safe_attr(db.session, attribute_display_name='Events',
  919. attribute_description='Defines default attributes for Events', attribute_for='event',
  920. attribute_content={})
  921. create_safe_attr(db.session, attribute_display_name='Assets',
  922. attribute_description='Defines default attributes for Assets', attribute_for='asset',
  923. attribute_content={})
  924. create_safe_attr(db.session, attribute_display_name='Tasks',
  925. attribute_description='Defines default attributes for Tasks', attribute_for='task',
  926. attribute_content={})
  927. create_safe_attr(db.session, attribute_display_name='Notes',
  928. attribute_description='Defines default attributes for Notes', attribute_for='note',
  929. attribute_content={})
  930. create_safe_attr(db.session, attribute_display_name='Evidences',
  931. attribute_description='Defines default attributes for Evidences', attribute_for='evidence',
  932. attribute_content={})
  933. create_safe_attr(db.session, attribute_display_name='Cases',
  934. attribute_description='Defines default attributes for Cases', attribute_for='case',
  935. attribute_content={})
  936. create_safe_attr(db.session, attribute_display_name='Customers',
  937. attribute_description='Defines default attributes for Customers', attribute_for='client',
  938. attribute_content={})
  939. def create_safe_ioctypes():
  940. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="AS",
  941. type_description="Autonomous system", type_taxonomy="")
  942. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="aba-rtn",
  943. type_description="ABA routing transit number",
  944. type_taxonomy="")
  945. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="account",
  946. type_description="Account of any type",
  947. type_taxonomy="")
  948. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="anonymised",
  949. type_description="Anonymised value - described with the anonymisation object via a relationship",
  950. type_taxonomy="")
  951. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="attachment",
  952. type_description="Attachment with external information",
  953. type_taxonomy="")
  954. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="authentihash",
  955. type_description="Authenticode executable signature hash", type_taxonomy="",
  956. type_validation_regex=r"[a-f0-9]{64}", type_validation_expect="64 hexadecimal characters"
  957. )
  958. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="boolean",
  959. type_description="Boolean value - to be used in objects",
  960. type_taxonomy="")
  961. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="btc",
  962. type_description="Bitcoin Address", type_taxonomy="")
  963. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="campaign-id",
  964. type_description="Associated campaign ID",
  965. type_taxonomy="")
  966. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="campaign-name",
  967. type_description="Associated campaign name",
  968. type_taxonomy="")
  969. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="cdhash",
  970. type_description="An Apple Code Directory Hash, identifying a code-signed Mach-O executable file",
  971. type_taxonomy="")
  972. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="chrome-extension-id",
  973. type_description="Chrome extension id",
  974. type_taxonomy="")
  975. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="community-id",
  976. type_description="a community ID flow hashing algorithm to map multiple traffic monitors into common flow id",
  977. type_taxonomy="")
  978. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="cookie",
  979. type_description="HTTP cookie as often stored on the user web client. This can include authentication cookie or session cookie.",
  980. type_taxonomy="")
  981. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="dash",
  982. type_description="Dash Address", type_taxonomy="")
  983. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="datetime",
  984. type_description="Datetime in the ISO 8601 format",
  985. type_taxonomy="")
  986. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="dkim",
  987. type_description="DKIM public key", type_taxonomy="")
  988. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="dkim-signature",
  989. type_description="DKIM signature", type_taxonomy="")
  990. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="dns-soa-email",
  991. type_description="RFC1035 mandates that DNS zones should have a SOA (Statement Of Authority) record that contains an email address where a PoC for the domain could be contacted. This can sometimes be used for attribution/linkage between different domains even if protected by whois privacy",
  992. type_taxonomy="")
  993. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="domain",
  994. type_description="A domain name used in the malware",
  995. type_taxonomy="")
  996. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="domain|ip",
  997. type_description="A domain name and its IP address (as found in DNS lookup) separated by a |",
  998. type_taxonomy="")
  999. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email",
  1000. type_description="An e-mail address", type_taxonomy="")
  1001. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-attachment",
  1002. type_description="File name of the email attachment.", type_taxonomy="")
  1003. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-body",
  1004. type_description="Email body", type_taxonomy="")
  1005. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-dst",
  1006. type_description="The destination email address. Used to describe the recipient when describing an e-mail.",
  1007. type_taxonomy="")
  1008. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-dst-display-name",
  1009. type_description="Email destination display name", type_taxonomy="")
  1010. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-header",
  1011. type_description="Email header", type_taxonomy="")
  1012. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-message-id",
  1013. type_description="The email message ID",
  1014. type_taxonomy="")
  1015. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-mime-boundary",
  1016. type_description="The email mime boundary separating parts in a multipart email",
  1017. type_taxonomy="")
  1018. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-reply-to",
  1019. type_description="Email reply to header",
  1020. type_taxonomy="")
  1021. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-src",
  1022. type_description="The source email address. Used to describe the sender when describing an e-mail.",
  1023. type_taxonomy="")
  1024. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-src-display-name",
  1025. type_description="Email source display name",
  1026. type_taxonomy="")
  1027. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-subject",
  1028. type_description="The subject of the email",
  1029. type_taxonomy="")
  1030. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-thread-index",
  1031. type_description="The email thread index header",
  1032. type_taxonomy="")
  1033. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-x-mailer",
  1034. type_description="Email x-mailer header",
  1035. type_taxonomy="")
  1036. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="favicon-mmh3",
  1037. type_description="favicon-mmh3 is the murmur3 hash of a favicon as used in Shodan.",
  1038. type_taxonomy="")
  1039. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename",
  1040. type_description="Filename", type_taxonomy="")
  1041. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename-pattern",
  1042. type_description="A pattern in the name of a file",
  1043. type_taxonomy="")
  1044. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|authentihash",
  1045. type_description="A checksum in md5 format",
  1046. type_taxonomy="",
  1047. type_validation_regex=r'.+\|[a-f0-9]{64}',
  1048. type_validation_expect="filename|64 hexadecimal characters")
  1049. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|impfuzzy",
  1050. type_description="Import fuzzy hash - a fuzzy hash created based on the imports in the sample.",
  1051. type_taxonomy="", )
  1052. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|imphash",
  1053. type_description="Import hash - a hash created based on the imports in the sample.",
  1054. type_taxonomy="",
  1055. type_validation_regex=r'.+\|[a-f0-9]{32}',
  1056. type_validation_expect="filename|32 hexadecimal characters")
  1057. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|md5",
  1058. type_description="A filename and an md5 hash separated by a |", type_taxonomy="",
  1059. type_validation_regex=r'.+\|[a-f0-9]{32}',
  1060. type_validation_expect="filename|32 hexadecimal characters")
  1061. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|pehash",
  1062. type_description="A filename and a PEhash separated by a |", type_taxonomy="",
  1063. type_validation_regex=r'.+\|[a-f0-9]{40}',
  1064. type_validation_expect="filename|40 hexadecimal characters")
  1065. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha1",
  1066. type_description="A filename and an sha1 hash separated by a |", type_taxonomy="",
  1067. type_validation_regex=r'.+\|[a-f0-9]{40}',
  1068. type_validation_expect="filename|40 hexadecimal characters")
  1069. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha224",
  1070. type_description="A filename and a sha-224 hash separated by a |", type_taxonomy="",
  1071. type_validation_regex=r'.+\|[a-f0-9]{56}',
  1072. type_validation_expect="filename|56 hexadecimal characters")
  1073. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha256",
  1074. type_description="A filename and an sha256 hash separated by a |", type_taxonomy="",
  1075. type_validation_regex=r'.+\|[a-f0-9]{64}',
  1076. type_validation_expect="filename|64 hexadecimal characters")
  1077. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha3-224",
  1078. type_description="A filename and an sha3-224 hash separated by a |", type_taxonomy="",
  1079. type_validation_regex=r'.+\|[a-f0-9]{56}',
  1080. type_validation_expect="filename|56 hexadecimal characters")
  1081. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha3-256",
  1082. type_description="A filename and an sha3-256 hash separated by a |", type_taxonomy="",
  1083. type_validation_regex=r'.+\|[a-f0-9]{64}',
  1084. type_validation_expect="filename|64 hexadecimal characters")
  1085. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha3-384",
  1086. type_description="A filename and an sha3-384 hash separated by a |", type_taxonomy="",
  1087. type_validation_regex=r'.+\|[a-f0-9]{96}',
  1088. type_validation_expect="filename|96 hexadecimal characters")
  1089. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha3-512",
  1090. type_description="A filename and an sha3-512 hash separated by a |", type_taxonomy="",
  1091. type_validation_regex=r'.+\|[a-f0-9]{128}',
  1092. type_validation_expect="filename|128 hexadecimal characters")
  1093. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha384",
  1094. type_description="A filename and a sha-384 hash separated by a |", type_taxonomy="",
  1095. type_validation_regex=r'.+\|[a-f0-9]{96}',
  1096. type_validation_expect="filename|96 hexadecimal characters")
  1097. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha512",
  1098. type_description="A filename and a sha-512 hash separated by a |", type_taxonomy="",
  1099. type_validation_regex=r'.+\|[a-f0-9]{128}',
  1100. type_validation_expect="filename|128 hexadecimal characters")
  1101. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha512/224",
  1102. type_description="A filename and a sha-512/224 hash separated by a |", type_taxonomy="",
  1103. type_validation_regex=r'.+\|[a-f0-9]{56}',
  1104. type_validation_expect="filename|56 hexadecimal characters")
  1105. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha512/256",
  1106. type_description="A filename and a sha-512/256 hash separated by a |", type_taxonomy="",
  1107. type_validation_regex=r'.+\|[a-f0-9]{64}',
  1108. type_validation_expect="filename|64 hexadecimal characters")
  1109. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|ssdeep",
  1110. type_description="A checksum in ssdeep format",
  1111. type_taxonomy="")
  1112. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|tlsh",
  1113. type_description="A filename and a Trend Micro Locality Sensitive Hash separated by a |",
  1114. type_taxonomy="",
  1115. type_validation_regex=r'.+\|t?[a-f0-9]{35,}',
  1116. type_validation_expect="filename|at least 35 hexadecimal characters, optionally starting with t1 instead of hexadecimal characters"
  1117. )
  1118. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|vhash",
  1119. type_description="A filename and a VirusTotal hash separated by a |", type_taxonomy="")
  1120. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="first-name",
  1121. type_description="First name of a natural person",
  1122. type_taxonomy="")
  1123. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="float",
  1124. type_description="A floating point value.", type_taxonomy="")
  1125. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="full-name",
  1126. type_description="Full name of a natural person",
  1127. type_taxonomy="")
  1128. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="gene",
  1129. type_description="GENE - Go Evtx sigNature Engine",
  1130. type_taxonomy="")
  1131. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="git-commit-id",
  1132. type_description="A git commit ID.", type_taxonomy="",
  1133. type_validation_regex=r"[a-f0-9]{40}", type_validation_expect="40 hexadecimal characters")
  1134. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="github-organisation",
  1135. type_description="A github organisation",
  1136. type_taxonomy="")
  1137. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="github-repository",
  1138. type_description="A github repository",
  1139. type_taxonomy="")
  1140. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="github-username",
  1141. type_description="A github user name",
  1142. type_taxonomy="")
  1143. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="hassh-md5",
  1144. type_description="hassh is a network fingerprinting standard which can be used to identify specific Client SSH implementations. The fingerprints can be easily stored, searched and shared in the form of an MD5 fingerprint.",
  1145. type_taxonomy="",
  1146. type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
  1147. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="hasshserver-md5",
  1148. type_description="hasshServer is a network fingerprinting standard which can be used to identify specific Server SSH implementations. The fingerprints can be easily stored, searched and shared in the form of an MD5 fingerprint.",
  1149. type_taxonomy="",
  1150. type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
  1151. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="hex",
  1152. type_description="A value in hexadecimal format",
  1153. type_taxonomy="")
  1154. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="hostname",
  1155. type_description="A full host/dnsname of an attacker",
  1156. type_taxonomy="")
  1157. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="hostname|port",
  1158. type_description="Hostname and port number separated by a |", type_taxonomy="")
  1159. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="http-method",
  1160. type_description="HTTP method used by the malware (e.g. POST, GET, …).", type_taxonomy="")
  1161. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="iban",
  1162. type_description="International Bank Account Number",
  1163. type_taxonomy="")
  1164. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="identity-card-number",
  1165. type_description="Identity card number",
  1166. type_taxonomy="")
  1167. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="impfuzzy",
  1168. type_description="A fuzzy hash of import table of Portable Executable format", type_taxonomy="")
  1169. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="imphash",
  1170. type_description="Import hash - a hash created based on the imports in the sample.",
  1171. type_taxonomy="",
  1172. type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
  1173. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ip-any",
  1174. type_description="A source or destination IP address of the attacker or C&C server",
  1175. type_taxonomy="")
  1176. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ip-dst",
  1177. type_description="A destination IP address of the attacker or C&C server", type_taxonomy="")
  1178. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ip-dst|port",
  1179. type_description="IP destination and port number separated by a |", type_taxonomy="")
  1180. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ip-src",
  1181. type_description="A source IP address of the attacker",
  1182. type_taxonomy="")
  1183. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ip-src|port",
  1184. type_description="IP source and port number separated by a |", type_taxonomy="")
  1185. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ja3-fingerprint-md5",
  1186. type_description="JA3 is a method for creating SSL/TLS client fingerprints that should be easy to produce on any platform and can be easily shared for threat intelligence.",
  1187. type_taxonomy="",
  1188. type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
  1189. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="jabber-id",
  1190. type_description="Jabber ID", type_taxonomy="")
  1191. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="jarm-fingerprint",
  1192. type_description="JARM is a method for creating SSL/TLS server fingerprints.", type_taxonomy="",
  1193. type_validation_regex=r"[a-f0-9]{62}", type_validation_expect="62 hexadecimal characters")
  1194. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="kusto-query",
  1195. type_description="Kusto query - Kusto from Microsoft Azure is a service for storing and running interactive analytics over Big Data.",
  1196. type_taxonomy="")
  1197. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="link",
  1198. type_description="Link to an external information",
  1199. type_taxonomy="")
  1200. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="mac-address",
  1201. type_description="Mac address", type_taxonomy="")
  1202. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="mac-eui-64",
  1203. type_description="Mac EUI-64 address", type_taxonomy="")
  1204. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="malware-sample",
  1205. type_description="Attachment containing encrypted malware sample", type_taxonomy="")
  1206. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="malware-type",
  1207. type_description="Malware type", type_taxonomy="")
  1208. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="md5",
  1209. type_description="A checksum in md5 format", type_taxonomy="",
  1210. type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
  1211. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="middle-name",
  1212. type_description="Middle name of a natural person",
  1213. type_taxonomy="")
  1214. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="mime-type",
  1215. type_description="A media type (also MIME type and content type) is a two-part identifier for file formats and format contents transmitted on the Internet",
  1216. type_taxonomy="")
  1217. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="mobile-application-id",
  1218. type_description="The application id of a mobile application", type_taxonomy="")
  1219. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="mutex",
  1220. type_description="Mutex, use the format \\BaseNamedObjects<Mutex>", type_taxonomy="")
  1221. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="named pipe",
  1222. type_description="Named pipe, use the format .\\pipe<PipeName>", type_taxonomy="")
  1223. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="other",
  1224. type_description="Other attribute", type_taxonomy="")
  1225. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="file-path",
  1226. type_description="Path of file", type_taxonomy="")
  1227. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pattern-in-file",
  1228. type_description="Pattern in file that identifies the malware", type_taxonomy="")
  1229. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pattern-in-memory",
  1230. type_description="Pattern in memory dump that identifies the malware", type_taxonomy="")
  1231. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pattern-in-traffic",
  1232. type_description="Pattern in network traffic that identifies the malware", type_taxonomy="")
  1233. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pdb",
  1234. type_description="Microsoft Program database (PDB) path information", type_taxonomy="")
  1235. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pehash",
  1236. type_description="PEhash - a hash calculated based of certain pieces of a PE executable file",
  1237. type_taxonomy="",
  1238. type_validation_regex=r"[a-f0-9]{40}", type_validation_expect="40 hexadecimal characters")
  1239. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pgp-private-key",
  1240. type_description="A PGP private key",
  1241. type_taxonomy="")
  1242. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pgp-public-key",
  1243. type_description="A PGP public key", type_taxonomy="")
  1244. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="phone-number",
  1245. type_description="Telephone Number", type_taxonomy="")
  1246. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="port",
  1247. type_description="Port number", type_taxonomy="")
  1248. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="process-state",
  1249. type_description="State of a process", type_taxonomy="")
  1250. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="prtn",
  1251. type_description="Premium-Rate Telephone Number",
  1252. type_taxonomy="")
  1253. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="regkey",
  1254. type_description="Registry key or value", type_taxonomy="")
  1255. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="regkey|value",
  1256. type_description="Registry value + data separated by |",
  1257. type_taxonomy="")
  1258. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha1",
  1259. type_description="A checksum in sha1 format", type_taxonomy="",
  1260. type_validation_regex=r"[a-f0-9]{40}", type_validation_expect="40 hexadecimal characters")
  1261. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha224",
  1262. type_description="A checksum in sha-224 format",
  1263. type_taxonomy="",
  1264. type_validation_regex=r"[a-f0-9]{56}", type_validation_expect="56 hexadecimal characters")
  1265. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha256",
  1266. type_description="A checksum in sha256 format",
  1267. type_taxonomy="",
  1268. type_validation_regex=r"[a-f0-9]{64}", type_validation_expect="64 hexadecimal characters")
  1269. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha3-224",
  1270. type_description="A checksum in sha3-224 format",
  1271. type_taxonomy="",
  1272. type_validation_regex=r"[a-f0-9]{56}", type_validation_expect="56 hexadecimal characters")
  1273. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha3-256",
  1274. type_description="A checksum in sha3-256 format",
  1275. type_taxonomy="",
  1276. type_validation_regex=r"[a-f0-9]{64}", type_validation_expect="64 hexadecimal characters")
  1277. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha3-384",
  1278. type_description="A checksum in sha3-384 format",
  1279. type_taxonomy="",
  1280. type_validation_regex=r"[a-f0-9]{96}", type_validation_expect="96 hexadecimal characters")
  1281. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha3-512",
  1282. type_description="A checksum in sha3-512 format",
  1283. type_taxonomy="",
  1284. type_validation_regex=r"[a-f0-9]{128}", type_validation_expect="128 hexadecimal characters")
  1285. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha384",
  1286. type_description="A checksum in sha-384 format",
  1287. type_taxonomy="",
  1288. type_validation_regex=r"[a-f0-9]{96}", type_validation_expect="96 hexadecimal characters")
  1289. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha512",
  1290. type_description="A checksum in sha-512 format",
  1291. type_taxonomy="",
  1292. type_validation_regex=r"[a-f0-9]{128}", type_validation_expect="128 hexadecimal characters")
  1293. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha512/224",
  1294. type_description="A checksum in the sha-512/224 format",
  1295. type_taxonomy="",
  1296. type_validation_regex=r"[a-f0-9]{56}", type_validation_expect="56 hexadecimal characters")
  1297. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha512/256",
  1298. type_description="A checksum in the sha-512/256 format",
  1299. type_taxonomy="",
  1300. type_validation_regex=r"[a-f0-9]{64}", type_validation_expect="64 hexadecimal characters")
  1301. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sigma",
  1302. type_description="Sigma - Generic Signature Format for SIEM Systems", type_taxonomy="")
  1303. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="size-in-bytes",
  1304. type_description="Size expressed in bytes",
  1305. type_taxonomy="")
  1306. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="snort",
  1307. type_description="An IDS rule in Snort rule-format",
  1308. type_taxonomy="")
  1309. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ssdeep",
  1310. type_description="A checksum in ssdeep format",
  1311. type_taxonomy="")
  1312. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ssh-fingerprint",
  1313. type_description="A fingerprint of SSH key material",
  1314. type_taxonomy="")
  1315. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="stix2-pattern",
  1316. type_description="STIX 2 pattern", type_taxonomy="")
  1317. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-email",
  1318. type_description="Attack Targets Email(s)",
  1319. type_taxonomy="")
  1320. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-external",
  1321. type_description="External Target Organizations Affected by this Attack", type_taxonomy="")
  1322. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-location",
  1323. type_description="Attack Targets Physical Location(s)", type_taxonomy="")
  1324. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-machine",
  1325. type_description="Attack Targets Machine Name(s)",
  1326. type_taxonomy="")
  1327. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-org",
  1328. type_description="Attack Targets Department or Organization(s)", type_taxonomy="")
  1329. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-user",
  1330. type_description="Attack Targets Username(s)",
  1331. type_taxonomy="")
  1332. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="telfhash",
  1333. type_description="telfhash is symbol hash for ELF files, just like imphash is imports hash for PE files.",
  1334. type_taxonomy="",
  1335. type_validation_regex=r"[a-f0-9]{70}", type_validation_expect="70 hexadecimal characters")
  1336. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="text",
  1337. type_description="Name, ID or a reference", type_taxonomy="")
  1338. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="threat-actor",
  1339. type_description="A string identifying the threat actor",
  1340. type_taxonomy="")
  1341. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="tlsh",
  1342. type_description="A checksum in the Trend Micro Locality Sensitive Hash format",
  1343. type_taxonomy="",
  1344. type_validation_regex=r"^t?[a-f0-9]{35,}",
  1345. type_validation_expect="at least 35 hexadecimal characters, optionally starting with t1 instead of hexadecimal characters")
  1346. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="travel-details",
  1347. type_description="Travel details", type_taxonomy="")
  1348. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="twitter-id",
  1349. type_description="Twitter ID", type_taxonomy="")
  1350. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="uri",
  1351. type_description="Uniform Resource Identifier", type_taxonomy="")
  1352. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="url", type_description="url",
  1353. type_taxonomy="")
  1354. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="user-agent",
  1355. type_description="The user-agent used by the malware in the HTTP request.", type_taxonomy="")
  1356. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="vhash",
  1357. type_description="A VirusTotal checksum", type_taxonomy="")
  1358. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="vulnerability",
  1359. type_description="A reference to the vulnerability used in the exploit", type_taxonomy="")
  1360. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="weakness",
  1361. type_description="A reference to the weakness used in the exploit", type_taxonomy="")
  1362. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-creation-date",
  1363. type_description="The date of domain’s creation, obtained from the WHOIS information.",
  1364. type_taxonomy="")
  1365. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-registrant-email",
  1366. type_description="The e-mail of a domain’s registrant, obtained from the WHOIS information.",
  1367. type_taxonomy="")
  1368. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-registrant-name",
  1369. type_description="The name of a domain’s registrant, obtained from the WHOIS information.",
  1370. type_taxonomy="")
  1371. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-registrant-org",
  1372. type_description="The org of a domain’s registrant, obtained from the WHOIS information.",
  1373. type_taxonomy="")
  1374. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-registrant-phone",
  1375. type_description="The phone number of a domain’s registrant, obtained from the WHOIS information.",
  1376. type_taxonomy="")
  1377. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-registrar",
  1378. type_description="The registrar of the domain, obtained from the WHOIS information.",
  1379. type_taxonomy="")
  1380. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="windows-scheduled-task",
  1381. type_description="A scheduled task in windows",
  1382. type_taxonomy="")
  1383. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="windows-service-displayname",
  1384. type_description="A windows service’s displayname, not to be confused with the windows-service-name. This is the name that applications will generally display as the service’s name in applications.",
  1385. type_taxonomy="")
  1386. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="windows-service-name",
  1387. type_description="A windows service name. This is the name used internally by windows. Not to be confused with the windows-service-displayname.",
  1388. type_taxonomy="")
  1389. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="x509-fingerprint-md5",
  1390. type_description="X509 fingerprint in MD5 format", type_taxonomy="",
  1391. type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
  1392. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="x509-fingerprint-sha1",
  1393. type_description="X509 fingerprint in SHA-1 format", type_taxonomy="",
  1394. type_validation_regex=r"[a-f0-9]{40}", type_validation_expect="40 hexadecimal characters")
  1395. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="x509-fingerprint-sha256",
  1396. type_description="X509 fingerprint in SHA-256 format", type_taxonomy="",
  1397. type_validation_regex=r"[a-f0-9]{64}", type_validation_expect="64 hexadecimal characters")
  1398. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="xmr",
  1399. type_description="Monero Address", type_taxonomy="")
  1400. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="yara",
  1401. type_description="Yara signature", type_taxonomy="")
  1402. create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="zeek",
  1403. type_description="An NIDS rule in the Zeek rule-format",
  1404. type_taxonomy="")
  1405. def create_safe_os_types():
  1406. create_safe(db.session, OsType, type_name="Windows")
  1407. create_safe(db.session, OsType, type_name="Linux")
  1408. create_safe(db.session, OsType, type_name="AIX")
  1409. create_safe(db.session, OsType, type_name="MacOS")
  1410. create_safe(db.session, OsType, type_name="Apple iOS")
  1411. create_safe(db.session, OsType, type_name="Cisco iOS")
  1412. create_safe(db.session, OsType, type_name="Android")
  1413. def create_safe_tlp():
  1414. create_safe(db.session, Tlp, tlp_name="red", tlp_bscolor="danger")
  1415. create_safe(db.session, Tlp, tlp_name="amber", tlp_bscolor="warning")
  1416. create_safe(db.session, Tlp, tlp_name="green", tlp_bscolor="success")
  1417. create_safe(db.session, Tlp, tlp_name="clear", tlp_bscolor="black")
  1418. create_safe(db.session, Tlp, tlp_name="amber+strict", tlp_bscolor="warning")
  1419. def create_safe_server_settings():
  1420. if not ServerSettings.query.count():
  1421. create_safe(db.session, ServerSettings,
  1422. http_proxy="", https_proxy="", prevent_post_mod_repush=False,
  1423. prevent_post_objects_repush=False,
  1424. password_policy_min_length="12", password_policy_upper_case=True,
  1425. password_policy_lower_case=True, password_policy_digit=True,
  1426. password_policy_special_chars="", enforce_mfa=app.config.get("MFA_ENABLED", False))
  1427. def register_modules_pipelines():
  1428. modules = IrisModule.query.with_entities(
  1429. IrisModule.module_name,
  1430. IrisModule.module_config
  1431. ).filter(
  1432. IrisModule.has_pipeline == True
  1433. ).all()
  1434. for module in modules:
  1435. module = module[0]
  1436. inst, _ = instantiate_module_from_name(module)
  1437. if not inst:
  1438. continue
  1439. inst.internal_configure(celery_decorator=celery.task,
  1440. evidence_storage=None,
  1441. mod_web_config=module[1])
  1442. status = inst.get_tasks_for_registration()
  1443. if status.is_failure():
  1444. log.warning("Failed getting tasks for module {}".format(module))
  1445. continue
  1446. tasks = status.get_data()
  1447. for task in tasks:
  1448. celery.register_task(task)
  1449. def register_default_modules():
  1450. modules = ['iris_vt_module', 'iris_misp_module', 'iris_check_module',
  1451. 'iris_webhooks_module', 'iris_intelowl_module']
  1452. for module_name in modules:
  1453. class_, _ = instantiate_module_from_name(module_name)
  1454. is_ready, logs = check_module_health(class_)
  1455. if not is_ready:
  1456. log.info("Attempted to initiate {mod}. Got {err}".format(mod=module_name, err=",".join(logs)))
  1457. return False
  1458. module, logs = register_module(module_name)
  1459. if module is None:
  1460. log.info("Attempted to add {mod}. Got {err}".format(mod=module_name, err=logs))
  1461. else:
  1462. iris_module_disable_by_id(module.id)
  1463. log.info('Successfully registered {mod}'.format(mod=module_name))
  1464. def custom_assets_symlinks():
  1465. try:
  1466. source_paths = glob.glob(os.path.join(app.config['ASSET_STORE_PATH'], "*"))
  1467. for store_fullpath in source_paths:
  1468. filename = store_fullpath.split(os.path.sep)[-1]
  1469. show_fullpath = os.path.join(app.config['APP_PATH'], 'app',
  1470. app.config['ASSET_SHOW_PATH'].strip(os.path.sep), filename)
  1471. if not os.path.islink(show_fullpath):
  1472. os.symlink(store_fullpath, show_fullpath)
  1473. log.info(f"Created assets img symlink {store_fullpath} -> {show_fullpath}")
  1474. except Exception as e:
  1475. log.error(f"Error: {e}")
  1476. def create_directories():
  1477. log.info("Attempting to create data directories")
  1478. for d in ['UPLOADED_PATH', 'TEMPLATES_PATH', 'BACKUP_PATH', 'ASSET_STORE_PATH', 'DATASTORE_PATH']:
  1479. try:
  1480. log.info(f'Creating directory {d}')
  1481. os.makedirs(app.config.get(d), exist_ok=True)
  1482. except OSError as e:
  1483. log.error(f"Failed to create directory {app.config.get(d)}: {e}")