barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

четверг, 16 декабря 2021 г.

Подписывание docker-образов без docker cli

Задача

Нужно подписывать docker-образы подписями, совместимыми с docker trust, однако без использования docker-демона (т.к. подписание происходит в CI/CD без доступа к демону).

Решение

Для формирвания подписи необходимо 2 инструмента: 

  • notary cli для формирования подписи и ее загрузки на notary-сервер
  • skopeo для получения данных из манифеста подписываемого образа (умеет в т.ч. работать с докер-registry, а не только с локальным хранилищем образом, позволяя получать манифесты без pull'а самих образов)
# Если есть готовый docker-конфиг с учетками для авторизации в нужном docker registry,
# то указываем его для skopeo
export REGISTRY_AUTH_FILE=$HOME/.docker/config.json
# Вычислям хэш и размер манифеста докер-образа
MANIFEST_HASH=`skopeo inspect --raw docker://$IMAGE_NAME:$IMAGE_VERSION | sha256sum`
MANIFEST_HASH=${MANIFEST_HASH:0:64}
MANIFEST_SIZE=`skopeo inspect --raw docker://$IMAGE_NAME:$IMAGE_VERSION | wc -c`
# импортируем ключ для подписания из файла delegation.key (используемый рандомный passphrase)
export NOTARY_DELEGATION_PASSPHRASE=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c10)
notary key import ~/delegation.key -d ~/.docker/trust
# собственно подписание и загрузка подписи на Notary-сервер (с debug-выводом)
notary -D addhash -p $IMAGE_NAME $IMAGE_VERSION "$MANIFEST_SIZE" --sha256 "$MANIFEST_HASH" -r targets/releases -s https://my.notary.server -d ~/.docker/trust
Важный моментом является использование роли targets/releases при формировании подписи. Docker trust доверяет только этой роли, а также роли targets. Если использовать другую роль, докер будет считать, что образ не подписан (см. https://github.com/notaryproject/notary/blob/master/docs/advanced_usage.md#use-delegations-with-content-trust).

вторник, 30 ноября 2021 г.

apt-get: почему возникает "The following packages have been kept back" при upgrade

Причина - у пакета поменялись зависимости, поэтому его обновление хоть и возможно, но повлечет установку новых пакетов-зависимостей. По-умолчанию такой пакет не обновляется, а выводится в списке после сообщения "The following packages have been kept back...". Чтобы все равно обновить такой пакет, apt-get upgrade нужно запускать с флагом --with-new-pkgs.

понедельник, 8 ноября 2021 г.

Запуск tcpdump на заданное количество секунд

Задача

Нужно в bash-скрипте запустить tcpdump, чтобы он отработал N секунд и завершился.

Решение

Как вариант - запуск с помощью команды timout:

timeout --preserve-status {N} tcpdump ...

Здесь {N} нужно заменить на необходимое количество секунд. Если не установить опцию --preserve-status, комадна будет всегда завершаться с ненулевым статусом (сигнализируя о наступлении таймаута). Если это не критично - опцию можно убрать.

Есть более элегантный вариант:

tcpdump -G {N} -W 1 -w myfile ...

, предложенный тут https://stackoverflow.com/questions/25731643/how-to-schedule-tcpdump-to-run-for-a-specific-period-of-time. Идея в том, чтобы задать ротацию по времени выходных файлов-дампов, и установить максимум в 1 файл. Однако, работоспособность такого варианта зависит от наличия трафика на интерфейсе и установленных в tcpdump фильтрах. Если вдруг окажется, что никакой трафик не удовлетворяет условиям установленного фильтра, то tcpdump зависнет навечно, вместо того, чтобы быть завершенным через {N} секунд. Tcpdump будет считать, что раз выходной файл пустой, то и ротировать его по истечении {N} секунд не нужно.

Kubernetes: как снять дамп трафика с Enthernet-интерфейсов узла, не подключаясь к узлу

Задача

Нужно снять дамп трафика с Enternet-интерфейсов одного из узлов Kubernetes-кластера. При этом ssh-доступа к самому узлу нет.

Решение

Деплоим на узел pod с hostNetwork = true. Pod оказывается подключенным к root network namespace, ему оказываются непосредственно видны физические ethernet-интерфейсы. Далее дело за малым - запустить tcpdump (например, можно взять для этого образ corfr/tcpdump).

Windows 10 игнорирует DHCP и использует DNS-сервер непонятно откуда

Проблема

При работе в своей домашней WiFi-сети у меня в один период была необходимость отключить на своем Windows-ноутбуке DHCP и прописать настройки сети вручную (включая DNS-сервер 192.168.1.1). Однако, когда я после этого попробовал воспользоваться интернетом, раздаваемым с телефона, то столкнулся с тем, что он не работает. Проверил настройки - DHCP для этой сети включен. Все настройки приходят корректно, кроме DNS - он почему-то установился в 192.168.1.1, хотя должен был быть а-ля 192.168.202.200. 

ipconfig /flushdns и ipconfig /renew, перезагрузки, выкл/вкл WiFi, удаление сети и подключение к ней по новой - ничего не помогло. 192.168.1.1 снова и снова появляся каким-то магическим образом. Причем я даже зашел в настройки подключения к домашней сети, и вернул там DHCP. После этого 192.168.1.1 больше нигде не фигурировал в настройках, но все равно упорно появлялся при подключении к раздаваемому с телефона WiFi.

Решение

Спасибо https://superuser.com/questions/1323938/windows-10-wifi-sets-wrong-dns-server-when-connecting-to-wifi-networks. Нужно зайти в реестр Windows и очистить значение ключа:

Computer\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces\{*interface-UUID*}\ProfileNameServer

Когда установлено, оно перезатирает адрес DNS-сервера, получемый по DHCP. Ох.

понедельник, 23 августа 2021 г.

RStudio: ошибка "Error in png ... unable to start png() device ... unable to open file 'xxx.png' for writing ... opening device failed"

 При попытке сделать knit в RSturio получаю ошибку:

 Error in png(..., res = dpi, units = "in") : unable to start png() device

Calls: <Anonymous> ... in_dir -> plot2dev -> do.call -> <Anonymous> -> png

In addition: Warning messages:

1: In png(..., res = dpi, units = "in") :

  unable to open file 'inf_for_categorical_data_Coursera_files/figure-html/us-atheism-ci-1.png' for writing

2: In png(..., res = dpi, units = "in") : opening device failed

Причина, как ни странно, в антивирусе Avast! - он молча блокировал создание png-шек.

пятница, 11 июня 2021 г.

Minikube и ingress

Ingress активируется в minikube командой:

minikube addons enable ingress

После этого, чтобы достучаться до ингресса, нужно узнать виртуальный IP миникуба командой:

minikube ip

И вуаля, по этому IP можно достучаться до ингресса.

четверг, 29 апреля 2021 г.

Экспорт конфигурации Kong Gateway с помощью deck

Предполагается, что Kong развернут в Kubernetes:

kubectl port-forward service/kong-apigateway-admin 8001:8001

docker run kong/deck dump --kong-addr http://host.docker.internal:8001 --headers "kong-admin-token:***********" -o '-' > kong.yaml