Jenkins: настройка источника

Данное руководство описывает процесс настройки сбора и отправки событий Jenkins в R-Vision SIEM.

Предварительные требования

Перед настройкой пересылки событий в R-Vision SIEM убедитесь в выполнении следующих условий:

  • Настройка производится УЗ с правами администратора.

  • Сетевая связность между сервером Jenkins и SIEM (или промежуточным syslog-сервером) обеспечена, а необходимые порты открыты.

Настройка Jenkins

Настройка плагина аудита

Для установки плагина аудита Jenkins выполните следующее:

  1. Войдите в веб-интерфейс Jenkins.

  2. Перейдите в раздел Настроить Jenkins.

  3. Выберите вариант Plugins.

  4. Перейдите на вкладку Available plugins.

  5. Найдите плагин Audit Trail.

  6. Нажмите на кнопку Install.

    jenkins install plugin

Для настройки плагина Audit Trail выполните следующее:

  1. Перейдите в раздел Настроить Jenkins.

  2. Выберите вариант System.

  3. В подразделе Audit Trail нажмите на кнопку Add Logger (plus) и добавьте logger типа Syslog.

    jenkins audit logger

  4. Заполните параметры в соответствии с изображением ниже:

    jenkins audit

    Здесь:

    • Syslog Server Hostname — IP-адрес или полное доменное имя (FQDN) коллектора SIEM.

    • Syslog Server Port — порт точки входа Syslog на конвейере SIEM.

  5. В подразделе Loggers нажмите на кнопку Расширенные (chevron down).

  6. Заполните параметры в соответствии с изображением ниже:

    jenkins audit extended

    Здесь:

    • Syslog network protocol — выберите сетевой протокол: TCP или UDP.

    • Syslog message format — выберите вариант RFC_5424.

    • Syslog App Name — введите значение jenkins.

    • Message Hostname — укажите hostname узла, на котором развернут Jenkins.

  7. В подразделе Audit Trail нажмите на кнопку Расширенные (chevron down).

  8. Измените значение параметра URL Patterns to Log на следующее:

    .*/(?:configSubmit|doDelete|Create|createAccountByAdmin|create|postBuildResult|enable|disable|authenticate|cancelQueue|stop|toggleLogKeep|doWipeOutWorkspace|createItem|createView|toggleOffline|cancelQuietDown|quietDown|restart|exit|safeExit|login|logout)/?.*

    jenkins audit extended2

  9. Нажмите на кнопку Save.

Настройка логирования событий авторизации

Настройка логирования событий авторизации отличается в зависимости от способа запуска Jenkins.

Вариант 1. Jenkins развернут через Docker

Чтобы настроить логирование событий авторизации, выполните следующие шаги:

  1. Чтобы логи безопасности с именами пользователей попадали в stdout (и далее в Docker logs), создайте Groovy-скрипт в папке /var/jenkins_home/init.groovy.d/log-security.groovy:

    import java.util.logging.*
    import groovy.json.JsonOutput
    
    class FinalJsonFormatter extends Formatter {
        private static final String HOSTNAME = java.net.InetAddress.getLocalHost().getHostName()
    
        @Override
        String format(LogRecord record) {
            try {
                def msg = formatMessage(record)
                def logEntry = [
                    "timestamp": new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").format(new Date(record.millis)),
                    "hostname" : HOSTNAME.toString(),
                    "level"    : record.level.toString(),
                    "logger"   : record.loggerName.toString(),
                    "message"  : msg ? msg.toString() : "empty",
                    "user"     : (record.parameters?.find { it instanceof String } ?: "system").toString()
                ]
                return JsonOutput.toJson(logEntry) + "\n"
            } catch (Exception e) {
                return "{\"error\": \"failed to format log\", \"reason\": \"${e.message}\"}\n"
            }
        }
    }
    
    def handler = new ConsoleHandler()
    handler.setFormatter(new FinalJsonFormatter())
    handler.setLevel(Level.FINE)
    
    // Настройка логгера только для событий входа и выхода.
    [
        "jenkins.security.SecurityListener"
    ].each { name ->
        def l = Logger.getLogger(name)
        // Очистите старые хендлеры, чтобы избежать дублирования.
        l.getHandlers().each { l.removeHandler(it) }
        l.addHandler(handler)
        l.setLevel(Level.FINE)
        l.setUseParentHandlers(false)
    }
    
    println "--- Jenkins Auth Audit (JSON) Re-Applied ---"
  2. Измените файл docker-compose.yml следующим образом:

    services:
      jenkins: --- Добавлять в этот блок.
        ...
        hostname: "${HOSTNAME:-my-jenkins-server}"
        image: jenkins/jenkins:lts
        logging:
          driver: syslog
          options:
            syslog-address: "protocol://siem:port" ---- Поменять на свои значения.
            tag: "jenkins-master"
        ...
  3. Перезапустите контейнер.

