softasap.sa_box_bootstap

Статус сборки

Пример использования:

Простой

  roles:
     - {
         role: "sa-box-bootstrap",
         deploy_user: "{{jenkins_user}}",
         deploy_user_authorized_keys: "{{jenkins_authorized_keys}}",
         timezone: "Europe/Kiev"
       }

Расширенный

  vars:
    - root_dir: ..

    - jenkins_user: jenkins
      jenkins_authorized_keys:
        - "{{playbook_dir}}/components/files/ssh/vyacheslav1.pub"
        - "{{playbook_dir}}/components/files/ssh/vyacheslav2.pub"
        - "{{playbook_dir}}/components/files/ssh/vyacheslav3.pub"
        - "{{playbook_dir}}/components/files/ssh/vyacheslav4.pub"
    - timezone: "Europe/Kiev"

  pre_tasks:
    - debug: msg="Раздел предварительных задач"

  roles:
     - {
         role: "sa-box-bootstrap",
         deploy_user: "{{jenkins_user}}",
         deploy_user_key: "{{playbook_dir}}/components/files/ssh/jenkins_rsa",
         deploy_user_pub_key: "{{playbook_dir}}/components/files/ssh/jenkins_rsa.pub",
         deploy_user_authorized_keys: "{{jenkins_authorized_keys}}",

         timezone: "Europe/Kiev",

         option_copy_initial_authorized_keys: true,
         option_enforce_ssh_keys_login: true,
         option_file2ban: true,
         option_firewall: true,
         option_monit: true
       }

Важно: если вы не укажете параметр deploy_user_sudo_password, созданному пользователю для развертывания будет разрешено выполнять команды sudo без подтверждения пароля. Хотя в некоторых случаях это допустимо, наличие дополнительного уровня безопасности никогда не будет лишним, поэтому:

Пользователь развертывания запрашивает пароль sudo

  vars:
    - user_authorized_keys:
        - "~/.ssh/id_rsa.pub"
    - user_sudo_pass: "секрет"

  roles:
     - {
         role: "sa-box-bootstrap",
         deploy_user: "slavko",
         deploy_user_authorized_keys: "{{user_authorized_keys}}",
         deploy_user_sudo_password: "{{user_sudo_pass | password_hash('sha512')}}",
         option_enforce_ssh_keys_login: yes
       }

Если у вас есть пользователь развертывания, который требует ввода пароля sudo, вам необходимо предоставить его через параметр ansible_become_password.

register
$BOX_PLAYBOOK
$BOX_NAME
$BOX_ADDRESS
$BOX_USER
$BOX_PWD

verbose 4
set box_address $BOX_ADDRESS
set ansible_become_password секрет

provision $BOX_NAME

Подготовьте вашу коробку к развертыванию

Предисловие

В наши дни развертывания переместились с физических серверов на быстро запускаемые виртуальные машины, такие как предоставляет Amazon, Digital Ocean, провайдеры на базе OpenStack. Таким образом, конфигурация коробки больше не требует ручных административных шагов. Одним из вариантов являются готовые предварительно сконфигурированные образы коробок. Другой подход — начать с перезагрузки начальной системы и подготовить ее в соответствии с потребностями проекта с помощью таких средств, как Ansible, Chef или Puppet.

Первый шаг в подготовке пользовательского развертывания - это базовая защита коробки, так как в некоторых случаях вы получите только что установленную коробку с паролем root.

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

Задачи, которые нужно решить

В конце статьи мы должны быть в состоянии защитить виртуальный сервер Ubuntu 14.04 LTS.

  • сконфигурировать файрвол, разрешив только порты 22, 443 и 80.
  • зарегистрировать ваши публичные ключи для пользователя развертывания.
  • защитить ssh, разрешив авторизацию только по ключам.
  • установить автоматический процесс, чтобы заблокировать любителей открытого ssh порта из интернета.

Роль загрузки коробки

Ansible имеет хорошую концепцию повторного использования фрагментов развертывания, называемых ролями. Давайте посмотрим, что делает роль sa-box-bootstrap:

Параметры конфигурации

