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