Вариант 2. Jenkins развернут локально

Чтобы настроить логирование событий авторизации, выполните следующие шаги:

  1. В стандартной установке на Linux (Debian, Ubuntu, RHEL) домашняя директория Jenkins находится по адресу /var/lib/jenkins. Создайте папку по указанному адресу:

    sudo mkdir -p /var/lib/jenkins/init.groovy.d
  2. Создайте файл /var/lib/jenkins/init.groovy.d/full-audit.groovy и добавьте в него JSON-скрипт:

    import java.util.logging.*
    import groovy.json.JsonOutput
    
    class FinalJsonFormatter extends Formatter {
        private static final String HOSTNAME = java.net.InetAddress.getLocalHost().getHostName()
    
        @Override
        String format(LogRecord record) {
            try {
                def msg = formatMessage(record)
                def logEntry = [
                    "timestamp": new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").format(new Date(record.millis)),
                    "hostname" : HOSTNAME.toString(),
                    "level"    : record.level.toString(),
                    "logger"   : record.loggerName.toString(),
                    "message"  : msg ? msg.toString() : "empty",
                    "user"     : (record.parameters?.find { it instanceof String } ?: "system").toString()
                ]
                return JsonOutput.toJson(logEntry) + "\n"
            } catch (Exception e) {
                return "{\"error\": \"failed to format log\", \"reason\": \"${e.message}\"}\n"
            }
        }
    }
    
    def handler = new ConsoleHandler()
    handler.setFormatter(new FinalJsonFormatter())
    handler.setLevel(Level.FINE)
    
    // Настройка логгера только для событий входа и выхода.
    [
        "jenkins.security.SecurityListener"
    ].each { name ->
        def l = Logger.getLogger(name)
        // Очистите старые хендлеры, чтобы избежать дублирования.
        l.getHandlers().each { l.removeHandler(it) }
        l.addHandler(handler)
        l.setLevel(Level.FINE)
        l.setUseParentHandlers(false)
    }
    
    println "--- Jenkins Auth Audit (JSON) Re-Applied ---"
  3. Jenkins должен иметь возможность прочитать этот файл. Убедитесь, что владельцем является пользователь Jenkins:

    sudo chown -R jenkins:jenkins /var/lib/jenkins/init.groovy.d/
    sudo chmod 755 /var/lib/jenkins/init.groovy.d/
  4. Чтобы rsyslog не отправлял в SIEM ненужные файлы, используйте фильтрацию по вашему формату. Для этого создайте файл /etc/rsyslog.d/10-siem.conf:

    # Фильтрация логов: только от сервиса Jenkins и только указанный JSON.
    if ($programname == 'jenkins') and ($msg contains '{"timestamp":') and ($msg contains 'jenkins.security.SecurityListener') then {
        # Отправка в SIEM по TCP (замените IP и порт на свои).
        action(type="omfwd"
               target="<target>"
               port="<port>"
               protocol="<protocol>"
            )
    
        # Остановите дальнейшую обработку этой строки, чтобы она не дублировалась в /var/log/syslog.
        stop
    }

    Здесь:

    • <target> — IP-адрес или полное доменное имя (FQDN) коллектора SIEM.

    • <port> — порт точки входа Syslog на конвейере SIEM.

    • <protocol> — сетевой протокол: tcp или udp.

  5. Перезапустите службу rsyslog.service с помощью команды:

    systemctl restart rsyslog.service

Настройка в R-Vision SIEM

Для настройки сбора и нормализации событий источника в R-Vision SIEM выполните следующие шаги:

  1. В интерфейсе R-Vision SIEM создайте новый конвейер в коллекторе.

  2. Добавьте на конвейер элемент Точка входа со следующими параметрами:

    • Название: введите название точки входа.

    • Тип точки входа: выберите вариант Syslog.

    • Порт точки входа: введите значение в соответствии с настройками на стороне Jenkins.

    • Протокол: выберите вариант в соответствии с настройками на стороне Jenkins.

  3. Добавьте на конвейер элемент Нормализатор с правилом Jenkins (идентификатор правила: RV-N-305).

  4. Соедините нормализатор с точкой входа.

  5. Добавьте на конвейер элемент Конечная точка типа Хранилище событий.

  6. Соедините конечную точку с нормализатором.

  7. Сохраните и установите конфигурацию конвейера.

Пример конфигурации конвейера:

jenkins pipeline

После настройки передачи событий, если настройка выполнена корректно, в хранилище начнут поступать события Jenkins.

Найти события Jenkins в хранилище можно по следующему фильтру:

device_product = "jenkins"

jenkins event storage filter

Была ли полезна эта страница?

Обратная связь