Настройка sudo-профилей и SSH-ключей

При включённой ролевой модели (то есть когда переменная enable_rbac_model имеет значение true — подробнее см. в разделе Включение RBAC) KeyStack автоматически создаёт системных пользователей на всех узлах региона, настраивает правила sudo в /etc/sudoers.d/ и развёртывает SSH-ключи авторизации. Управление этими профилями осуществляется через переменную keystack_sudoers.

Описание переменной keystack_sudoers

keystack_sudoers представляет собой словарь, где ключ — имя системного пользователя, а значение содержит два параметра:

  • sudo — список правил sudoers для пользователя;

  • key — список публичных SSH-ключей для авторизации.

keystack_sudoers:
  <имя_пользователя>:
    sudo:
      - "<правило_sudoers>"
    key:
      - "<публичный_SSH_ключ>"

Платформа содержит встроенный набор пользователей. Пользователь admin имеет предустановленные правила sudo:

keystack_sudoers:
  admin:
    sudo:
      - "ALL=(root) !/usr/bin/su, !/usr/bin/bash, !/usr/bin/sudo, !/usr/bin/sh"
      - "ALL=(root) !/usr/bin/systemctl stop chronyd, !/usr/bin/systemctl stop fapolicyd"
      - "ALL=(root) !/usr/sbin/service stop chronyd, !/usr/sbin/service stop fapolicyd"
      - "ALL=(root) !/usr/bin/vi, !/usr/bin/vim, !/usr/bin/nano, !/usr/bin/tee"
      - "ALL=(root) /usr/bin/systemctl start *, /usr/bin/systemctl restart *, /usr/bin/systemctl status *"
      - "ALL=(root) /usr/bin/dnf update, /usr/bin/dnf upgrade, /usr/bin/dnf install, /usr/bin/dnf remove"
      - "ALL=(root) /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/sbin/groupadd, /usr/sbin/groupdel"
      - "ALL=(root) /usr/bin/journalctl"
      - "ALL=(root) /usr/sbin/ifconfig, /usr/sbin/ip link set *, /usr/sbin/ip addr show, /usr/sbin/ip route show"
    key: []

Пользователь создаётся на узлах только при наличии хотя бы одного непустого правила в sudo. SSH-ключи разворачиваются только при наличии записей в key. Роль не удаляет существующих системных пользователей — она только создаёт и настраивает тех, кто указан в keystack_sudoers.

Настройка пользовательских sudo-профилей

Платформа поддерживает два способа переопределения sudo-профилей: прямое переопределение через файл в репозитории региона и загрузку конфигурации из внешнего Git-репозитория.

Способ 1 — прямое переопределение через globals.d

Разместите YAML-файл в каталоге globals.d/ репозитория региона с полным определением keystack_sudoers. Этот способ полностью заменяет значения по умолчанию — содержимое переменной keystack_sudoers перезаписывается содержимым файла. Пользователи, не указанные в новом определении, перестанут управляться ролью, но не будут удалены с узлов.

Для переопределения через globals.d:

  1. Откройте веб-интерфейс GitLab.

  2. Перейдите в репозиторий региона project_k / deployments / <имя региона>.

  3. Создайте в репозитории региона файл с определением переменной keystack_sudoers, например globals.d/sudoers.yml:

    keystack_sudoers:
      admin:
        sudo:
          - "ALL=(root) /usr/bin/systemctl start *, /usr/bin/systemctl restart *, /usr/bin/systemctl status *"
          - "ALL=(root) /usr/bin/journalctl"
        key:
          - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... admin@example.com"
      monitoring:
        sudo:
          - "ALL=(root) NOPASSWD: /usr/bin/systemctl status *"
        key:
          - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... monitoring@example.com"
    
  4. Создайте новый пайплайн: Build > Pipelines > New Pipeline.

  5. Запустите пайплайн, нажав кнопку New pipeline.

  6. Дождитесь завершения выполнения задач на шаге setup.

  7. Запустите задачу bootstrap-servers и дождитесь её завершения.

Способ 2 — переопределение через globals_override из внешнего репозитория

Определите переменную globals_override для загрузки конфигурации из удалённого Git-репозитория. Этот способ объединяет загруженные значения с существующими через Ansible-фильтр combine, что позволяет добавлять новых пользователей без потери значений по умолчанию. Если пользователь уже существовал, его привилегии будут переопределены в соответствии с указанными в globals_override.

Для переопределения через внешний репозиторий:

  1. Откройте веб-интерфейс GitLab.

  2. Перейдите в репозиторий региона project_k / deployments / <имя региона>.

  3. В файле конфигурации региона (globals.yml или globals.d/override.yml) укажите переменную globals_override:

    globals_override:
      - repo: "https://gitlab.example.com/infra/keystack-overrides.git"
        reference: "main"
        files:
          - "sudoers.yml"
    

    Параметры каждого элемента списка:

    • repo — URL Git-репозитория (HTTP/HTTPS или SSH);

    • reference — ветка или тег для клонирования;

    • files — файл или список файлов для загрузки из репозитория;

    • auth (необязательный) — учётные данные для HTTP-аутентификации в формате user:password или token. Значение подставляется в URL перед хостом (https://<auth>@gitlab.example.com/...).

    Пример с аутентификацией:

    globals_override:
      - repo: "https://gitlab.example.com/infra/keystack-overrides.git"
        reference: "v1.0"
        files:
          - "sudoers.yml"
          - "custom_vars.yml"
        auth: "<user>:<token>"
    
  4. Файл sudoers.yml во внешнем репозитории должен содержать переменную keystack_sudoers с дополнительными пользователями, например:

    keystack_sudoers:
      backup_operator:
        sudo:
          - "ALL=(root) NOPASSWD: /usr/bin/rsync, /usr/bin/tar"
        key:
          - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... backup@example.com"
    
  5. Создайте новый пайплайн: Build > Pipelines > New Pipeline.

  6. Запустите пайплайн, нажав кнопку New pipeline.

  7. Дождитесь завершения выполнения задач на шаге setup.

  8. Запустите задачу bootstrap-servers и дождитесь её завершения.

  9. В результате объединения пользователь backup_operator будет добавлен к существующим пользователям по умолчанию.

Проверка настройки

После развёртывания подключитесь к любому узлу региона и выполните проверки:

  1. Убедитесь, что пользователь создан:

    $ id admin
    uid=998(admin) gid=997(admin) groups=997(admin)
    
  2. Проверьте правила sudo для пользователя:

    $ sudo cat /etc/sudoers.d/admin
    
    # Sudo permissions for admin
    admin ALL=(root) !/usr/bin/su, !/usr/bin/bash, !/usr/bin/sudo, !/usr/bin/sh
    admin ALL=(root) !/usr/bin/systemctl stop chronyd, !/usr/bin/systemctl stop fapolicyd
    
  3. Проверьте SSH-ключи (если ключи были добавлены в key):

    $ sudo cat /home/admin/.ssh/authorized_keys
    ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... admin@example.com