
layerleak — сканер секретов Docker Hub
Ознакомьтесь с CONTRIBUTING.md для руководства по участию.
Опубликованный сайт собирается из web/ на ветке main с помощью .github/workflows/pages.yml. Исходный код документации и симулированная демонстрация браузера находятся в этой директории.
Предварительные требования:
Установка с помощью Go:
go install github.com/brumbelow/layerleak@latest
layerleak --help
Каноническая цель установки — корень модуля. Чтобы явно зафиксировать релиз:
go install github.com/brumbelow/[email protected]
Замените v1.0.0 на опубликованный тег v1.x.y, который вам нужен.
Убедитесь, что ваш GOBIN или GOPATH/bin находится в PATH.
Путь модуля — github.com/brumbelow/layerleak, поэтому go install @latest разрешается в самый высокий опубликованный тег v1.x.y. Релиз модуля v2.x.y потребовал бы изменения пути модуля на github.com/brumbelow/layerleak/v2. Установленные из модуля бинарники сообщают разрешённую версию модуля через layerleak --version; сборки из локальной копии сообщают версию, встроенную Go для этой копии, с понижением до dev, если версия модуля недоступна.
Сборка из исходного кода:
git clone https://github.com/brumbelow/layerleak.git
cd layerleak
go build -o layerleak .
./layerleak --help
Запуск API с помощью контейнерного образа:
docker pull ghcr.io/brumbelow/layerleak:latest
docker run --rm \
-p 8080:8080 \
-e LAYERLEAK_DATABASE_URL='postgres://<user>:<password>@<host>:5432/layerleak?sslmode=disable' \
ghcr.io/brumbelow/layerleak:latest
Контейнерный образ по умолчанию запускает API и устанавливает LAYERLEAK_API_ADDR=0.0.0.0:8080.
Необязательная конфигурация окружения:
cp .env.example .env
Конфигурация результатов и базы данных:
export LAYERLEAK_LOG_LEVEL=info
export LAYERLEAK_FINDINGS_DIR=findings
export LAYERLEAK_API_ADDR=127.0.0.1:8080
export LAYERLEAK_PERSIST_RAW_SECRETS=0
export LAYERLEAK_TAG_PAGE_SIZE=100
export LAYERLEAK_HTTP_TIMEOUT=30s
export LAYERLEAK_MAX_FILE_BYTES=1048576
export LAYERLEAK_MAX_LAYER_BYTES=536870912
export LAYERLEAK_MAX_LAYER_ENTRIES=50000
export LAYERLEAK_MAX_MANIFEST_BYTES=0
export LAYERLEAK_MAX_CONFIG_BYTES=0
export LAYERLEAK_MAX_TAG_RESPONSE_BYTES=8388608
export LAYERLEAK_MAX_REPOSITORY_TAGS=0
export LAYERLEAK_MAX_REPOSITORY_TARGETS=0
export LAYERLEAK_REGISTRY_REQUEST_ATTEMPTS=2
# Необязательные переопределения реестра; обычно оставляйте пустыми.
export LAYERLEAK_REGISTRY_BASE_URL=
export LAYERLEAK_REGISTRY_AUTH_URL=
export LAYERLEAK_DATABASE_URL=postgres://postgres:postgres@localhost:5432/layerleak?sslmode=disable
Те же переменные и их значения по умолчанию находятся в .env.example, который является источником истины для значений по умолчанию.
| Переменная | По умолчанию | Назначение |
|---|---|---|
LAYERLEAK_LOG_LEVEL | info | Уровень логирования: debug, info, warn или error. |
LAYERLEAK_FINDINGS_DIR | не задана | Куда записывать JSON-файлы с результатами. Если не задана, по умолчанию используется findings/ в ближайшей родительской директории, содержащей go.mod, или текущая рабочая директория, если корень репозитория не найден. |
LAYERLEAK_API_ADDR | 127.0.0.1:8080 | Адрес привязки для API-сервера. Контейнерный образ переопределяет это значение на 0.0.0.0:8080. |
LAYERLEAK_PERSIST_RAW_SECRETS | 0 | Установите в 1, чтобы записывать сырые значения секретов и сырые фрагменты контекста на диск и в Postgres. По умолчанию результаты остаются скрытыми. |
LAYERLEAK_HTTP_TIMEOUT | 30s | Тайм-аут на один запрос для каждого вызова реестра (манифесты, блобы, страницы тегов, токены аутентификации). Принимает любую длительность Go (30s, 2m, 1h). |
LAYERLEAK_MAX_FILE_BYTES | 1048576 (1 MiB) | Максимальное количество распакованных байт, буферизованных на один файл внутри слоя. Файлы больше этого размера пропускаются как слишком большие. Должно быть больше нуля. |
LAYERLEAK_MAX_LAYER_BYTES | 536870912 (512 MiB) | Максимальное количество распакованных байт потока слоя на один слой. 0 отключает ограничение. |
LAYERLEAK_MAX_LAYER_ENTRIES | 50000 | Максимальное количество tar-записей на слой. 0 отключает ограничение. |
LAYERLEAK_MAX_MANIFEST_BYTES | 0 | Максимальное количество байт тела манифеста. 0 отключает ограничение. |
LAYERLEAK_MAX_CONFIG_BYTES | 0 | Максимальное количество байт тела конфигурации образа. 0 отключает ограничение. |
LAYERLEAK_MAX_TAG_RESPONSE_BYTES | 8388608 (8 MiB) | Максимальное количество байт на страницу ответа списка тегов реестра. 0 отключает ограничение. |
LAYERLEAK_TAG_PAGE_SIZE | 100 | Размер страницы списка тегов реестра для сканирования всего репозитория. |
LAYERLEAK_MAX_REPOSITORY_TAGS | 0 | Максимальное количество тегов, перечисляемых при сканировании репозитория. 0 отключает ограничение. |
LAYERLEAK_MAX_REPOSITORY_TARGETS | 0 | Максимальное количество различных целей, разрешённых при сканировании репозитория. 0 отключает ограничение. |
LAYERLEAK_REGISTRY_REQUEST_ATTEMPTS | 2 | Количество попыток (включая первую) для каждого запроса к реестру. |
LAYERLEAK_REGISTRY_BASE_URL | не задана | Необязательное переопределение. Обычно layerleak определяет его из ссылки на образ; устанавливайте только для принудительного сканирования через прокси или альтернативную конечную точку. |
LAYERLEAK_REGISTRY_AUTH_URL | не задана | Необязательное переопределение. Обычно определяется из запроса WWW-Authenticate реестра. |
LAYERLEAK_DATABASE_URL | не задана | Если задана, layerleak записывает результаты сканирования в Postgres и завершает команду с ошибкой, если постоянное хранение не удалось. |
Когда любой из лимитов MAX_* установлен в положительное значение, его превышение приводит к сбою сканирования с явной ошибкой, а не к молчаливому усечению работы.
Поведение результатов: