# Практика для занятия "Безопасность на уровне ОС"
Для практики понадобится:
- [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**.
Пример того как может выглядеть иерархия директорий:

После создания необходимых директорий и файлов можно приступить к заполнению файлов. Первым заполняется файл 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