Следующие переменные могут быть переопределены:

  • root_dir - обязательный, рецепты разработчиков Ansible
  • option_enforce_ssh_keys_login (true|false) - следует ли принудительно применять безопасность ssh
  • ufw_rules_default - политика файрвола по умолчанию. В большинстве случаев не изменяется
  • ufw_rules_allow - набор правил для входящих подключений, которые необходимо настроить
  • sshd_config_lines - необходимые изменения в конфигурации SSHD для защиты коробки.
  • option_file2ban - когда true, дополнительно будет установлено средство file2ban
  • whitelistedips - набор ip-адресов, считающихся безопасными - ваш офисный шлюз, сервер сборки и т.д.; Чтобы избежать случайной блокировки

Шаг 1: Включение файрвола

1-й шаг - установка и настройка файрвола ufw:

- include: "{{root_dir}}/tasks_ufw.yml"

по умолчанию применяются следующие правила файрвола (входящие разрешены: http, https и ssh):

ufw_rules_default:
  - {
      policy: deny,
      direction: incoming
    }
  - {
      policy: allow,
      direction: outgoing
    }

ufw_rules_allow:
  - {
      port: 80,
      proto: tcp
     }
  - {
      port: 443,
      proto: tcp
    }
  - {
      port: 22,
      proto: tcp
     }

Вы можете переопределить эти переменные в соответствии с вашими потребностями.

Шаг 2: Создание пользователя развертывания

Если вы собираетесь работать и настраивать эту коробку, скорее всего, вы не захотите делать это от имени root. Таким образом, второй шаг - создать пользователя развертывания, авторизованного по набору предоставленных ssh ключей, которому разрешено быть sudoer без пароля (базовое требование для автоматизированного развертывания):

- include: "{{root_dir}}/use/__create_deploy_user.yml user={{deploy_user}} group={{deploy_user}} home=/home/{{deploy_user}}"
  when: deploy_user is defined

- name: SSH | Авторизовать ключи
  authorized_key: user={{deploy_user}} key="{{ lookup('file', item) }}"
  when: deploy_user_keys is defined
  with_items: "{{deploy_user_keys}}"
  sudo: yes

Вы можете определить пользователя в вашем плейбуке, например, таким образом:

jenkins_user: jenkins
jenkins_authorized_keys:
  - "{{playbook_dir}}/components/files/ssh/vyacheslav.pub"

А затем передать это как параметры в роль:

roles:
   - {
       role: "sa-box-bootstrap",
       root_dir: "{{playbook_dir}}/public/ansible_developer_recipes",
       deploy_user: "{{jenkins_user}}",
       deploy_user_keys: "{{jenkins_authorized_keys}}"
     }

Шаг 3: Защита SSH (по желанию)

- name: SSH | Принудительно применить безопасность ключей SSH
  lineinfile: dest=/etc/ssh/sshd_config regexp="{{item.regexp}}" line="{{item.line}}"
  with_items: "{{sshd_config_lines}}"
  when: option_enforce_ssh_keys_login
  become: true
  tags: ssh

Если переменная option_enforce_ssh_keys_login установлена в true, конфигурация sshd изменяется в соответствии с правилами sshd_config_lines. По умолчанию используется протокол v2, запрещающий вход root, запрещающий аутентификацию по паролю.

Шаг 4: Заблокировать странных людей, которые догадываются о вашем доступе к ssh

Если переменная option_file2ban установлена в true, будет установлено специальное средство file2ban. Оно будет отслеживать неудачные попытки входа в ssh и блокировать нарушителей. Чтобы предотвратить случайную блокировку, хорошая идея - внести свои ip-адреса в белый список, поддерживаются как одиночные IP, так и сетевые маски, например:

whitelistedips:
 - 127.0.0.1
 - 127.0.0.1/8

Создание собственного проекта загрузки коробки

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

  • bootstrap.sh - устанавливает ansible вместе с зависимостями.
  • init.sh - инициализирует
  • .projmodules - полностью совместим с синтаксисом .gitmodules, указывает список зависимостей, которые будут использоваться плейбуком. В частности, он включает в себя ansible- по умолчанию developer_recipes (репозиторий с набором удобных рецептов развертывания) и роль ansible под названием sa-box-bootstrap, отвечающую за шаги по защите коробки.
