Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.
Эта статья приняла участие"Проект "Звезда раскопок"", чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
Дело в том, что некоторое время назад, на выходных, я сидел за едой, когда вдруг получил смс:
какова ситуация? Можно ли майнить мой небольшой личный сервер? Вспоминая об этом, я не думал, что то, что я сделал раньше, могло вызвать операцию майнинга, пока два часа спустя я не получил сигнал тревоги текстового сообщения:
порт? Когда я упомянул порт, я вспомнил, что накануне открыл порт 2375, потому что хотел подключиться к докеру на сервере с идеей. Что касается конкретной операции, то это просто изменение файла конфигурации./usr/lib/systemd/system/docker.service/usr/lib/systemd/system/docker.servicevv, изменил следующее:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Добавил фразу после этого:
-H tcp://0.0.0.0:2375
Таким образом открывается порт 2375. Через этот порт по идее можно настраивать докер, а образ можно загружать при упаковке:
Через этот порт мы можем получить прямой доступ к удаленномуdocker daemonВыполнено.
первая помощь
Теперь, когда мы обнаружили проблему, мы должны немедленно с ней справиться. Придя домой, я сразу закрыл доступ к внешней сети на порту 2375 в настройках безопасности:
Взгляните на информацию о тревоге в фоновом режиме:
использоватьkillКоманда, чтобы убить этот процесс:
Ну и процесс в этот раз тоже убит, и доступ порта во внешнюю сеть тоже закрыт.Все должно быть нормально, да? Неожиданно после 7 часов вечера последовательно поступили два предупреждающих сообщения:
использоватьpsИнструкция смотрит на процесс 13102, но его не находит. проверить этоmasscanпроцесс, способный найти, этоmasscanЭто инструмент сканирования портов, который может быстро выполнять сканирование портов в соответствии с диапазоном IP-адресов и номеров портов:
Кстати, родительский процесс опрашиваетсяpid, фактически используетсяportainer, даже графический интерфейс управления докером помог мне его установить. Обратите внимание, что убийствоmasscanПеред процессом обязательно убить родительский процесс, иначеmasscanПроцесс продолжает перезапускаться.
Посмотрите на процесс 32452 второго будильника, вы можете найтиdocker-cacheпроцесс, используяkillНикакой перезагрузки после убийства не произойдет.
Остановите запуск контейнеров и удалите:
удалить майнингimage:
Измените файл конфигурации и удалите порт 2375.tcpПодключитесь, затем перезапустите докер:
systemctl daemon-reload
systemctl start docker
Принцип вторжения
На этом этапе сначала резюмируйте, почему хост может быть захвачен через порт 2375?
- пара докеров
user namespaceИзоляции нет, то есть внутренняя часть контейнераrootПользователь является хостомrootПользователь после монтирования каталога может использоватьrootУдостоверение пользователя произвольно изменило смонтированную файловую систему. - Служба докеров имеет высокие права на выполнение (эквивалентно
root), а обычные пользователи из группы пользователей docker могут выполняться без какой-либо дополнительной аутентификации.docker runкоманда ожидания - незащищенный
docker remoteПорт API, если не включенsslЕсли проверка подтверждена, любая машина, которая может подключиться к хосту докера, может управлять хостом докера по своему желанию.docker daemon
Исправлена ошибка
Итак, как исправить эту уязвимость?Посмотрев информацию, docker сам предоставляет зашифрованный порт удаленного управления 2376, который может быть предоставлен с сертификатом CA.TLSсвязаны.
Сначала подготовьте 5 файлов сертификатов и ключей, которыеca.pem,server-cert.pem,server-key.pem,client-cert.pemа такжеclient-key.pem. в,server-cert.pemСписок клиентов, которые могут получить доступ к хосту Docker, ограничен в .
запускатьdocker deamon, вам нужно установить-H,–tls,–tlscacert=ca.pem,–tlscert=server-cert.pemа также–tlskey=server-key.pem. На данный момент только хосты в списке клиентов могут получить доступ к хосту докера.
1. Сгенерируйте закрытый ключ ЦСca-key.pem, используйте закрытый ключ для подписи сертификата ЦС
openssl genrsa -out ~/docker/ca-key.pem 4096
2. Используйте закрытый ключ ЦС для создания самозаверяющего сертификата ЦС.ca.pem. При генерации сертификата передать-days 365Установить срок действия сертификата. Единица измерения — дни, по умолчанию — 30 дней.
openssl req -x509 -sha256 -batch -subj '/C=CN/ST=Sichuan/L=Chengdu/O=Ghostcloud Co.,Ltd/OU=Laboratory/CN=www.ghostcloud.cn' -new -days 365 -key ~/docker/ca-key.pem -out ~/docker/ca.pem
3. Сгенерируйте закрытый ключ сервераserver-key.pemа такжеCSR(Certificate Signing Request)server-csr.pem
openssl genrsa -out ~/docker/server-key.pem 4096
openssl req -subj '/CN=DockerDaemon' -sha256 -new -key ~/docker/server-key.pem -out ~/docker/server-csr.pem
4. Используйте сертификат ЦС для создания сертификата сервера.server-cert.pem. При подключении с помощью TLS необходимо ограничить список IP-адресов клиента или список доменных имен. Только клиенты из списка могут получить доступ через клиентский сертификатdocker daemon
echo subjectAltName = IP:127.0.0.1,IP:192.168.1.100 > ~/docker/allow.list
openssl x509 -req -days 365 -sha256 -in ~/docker/server-csr.pem -CA ~/docker/ca.pem -CAkey ~/docker/ca-key.pem -CAcreateserial -out ~/docker/server-cert.pem -extfile ~/docker/allow.list
5. Сгенерируйте закрытый ключ клиентаclient-key.pemа такжеCSRclient-csr.pem
openssl genrsa -out ~/docker/client-key.pem 4096
openssl req -subj '/CN=DockerClient' -new -key ~/docker/client-key.pem -out ~/docker/client-csr.pem
6. Используйте сертификат ЦС для создания сертификата клиента.client-cert.pem. нужно присоединитьсяextendedKeyUsageОпции
echo extendedKeyUsage = clientAuth > ~/docker/options.list
openssl x509 -req -days 365 -sha256 -in ~/docker/client-csr.pem -CA ~/docker/ca.pem -CAkey ~/docker/ca-key.pem -CAcreateserial -out ~/docker/client-cert.pem -extfile ~/docker/options.list
7. Необходимый сертификат и ключ успешно сгенерированы, и временный файл можно удалить.
rm -f ~/docker/server-csr.pem ~/docker/client-csr.pem ~/docker/allow.list ~/docker/options.list
8. Для обеспечения безопасности сертификата и закрытого ключа необходимо изменить права доступа к файлу
chmod 0444 ~/docker/ca.pem ~/docker/server-cert.pem ~/docker/client-cert.pem
chmod 0400 ~/docker/ca-key.pem ~/docker/server-key.pem ~/docker/client-key.pem
9. Перезагрузкаdocker daemon,Присоединяйсяca.pem,server-cert.pemа такжеserver-key.pem.-H=0.0.0.0:2376выражатьdocker daemonслушаю порт 2376
docker daemon --tlsverify --tlscacert=~/docker/ca.pem --tlscert=~/docker/server-cert.pem --tlskey=~/docker/server-key.pem -H=0.0.0.0:2376
10. На клиенте при запуске команды docker добавляемca.pem,client-cert.pemа такжеclient-key.pem
docker --tlsverify --tlscacert=~/docker/ca.pem --tlscert=~/docker/client-cert.pem --tlskey=~/docker/client-key.pem -H=tcp://127.0.0.1:2376 info
Containers: 41 Running: 16 Paused: 0 Stopped: 25 Images: 821 Server Version: 1.10.3
Таким образом, вы можете безопасно управлять хостом докера удаленно.
Наконец
Если вы считаете, что это полезно для вас, вы можете поставить лайк и отправить его, большое спасибо
публика
码农参上, добавить в друзья, быть другом