#3075: Further notebook updates.

This commit is contained in:
Nick Todd
2025-02-05 16:40:59 +00:00
parent a4c19608a6
commit b22ba65eb6
12 changed files with 224 additions and 1759 deletions

View File

@@ -382,7 +382,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": null,
"metadata": { "metadata": {
"tags": [] "tags": []
}, },
@@ -394,7 +394,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": null,
"metadata": { "metadata": {
"tags": [] "tags": []
}, },
@@ -450,7 +450,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [

View File

@@ -6,7 +6,7 @@
"source": [ "source": [
"# Getting information out of PrimAITE\n", "# Getting information out of PrimAITE\n",
"\n", "\n",
"© Crown-owned copyright 2024, Defence Science and Technology Laboratory UK\n" "© Crown-owned copyright 2025, Defence Science and Technology Laboratory UK\n"
] ]
}, },
{ {
@@ -32,8 +32,6 @@
"from primaite.session.environment import PrimaiteGymEnv\n", "from primaite.session.environment import PrimaiteGymEnv\n",
"from primaite.simulator.network.hardware.nodes.host.computer import Computer\n", "from primaite.simulator.network.hardware.nodes.host.computer import Computer\n",
"from notebook.services.config import ConfigManager\n", "from notebook.services.config import ConfigManager\n",
"from primaite.game.agent.scripted_agents import probabilistic_agent\n",
"\n",
"\n", "\n",
"cm = ConfigManager().update('notebook', {'limit_output': 50}) # limit output lines to 50 - for neatness\n", "cm = ConfigManager().update('notebook', {'limit_output': 50}) # limit output lines to 50 - for neatness\n",
"\n", "\n",

View File

@@ -6,7 +6,7 @@
"source": [ "source": [
"# Simulating Privilege Escalation and Data Loss Using SSH and ACLs Manipulation\n", "# Simulating Privilege Escalation and Data Loss Using SSH and ACLs Manipulation\n",
"\n", "\n",
"© Crown-owned copyright 2024, Defence Science and Technology Laboratory UK\n", "© Crown-owned copyright 2025, Defence Science and Technology Laboratory UK\n",
"\n", "\n",
"## Overview\n", "## Overview\n",
"\n", "\n",
@@ -62,7 +62,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": null,
"metadata": { "metadata": {
"tags": [] "tags": []
}, },
@@ -77,7 +77,8 @@
"from primaite.simulator.network.hardware.nodes.host.server import Server\n", "from primaite.simulator.network.hardware.nodes.host.server import Server\n",
"from primaite.simulator.system.applications.database_client import DatabaseClient\n", "from primaite.simulator.system.applications.database_client import DatabaseClient\n",
"from primaite.simulator.system.applications.web_browser import WebBrowser\n", "from primaite.simulator.system.applications.web_browser import WebBrowser\n",
"from primaite.simulator.system.services.database.database_service import DatabaseService\n" "from primaite.simulator.system.services.database.database_service import DatabaseService\n",
"from primaite.simulator.network.hardware.nodes.network import firewall\n"
] ]
}, },
{ {
@@ -89,7 +90,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": null,
"metadata": { "metadata": {
"tags": [] "tags": []
}, },
@@ -112,7 +113,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": null,
"metadata": { "metadata": {
"tags": [] "tags": []
}, },

View File

@@ -6,7 +6,7 @@
"source": [ "source": [
"# Requests and Responses\n", "# Requests and Responses\n",
"\n", "\n",
"© Crown-owned copyright 2024, Defence Science and Technology Laboratory UK\n", "© Crown-owned copyright 2025, Defence Science and Technology Laboratory UK\n",
"\n", "\n",
"Agents interact with the PrimAITE simulation via the Request system.\n" "Agents interact with the PrimAITE simulation via the Request system.\n"
] ]
@@ -36,7 +36,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -47,17 +47,21 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"sim = Simulation()\n", "sim = Simulation()\n",
"sim.network.add_node(\n", "sim.network.add_node(\n",
" HostNode(\n", " HostNode.from_config(\n",
" hostname=\"client\",\n", " config = {\n",
" ip_address='10.0.0.1',\n", " 'type': \"hostnode\",\n",
" subnet_mask='255.255.255.0',\n", " 'hostname': \"client\",\n",
" operating_state=NodeOperatingState.ON)\n", " 'ip_address': '10.0.0.1',\n",
" 'subnet_mask': '255.255.255.0',\n",
" 'operating_state': NodeOperatingState.ON,\n",
" }\n",
" )\n",
")\n", ")\n",
"client = sim.network.get_node_by_hostname('client')\n" "client = sim.network.get_node_by_hostname('client')\n"
] ]
@@ -210,7 +214,7 @@
], ],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": "venv", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },

View File

@@ -29,7 +29,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -39,12 +39,43 @@
"from primaite.simulator.system.applications.red_applications.ransomware_script import RansomwareScript\n", "from primaite.simulator.system.applications.red_applications.ransomware_script import RansomwareScript\n",
"from primaite.simulator.system.services.terminal.terminal import RemoteTerminalConnection\n", "from primaite.simulator.system.services.terminal.terminal import RemoteTerminalConnection\n",
"\n", "\n",
"# print(dir(Computer))\n",
"# node_a = Computer.from_config(\n",
"# config = {\n",
"# \"type\": \"computer\",\n",
"# \"hostname\": \"node_a\",\n",
"# \"ip_address\": \"192.168.0.10\",\n",
"# \"subnet_mask\": \"255.255.255.0\",\n",
"# \"startup_duration\": 0,\n",
"# }\n",
"# )\n",
"# print(f\"{node_a=}\")\n",
"\n",
"def basic_network() -> Network:\n", "def basic_network() -> Network:\n",
" \"\"\"Utility function for creating a default network to demonstrate Terminal functionality\"\"\"\n", " \"\"\"Utility function for creating a default network to demonstrate Terminal functionality\"\"\"\n",
" network = Network()\n", " network = Network()\n",
" node_a = Computer(hostname=\"node_a\", ip_address=\"192.168.0.10\", subnet_mask=\"255.255.255.0\", start_up_duration=0)\n", " # node_a = Computer(hostname=\"node_a\", ip_address=\"192.168.0.10\", subnet_mask=\"255.255.255.0\", start_up_duration=0)\n",
" node_a = Computer.from_config(\n",
" config = {\n",
" \"type\": \"computer\",\n",
" \"hostname\": \"node_a\",\n",
" \"ip_address\": \"192.168.0.10\",\n",
" \"subnet_mask\": \"255.255.255.0\",\n",
" \"startup_duration\": 0,\n",
" }\n",
" )\n",
" print(f\"{node_a=}\")\n",
" node_a.power_on()\n", " node_a.power_on()\n",
" node_b = Computer(hostname=\"node_b\", ip_address=\"192.168.0.11\", subnet_mask=\"255.255.255.0\", start_up_duration=0)\n", " # node_b = Computer(hostname=\"node_b\", ip_address=\"192.168.0.11\", subnet_mask=\"255.255.255.0\", start_up_duration=0)\n",
" node_b = Computer.from_config(\n",
" config = {\n",
" \"type\": \"computer\",\n",
" \"hostname\": \"node_b\",\n",
" \"ip_address\": \"192.168.0.11\",\n",
" \"subnet_mask\": \"255.255.255.0\",\n",
" \"startup_duration\": 0,\n",
" }\n",
" )\n",
" node_b.power_on()\n", " node_b.power_on()\n",
" network.connect(node_a.network_interface[1], node_b.network_interface[1])\n", " network.connect(node_a.network_interface[1], node_b.network_interface[1])\n",
" return network" " return network"
@@ -84,7 +115,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -211,7 +242,7 @@
], ],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": ".venv", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
@@ -225,7 +256,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.10.11" "version": "3.10.12"
} }
}, },
"nbformat": 4, "nbformat": 4,

View File

@@ -6,7 +6,7 @@
"source": [ "source": [
"# Train a Multi agent system using RLLIB\n", "# Train a Multi agent system using RLLIB\n",
"\n", "\n",
"© Crown-owned copyright 2024, Defence Science and Technology Laboratory UK\n", "© Crown-owned copyright 2025, Defence Science and Technology Laboratory UK\n",
"\n", "\n",
"This notebook will demonstrate how to use the `PrimaiteRayMARLEnv` to train a very basic system with two PPO agents." "This notebook will demonstrate how to use the `PrimaiteRayMARLEnv` to train a very basic system with two PPO agents."
] ]
@@ -57,7 +57,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -103,20 +103,7 @@
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"*** SIGTERM received at time=1737996337 on cpu 7 ***\n",
"PC: @ 0x7f3649b0fe2e (unknown) epoll_wait\n",
" @ 0x7f3649a2c520 (unknown) (unknown)\n",
"[2025-01-27 16:45:37,381 E 117142 117142] logging.cc:440: *** SIGTERM received at time=1737996337 on cpu 7 ***\n",
"[2025-01-27 16:45:37,381 E 117142 117142] logging.cc:440: PC: @ 0x7f3649b0fe2e (unknown) epoll_wait\n",
"[2025-01-27 16:45:37,381 E 117142 117142] logging.cc:440: @ 0x7f3649a2c520 (unknown) (unknown)\n"
]
}
],
"source": [ "source": [
"eval = algo.evaluate()" "eval = algo.evaluate()"
] ]
@@ -127,18 +114,6 @@
"display_name": "Python 3 (ipykernel)", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
} }
}, },
"nbformat": 4, "nbformat": 4,

View File

@@ -6,7 +6,7 @@
"source": [ "source": [
"# Train a Single agent system using RLLib\n", "# Train a Single agent system using RLLib\n",
"\n", "\n",
"© Crown-owned copyright 2024, Defence Science and Technology Laboratory UK\n", "© Crown-owned copyright 2025, Defence Science and Technology Laboratory UK\n",
"\n", "\n",
"This notebook will demonstrate how to use PrimaiteRayEnv to train a basic PPO agent." "This notebook will demonstrate how to use PrimaiteRayEnv to train a basic PPO agent."
] ]
@@ -52,7 +52,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -98,20 +98,7 @@
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"*** SIGTERM received at time=1737996055 on cpu 1 ***\n",
"PC: @ 0x7f6e254a6e2e (unknown) epoll_wait\n",
" @ 0x7f6e253c3520 (unknown) (unknown)\n",
"[2025-01-27 16:40:55,343 E 114171 114171] logging.cc:440: *** SIGTERM received at time=1737996055 on cpu 1 ***\n",
"[2025-01-27 16:40:55,343 E 114171 114171] logging.cc:440: PC: @ 0x7f6e254a6e2e (unknown) epoll_wait\n",
"[2025-01-27 16:40:55,344 E 114171 114171] logging.cc:440: @ 0x7f6e253c3520 (unknown) (unknown)\n"
]
}
],
"source": [ "source": [
"eval = algo.evaluate()" "eval = algo.evaluate()"
] ]
@@ -122,18 +109,6 @@
"display_name": "Python 3 (ipykernel)", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
} }
}, },
"nbformat": 4, "nbformat": 4,

View File

@@ -6,7 +6,7 @@
"source": [ "source": [
"# Training an SB3 Agent\n", "# Training an SB3 Agent\n",
"\n", "\n",
"© Crown-owned copyright 2024, Defence Science and Technology Laboratory UK\n", "© Crown-owned copyright 2025, Defence Science and Technology Laboratory UK\n",
"\n", "\n",
"This notebook will demonstrate how to use primaite to create and train a PPO agent, using a pre-defined configuration file." "This notebook will demonstrate how to use primaite to create and train a PPO agent, using a pre-defined configuration file."
] ]

View File

@@ -6,7 +6,7 @@
"source": [ "source": [
"# Using Episode Schedules\n", "# Using Episode Schedules\n",
"\n", "\n",
"© Crown-owned copyright 2024, Defence Science and Technology Laboratory UK\n", "© Crown-owned copyright 2025, Defence Science and Technology Laboratory UK\n",
"\n", "\n",
"PrimAITE supports the ability to use different variations on a scenario at different episodes. This can be used to increase \n", "PrimAITE supports the ability to use different variations on a scenario at different episodes. This can be used to increase \n",
"domain randomisation to prevent overfitting, or to set up curriculum learning to train agents to perform more complicated tasks.\n", "domain randomisation to prevent overfitting, or to set up curriculum learning to train agents to perform more complicated tasks.\n",
@@ -40,7 +40,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -325,7 +325,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 17,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -413,6 +413,18 @@
"display_name": "Python 3 (ipykernel)", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
} }
}, },
"nbformat": 4, "nbformat": 4,

View File

@@ -6,7 +6,7 @@
"source": [ "source": [
"# Simple multi-processing demonstration\n", "# Simple multi-processing demonstration\n",
"\n", "\n",
"© Crown-owned copyright 2024, Defence Science and Technology Laboratory UK\n", "© Crown-owned copyright 2025, Defence Science and Technology Laboratory UK\n",
"\n", "\n",
"This notebook uses SubprocVecEnv from SB3." "This notebook uses SubprocVecEnv from SB3."
] ]
@@ -29,7 +29,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 30, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -37,13 +37,12 @@
"from stable_baselines3 import PPO\n", "from stable_baselines3 import PPO\n",
"from stable_baselines3.common.utils import set_random_seed\n", "from stable_baselines3.common.utils import set_random_seed\n",
"from stable_baselines3.common.vec_env import SubprocVecEnv\n", "from stable_baselines3.common.vec_env import SubprocVecEnv\n",
"from primaite.session.environment import PrimaiteGymEnv\n", "from primaite.session.environment import PrimaiteGymEnv\n"
"from primaite.game.agent.scripted_agents import probabilistic_agent\n"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 31, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -52,7 +51,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 32, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -69,7 +68,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 33, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@@ -90,7 +89,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 36, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [

View File

@@ -1197,7 +1197,7 @@ class UserSessionManager(Service, identifier="UserSessionManager"):
"""Request should take the form [username, password, remote_ip_address].""" """Request should take the form [username, password, remote_ip_address]."""
username, password, remote_ip_address = request username, password, remote_ip_address = request
response = RequestResponse.from_bool(self.remote_login(username, password, remote_ip_address)) response = RequestResponse.from_bool(self.remote_login(username, password, remote_ip_address))
response.data = {"remote_hostname": self.parent.hostname, "username": username} response.data = {"remote_hostname": self.parent.config.hostname, "username": username}
return response return response
rm.add_request("remote_login", RequestType(func=_remote_login)) rm.add_request("remote_login", RequestType(func=_remote_login))
@@ -1230,7 +1230,7 @@ class UserSessionManager(Service, identifier="UserSessionManager"):
if markdown: if markdown:
table.set_style(MARKDOWN) table.set_style(MARKDOWN)
table.align = "l" table.align = "l"
table.title = f"{self.parent.hostname} User Sessions" table.title = f"{self.parent.config.hostname} User Sessions"
def _add_session_to_table(user_session: UserSession): def _add_session_to_table(user_session: UserSession):
""" """
@@ -1627,9 +1627,7 @@ class Node(SimComponent, ABC):
dns_server=kwargs["config"].dns_server, dns_server=kwargs["config"].dns_server,
) )
super().__init__(**kwargs) super().__init__(**kwargs)
self.operating_state = ( self.operating_state = NodeOperatingState.ON if not (p := kwargs["config"].operating_state) else p
NodeOperatingState.ON if not (p := kwargs["config"].operating_state) else NodeOperatingState[p.upper()]
)
self._install_system_software() self._install_system_software()
self.session_manager.node = self self.session_manager.node = self
self.session_manager.software_manager = self.software_manager self.session_manager.software_manager = self.software_manager