[submodule "public/ansible_developer_recipes"]
    path = public/ansible_developer_recipes
    url = [email protected]:Voronenko/ansible-developer_recipes.git
[submodule "roles/sa-box-bootstrap"]
        path = roles/sa-box-bootstrap
        url = [email protected]:softasap/sa-box-bootstrap.git
  • hosts - здесь указываются учетные данные начальной коробки, предоставленные вам для сервера:
[bootstrap]
box_bootstrap ansible_ssh_host=192.168.0.17 ansible_ssh_user=ваш_пользователь ansible_ssh_pass=ваш_пароль
  • box_vars.yml - здесь указываются специфические переопределения для вашей среды, такие как ваше предпочтительное имя пользователя для развертывания и ключи.
  • box_bootstrap.yml - здесь вы описываете шаги по развертыванию вашей коробки. Защита коробки - это только первый шаг. Чтобы переопределить параметры для sa-box-bootstrap, передайте параметры, как в приведенном ниже примере.
- hosts: all

  vars_files:
    - ./box_vars.yml
  roles:
     - {
         role: "sa-box-bootstrap",
         root_dir: "{{playbook_dir}}/public/ansible_developer_recipes",
         deploy_user: "{{my_deploy_user}}",
         deploy_user_keys: "{{my_deploy_authorized_keys}}"
       }

Код в действии

Код можно скачать из репозитория https://github.com/Voronenko/devops-bootstrap-box-template. Чтобы его использовать - создайте ответвление, подстройте параметры под свои нужды и используйте. Настройка включает: создание файла box_vars.yml. Вы можете переопределить любые из упомянутых выше переменных. Минимальный необходимый набор - это deploy_user и ваши публичные ключи.

box_deploy_user: jenkins
box_deploy_authorized_keys:
  - "{{playbook_dir}}/components/files/ssh/vyacheslav.pub"

Убедитесь, что у вас установлен ansible (bootstrap.sh для установки) и клонированы каталоги с ролями (init.sh). Затем выполните setup.sh. Если все настроено правильно, вы увидите что-то вроде этого:

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [box_bootstrap]

TASK: [sa-box-bootstrap | Правильное задание имени хоста] ********************
changed: [box_bootstrap]

TASK: [sa-box-bootstrap | отладка var="ufw_rules_allow"] ********************
ok: [box_bootstrap] => {
    "var": {
        "ufw_rules_allow": [
            {
                "port": 80,
                "proto": "tcp"
            },
            {
                "port": 443,
                "proto": "tcp"
            },
            {
                "port": 22,
                "proto": "tcp"
            }
        ]
    }
}

TASK: [sa-box-bootstrap | UFW | Сбросить его] *********************************
ok: [box_bootstrap]

TASK: [sa-box-bootstrap | UFW | Настроить входящие/исходящие правила по умолчанию] ***
ok: [box_bootstrap] => (item={'policy': 'deny', 'direction': 'incoming'})
ok: [box_bootstrap] => (item={'policy': 'allow', 'direction': 'outgoing'})

TASK: [sa-box-bootstrap | UFW | Настроить правила для разрешения входящего трафика] **
ok: [box_bootstrap] => (item={'port': 80, 'proto': 'tcp'})
ok: [box_bootstrap] => (item={'port': 443, 'proto': 'tcp'})
ok: [box_bootstrap] => (item={'port': 22, 'proto': 'tcp'})

TASK: [sa-box-bootstrap | UFW | Настроить правила для разрешения входящего трафика от определенных хостов] ***
skipping: [box_bootstrap] => (item=ufw_rules_allow_from_hosts)

TASK: [sa-box-bootstrap | UFW | Включить его] **********************************
changed: [box_bootstrap]

TASK: [sa-box-bootstrap | Monit | Проверить, установлен ли он] ****************
changed: [box_bootstrap]

TASK: [sa-box-bootstrap | Monit | зависимость libssl-dev] *********************
changed: [box_bootstrap]

