Linux gosu что это такое
Обновлено: 22.11.2024
В этом руководстве мы узнаем, как установить gosu в Ubuntu 20.04.
Что такое госу
Этот простой инструмент вырос из простого факта, что «su» и «sudo» имеют очень странное и часто раздражающее поведение TTY и переадресации сигналов. Они также несколько сложны в настройке и использовании (особенно в случае «sudo»), что обеспечивает большую выразительность, но не работает, если все, что вам нужно, это «запустить это конкретное приложение от имени этого конкретного пользователя и выйти». трубопровода».
Ядро того, как работает «gosu», взято непосредственно из того, как Docker/libcontainer запускает приложение внутри контейнера (и фактически использует код обработки «/etc/passwd» непосредственно из кодовой базы libcontainer). р>
После обработки пользователя/группы мы переключаемся на этого пользователя, затем «выполняем» указанный процесс, а сам «госу» больше не является резидентом или вообще не участвует в жизненном цикле процесса. Это позволяет избежать всех проблем с прохождением сигнала и телетайпом и сводит их к процессу, вызывающему «госу», и к процессу, вызываемому «госу», где они и принадлежат. Это простой инструмент, выросший из простого факта, что «su» и «sudo» имеют очень странное и часто раздражающее поведение TTY и переадресации сигналов. Они также несколько сложны в настройке и использовании (особенно в случае «sudo»), что обеспечивает большую выразительность, но не работает, если все, что вам нужно, это «запустить это конкретное приложение от имени этого конкретного пользователя и выйти». трубопровода».
Ядро того, как работает «gosu», взято непосредственно из того, как Docker/libcontainer запускает приложение внутри контейнера (и фактически использует код обработки «/etc/passwd» непосредственно из кодовой базы libcontainer). р>
После обработки пользователя/группы мы переключаемся на этого пользователя, затем «выполняем» указанный процесс, а сам «госу» больше не является резидентом или вообще не участвует в жизненном цикле процесса. Это позволяет избежать всех проблем с прохождением сигнала и телетайпом и сводит их к процессу, вызывающему «госу», и к процессу, вызываемому «госу», где они и должны быть.
Есть три способа установить gosu в Ubuntu 20.04. Мы можем использовать apt-get, apt и aptitude. В следующих разделах мы опишем каждый метод. Вы можете выбрать один из них.
Установить gosu с помощью apt-get
Обновите базу данных apt с помощью apt-get, используя следующую команду.
После обновления базы данных apt мы можем установить gosu с помощью apt-get, выполнив следующую команду:
Установить gosu с помощью apt
Обновите базу данных apt с помощью следующей команды.
После обновления базы данных apt мы можем установить gosu с помощью apt, выполнив следующую команду:
Установить gosu с помощью aptitude
Если вы хотите следовать этому методу, вам может потребоваться сначала установить aptitude, так как aptitude обычно не устанавливается по умолчанию в Ubuntu. Обновите базу данных apt с помощью aptitude с помощью следующей команды.
После обновления базы данных apt мы можем установить gosu с помощью aptitude, выполнив следующую команду:
Как удалить госу в Ubuntu 20.04
Чтобы удалить только пакет gosu, мы можем использовать следующую команду:
Удалить gosu и его зависимости
Чтобы удалить gosu и его зависимости, которые больше не нужны Ubuntu 20.04, мы можем использовать следующую команду:
Удалить конфигурации и данные gosu
Чтобы удалить конфигурацию и данные gosu из Ubuntu 20.04, мы можем использовать следующую команду:
Удалить конфигурацию gosu, данные и все их зависимости
Мы можем использовать следующую команду для удаления конфигураций госу, данных и всех их зависимостей, мы можем использовать следующую команду:
Ссылки
Обзор
В этом руководстве мы узнаем, как установить gosu в Ubuntu 20.04 с помощью различных инструментов управления пакетами, таких как apt, apt-get и aptitude.
В продолжение моего предыдущего поста об официальных образах Docker в этом посте я расскажу о некоторых советах и методах создания файлов Docker, которые я узнал из официальных образов.
1. Предпочитаю Debian
Большинство файлов Docker для официальных образов основаны на Debian либо напрямую, либо через другой образ. Версия обычно привязана к определенному дистрибутиву, обычно wheezy (на момент написания статьи стабильный дистрибутив), но в некоторых изображениях используется jessie (в процессе тестирования) и даже sid (нестабильный). Основным преимуществом образа Debian является меньший размер — он занимает около 85,1 МБ по сравнению с примерно 200 МБ для Ubuntu. Указание точного дистрибутива защищает вашу сборку от поломки при обновлении дистрибутива с тегом latest.
2. Установить происхождение
Если ваши пользователи должны иметь возможность полагаться на ваш образ и доверять ему, вам необходимо подумать о том, как проверить подлинность любого программного обеспечения, установленного в этом образе. В случае получения apt из официальных репозиториев Debian об этом уже позаботились. Однако если вы загружаете файлы из Интернета или устанавливаете программное обеспечение из стороннего репозитория, вам следует проверить файлы, проверив контрольные суммы или цифровые подписи. Например, файл nginx Dockerfile выполняет следующие действия для проверки пакета nginx:
Обратите внимание, что nginx привязан к определенной версии. Это хорошая идея, поскольку она помогает гарантировать, что образ, протестированный сопровождающим, совпадает с образом, созданным системой сборки. Однако это не является безошибочным, поскольку сам nginx, вероятно, будет использовать зависимости, которые могут меняться со временем (учитывайте зависимости, указанные как >= для данной версии).
Вы можете сделать что-то подобное для любых загруженных файлов, взяв криптографическую сумму файла и проверив сохраненную версию. Это делается в Redis Dockerfile. Кроме того, у некоторых загрузок будет файл подписи, который вы можете протестировать с помощью gpg, что опять же обычно делается в официальных образах.
К сожалению, некоторые официальные образы в настоящее время не делают этого правильно или проверяют только некоторые файлы, поэтому имейте это в виду, просматривая официальные файлы Docker.
3. Удалить зависимости сборки
Если вы компилируете код из исходного кода во время сборки, скорее всего, ваше изображение намного больше, чем должно быть. Если возможно, попробуйте установить инструменты сборки, собрать программное обеспечение и удалить инструменты сборки в одной и той же инструкции RUN. Это неудобно и раздражает, но может сэкономить 100 МБ. Выносить файлы в отдельную инструкцию нет смысла, так как они уже будут запакованы в образ. В качестве примера того, как это сделать, мы можем снова взглянуть на Redis Dockerfile:
gcc, libc и make устанавливаются, используются и удаляются в этой одной инструкции. Также обратите внимание, что автор удалил больше не нужный исходный каталог файла tar.gz. Между прочим, этот код также показывает, как использовать sha1sum для проверки контрольной суммы загрузки Redis.
4. Отъезд госу
Утилита gosu часто используется в скриптах, вызываемых из инструкций ENTRYPOINT внутри Dockerfiles для официальных образов. Это очень простая утилита, похожая на sudo, которая выполняет данную инструкцию от имени данного пользователя. Разница в том, что gosu избегает "странного и часто раздражающего поведения телетайпа и переадресации сигналов" sudo, свойственного sudo.
Также ознакомьтесь с официальным советом по написанию скриптов точки входа, за которым следует большинство официальных изображений
5. Рассмотрим базовый образ buildpack-deps
Некоторые образы "language-stack" Docker основаны на базовом образе buildpack-deps, который устанавливает различные часто требуемые заголовки и инструменты разработки (например, инструменты управления исходным кодом). Если вы создаете образ языкового стека, вы вполне можете сэкономить время, используя этот базовый образ. Он подвергся некоторой критике за добавление ненужного раздувания к образам, что привело к появлению нескольких репозиториев, таких как Node, предлагающих альтернативные пакеты slim, основанные непосредственно на Debian (полный образ Node составляет 728 МБ по сравнению с 291,4 МБ для тонкий). Однако помните, что вашим пользователям могут потребоваться одни и те же библиотеки разработки, и они, скорее всего, уже скачали базовый образ.
6. Используйте ряд описательных тегов
Все официальные репозитории предлагают ряд тегов. Помимо тега latest, хорошим тоном будет предлагать тег версии, который пользователи могут использовать, не опасаясь изменения базового образа и поломки их контейнеров. Официальные образы идут дальше, часто предлагая минимальные slim образы, как обсуждалось выше, а также образы onbuild, которые заботятся об автоматическом импорте и компиляции кода. Пометив это изображение тегом onbuild, пользователь гораздо меньше удивится, когда код перемещается и компилируется при создании дочернего образа.
В Docker всегда была команда USER для запуска процесса от имени конкретного пользователя, но в целом многие вещи приходилось запускать от имени ROOT.
Я видел много изображений, которые используют ENTRYPOINT с gosu для снижения прав запуска процесса.
Меня все еще немного смущает потребность в госу . Разве USER не должно быть достаточно?
Я знаю, что в Docker 1.10 многое изменилось с точки зрения безопасности, но мне все еще не ясно, как рекомендуется запускать процесс в контейнере Docker.
Может ли кто-нибудь объяснить, когда мне следует использовать gosu вместо USER?
Руководство по передовой практике Docker не очень понятно: в нем говорится, что если процесс может работать без привилегий, используйте USER , если вам нужен sudo, вы можете использовать gosu .Это сбивает с толку, потому что можно установить всевозможные вещи как ROOT в Dockerfile, затем создать пользователя и дать ему соответствующие привилегии, а затем, наконец, переключиться на этого пользователя и запустить CMD от имени этого пользователя. Так зачем тогда нам нужны sudo или gosu?
3 ответа 3
Файлы Docker предназначены для создания образов. Я считаю gosu более полезным как часть инициализации контейнера, когда вы больше не можете менять пользователей между командами запуска в вашем Dockerfile.
После того, как образ создан, что-то вроде gosu позволяет вам удалить права root в конце вашей точки входа внутри контейнера. Первоначально вам может понадобиться root-доступ для выполнения некоторых шагов инициализации (исправление uid, разрешений для тома, подключенного к хосту, и т. д.). Затем, после инициализации, вы запускаете конечный сервис без привилегий root и с pid 1 для корректной обработки сигналов.
Enterpoint.sh ищет GID файла /var/lib/docker.sock и обновляет GID пользователя Docker внутри контейнера, чтобы он совпадал. Это позволяет портировать образ на другие хосты докеров, где gid на хосте может отличаться. Для изменения группы требуется root-доступ внутри контейнера. Если бы я использовал USER jenkins в файле докеров, я бы застрял с gid группы докеров, как определено в образе, который не будет работать, если он не соответствует хосту докера, на котором он работает. Но root-права могут быть потеряны при запуске приложения, и здесь на помощь приходит gosu.
В конце скрипта вызов exec не позволяет оболочке разветвить gosu и вместо этого заменяет pid 1 этим процессом. Gosu, в свою очередь, делает то же самое, переключая uid, а затем запуская процесс jenkins, так что он принимает на себя роль pid 1. Это позволяет правильно обрабатывать сигналы, которые в противном случае игнорировались бы оболочкой как pid 1.
Этот простой инструмент вырос из того простого факта, что "su" и "sudo" имеют очень странное и часто раздражающее поведение TTY и переадресации сигналов. Они также несколько сложны в настройке и использовании (особенно в случае «sudo»), что обеспечивает большую выразительность, но терпит неудачу, если все, что вам нужно, это «запустить это конкретное приложение от имени этого конкретного пользователя и выйти». трубопровода".
Ядро того, как работает "gosu", взято непосредственно из того, как Docker/libcontainer запускает приложение внутри контейнера (и фактически использует код обработки "/etc/passwd" непосредственно из кодовой базы libcontainer). р>
После того, как пользователь/группа обработаны, мы переключаемся на этого пользователя, затем "выполняем" указанный процесс, а сам "gosu" больше не является резидентом или вообще не участвует в жизненном цикле процесса. Это позволяет избежать всех проблем с прохождением сигнала и телетайпом и направляет их на процесс, вызывающий «госу», и процесс, вызываемый «госу», где они и принадлежат.
Другие пакеты, интересные к госу
- зависимость
- рекомендации
- предложения
- улучшает
- dep: libc6 (>= 2.17) [arm64, ppc64el] библиотека GNU C: подключаемые библиотеки
также виртуальный пакет, поисковый libc6-udeb dep: libc6 (>= 2.3.6-6~) [i386 ] dep: libc6 (>= 2.4) [не arm64, i386, ppc64el]
Загрузка госу
Эта страница также доступна на следующих этапах (Как установить язык по умолчанию):
Авторские права © 1997 - 2022 SPI Inc.; См. условия лицензии. Debian это торговый знак компании SPI Inc. Об этом сайте.
Читайте также: