Нема описа

configuration.py 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  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 configparser
  19. import logging as log
  20. import os
  21. import ssl
  22. # --------- Configuration ---------
  23. # read the private configuration file
  24. from datetime import timedelta
  25. from enum import Enum
  26. from pathlib import Path
  27. import requests
  28. # --------- Configuration ---------
  29. # read the private configuration file
  30. from azure.core.exceptions import ResourceNotFoundError
  31. from azure.identity import DefaultAzureCredential
  32. from azure.keyvault.secrets import SecretClient
  33. class IrisConfigException(Exception):
  34. pass
  35. class IrisConfig(configparser.ConfigParser):
  36. """ From https://gist.github.com/jeffersfp/586c2570cd2bdb8385693a744aa13122 - @jeffersfp """
  37. def __init__(self):
  38. super(IrisConfig, self).__init__()
  39. # Azure Key Vault
  40. self.key_vault_name = self.load('AZURE', 'KEY_VAULT_NAME')
  41. if self.key_vault_name:
  42. self.az_credential = DefaultAzureCredential()
  43. self.az_client = SecretClient(vault_url=f"https://{self.key_vault_name}.vault.azure.net/",
  44. credential=self.az_credential)
  45. log.getLogger('azure.core.pipeline.policies.http_logging_policy').setLevel(log.WARNING)
  46. def validate_config(self):
  47. required_values = {
  48. 'POSTGRES': {
  49. },
  50. 'IRIS': {
  51. },
  52. 'CELERY': {
  53. },
  54. 'DEVELOPMENT': {
  55. }
  56. }
  57. for section, keys in required_values.items():
  58. if section not in self:
  59. raise IrisConfigException(
  60. 'Missing section %s in the configuration file' % section)
  61. def config_key_vault(self):
  62. """
  63. Load the settings to connect to Azure Key Vault
  64. """
  65. def load(self, section, option, fallback=None):
  66. """
  67. Load variable from different sources. Uses the following order
  68. 1. Azure Key Vault
  69. 2. Environment Variable
  70. 3. Environment Variable deprecated
  71. 3. Configuration File
  72. """
  73. loaders = [self._load_azure_key_vault,
  74. self._load_env, self._load_env_deprecated,
  75. self._load_file, self._load_file_deprecated]
  76. for loader in loaders:
  77. value = loader(section, option)
  78. if value:
  79. return value
  80. return fallback
  81. def _load_azure_key_vault(self, section, option):
  82. if not (hasattr(self, 'key_vault_name') and self.key_vault_name):
  83. return
  84. key = f"{section}-{option}".replace('_', '-')
  85. try:
  86. return self.az_client.get_secret(key).value
  87. except ResourceNotFoundError:
  88. return None
  89. def _load_env(self, section, option):
  90. return os.environ.get(f"{section}_{option}")
  91. def _load_env_deprecated(self, section, option):
  92. # Specify new_value : old_value
  93. mapping = {
  94. 'POSTGRES_ADMIN_USER': 'DB_USER',
  95. 'POSTGRES_ADMIN_PASSWORD': 'DB_PASS',
  96. 'POSTGRES_SERVER': 'DB_HOST',
  97. 'POSTGRES_PORT': 'DB_PORT',
  98. 'IRIS_SECRET_KEY': 'SECRET_KEY',
  99. 'IRIS_SECURITY_PASSWORD_SALT': 'SECURITY_PASSWORD_SALT',
  100. 'IRIS_UPSTREAM_SERVER': 'APP_HOST',
  101. 'IRIS_UPSTREAM_PORT': 'APP_PORT'
  102. }
  103. new_key = f"{section}_{option}"
  104. old_key = mapping.get(new_key)
  105. if not old_key:
  106. return
  107. value = os.environ.get(old_key)
  108. if value:
  109. log.warning(f"Environment variable {old_key} used which is deprecated. Please use {new_key}.")
  110. return value
  111. def _load_file(self, section, option):
  112. return self.get(section, option, fallback=None)
  113. def _load_file_deprecated(self, section, option):
  114. # Specify new_value : old_value
  115. mapping = {
  116. ('POSTGRES', 'USER'): ('POSTGRES', 'PG_ACCOUNT'),
  117. ('POSTGRES', 'PASSWORD'): ('POSTGRES', 'PG_PASSWD'),
  118. ('POSTGRES', 'ADMIN_USER'): ('POSTGRES', 'PGA_ACCOUNT'),
  119. ('POSTGRES', 'ADMIN_PASSWORD'): ('POSTGRES', 'PGA_PASSWD'),
  120. ('POSTGRES', 'SERVER'): ('POSTGRES', 'PG_SERVER'),
  121. ('POSTGRES', 'PORT'): ('POSTGRES', 'PG_PORT')
  122. }
  123. new_key = (section, option)
  124. old_key = mapping.get(new_key)
  125. if not old_key:
  126. return
  127. value = self.get(old_key[0], old_key[1], fallback=None)
  128. if value:
  129. log.warning(
  130. f"Configuration {old_key[0]}.{old_key[1]} found in configuration file. "
  131. f"This is a deprecated configuration. Please use {new_key[0]}.{new_key[1]}")
  132. return value
  133. # --------- Configuration ---------
  134. config = IrisConfig()
  135. # Fetch the values
  136. PG_ACCOUNT_ = config.load('POSTGRES', 'USER')
  137. PG_PASSWD_ = config.load('POSTGRES', 'PASSWORD')
  138. PGA_ACCOUNT_ = config.load('POSTGRES', 'ADMIN_USER')
  139. PGA_PASSWD_ = config.load('POSTGRES', 'ADMIN_PASSWORD')
  140. PG_SERVER_ = config.load('POSTGRES', 'SERVER')
  141. PG_PORT_ = config.load('POSTGRES', 'PORT')
  142. PG_DB_ = config.load('POSTGRES', 'DB', fallback='iris_db')
  143. CELERY_BROKER_ = config.load('CELERY', 'BROKER',
  144. fallback=f"amqp://{config.load('CELERY', 'HOST', fallback='rabbitmq')}")
  145. # Grabs the folder where the script runs.
  146. basedir = os.path.abspath(os.path.dirname(__file__))
  147. # Build of SQLAlchemy connectors. One is admin and the other is only for iris. Admin is needed to create new DB
  148. SQLALCHEMY_BASE_URI = "postgresql+psycopg2://{user}:{passwd}@{server}:{port}/".format(
  149. user=PG_ACCOUNT_,
  150. passwd=PG_PASSWD_,
  151. server=PG_SERVER_,
  152. port=PG_PORT_
  153. )
  154. SQLALCHEMY_BASEA_URI = "postgresql+psycopg2://{user}:{passwd}@{server}:{port}/".format(
  155. user=PGA_ACCOUNT_,
  156. passwd=PGA_PASSWD_,
  157. server=PG_SERVER_,
  158. port=PG_PORT_
  159. )
  160. SQLALCHEMY_BASE_ADMIN_URI = "postgresql+psycopg2://{user}:{passwd}@{server}:{port}/".format(user=PGA_ACCOUNT_,
  161. passwd=PGA_PASSWD_,
  162. server=PG_SERVER_,
  163. port=PG_PORT_)
  164. class AuthenticationType(Enum):
  165. local = 1
  166. oidc_proxy = 2
  167. authentication_type = os.environ.get('IRIS_AUTHENTICATION_TYPE',
  168. config.get('IRIS', 'AUTHENTICATION_TYPE', fallback="local"))
  169. authentication_create_user_if_not_exists = config.load('IRIS', 'AUTHENTICATION_CREATE_USER_IF_NOT_EXIST',
  170. fallback="False")
  171. tls_root_ca = os.environ.get('TLS_ROOT_CA',
  172. config.get('IRIS', 'TLS_ROOT_CA', fallback=None))
  173. authentication_logout_url = None
  174. authentication_account_service_url = None
  175. authentication_token_introspection_url = None
  176. authentication_client_id = None
  177. authentication_client_secret = None
  178. authentication_app_admin_role_name = None
  179. authentication_jwks_url = None
  180. if authentication_type == 'oidc_proxy':
  181. oidc_discovery_url = config.load('OIDC', 'IRIS_DISCOVERY_URL', fallback="")
  182. try:
  183. oidc_discovery_response = requests.get(oidc_discovery_url, verify=tls_root_ca)
  184. if oidc_discovery_response.status_code == 200:
  185. response_json = oidc_discovery_response.json()
  186. authentication_logout_url = response_json.get('end_session_endpoint')
  187. authentication_account_service_url = f"{response_json.get('issuer')}/account"
  188. authentication_token_introspection_url = response_json.get('introspection_endpoint')
  189. authentication_jwks_url = response_json.get('jwks_uri')
  190. else:
  191. raise IrisConfigException("Unsuccessful authN server discovery")
  192. authentication_client_id = config.load('OIDC', 'IRIS_CLIENT_ID', fallback="")
  193. authentication_client_secret = config.load('OIDC', 'IRIS_CLIENT_SECRET', fallback="")
  194. authentication_app_admin_role_name = config.load('OIDC', 'IRIS_ADMIN_ROLE_NAME', fallback="")
  195. except Exception as e:
  196. log.error(f"OIDC ERROR - {e}")
  197. exit(0)
  198. pass
  199. else:
  200. log.info("OIDC configuration properly parsed")
  201. # --------- CELERY ---------
  202. class CeleryConfig:
  203. result_backend = "db+" + SQLALCHEMY_BASE_URI + "iris_tasks" # use database as storage
  204. broker_url = CELERY_BROKER_
  205. result_extended = True
  206. result_serializer = "json"
  207. worker_pool_restarts = True
  208. broker_connection_retry_on_startup =True
  209. # --------- APP ---------
  210. class Config:
  211. # Handled by bumpversion
  212. IRIS_VERSION = "v2.5.0-beta.1" # DO NOT EDIT THIS LINE MANUALLY
  213. if os.environ.get('IRIS_DEMO_VERSION') is not None and os.environ.get('IRIS_DEMO_VERSION') != 'None':
  214. IRIS_VERSION = os.environ.get('IRIS_DEMO_VERSION')
  215. API_MIN_VERSION = "2.0.4"
  216. API_MAX_VERSION = "2.1.0"
  217. MODULES_INTERFACE_MIN_VERSION = '1.1'
  218. MODULES_INTERFACE_MAX_VERSION = '1.2.0'
  219. if os.environ.get('IRIS_WORKER') is None:
  220. CSRF_ENABLED = True
  221. SECRET_KEY = config.load('IRIS', 'SECRET_KEY')
  222. SECURITY_PASSWORD_SALT = config.load('IRIS', 'SECURITY_PASSWORD_SALT')
  223. SECURITY_LOGIN_USER_TEMPLATE = 'login.html'
  224. IRIS_ADM_EMAIL = config.load('IRIS', 'ADM_EMAIL')
  225. IRIS_ADM_PASSWORD = config.load('IRIS', 'ADM_PASSWORD')
  226. IRIS_ADM_USERNAME = config.load('IRIS', 'ADM_USERNAME')
  227. IRIS_ADM_API_KEY = config.load('IRIS', 'ADM_API_KEY')
  228. PERMANENT_SESSION_LIFETIME = timedelta(minutes=int(config.load('IRIS', 'SESSION_TIMEOUT', fallback=1440)))
  229. SESSION_COOKIE_SAMESITE = 'Lax'
  230. SESSION_COOKIE_SECURE = True
  231. MFA_ENABLED = config.load('IRIS', 'MFA_ENABLED', fallback=False) == 'True'
  232. PG_ACCOUNT = PG_ACCOUNT_
  233. PG_PASSWD = PG_PASSWD_
  234. PGA_ACCOUNT = PGA_ACCOUNT_
  235. PGA_PASSWD = PGA_PASSWD_
  236. PG_SERVER = PG_SERVER_
  237. PG_PORT = PG_PORT_
  238. PG_DB = PG_DB_
  239. DB_RETRY_COUNT = config.load('DB', 'RETRY_COUNT', fallback=3)
  240. DB_RETRY_DELAY = config.load('DB', 'RETRY_DELAY', fallback=0.5)
  241. DEMO_MODE_ENABLED = config.load('IRIS_DEMO', 'ENABLED', fallback=False)
  242. if DEMO_MODE_ENABLED == 'True':
  243. DEMO_DOMAIN = config.load('IRIS_DEMO', 'DOMAIN', fallback=None)
  244. DEMO_USERS_SEED = config.load('IRIS_DEMO', 'USERS_SEED', fallback=0)
  245. DEMO_ADM_SEED = config.load('IRIS_DEMO', 'ADM_SEED', fallback=0)
  246. MAX_CONTENT_LENGTH = 200000
  247. WTF_CSRF_TIME_LIMIT = None
  248. """ SqlAlchemy configuration
  249. """
  250. SQLALCHEMY_TRACK_MODIFICATIONS = False
  251. SQLALCHEMY_DATABASE_URI = SQLALCHEMY_BASE_URI + PG_DB_
  252. SQLALCHEMY_BINDS = {
  253. 'iris_tasks': SQLALCHEMY_BASE_URI + 'iris_tasks'
  254. }
  255. SQALCHEMY_PIGGER_URI = SQLALCHEMY_BASE_URI
  256. """ Dropzone configuration
  257. Set download path, max file upload size and timeout
  258. """
  259. APP_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  260. UPLOADED_PATH = config.load('IRIS', 'UPLOADED_PATH', fallback="/home/iris/downloads")
  261. TEMPLATES_PATH = config.load('IRIS', 'TEMPLATES_PATH', fallback="/home/iris/user_templates")
  262. BACKUP_PATH = config.load('IRIS', 'BACKUP_PATH', fallback="/home/iris/server_data/backup")
  263. UPDATES_PATH = os.path.join(BACKUP_PATH, 'updates')
  264. RELEASE_URL = config.load('IRIS', 'RELEASE_URL',
  265. fallback="https://api.github.com/repos/dfir-iris/iris-web/releases")
  266. RELEASE_SIGNATURE_KEY = config.load('IRIS', 'RELEASE_SIGNATURE_KEY', fallback="dependencies/DFIR-IRIS_pkey.asc")
  267. PG_CLIENT_PATH = config.load('IRIS', 'PG_CLIENT_PATH', fallback="/usr/bin")
  268. ASSET_STORE_PATH = config.load('IRIS', 'ASSET_STORE_PATH', fallback="/home/iris/server_data/custom_assets")
  269. DATASTORE_PATH = config.load('IRIS', 'DATASTORE_PATH', fallback="/home/iris/server_data/datastore")
  270. ASSET_SHOW_PATH = "/static/assets/img/graph"
  271. ORGANISATION_NAME = config.load('IRIS', 'ORGANISATION_NAME', fallback='')
  272. LOGIN_BANNER_TEXT = config.load('IRIS', 'LOGIN_BANNER_TEXT', fallback='')
  273. LOGIN_PTFM_CONTACT = config.load('IRIS', 'LOGIN_PTFM_CONTACT', fallback='Please contact the platform administrator')
  274. UPDATE_DIR_NAME = '_updates_'
  275. DROPZONE_MAX_FILE_SIZE = 1024 * 1024 * 1024 * 10 # 10 GB
  276. DROPZONE_TIMEOUT = 15 * 60 * 10000 # 15 Minutes of uploads per file
  277. """ Celery configuration
  278. Configure URL and backend
  279. """
  280. CELERY = CeleryConfig
  281. if os.getenv('IRIS_DEV'):
  282. DEVELOPMENT = True
  283. else:
  284. DEVELOPMENT = config.load('DEVELOPMENT', 'IS_DEV_INSTANCE') == "True"
  285. """
  286. Authentication configuration
  287. """
  288. TLS_ROOT_CA = tls_root_ca
  289. AUTHENTICATION_TYPE = authentication_type
  290. AUTHENTICATION_CREATE_USER_IF_NOT_EXIST = (authentication_create_user_if_not_exists == "True")
  291. IRIS_NEW_USERS_DEFAULT_GROUP = config.load('IRIS', 'NEW_USERS_DEFAULT_GROUP', fallback='Analysts')
  292. AUTHENTICATION_LOCAL_FALLBACK = config.load('IRIS', 'AUTHENTICATION_LOCAL_FALLBACK', fallback="True") == "True"
  293. if authentication_type == 'oidc_proxy':
  294. AUTHENTICATION_LOGOUT_URL = authentication_logout_url
  295. AUTHENTICATION_ACCOUNT_SERVICE_URL = authentication_account_service_url
  296. AUTHENTICATION_PROXY_LOGOUT_URL = f"/oauth2/sign_out?rd={AUTHENTICATION_LOGOUT_URL}?redirect_uri=/dashboard"
  297. AUTHENTICATION_TOKEN_INTROSPECTION_URL = authentication_token_introspection_url
  298. AUTHENTICATION_JWKS_URL = authentication_jwks_url
  299. AUTHENTICATION_CLIENT_ID = authentication_client_id
  300. AUTHENTICATION_CLIENT_SECRET = authentication_client_secret
  301. AUTHENTICATION_AUDIENCE = config.load('OIDC', 'IRIS_AUDIENCE', fallback="")
  302. AUTHENTICATION_VERIFY_TOKEN_EXP = config.load('OIDC', 'IRIS_VERIFY_TOKEN_EXPIRATION',
  303. fallback=True)
  304. AUTHENTICATION_TOKEN_VERIFY_MODE = config.load('OIDC', 'IRIS_TOKEN_VERIFY_MODE',
  305. fallback='signature')
  306. AUTHENTICATION_INIT_ADMINISTRATOR_EMAIL = config.load('OIDC', 'IRIS_INIT_ADMINISTRATOR_EMAIL',
  307. fallback="")
  308. AUTHENTICATION_APP_ADMIN_ROLE_NAME = authentication_app_admin_role_name
  309. elif authentication_type == 'ldap':
  310. LDAP_SERVER = config.load('LDAP', 'SERVER')
  311. if LDAP_SERVER is None:
  312. raise Exception('LDAP enabled and no server configured')
  313. LDAP_PORT = config.load('LDAP', 'PORT')
  314. if LDAP_PORT is None:
  315. raise Exception('LDAP enabled and no server configured')
  316. LDAP_USER_PREFIX = config.load('LDAP', 'USER_PREFIX', '')
  317. if LDAP_USER_PREFIX is None:
  318. raise Exception('LDAP enabled and no user prefix configured')
  319. LDAP_USER_SUFFIX = config.load('LDAP', 'USER_SUFFIX', '')
  320. if LDAP_USER_SUFFIX is None:
  321. raise Exception('LDAP enabled and no user suffix configured')
  322. LDAP_AUTHENTICATION_TYPE = config.load('LDAP', 'AUTHENTICATION_TYPE')
  323. LDAP_SEARCH_DN = config.load('LDAP', 'SEARCH_DN')
  324. if authentication_create_user_if_not_exists and LDAP_SEARCH_DN is None:
  325. raise Exception('LDAP enabled with user provisioning: LDAP_SEARCH_DN should be set')
  326. LDAP_ATTRIBUTE_IDENTIFIER = config.load('LDAP', 'ATTRIBUTE_IDENTIFIER')
  327. if authentication_create_user_if_not_exists and LDAP_ATTRIBUTE_IDENTIFIER is None:
  328. raise Exception('LDAP enabled with user provisioning: LDAP_ATTRIBUTE_IDENTIFIER should be set')
  329. LDAP_ATTRIBUTE_DISPLAY_NAME = config.load('LDAP', 'ATTRIBUTE_DISPLAY_NAME')
  330. LDAP_ATTRIBUTE_MAIL = config.load('LDAP', 'ATTRIBUTE_MAIL')
  331. LDAP_USE_SSL = config.load('LDAP', 'USE_SSL', fallback='True')
  332. LDAP_USE_SSL = (LDAP_USE_SSL == 'True')
  333. LDAP_VALIDATE_CERTIFICATE = config.load('LDAP', 'VALIDATE_CERTIFICATE', fallback='True')
  334. LDAP_VALIDATE_CERTIFICATE = (LDAP_VALIDATE_CERTIFICATE == 'True')
  335. ldap_tls_v = config.load('LDAP', 'TLS_VERSION', '1.2')
  336. if ldap_tls_v not in ['1.0', '1.1', '1.2']:
  337. raise Exception(f'Unsupported LDAP TLS version {ldap_tls_v}')
  338. if ldap_tls_v == '1.1':
  339. LDAP_TLS_VERSION = ssl.PROTOCOL_TLSv1_1
  340. elif ldap_tls_v == '1.2':
  341. LDAP_TLS_VERSION = ssl.PROTOCOL_TLSv1_2
  342. elif ldap_tls_v == '1.0':
  343. LDAP_TLS_VERSION = ssl.PROTOCOL_TLSv1
  344. proto = 'ldaps' if LDAP_USE_SSL else 'ldap'
  345. LDAP_CONNECT_STRING = f'{proto}://{LDAP_SERVER}:{LDAP_PORT}'
  346. if LDAP_USE_SSL:
  347. LDAP_SERVER_CERTIFICATE = config.load('LDAP', 'SERVER_CERTIFICATE')
  348. if not Path(f'certificates/ldap/{LDAP_SERVER_CERTIFICATE}').is_file():
  349. log.error(f'Unable to read LDAP certificate file certificates/ldap/{LDAP_SERVER_CERTIFICATE}')
  350. raise Exception(f'Unable to read LDAP certificate file certificates/ldap/{LDAP_SERVER_CERTIFICATE}')
  351. LDAP_PRIVATE_KEY = config.load('LDAP', 'PRIVATE_KEY')
  352. if LDAP_PRIVATE_KEY and not Path(f'certificates/ldap/{LDAP_PRIVATE_KEY}').is_file():
  353. log.error(f'Unable to read LDAP certificate file certificates/ldap/{LDAP_PRIVATE_KEY}')
  354. raise Exception(f'Unable to read LDAP certificate file certificates/ldap/{LDAP_PRIVATE_KEY}')
  355. PRIVATE_KEY_PASSWORD = config.load('LDAP', 'PRIVATE_KEY_PASSWORD', fallback=None)
  356. LDAP_CA_CERTIFICATE = config.load('LDAP', 'CA_CERTIFICATE')
  357. if LDAP_CA_CERTIFICATE and not Path(f'certificates/ldap/{LDAP_CA_CERTIFICATE}').is_file():
  358. log.error(f'Unable to read LDAP certificate file certificates/ldap/{LDAP_CA_CERTIFICATE}')
  359. raise Exception(f'Unable to read LDAP certificate file certificates/ldap/{LDAP_CA_CERTIFICATE}')
  360. LDAP_CUSTOM_TLS_CONFIG = config.load('LDAP', 'CUSTOM_TLS_CONFIG', fallback='True')
  361. LDAP_CUSTOM_TLS_CONFIG = (LDAP_CUSTOM_TLS_CONFIG == 'True')
  362. elif authentication_type == 'oidc':
  363. OIDC_ISSUER_URL = config.load('OIDC', 'ISSUER_URL')
  364. OIDC_CLIENT_ID = config.load('OIDC', 'CLIENT_ID')
  365. OIDC_CLIENT_SECRET = config.load('OIDC', 'CLIENT_SECRET')
  366. OIDC_AUTH_ENDPOINT = config.load('OIDC', 'AUTH_ENDPOINT', fallback=None)
  367. OIDC_TOKEN_ENDPOINT = config.load('OIDC', 'TOKEN_ENDPOINT', fallback=None)
  368. OIDC_END_SESSION_ENDPOINT = config.load('OIDC', 'END_SESSION_ENDPOINT', fallback=None)
  369. OIDC_SCOPES = config.load('OIDC', 'SCOPES', fallback="openid email profile")
  370. OIDC_MAPPING_USERNAME = config.load('OIDC', 'MAPPING_USERNAME', fallback='preferred_username')
  371. OIDC_MAPPING_EMAIL = config.load('OIDC', 'MAPPING_EMAIL', fallback='email')
  372. """ Caching
  373. """
  374. CACHE_TYPE = "SimpleCache"
  375. CACHE_DEFAULT_TIMEOUT = 300
  376. log.info(f'IRIS Server {IRIS_VERSION}')
  377. log.info(f'Min. API version supported: {API_MIN_VERSION}')
  378. log.info(f'Max. API version supported: {API_MAX_VERSION}')
  379. log.info(f'Min. module interface version supported: {MODULES_INTERFACE_MIN_VERSION}')
  380. log.info(f'Max. module interface version supported: {MODULES_INTERFACE_MAX_VERSION}')
  381. log.info(f'Session lifetime: {PERMANENT_SESSION_LIFETIME}')
  382. log.info(f'Authentication mechanism configured: {AUTHENTICATION_TYPE}')
  383. log.info(f'Authentication local fallback {"enabled" if AUTHENTICATION_LOCAL_FALLBACK else "disabled"}')
  384. log.info(f'MFA {"enabled" if MFA_ENABLED else "disabled"}')
  385. log.info(f'Create user during authentication: {"enabled" if AUTHENTICATION_CREATE_USER_IF_NOT_EXIST else "disabled"}')