TASK: [sa-box-bootstrap | Monit | Скачать] *************************************
changed: [box_bootstrap]

TASK: [sa-box-bootstrap | Monit | Установить] **********************************
changed: [box_bootstrap]

TASK: [sa-box-bootstrap | отладка msg="Создание пользователя развертывания {{my_deploy_user}}:{{my_deploy_user}} с домашней директорией /home/{{my_deploy_user}}"] ***
ok: [box_bootstrap] => {
    "msg": "Создание пользователя развертывания jenkins:jenkins с домашней директорией /home/jenkins"
}

TASK: [sa-box-bootstrap | Пользователь развертывания | Создание группы] *************
changed: [box_bootstrap]

TASK: [sa-box-bootstrap | Пользователь развертывания | Создание пользователя] *************
changed: [box_bootstrap]

TASK: [sa-box-bootstrap | Пользователь развертывания | Проверка наличия ключа] ***************
ok: [box_bootstrap]

TASK: [sa-box-bootstrap | Пользователь развертывания | Копирование authorized_keys из {{ansible_user_id}}] ***
skipping: [box_bootstrap]

TASK: [sa-box-bootstrap | Пользователь развертывания | Установка прав на authorized_keys] ****
skipping: [box_bootstrap]

TASK: [sa-box-bootstrap | Пользователь развертывания | Обеспечение sudoers без запроса пароля] ****
changed: [box_bootstrap]

TASK: [sa-box-bootstrap | SSH | Авторизация ключей] *****************************
changed: [box_bootstrap] => (item=/home/slavko/labs/devops-bootstrap-box-template/components/files/ssh/vyacheslav.pub)

TASK: [sa-box-bootstrap | SSH | Принудительно применить безопасность ключей SSH] ************
ok: [box_bootstrap] => (item={'regexp': '^Protocol.*', 'line': 'Protocol 2'})
changed: [box_bootstrap] => (item={'regexp': '^PermitRootLogin.*', 'line': 'PermitRootLogin no'})
ok: [box_bootstrap] => (item={'regexp': '^RSAAuthentication.*', 'line': 'RSAAuthentication yes'})
ok: [box_bootstrap] => (item={'regexp': '^PubkeyAuthentication.*', 'line': 'PubkeyAuthentication yes'})
ok: [box_bootstrap] => (item={'regexp': '^ChallengeResponseAuthentication.*', 'line': 'ChallengeResponseAuthentication no'})
changed: [box_bootstrap] => (item={'regexp': '^PasswordAuthentication.*', 'line': 'PasswordAuthentication no'})
changed: [box_bootstrap] => (item={'regexp': '^MaxAuthTries.*', 'line': 'MaxAuthTries 3'})

TASK: [sa-box-bootstrap | SSH | Перезапустить SSHD] ***************************
changed: [box_bootstrap]

TASK: [sa-box-bootstrap | Установить базовые пакеты Ubuntu] *********************
changed: [box_bootstrap] => (item=unzip,mc)

PLAY RECAP ********************************************************************
box_bootstrap              : ok=21   changed=13   unreachable=0    failed=0   

В конечном итоге - у вас есть защищенная коробка с пользователем для развертывания с правами sudo, который вы указали, разрешенным только для авторизации с помощью ваших настроенных ключей. Вход root запрещен. Только некоторые входящие порты разрешены в соответствии с вашими правилами.

Проверьте с помощью NMap и попробуйте войти:

ssh  192.168.0.17
Доступ запрещен (publickey).

ssh -ldeploy_user 192.168.0.17
Добро пожаловать в Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-32-generic x86_64)
deploy_user@LABBOX17:~$

Важные моменты

Вы можете повторно использовать этот плейбук для создания собственных проектов загрузки коробок и использовать роль для быстрой настройки ваших окружений безопасным способом с помощью ansible.

О проекте

Role to perform basic securing of fresh instance for further automated deploy

Установить
ansible-galaxy install softasap.sa_box_bootstap
Лицензия
Unknown
Загрузки
1.7k
Владелец
Get your application deployed in a robust way