Create a Network#

Imports#

To get started, import Network and Node.

from yawning_titan.networks.node import Node
from yawning_titan.networks.network import Network

Network Instantiation#

To create a Network, first, we must instantiate an instance of Network.

While a Network can be instantiated right out of the box by calling Network(), there are some configurable parameters that you can set (we’ll get onto these further down).

network = Network()

Node Instantiation#

Next, we instantiate some Node’s.

Again, while a Node can be instantiated right out of the box by calling Node(), there are some configurable parameters that you can set (we’ll get onto these further down).

node_1 = Node()
node_2 = Node()
node_3 = Node()
node_4 = Node()
node_5 = Node()
node_6 = Node()

Add Nodes to a Network#

Currently we only have an instance of Network and some instances of Node.

To add a Node to a Network, we need to call .add_node().

network.add_node(node_1)
network.add_node(node_2)
network.add_node(node_3)
network.add_node(node_4)
network.add_node(node_5)
network.add_node(node_6)

Adding Edges Between Nodes#

With our Node’s added to the Network, we can begin joining them by calling .add_edge().

network.add_edge(node_1, node_2)
network.add_edge(node_1, node_3)
network.add_edge(node_1, node_4)
network.add_edge(node_2, node_5)
network.add_edge(node_2, node_6)

And that’s it, our basic Network has been created.

Setting Entry Nodes#

Entry nodes can be set manually at the Node:

node_1.entry_node = True

Or by configuring the Network to set them at random:

from yawning_titan.networks.network import RandomEntryNodePreference

network.set_random_entry_nodes = True
network.num_of_random_entry_nodes = 1
network.random_entry_node_preference = RandomEntryNodePreference.EDGE
network.reset_random_entry_nodes()

Setting EntHigh Value Nodes#

High value nodes can be set manually at the Node:

node_1.high_value_node = True

Or by configuring the Network to set them at random:

from yawning_titan.networks.network import RandomHighValueNodePreference

network.set_random_high_value_nodes = True
network.num_of_random_high_value_nodes = 1
network.random_high_value_node_preference = RandomHighValueNodePreference.FURTHEST_AWAY_FROM_ENTRY
network.reset_random_high_value_nodes()

Setting Node Vulnerability#

A nodes vulnerability can be set manually at the Node:

node_1.vulnerability = 0.5

Or by configuring the Network to set them at random:

network.set_random_vulnerabilities = True
network.reset_random_vulnerabilities()

Reset the Network#

To reset all entry nodes, high value nodes, and vulnerabilities at once:

network.reset()

View a Networks Node Details#

To view a table of the Node’s in a Network:

network.show(verbose=True)

This gives an output like:

UUID                                  Name    High Value Node    Entry Node      Vulnerability  Position (x,y)
------------------------------------  ------  -----------------  ------------  ---------------  ----------------
bf308d9f-8382-4c15-99be-51f84f75f9ed          False              False               0.0296121  0.34, -0.23
1d757e6e-b637-4f63-8988-36e25e51cd55          False              False               0.711901   -0.34, 0.23
8f76d75c-5afd-4b2c-98ed-9c9dc6181299          True               False               0.65281    0.50, -0.88
38819aa3-0c05-4863-8b9d-c704f254e065          False              False               0.723192   1.00, -0.13
cc06f5e0-c956-449a-b397-b0e7bed3b8d4          False              True                0.85681    -0.49, 0.88
665b150b-fbd3-42a7-b899-3770ef2b285a          False              False               0.48435    -1.00, 0.13

Example Network#

Here we will create the corporate network that is used as a fixture in the Yawning-Titan tests (tests.conftest.corporate_network).

Names are added to each of the nodes for when they’re displayed in a network graph.

# Instantiate the Network
network = Network(
    set_random_entry_nodes=True,
    num_of_random_entry_nodes=3,
    set_random_high_value_nodes=True,
    num_of_random_high_value_nodes=2,
    set_random_vulnerabilities=True,
)

# Instantiate the Node's and add them to the Network
router_1 = Node("Router 1")
network.add_node(router_1)

switch_1 = Node("Switch 1")
network.add_node(switch_1)

switch_2 = Node("Switch 2")
network.add_node(switch_2)

pc_1 = Node("PC 1")
network.add_node(pc_1)

pc_2 = Node("PC 2")
network.add_node(pc_2)

pc_3 = Node("PC 3")
network.add_node(pc_3)

pc_4 = Node("PC 4")
network.add_node(pc_4)

pc_5 = Node("PC 5")
network.add_node(pc_5)

pc_6 = Node("PC 6")
network.add_node(pc_6)

server_1 = Node("Server 1")
network.add_node(server_1)

server_2 = Node("Server 2")
network.add_node(server_2)

# Add the edges between Node's
network.add_edge(router_1, switch_1)
network.add_edge(switch_1, server_1)
network.add_edge(switch_1, pc_1)
network.add_edge(switch_1, pc_2)
network.add_edge(switch_1, pc_3)
network.add_edge(router_1, switch_2)
network.add_edge(switch_2, server_2)
network.add_edge(switch_2, pc_4)
network.add_edge(switch_2, pc_5)
network.add_edge(switch_2, pc_6)

# Reset the entry nodes, high value nodes, and vulnerability scores by calling .setup()
network.reset()

# View the Networks Node Details
network.show(verbose=True)

Gives:

UUID                                  Name      High Value Node    Entry Node      Vulnerability  Position (x,y)
------------------------------------  --------  -----------------  ------------  ---------------  ----------------
c883596b-1d86-44f5-b4de-331292d8e3d5  Router 1  False              False               0.320496   0.00, -0.00
b2bd683b-a773-40de-85e8-36c21e66613d  Switch 1  False              False               0.889044   0.01, 0.61
68d9689b-5365-4022-b3bd-92bdc5a1627b  Switch 2  True               False               0.0671795  -0.00, -0.62
3554ed26-9480-487b-9d3c-57975654a2af  PC 1      False              False               0.400729   -0.38, 0.69
89700b3f-8be2-4b70-a21e-a0772551a6bc  PC 2      True               False               0.0807914  0.18, 1.00
82e91c52-5458-493a-a7cd-00fb702d6af1  PC 3      False              True                0.86676    0.39, 0.70
91edf896-f004-4ca7-9587-cc8417c4a26b  PC 4      False              False               0.967413   -0.39, -0.69
ebbc79f7-9a52-4a08-8b56-fee816284b54  PC 5      False              True                0.684436   0.38, -0.69
2cdaaf06-9b4a-41e9-ba6f-129aec634080  PC 6      False              False               0.727421   -0.19, -1.00
b81ad769-688a-4d02-ae7b-a64f0984b101  Server 1  False              False               0.630726   -0.17, 0.99
52cbd8ec-b063-40c5-a73e-a51291347e8f  Server 2  False              True                0.789554   0.17, -1.00