Что такое Clair?

Clair — это open-source инструмент статического анализа уязвимостей в контейнерах, разработанный компанией CoreOS. Он сканирует образы контейнеров на предмет известных уязвимостей безопасности и предоставляет детальные отчеты о найденных проблемах.

Основные возможности Clair

  • Статический анализ — сканирование образов контейнеров без их запуска
  • Поддержка дистрибутивов — Ubuntu, Debian, CentOS, RHEL, Alpine, Oracle Linux
  • База данных уязвимостей — регулярные обновления из различных источников
  • API интерфейс — REST API для интеграции в CI/CD pipeline
  • Масштабируемость — горизонтальное масштабирование для больших объемов
  • Интеграции — поддержка Docker Registry, Kubernetes

Архитектура Clair

Clair состоит из нескольких компонентов:

  • Clair API — основной сервис анализа
  • PostgreSQL — база данных уязвимостей и результатов
  • Updaters — модули обновления базы уязвимостей
  • Matchers — модули сопоставления пакетов с уязвимостями

Установка Clair

Установка через Docker Compose:

 1version: '3.8'
 2services:
 3  postgres:
 4    image: postgres:13
 5    environment:
 6      POSTGRES_DB: clair
 7      POSTGRES_USER: clair
 8      POSTGRES_PASSWORD: password
 9    volumes:
10      - postgres_data:/var/lib/postgresql/data
11
12  clair:
13    image: quay.io/coreos/clair:v4.7.0
14    restart: unless-stopped
15    depends_on:
16      - postgres
17    ports:
18      - "6060:6060"
19      - "6061:6061"
20    environment:
21      CLAIR_CONF: /config/config.yaml
22      CLAIR_MODE: combo
23    volumes:
24      - ./config.yaml:/config/config.yaml:ro
25
26volumes:
27  postgres_data:

Конфигурационный файл config.yaml:

 1http_listen_addr: ":6060"
 2introspection_addr: ":6061"
 3log_level: info
 4
 5indexer:
 6  connstring: host=postgres port=5432 user=clair dbname=clair password=password sslmode=disable
 7  scanlock_retry: 10
 8  layer_scan_concurrency: 5
 9  migrations: true
10
11matcher:
12  connstring: host=postgres port=5432 user=clair dbname=clair password=password sslmode=disable
13  max_conn_pool: 100
14  migrations: true
15
16updaters:
17  sets:
18    - "ubuntu"
19    - "debian"
20    - "rhel"
21    - "alpine"
22  interval: "6h"

Использование Clair API

Пример сканирования образа через Python:

 1import requests
 2import json
 3
 4# Конфигурация Clair
 5CLAIR_URL = "http://localhost:6060"
 6
 7def scan_image(image_name, image_tag="latest"):
 8    """Сканирование Docker образа"""
 9    
10    # Создание манифеста для сканирования
11    manifest = {
12        "hash": f"{image_name}:{image_tag}",
13        "layers": [
14            {
15                "hash": "layer1",
16                "uri": f"docker://{image_name}:{image_tag}",
17                "headers": {}
18            }
19        ]
20    }
21    
22    # Отправка на сканирование
23    response = requests.post(
24        f"{CLAIR_URL}/indexer/api/v1/index_report",
25        json=manifest
26    )
27    
28    if response.status_code == 201:
29        # Получение результатов
30        report_id = response.json()["manifest_hash"]
31        
32        vuln_response = requests.get(
33            f"{CLAIR_URL}/matcher/api/v1/vulnerability_report/{report_id}"
34        )
35        
36        if vuln_response.status_code == 200:
37            return vuln_response.json()
38    
39    return None
40
41# Использование
42results = scan_image("nginx", "latest")
43if results:
44    print(f"Найдено уязвимостей: {len(results.get('vulnerabilities', []))}")

Установка Python клиента:

1pip install requests
2# или
3poetry add requests

Интеграция с CI/CD

Пример интеграции с GitHub Actions:

 1name: Security Scan
 2
 3on:
 4  push:
 5    branches: [ main ]
 6  pull_request:
 7    branches: [ main ]
 8
 9jobs:
10  security-scan:
11    runs-on: ubuntu-latest
12    
13    steps:
14    - uses: actions/checkout@v3
15    
16    - name: Build Docker image
17      run: docker build -t myapp:${{ github.sha }} .
18    
19    - name: Run Clair scan
20      run: |
21        docker run -d --name clair-db postgres:13
22        docker run -d --name clair --link clair-db:postgres \
23          -p 6060:6060 -p 6061:6061 \
24          quay.io/coreos/clair:latest
25        
26        # Ожидание запуска Clair
27        sleep 30
28        
29        # Сканирование образа
30        clairctl analyze myapp:${{ github.sha }}
31    
32    - name: Upload scan results
33      uses: actions/upload-artifact@v3
34      with:
35        name: security-scan-results
36        path: clair-report.json

Применение Clair

  • CI/CD безопасность — автоматическое сканирование в pipeline
  • Compliance — соответствие требованиям безопасности
  • Мониторинг реестров — регулярное сканирование Docker Registry
  • Анализ образов — оценка безопасности базовых образов
  • Отчетность — детальные отчеты о найденных уязвимостях

Преимущества использования

  • Open Source — бесплатное использование и модификация
  • Точность — минимальное количество ложных срабатываний
  • Производительность — быстрое сканирование больших образов
  • Актуальность — регулярные обновления базы уязвимостей
  • Интеграция — легкая интеграция в существующие процессы

Источники данных о уязвимостях

Clair использует данные из:

  • CVE Database — официальная база уязвимостей
  • Ubuntu Security Notices — уведомления безопасности Ubuntu
  • Debian Security Tracker — трекер безопасности Debian
  • Red Hat Security Data — данные безопасности Red Hat
  • Alpine SecDB — база данных Alpine Linux

FAQ

Может ли Clair сканировать запущенные контейнеры?

Нет, Clair выполняет статический анализ образов контейнеров. Для сканирования запущенных контейнеров используйте runtime security решения.

Как часто обновляется база уязвимостей?

База уязвимостей обновляется каждые 6 часов по умолчанию, но интервал можно настроить в конфигурации.

Поддерживает ли Clair частные реестры?

Да, Clair может работать с частными Docker Registry, включая аутентификацию и SSL сертификаты.