V tomto dokumentu je popsán návod na realizaci praktické části bakalářské práce.


Nasazení platformy OpenStack
------------------------------------------------------------------------------------------------------------

//Instalace balíčků, vytvoření a aktivace virtuálního prostředí
sudo apt update
sudo apt install python3-dev libffi-dev gcc libssl-dev
sudo apt install python3-venv
python3 -m venv /home/server/koll-open
source /home/server/koll-open/bin/activate

//Instalace nástrojů pip, Ansible a Kolla Ansible
pip install -U pip
pip install 'ansible==5.*'
pip install git+https://opendev.org/openstack/kolla-ansible@master

//Vytvoření adresáře /etc/kolla a úprava vlastnictví tohoto adresáře
sudo mkdir -p /etc/kolla
sudo chown server:server /etc/kolla

//Zkopírování souborů do vhodných adresářů
cp -r /home/server/koll-open/share/kolla-ansible/etc_examples/kolla/* /etc/kolla
cp /home/server/koll-open/share/kolla-ansible/ansible/inventory/* .

//Instalace závislostí Ansible Galaxy
kolla-ansible install-deps

//Úprava souboru globals.yml
nano /etc/kolla/globals.yml
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
kolla_base_distro: "ubuntu"
kolla_install_type: "source"
kolla_internal_vip_address: "192.168.1.211"
network_interface: "ens160"
neutron_external_interface: "ens192"
nova_console: "spice"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

//Vygenerování hesel a naplnění souboru /etc/kolla/passwords.yml
kolla-genpwd

//Nasazení platformy OpenStack
kolla-ansible -i all-in-one bootstrap-servers
kolla-ansible -i all-in-one prechecks
kolla-ansible -i all-in-one deploy

//Vygenerování souboru admin-openrc.sh
kolla-ansible -i all-in-one post-deploy

//Deaktivace virtuálního prostředí
deactivate

//Instalace balíčků a připojení souboru jako zdroje
pip3 install python-openstackclient python-heatclient
source /etc/kolla/admin-openrc.sh
sudo apt install python3-openstackclient

//Stažení a připojení podporovaných obrazů na platformu OpenStack
wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img -P /tmp/
openstack image create --disk-format qcow2 --container-format bare --public --property os_type=linux --file /tmp/bionic-server-cloudimg-amd64.img ubuntu-bionic-x86_64
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img -P /tmp/
openstack image create --disk-format qcow2 --container-format bare --public --property os_type=linux --file /tmp/focal-server-cloudimg-amd64.img ubuntu-focal-x86_64
wget http://cdimage.debian.org/cdimage/openstack/current-9/debian-9-openstack-amd64.qcow2 -P /tmp/
openstack image create --disk-format qcow2 --container-format bare --public --property os_type=linux --file /tmp/debian-9-openstack-amd64.qcow2 debian-9-x86_64

//Vytvoření flavors (typů)
openstack flavor create --id 1 --ram 16384 --disk 30 --vcpus 4 standard.large
openstack flavor create --id 2 --ram 4092 --disk 20 --vcpus 2 standard.medium
openstack flavor create --id 3 --ram 2048 --disk 20 --vcpus 1 csirtmu.tiny1x2

//Vytvoření externí sítě public
openstack network create --provider-network-type flat --share --provider-physical-network physnet1 --external public
openstack subnet create --subnet-range 172.24.1.0/24 --allocation-pool start=172.24.1.2,end=172.24.1.100 --gateway 172.24.1.1 --network public public-subnet

//Zjištění hesla pro přístup k Horizonu (parametr = keystone_admin_password)
nano /etc/kolla/passwords.yml



Vytvoření základní infrastruktury KYPO
------------------------------------------------------------------------------------------------------------

//Vygenerování a stažení souboru app-cred-kypo-openrc.sh (app-credentials) přes prostředí Horizon
//Soubor zahrnuje role admin, member, reader, heat_stack_owner a parametr unrestricted

//Instalace APT balíčků, nástroje pipenv a připojení souboru app-cred-kypo-openrc.sh jako zdroje
sudo apt install python3-pip openssh-client jq
sudo pip3 install pipenv
source app-cred-kypo-openrc.sh

//Stažení repozitáře pro základní infrastrukturu KYPO a přepnutí do adresáře kypo-crp-openstack-base
git clone https://gitlab.ics.muni.cz/muni-kypo-crp/devops/kypo-crp-openstack-base.git
cd kypo-crp-openstack-base

//Spuštění virtuálního prostředí
pipenv install
pipenv shell

//Úprava souboru openstack-defaults.sh
nano openstack-defaults.sh
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
export KYPO_HEAD_FLAVOR="standard.large"
export KYPO_HEAD_IMAGE="ubuntu-bionic-x86_64"
export KYPO_HEAD_USER="ubuntu"
export KYPO_PROXY_FLAVOR="standard.medium"
export KYPO_PROXY_IMAGE="ubuntu-bionic-x86_64"
export KYPO_PROXY_USER="ubuntu"
export DNS1="1.1.1.1"
export DNS2="1.0.0.1"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

//Připojení souboru openstack-defaults.sh jako zdroje
source openstack-defaults.sh

//Vytvoření základní infrastruktury KYPO
./bootstrap.sh public
./create-base.sh	

//Instalace nástroje net-tools a uvedení rozhraní ens192 do stavu UP
sudo apt install net-tools        
sudo ifconfig ens192 up

//Ověření dostupnosti vytvořených stanic
./ansible-check-base.sh 
./ansible-user-access.sh



Nasazení a konfigurace cyber range platformy KYPO
------------------------------------------------------------------------------------------------------------

//Stažení repozitáře pro nasazení platformy KYPO a přepnutí do adresáře kypo-crp-deployment
cd
git clone https://gitlab.ics.muni.cz/muni-kypo-crp/devops/kypo-crp-deployment.git
cd kypo-crp-deployment

//Úprava souboru extra-vars.yml
nano extra-vars.yml
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
kypo_crp_host: 172.24.1.19
kypo_crp_instance_name: default0
kypo_crp_docker_network_mtu: 1442
kypo_crp_os_auth_url: http://192.168.56.201:5000
kypo_crp_os_application_credential_id: c9704941aa1d4456b8f165f460c382e1
kypo_crp_os_application_credential_secret: ****
kypo_crp_proxy_host: 172.24.1.14
kypo_crp_proxy_user: ubuntu
kypo_crp_dns:
    - 1.1.1.1
    - 1.0.0.1
kypo_crp_os_console_type: spice-html5

kypo_crp_oidc_local_provider_url: '{{ kypo_crp_url }}:8443/csirtmu-dummy-issuer-server/'
kypo_crp_oidc_local_provider_ldap_root_password: ****
kypo_crp_oidc_local_provider_postgres_password: ****
kypo_crp_oidc_providers: '{{ [kypo_crp_oidc_local_provider] }}'

kypo_crp_users:
    - sub: kypo-admin
      iss: '{{ kypo_crp_oidc_local_provider_url }}'
      password: ****
      email: kypo-admin@example.com
      fullName: "Demo Admin"
      givenName: "Demo"
      familyName: "Admin"
      admin: True
    - sub: kypo-user
      iss: '{{ kypo_crp_oidc_local_provider_url }}'
      password: ****
      email: kypo-user@example.com
      fullName: "Demo User"
      givenName: "Demo"
      familyName: "User"
      admin: False

kypo_crp_git: '{{ kypo_crp_git_internal }}'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

//Vygenerování SSL certifikátu a jeho soukromého klíče
openssl req  -nodes -new -x509  -keyout kypo.key -out kypo.crt -subj "/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=172.24.1.19" -addext "subjectAltName = DNS:172.24.1.19, IP:172.24.1.19"

//Zakódování SSL certifikátu, jeho soukromého klíče a SSH klíče pro přístup ke stanici Kypo Proxy
base64 kypo.crt
base64 kypo.key
base64 ../kypo-crp-openstack-base/admin_kypo-base-key.key

//Zkopírování zakódovaného SSL certifikátu, jeho soukromého klíče a SSH klíče do souboru secrets.yml
nano secrets.yml
%%%%%%%%%%%%%%%%%%%%%%%%%
kypo_crp_cert: ****
kypo_crp_cert_key: ****
kypo_crp_proxy_key: ****
%%%%%%%%%%%%%%%%%%%%%%%%%

//Vytvoření souboru inventory.ini
nano inventory.ini
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[kypo_head]
172.24.1.19
[kypo_head:vars]
ansible_host=172.24.1.19
ansible_user=ubuntu
ansible_ssh_private_key_file=../kypo-crp-openstack-base/admin_kypo-base-key.key
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

//Úprava systémové proměnné ANSIBLE_ROLES_PATH
export ANSIBLE_ROLES_PATH=provisioning/roles_required:provisioning/roles

//Instalace community.docker, community.postgresql, požadavků a rolí pomocí nástroje ansible-galaxy
ansible-galaxy collection install community.docker
ansible-galaxy collection install community.postgresql
ansible-galaxy install -r provisioning/requirements.yml -p provisioning/roles_required

//Vytvoření CSIRT-MU dummy OIDC issuer
ansible-playbook -i inventory.ini provisioning/docker.yml --extra-vars=@extra-vars.yml --extra-vars=@secrets.yml

//!!Problém nástroj pip - manuální připojení na Kypo head a instalace pipenv!!
ssh -i ../kypo-crp-openstack-base/admin_kypo-base-key.key ubuntu@172.24.1.19
sudo pip3 install pipenv
exit
//Znovuspuštění playbooku (ansible-playbook -i inventory.ini provisioning/docker.yml --extra-vars=@extra-vars.yml --extra-vars=@secrets.yml)

ansible-playbook -i inventory.ini provisioning-oidc/oidc.yml --extra-vars=@extra-vars.yml --extra-vars=@secrets.yml
ansible-playbook -i inventory.ini provisioning/docker.yml --extra-vars=@extra-vars.yml --extra-vars=@secrets.yml
ansible-playbook -i inventory.ini provisioning/playbook.yml --extra-vars=@extra-vars.yml --extra-vars=@secrets.yml --extra-vars=@oidc-local-provider.yml

//!!Problém get certificate info - manuální připojení na Kypo Head a instalace cryptography 3.4.8!!
ssh -i ../kypo-crp-openstack-base/admin_kypo-base-key.key ubuntu@172.24.1.19
sudo pip uninstall cryptography
sudo pip install cryptography==3.4.8
exit
//Znovuspuštění playbooku (ansible-playbook -i inventory.ini provisioning/playbook.yml --extra-vars=@extra-vars.yml --extra-vars=@secrets.yml --extra-vars=@oidc-local-provider.yml)



Vytvoření sandbox definice
------------------------------------------------------------------------------------------------------------

//Topologie:

energy-network/
├── topology.yml
└── provisioning/
    ├── playbook.yml
    └── roles/
        └── iptables/

//Úprava souboru topology.yml
topology.yml
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
name: energy-network

hosts:
  - name: smart-meter
    base_box:
      image: ubuntu-focal-x86_64
      man_user: ubuntu
    flavor: csirtmu.tiny1x2

  - name: concentrator
    base_box:
      image: ubuntu-focal-x86_64
      man_user: ubuntu
    flavor: csirtmu.tiny1x2

routers:
  - name: router
    base_box:
      image: debian-9-x86_64
      man_user: debian
    flavor: csirtmu.tiny1x2

networks:
  - name: smart-meter-switch
    cidr: 10.10.20.0/24

  - name: concentrator-switch
    cidr: 10.10.30.0/24

net_mappings:
    - host: smart-meter
      network: smart-meter-switch
      ip: 10.10.20.5

    - host: concentrator
      network: concentrator-switch
      ip: 10.10.30.5

router_mappings:
    - router: router
      network: smart-meter-switch
      ip: 10.10.20.1

    - router: router
      network: concentrator-switch
      ip: 10.10.30.1

groups: []
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

//Úprava souboru playbook.yml
playbook.yml
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- name: Flush ALL rules on MAN
  hosts: man
  strategy: free
  gather_facts: yes
  become: yes
  become_user: root

  tasks:
    - name: setup
      include_role:
        name: iptables
      vars:
        iptables_rules:
          - flush: yes


- name: Setup DROP rules on MAN
  hosts: man
  strategy: free
  gather_facts: yes
  become: yes
  become_user: root

  tasks:
    - set_fact:
        private_ip_address_range: ['10.0.0.0/8', '172.16.0.0/12', '224.0.0.0/4']
    - set_fact:
        host_interface: 'eth2'

    - name: setup
      include_role:
        name: iptables
      vars:
        iptables_rules:
          - chain: FORWARD
            destination: '{{ item }}'
            in_interface: '{{ host_interface }}'
            out_interface: eth0
            jump: DROP
      loop: '{{ private_ip_address_range }}'

- name: Update apt packages and install maven
  hosts:
    - smart-meter
    - concentrator
  gather_facts: no
  become: yes
  become_user: root
  tasks:
  - name: Update apt packages
    become: yes
    apt:
      update_cache: yes

  - name: Install maven
    become: yes
    apt:
      pkg:
       - maven

- name: Smart-meter setup
  hosts:
    - smart-meter
  gather_facts: no
  become: yes
  become_user: ubuntu
  tasks: 

  - name: Clone gurux repository
    become: yes
    ansible.builtin.git:
       repo: https://github.com/Gurux/gurux.dlms.java.git
       dest: /home/ubuntu/gurux
       clone: yes

  - name: Create smart-meter
    shell: mvn clean package
    args:
      chdir: /home/ubuntu/gurux/gurux.dlms.server.example.java/

- name: Concentrator setup
  hosts:
    - concentrator
  gather_facts: no
  become: yes
  become_user: ubuntu
  tasks: 

  - name: Clone gurux repository
    become: yes
    ansible.builtin.git:
       repo: https://github.com/Gurux/gurux.dlms.java.git
       dest: /home/ubuntu/gurux
       clone: yes

  - name: Create concentrator
    shell: mvn clean package
    args: 
      chdir: /home/ubuntu/gurux/gurux.dlms.client.example.java/    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

//Dostupnost role iptables: https://gitlab.ics.muni.cz/CSIRT-MU-PUBLIC/ansible-roles/iptables

//Nahrání sandbox definice do interního git repozitáře (na Kypo Head)
ssh -i ../kypo-crp-openstack-base/admin_kypo-base-key.key ubuntu@172.24.1.19
sudo su
git clone -q --bare https://github.com/danielmorawiec/energy-network.git
docker cp energy-network.git git-internal-ssh:/repos/prototypes-and-examples/sandbox-definitions



KYPO Portál a zprovoznění testovacího scénáře
------------------------------------------------------------------------------------------------------------

//Přihlášení na KYPO Portál

//Nutno povolit riziko certifikátu na adresách:
//IP adresa: https://172.24.1.19
//IP adresa oidc: https://172.24.1.19/csirtmu-dummy-issuer-server/

//Zprovoznění testovacího scénáře

//Vložení sandbox definice
//Přihlášení jako admin: Username = kypo-admin, Password = ****
//Sekce Sandbox Definiton -> Create 
//Gitlab URL: git@git-internal-ssh:/repos/prototypes-and-examples/sandbox-definitions/energy-network.git
//Revision: main

//Alokace sandboxu
//Sekce Pool -> Create 
//Sandbox Pool Size: 1, Sandbox Definition: energy-network
// -> Allocate All
//OpenStack Stage 1, Networking Ansible Stage 2, User Ansible Stage 3 -> Finnished

//Stažení souborů pro SSH přístup k jednotlivým zařízením vytvořené topologie
//Sekce Pool -> Get SSH Configs (management)

//Rozbalení souborů pro SSH přístup
unzip ssh-access.zip -d ~/.ssh/

//Připojení na zařízení ve vytvořeném testovacím scénáři (aaa = man / router / smart-meter / concentrator) 
ssh -F ~/.ssh/pool-id-1-sandbox-id-1-management-config aaa



Testovací scénář s prvky energetických sítí - spuštění chytrého elektroměru a koncentrátoru
------------------------------------------------------------------------------------------------------------

//Chytrý elektroměr
ssh -F ~/.ssh/pool-id-1-sandbox-id-1-management-config smart-meter
cd gurux/gurux.dlms.server.example.java/
java -jar target/gurux.dlms.server.example.java-0.0.1-SNAPSHOT.jar

//Koncentrátor
ssh -F ~/.ssh/pool-id-1-sandbox-id-1-management-config concentrator
cd gurux/gurux.dlms.client.example.java/
java -jar target/gurux.dlms.client.example.java-0.0.1-SNAPSHOT.jar -h 10.10.20.5 -p 4061

















