🔐 Безопасность
Введение
Безопасность — главный приоритет Semaphore UI. Автоматизируете ли вы критически важные инфраструктурные задачи или управляете доступом команды к чувствительным системам, Semaphore UI изначально спроектирован для надёжной и безопасной работы. В этом разделе описано, как Semaphore обеспечивает безопасность и что следует учитывать при развёртывании в production.
Аутентификация и авторизация
Semaphore поддерживает безопасную аутентификацию и гибкие механизмы авторизации:
-
Способы входа:
-
Имя пользователя и пароль
Способ по умолчанию, использующий учётные данные из базы данных Semaphore. Пароли никогда не хранятся в открытом виде; они хешируются алгоритмом Argon2id (см. Хеширование паролей). -
LDAP
Позволяет интегрироваться с корпоративными службами каталогов. Поддерживает фильтрацию пользователей и групп, а также защищённые соединения через LDAPS. -
OpenID Connect (OIDC)
Обеспечивает единый вход с провайдерами идентификации, такими как Google, Azure AD или Keycloak. Поддерживает пользовательские claim-ы и сопоставление групп.
-
-
Двухфакторная аутентификация (2FA)
Доступна двухфакторная аутентификация на основе TOTP, и её рекомендуется включить всем пользователям. Она включается для каждого пользователя и поддерживает необязательные коды восстановления. См. параметры конфигурацииmfa.totp.enabledиmfa.totp.allow_recovery. -
Управление доступом на основе ролей
Пользователям можно назначать разные роли, например Admin, Maintainer или Viewer, ограничивая доступ в соответствии с зоной ответственности. -
Управление сеансами
Сеансы защищены безопасными HTTP-куками. Истечение срока сеанса и механизмы выхода сводят время экспозиции к минимуму.
Хеширование паролей
Хеширование паролей алгоритмом Argon2id доступно начиная с Semaphore 2.20. Более ранние версии используют bcrypt.
Пароли локальных пользователей хешируются алгоритмом Argon2id, который OWASP рекомендует для хранения паролей. Semaphore использует минимальные параметры стойкости, рекомендованные OWASP:
| Параметр | Значение |
|---|---|
| Память | 19 МиБ (m=19456) |
| Итерации | 2 (t=2) |
| Параллелизм | 1 (p=1) |
| Соль | 16 случайных байт на пароль |
| Длина хеша | 32 байта |
Хеши хранятся в стандартном формате строки PHC, например $argon2id$v=19$m=19456,t=2,p=1$<salt>$<hash>, поэтому параметры, использованные для каждого хеша, записываются вместе с ним.
Это относится ко всем способам задания пароля: через веб-интерфейс, через API и через команды CLI semaphore user add, semaphore user change-by-login и semaphore setup.
Обновление с версий до 2.20. В выпусках до 2.20 пароли хешировались с помощью bcrypt. Отдельный шаг миграции не требуется:
- Существующие хеши bcrypt по-прежнему принимаются при входе, поэтому после обновления все пользователи продолжают работать.
- При первом успешном входе пароль прозрачно перехешируется алгоритмом Argon2id, а хеш bcrypt заменяется.
- Если в будущем выпуске параметры Argon2id в Semaphore будут усилены, хеши, созданные со старыми параметрами, обновятся тем же способом при следующем входе.
Поскольку перехеширование происходит только при входе, у пользователей, которые больше никогда не войдут, сохранится хеш bcrypt. Чтобы принудительно обновить такие учётные записи, сбросьте их пароль командой semaphore user change-by-login --password ... или через интерфейс администратора.
Коды восстановления для двухфакторной аутентификации не являются паролями пользователей и продолжают использовать bcrypt.
Секреты и учётные данные
Безопасное управление секретами — ключевая возможность:
-
Зашифрованное хранилище ключей
Учётные данные и секретные переменные шифруются при хранении с помощью AES. -
Изоляция окружения
Секреты передаются заданиям только во время выполнения и не попадают напрямую в окружение контейнера. -
SSH-ключи и токены
Пользователи сами отвечают за загрузку корректных SSH-ключей и токенов. Они шифруются и используются только при выполнении задач. -
Интеграция с HashiCorp Vault (Pro)
Секреты могут храниться во внешнем экземпляре Vault. Хранилище выбирается для каждого секрета при его создании или изменении.
Шифрование данных
Чувствительные данные хранятся в базе данных в зашифрованном виде. Чтобы включить шифрование ключей доступа, задайте в файле конфигурации параметр access_key_encryption. Его нужно сгенерировать командой:
head -c32 /dev/urandom | base64
Выполнение недоверенного кода и playbook
Semaphore выполняет заданные пользователем playbook и команды, что может быть рискованно:
-
Изоляция выполнения
По умолчанию задача — это обычный процесс на сервере Semaphore, с его файловой системой и сетевым доступом. Изоляция включается отдельно: передайте задачу раннеру с исполнителемdockerилиk8s, и для каждой задачи создаётся новый контейнер или Pod, который удаляется после завершения. -
Минимальные привилегии
В исполнителях Docker и Kubernetes вы сами выбираете образ, сеть и сервисный аккаунт, поэ тому задача получает только то, что ей нужно. -
Выполнение в chroot
Semaphore может выполнять задачи внутри chroot-окружения, дополнительно изолируя среду выполнения от хост-системы. -
Пользователь процесса задачи
Задачи могут выполняться от имени выделенного системного пользователя без прав root (например,semaphore), чтобы снизить последствия возможных эксплойтов. Это необязательно и настраивается в соответствии с политиками системы.
Безопасное развёртывание
Чтобы развернуть Semaphore безопасно:
-
Используйте HTTPS
Semaphore поддерживает HTTPS как через встроенную поддержку TLS, так и через обратный прокси, например Nginx. В production настоятельно рекомендуется включить HTTPS.Чтобы включить встроенную поддержку HTTPS, добавьте следующий блок в config.json:
{
...
"tls": {
"enabled": true,
"cert_file": "/path/to/cert/example.com.cert",
"key_file": "/path/to/key/example.com.key"
}
...
} -
Работайте за межсетевым экраном
Ограничьте доступ к интерфейсу Semaphore и базе данных только доверенными IP-адресами. -
Безопасность базы данных
Используйте надёжные пароли и разрешайте доступ к базе данных только для Semaphore.
Обновления и управление патчами
Обновления безопасности публикуются регулярн о:
-
Обновляйтесь
Всегда используйте последний стабильный выпуск. -
Список изменений
Перед обновлением просматривайте изменения на GitHub. -
Автоматические обновления
При использовании Docker рассмотрите автоматизацию регулярных обновлений через конвейеры.
Сообщение об уязвимостях
Нашли уязвимость? Помогите нам сохранить безопасность Semaphore:
- Ответственное раскрытие
Напишите нам на[email protected].
Целевые сроки устранения уязвимостей
Мы стремимся устранять полученные сообщения об уязвимостях в следующие сроки:
- Критические: в течение 30 дней
- Высокие: в течение 60 дней
- Средние: в течение 90 дней
- Низкие: по возможности, обычно в течение 180 дней
Для активно эксплуатируемых проблем, затрагивающих последние стабильные выпуски, могут выпускаться внеочередные патчи.
Инструменты анализа безопасности кода
Мы используем CodeQL, Codacy, Snyk и Renovate для анализа кодовой базы и зависимостей, а также для автоматизации обновления зависимостей.
-
Без публичных эксплойтов
Не публикуйте информацию об уязвимостях до выхода исправления. -
Благодарности
Исследователи безопасности по желанию могут быть упомянуты в примечаниях к выпуску.