---
# System prepended metadata

title: Практика для занятия "Безопасность на уровне ОС"

---

# Практика для занятия "Безопасность на уровне ОС"

Для практики понадобится:

- [virtuabox](https://www.virtualbox.org)
- [vargant](https://www.vagrantup.com)
- [ansible](https://docs.ansible.com/ansible/latest/getting_started/index.html)
- ubuntu/debian виртуальная машина, которая установлена в virtualbox 
- IDE для работы с конфигурациями (желательно с плагинами для синтаксиса ruby, yaml, ini)


:::    danger
 Если в качестве основной машины используется Windows:
     1. На windows ставится vagrant+virtualbox
     2. В virtualbox ставится Debian/Ubuntu дистрибутив
     3. Проводится настройка доступа по закрытому ключу
     4. В Debian/Ubuntu дистрибутиве устанавливается ansible

В ЭТОЙ КОФИГУРАЦИИ ВСЕ УПРАВЛЯЕМЫЕ ЧЕРЕЗ ANSIBLE машины должны быть доступны в общей локальной сети.
:::

:::    success
    Если в качестве основной машины используется Linux система:
    1. Ставим в систему virtualbox+vagrant+ansible
    2. В virtualbox ставим Debian/Ubuntu дистрибутив
    3. Настраиваем доступ в систему по закрытому ключу
::: 
## Работа с vagrant

Система использует обертки - providers для работы с различными системами виртуализации. Написаны обертки на Ruby. Всё упраление со стороны пользователя осуществляется с помощью файла `Vagrantfile`. 

Пример:

```ruby=
Vagrant.configure("2") do |config|
  config.vm.box = "MyBox"
  config.vm.provider "virtualbox"
  config.vm.provision :shell, path: "bootstrap.sh"
end
```

`Vagrant` позволяет настраивать виртуальную машину:

1. Pre-boot - до запуска, здесь указываются характеристики, количество сетевых интерфейсов и работа с расшириваемыми ресурсами
2. Работа с запущенной виртуальной машиной или `provision`. Здесь можно использовать готовые скрипты или обращаться к системам типа puppet, ansible и т.д.

:::    info
Так как на сегодняшний день доступ к каталогу с готовыми осями для vagrant закрыт, то нужно будет выполнить следующие дейтсвия в терминале:

1. Создать рабочую директорию для экспорта виртуальной машины в box формат
2. vagrant box package virtualMachineName
3. vagrant box add package.box --name myNewBox

Где **virtualMachineName** - это имя виртуальной машины, которую хотите сделать доступной из Vagrant.

**myNameBox** - не обязательный параметр, называть box можно как угодно

Для проверки успешности проведенных действий нужно запустить команду - vagrant box list. Если в списке появился box с указанным названием из команд выше, то всё прошло успешно, если нет, на экране будут ошибки, которые нужно будет устранить.
:::

В практике занятия будем использовать следующий конфиг:

```ruby=
servers=[
  {
    :hostname => "host1",
    :ip => "10.0.2.15",
    :box => "ubuntuServer",
    :ram => 1024,
    :cpu => 1,
    :ssh_port => 2001
  },
  {
    :hostname => "db2",
    :ip => "10.0.2.16",
    :box => "ubuntuServer",
    :ram => 1024,
    :cpu => 1,
    :ssh_port => 2004
  }
]

Vagrant.configure(2) do |config|
    servers.each do |machine|
        config.vm.define machine[:hostname] do |node|
            node.vm.box = machine[:box]
            node.vm.hostname = machine[:hostname]
            node.vm.network "public_network", ip: machine[:ip]
            node.vm.provider "virtualbox" do |vb|
            config.vm.network :forwarded_port, guest: 22, host: machine[:ssh_port], id: "ssh"
            config.ssh.username = "labs"
            config.ssh.private_key_path = "labs_private"
            vb.customize ["modifyvm", :id, "--memory", machine[:ram]]
            end
        end
    end
end

```

В файле можно пользоваться конструкциями языка ruby, поэтому в начале конфига создан массив из данных для виртуальных машин и далее, в цикле проводится их запуск.

:::    warning
Если нарушена идентация - количество пробелов слева от конструкций языка, то может не отрабатывать часть команд и запускаться только одна машина. 

Так же в конфиге указано назначение ip адреса принудительно. Для public_network это не будет работать корректно, поэтому можно закомментировать или удалить строку 25. Она приведена для примера установки ip для private_network сетей.
:::

Проверку правильности составления vagrant файла можно провести через команду:

```
vagrant validate
```

Запускаем виртуальные машины:

```vagrant up```

Так же можно виртуалку:
1. уничтожить - vagrant destroy
2. заново запустить процедуру настройки или provision - vagrant provision.

В результате этого этапа должны начать работать 2 одинаковые виртуальные машины.


## Работа с ansible

Чтобы успешно завершить практику по этой части должны быть предварительно запущены 2 виртуальные машины из части `vagrant`.


Для удобства работы с проектом ansible и его дальнейшей поддержке необходимо пользоваться иерархией директорий, которые по смыслу содержат необходимые файлы. Обычно алгоритм создания директорий такой:

1. Создать директорию, где будет располагаться весь проект
2. Создать файл **inventory**(обычно называется **hosts**) - файл с набором данных для доступа к системам, которыми будем управлять. Управление без предоставления ключей и данных о пользователе может быть только из-под учетной записи, которая стартует в системе ansible команду.
3. Создать директрию **roles** - вложенные директории должны иметь соответствующие роли названия
4. Создать файл **site.yaml** - это будет основной файл с перечнем всех ролей и тасок, так называемый **playbook**. 

Пример того как может выглядеть иерархия директорий:

![](https://i.imgur.com/0jMCZcb.png)


После создания необходимых директорий и файлов можно приступить к заполнению файлов. Первым заполняется файл hosts:

```ini=
[test]
host1 ansible_host=127.0.0.1 ansible_ssh_port=2001 ansible_user=labs ansible_ssh_private_key_file="labs_private"
db2 ansible_host=127.0.0.1 ansible_ssh_port=2004 ansible_user=labs ansible_ssh_private_key_file="labs_private"
```

[] - это тег, его можно использовать для показа в playbook, на каких устройствах нужно запустить задания и роли. Остальные части конфига - это просто переменные, которые используются ansible для доступа к операционным системам.

127.0.0.1 используется только если вы запустили весь стенд на Linux системе (виртуалки+ansible). Если у вас ansible поставлен отдельно, то вместо 127.0.0.1 поставляется адрес виртуальной машины.

:::danger
В любом файле проекта ansible не должен появляться пароль от сервисов в чистом виде, для хранения нужно использовать **vault**.
:::

Проверить правильность заполнения файла **hosts** можно командой:

```shell
ansible all -m ping
```

Ответ от систем должен содержать информацию о python и pong ответ.

Заполняем файл site.yaml:

```yaml=
---
- name: test ansible site
  become: true
  hosts: all
  gather_facts: no
  roles:
  - test1
```

Пример кусочка playbook. Прописаны параметры для работы со всеми серверами, разрешено поднятие привелегий через sudo.

Основные задачи, которые будут работать в системах прописаны в роли test1.

Содержимое файла main.yaml из директории test1 роли:

```yaml=
---
- name: Test ansible_host
  debug:
    msg: "It works"
    
- name: disable debug shell
  ansible.builtin.systemd:
    name: debug-shell
    enabled: no

- name: Disable CtrlAltDel
  ansible.builtin.file:
    src: /dev/null
    dest: /etc/systemd/system/ctrl-alt-del.target
    state: link
    
- name: 7 times delay
  ansible.builtin.lineinfile:
    path: /etc/systemd/system.conf
    line: CtrlAltDelBurstAction=none
    create: yes
```

В качестве задач используется встроенный модуль для работы с отладочным выводом информации и модулями для работы с файлами.

Для завершения описания проекта необходимо провести создание всех hardering команд через ansible. Задачи можно найти [тут](https://hackmd.io/9vEUj_udSHiwLC8u49pifg).

Запуск ansible после внесения всех изменений выподняется через команду:

```
ansible-playbook -i hosts site.yaml -D
```

Команда позволяет запустить playbook и отслеживать изменения, которые вызывают команды. Для дополнительных модификаций команды можно исползовать либо общие переменные в отдельном файле yaml, либо можно их передавать в командной строке через `--extra-vars`.
## Демо проекты

Проект для настройки сцепки Docker+Vagrant+Ansible для создания системы логирования событий внутри Docker контейнеров. Система может быть автоатически подключена ко всем контейнерам, которые стартуют совместно на системе:

https://lms.cyber-ed.ru/mod/resource/view.php?id=21473


Проект, который рассматривали и дополняли на протяжении второй половины занятия:

https://lms.cyber-ed.ru/mod/resource/view.php?id=21473

