
Как запретить пользователю моего предварительно созданного контейнера Docker доступ к оболочке в запущенном экземпляре этого контейнера? Я погуглил и прочитал все посты, которые связаны с этим сценарием, и не нашел работающего решения. Я пытаюсь запретить доступ к определенному ресурсу в контейнере, ради этого расследования, скажем, это серийный номер в файле конфигурации. Я основываюсь наЯва:7изображение, которое основано наубунтуизображение.
Чтобы протестировать свое решение, выполните следующие действия:
Создайте и запустите свой Docker-контейнер
Экспортируйте свой контейнер
docker export [имя контейнера] | gzip -c > mycontainer.tar.gz
Импортируйте свой контейнер во внешнюю систему
gzip -dc mycontainer.tar.gz | docker import - [имя контейнера]
Запустить контейнер
Выполните команду Shell в работающем контейнере, используя любой/все из следующих методов:
docker exec -it [имя контейнера] bash
прикрепить докер [имя контейнера]
docker run -ti --entrypoint=/bin/bash [имя контейнера]
[имя контейнера] — имя вашего контейнера
bash, dash и sh — все это допустимые оболочки
решение1
В дополнение к ответу Хосе, есть еще одно решение...
docker exec :id -it /bin/rm -R /bin/*
Это избавляет от sh и любой полезной команды bin в Linux. Я не уверен, что вы сделаете, чтобы попасть в контейнер в этот момент. Хотя я знаю, что вы можете использовать отладчик памяти, чтобы получить переменные окружения работающего контейнера, но это делает его еще более раздражающим... Интересно, есть ли способ заблокировать эту память в кольце 0 и полностью лишить ssh-доступа к хосту.
Если кто-то знает, как это взломать, мне было бы интересно узнать.
РЕДАКТИРОВАТЬ
Вам следует использовать docker secrets, если вы защищаете конфиденциальную информацию. Проверьте:
решение2
Что касается bash
команды, я добавил ее в файл .bashrc exit
в конце файла, чтобы пользователь входил в систему и в конце концов выходил из нее, но пользователи по-прежнему могли использовать sh
команду.
решение3
Если информация, которую вы хотите защитить, является серийным номером, то шифрование этой информации является единственным надежным способом ее защиты. Вы можете выбрать различные способы шифрования секретных данных, убедитесь, что используете надежный ключ. Вы также можете заставить свое приложение отправлять секретные данные на ваш сервер для определения их действительности, и на основе ответов с вашего сервера приложения могут продолжить работу или остановиться и показать сообщения.
Короче говоря, всегда предполагайте, что ваше приложение может быть полностью и тщательно разобрано. Всегда шифруйте все секретные и важные данные с помощью сильного ключа, чтобы взлом ключа занял очень много времени (предположим, что алгоритм шифрования общедоступный или общеизвестный).
Даже если вы найдете способ предотвратить доступ, это лишь даст ложное чувство безопасности.