93 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
| Overview
 | |
| ========
 | |
| 
 | |
| Goals
 | |
| -----
 | |
| 
 | |
| High level goals/principles of the Python ``stix2`` library:
 | |
| 
 | |
| 1. It should be as easy as possible (but no easier!) to perform common tasks of
 | |
|    producing, consuming, and processing STIX 2 content.
 | |
| 2. It should be hard, if not impossible, to emit invalid STIX 2.
 | |
| 3. The library should default to doing "the right thing", complying with both
 | |
|    the STIX 2.0 spec, as well as associated best practices. The library should
 | |
|    make it hard to do "the wrong thing".
 | |
| 
 | |
| Design Decisions
 | |
| ----------------
 | |
| 
 | |
| To accomplish these goals, and to incorporate lessons learned while developing
 | |
| ``python-stix`` (for STIX 1.x), several decisions influenced the design of the
 | |
| ``stix2`` library:
 | |
| 
 | |
| 1. All data structures are immutable by default. In contrast to python-stix,
 | |
|    where users would create an object and then assign attributes to it, in
 | |
|    ``stix2`` all properties must be provided when creating the object.
 | |
| 2. Where necessary, library objects should act like ``dict``'s. When treated as
 | |
|    a ``str``, the JSON reprentation of the object should be used.
 | |
| 3. Core Python data types (including numeric types, ``datetime``) should be used
 | |
|    when appropriate, and serialized to the correct format in JSON as specified
 | |
|    in the STIX 2 spec.
 | |
| 
 | |
| Architecture
 | |
| ------------
 | |
| 
 | |
| The ``stix2`` library is divided into three logical layers, representing
 | |
| different levels of abstraction useful in different types of scripts and larger
 | |
| applications. It is possible to combine multiple layers in the same program,
 | |
| and the higher levels build on the layers below.
 | |
| 
 | |
| 
 | |
| Object Layer
 | |
| ^^^^^^^^^^^^
 | |
| 
 | |
| The lowest layer, the **Object Layer**, is where Python objects representing STIX 2
 | |
| data types (such as SDOs, SROs, and Cyber Observable Objects, as well as
 | |
| non-top-level objects like External References, Kill Chain phases, and Cyber
 | |
| Observable extensions) are created, and can be serialized and deserialized
 | |
| to and from JSON representation.
 | |
| 
 | |
| This layer is appropriate for stand-alone scripts that produce or consume STIX
 | |
| 2 content, or can serve as a low-level data API for larger applications that
 | |
| need to represent STIX objects as Python classes.
 | |
| 
 | |
| At this level, non-embedded reference properties (those ending in ``_ref``, such
 | |
| as the links from a Relationship object to its source and target objects) are
 | |
| not implemented as references between the Python objects themselves, but by
 | |
| simply having the same values in ``id`` and reference properties. There is no
 | |
| referential integrity maintained by the ``stix2`` library.
 | |
| 
 | |
| Environment Layer
 | |
| ^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| The **Environment Layer** adds several components that make it easier to handle
 | |
| STIX 2 data as part of a larger application and as part of a larger cyber threat
 | |
| intelligence ecosystem.
 | |
| 
 | |
| - ``Data Source``\s represent locations from which STIX data can be retrieved,
 | |
|   such as a TAXII server, database, or local filesystem. The Data Source API
 | |
|   abstracts differences between these storage location, giving a common API to
 | |
|   get objects by ID or query by various properties, as well as allowing
 | |
|   federated operations over multiple data sources.
 | |
| - Similarly, ``Data Sink`` objects represent destinations for sending STIX data.
 | |
| - An ``Object Factory`` provides a way to add common properties to all created
 | |
|   objects (such as the same ``created_by_ref``, or a ``StatementMarking`` with
 | |
|   copyright information or terms of use for the STIX data).
 | |
| 
 | |
| Each of these components can be used individually, or combined as part of an
 | |
| ``Environment``. These ``Environment`` objects allow different settings to be
 | |
| used by different users of a multi-user application (such as a web application).
 | |
| For more information, check out `this Environment tutorial <guide/environment.ipynb>`_.
 | |
| 
 | |
| Workbench Layer
 | |
| ^^^^^^^^^^^^^^^
 | |
| 
 | |
| The highest layer of the ``stix2`` APIs is the **Workbench Layer**, designed for
 | |
| a single user in a highly-interactive analytical environment (such as a `Jupyter
 | |
| Notebook <https://jupyter.org/>`_). It builds on the lower layers of the API,
 | |
| while hiding most of their complexity. Unlike the other layers, this layer is
 | |
| designed to be used directly by end users. For users who are comfortable with
 | |
| Python, the Workbench Layer makes it easy to quickly interact with STIX data
 | |
| from a variety of sources without needing to write and run one-off Python
 | |
| scripts. For more information, check out `this Workbench tutorial <guide/workbench.ipynb>`_.
 |