• Русский
  • Настройка Containerfile для сборки пользовательских образов, совместимых с Task

    Обзор функции

    В Tekton для повышения безопасности Tasks могут быть настроены с параметром runAsNonRoot: true, что требует запуска контейнеров от имени непривилегированного пользователя. Поэтому при сборке пользовательских образов необходимо уделять особое внимание конфигурации Containerfile, чтобы обеспечить корректную работу образов в таких Tasks.

    В этом документе описывается, как настроить Containerfile для сборки пользовательских образов, совместимых с Tasks, с акцентом на конфигурацию прав пользователя.

    Сценарии использования

    Следующие ситуации требуют обращения к рекомендациям данного документа:

    • Сборка пользовательского образа для использования в Tasks
    • Возникновение ошибок, связанных с правами доступа, при запуске существующих образов в Tasks
    • Обеспечение соответствия образа требованиям безопасности Tasks

    Предварительные требования

    Перед использованием данной функции убедитесь, что:

    • У вас есть среда для сборки OCI-образов
      • Можно использовать нативный pipeline сборки платформы
      • Если требуется использовать инструменты сообщества/с открытым исходным кодом, обеспечьте доступ в интернет или подготовьте офлайн-пакеты
    • Вы обладаете базовыми знаниями по написанию Containerfile
    • Имеется файл Containerfile и соответствующая конфигурация

    Шаги

    1. Подтвердите базовый образ

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

    # Проверка версии релиза базового образа
    $ podman run -it --rm ${registry} cat /etc/os-release
    
    # Возможные результаты
    NAME="Alpine Linux"
    # или
    NAME="Debian GNU/Linux"
    # или
    NAME="Ubuntu"
    # или
    NAME="CentOS Linux"

    2. Добавьте непривилегированного пользователя

    Добавьте в Containerfile непривилегированного пользователя (рекомендуется использовать UID 65532):

    # В зависимости от базового образа выберите соответствующую команду
    
    # Alpine
    RUN adduser -u 65532 -h /home/nonroot -D nonroot
    
    # Debian
    RUN adduser --home /home/nonroot --uid 65532 nonroot --disabled-password --gecos ""
    
    # Ubuntu
    RUN apt-get update && apt-get install -y adduser \
        && adduser --home /home/nonroot --uid 65532 nonroot --disabled-password --gecos ""
    
    # CentOS
    RUN groupadd -g 65532 nonroot && useradd -u 65532 -U -d /home/nonroot -m nonroot

    3. Установите необходимые права для пользователя (опционально)

    Если пользователю требуется доступ к определённым каталогам или файлам, необходимо добавить соответствующие права:

    # Назначьте владельцем каталога или файла пользователя nonroot
    RUN chown -R nonroot:nonroot /path/to/directory
    
    # Или установите права доступа каталога или файла, позволяющие всем читать и записывать, либо другие минимальные права
    RUN chmod -R a+rwx /path/to/directory

    4. Установите пользователя по умолчанию

    Задайте пользователя по умолчанию в Containerfile (используя UID вместо имени пользователя):

    Поскольку Pods с параметром runAsNonRoot проверяют, что ID пользователя не является root, а не имя пользователя.

    # Установите пользователя по умолчанию nonroot (используя UID)
    USER 65532

    5. Проверьте образ

    После сборки проверьте, что образ запускается корректно:

    # Проверка конфигурации пользователя
    $ podman run -it --rm ${registry} id
    
    # Ожидаемый вывод
    uid=65532(nonroot) gid=65532(nonroot) groups=65532(nonroot)
    
    # Проверка прав доступа приложения
    $ podman run -it --rm ${registry} ls -la /home/nonroot

    Результаты работы

    С данной конфигурацией:

    1. Конфигурация пользователя

      • UID 65532 используется последовательно, что позволяет файлам, создаваемым в нескольких Tasks, иметь согласованные права доступа
      • Обеспечивается наличие у пользователя необходимых прав на рабочие каталоги
      • Избегается использование пользователя root или UID 0
    2. Конфигурация приложения

      • Гарантируется нормальная работа приложений от имени непривилегированного пользователя
      • Необходимые права на каталоги предварительно настраиваются в Containerfile
      • Используется инструкция VOLUME для определения каталогов, которые должны сохраняться
    3. Рекомендации по безопасности

      • Регулярно обновляйте базовый образ для устранения уязвимостей
      • Используйте многоступенчатую сборку для уменьшения размера образа
      • Следуйте принципу наименьших привилегий при настройке прав пользователя

    Устранение неполадок

    Если при запуске образа в Tasks возникают проблемы с правами доступа, можно:

    1. Проверить сообщения об ошибках в событиях Pod
    2. Убедиться в корректности конфигурации пользователя в образе
    3. Проверить, что для приложения настроены необходимые права доступа

    Дополнительная информация