Skip to main content
We publish frequent updates to our documentation, and translation of this page may still be in progress. For the most current information, please visit the English documentation.

Защита веб-перехватчиков

Убедитесь, что сервер получает только ожидаемые запросы GitHub по соображениям безопасности.

После настройки сервера для получения полезных данных он будет ожидать передачи всех полезных данных, отправляемых в настроенную конечную точку. Из соображений безопасности можно разрешить только запросы, поступающие из GitHub. Это можно сделать несколькими способами (например, разрешить запросы с IP-адреса GitHub), но гораздо проще настроить секретный маркер и проверить сведения.

REST API можно использовать для управления веб-перехватчиками репозитория, организации и приложения. Вы можете перечислить доставку веб-перехватчиков для веб-перехватчика или получить и повторно получить отдельную доставку для веб-перехватчика, которую можно интегрировать во внешнее приложение или службу. Вы также можете использовать REST API для изменения конфигурации веб-перехватчика. Например, можно изменить URL-адрес полезных данных, тип контента, проверку SSL и секрет. Дополнительные сведения см. в разделе:

Настройка секретного маркера

Вам потребуется настроить секретный маркер в двух местах: в GitHub и на сервере.

Чтобы задать маркер в GitHub, выполните следующие действия.

  1. Перейдите в репозиторий, в котором вы настраиваете веб-перехватчик.
  2. Заполните текстовое поле "Секрет". Используйте произвольную строку с высокой энтропией (например, путем принятия выходных данных ruby -rsecurerandom -e 'puts SecureRandom.hex(20)' в терминале). Поле маркера секрета веб-перехватчика
  3. Щелкните Обновить веб-перехватчик.

Затем настройте переменную среды на сервере, в которой хранится этот маркер. Как правило, для этого достаточно просто выполнить:

$ export SECRET_TOKEN=YOUR-TOKEN

Никогда не применяйте жесткое кодирование маркера в приложении!

Проверка полезных данных из GitHub

При установке секретного маркера GitHub Enterprise Server будет использовать его для создания хэш-подписи для каждой полезной нагрузки. Эта хэш-подпись включается в заголовки каждого запроса как x-hub-signature-256.

Примечание. Чтобы обеспечить обратную совместимость, мы также включаем заголовок x-hub-signature, созданный с помощью хэш-функции SHA-1. По возможности рекомендуется использовать заголовок x-hub-signature-256 для повышения безопасности. В приведенном ниже примере показано использование заголовка x-hub-signature-256.

Например, если у вас есть базовый сервер, который прослушивает веб-перехватчики, его можно настроить следующим образом:

require 'sinatra'
require 'json'

post '/payload' do
  request.body.rewind
  push = JSON.parse(request.body.read)
  "I got some JSON: #{push.inspect}"
end

Цель состоит в том, чтобы вычислить хэш с помощью вашего SECRET_TOKEN и убедиться, что результат соответствует хэшу из GitHub Enterprise Server. GitHub Enterprise Server использует хэш-код HMAC в шестнадцатеричном формате для вычисления хэша, что позволяет перенастроить сервер примерно следующим образом:

post '/payload' do
  request.body.rewind
  payload_body = request.body.read
  verify_signature(payload_body)
  push = JSON.parse(payload_body)
  "I got some JSON: #{push.inspect}"
end

def verify_signature(payload_body)
  signature = 'sha256=' + OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), ENV['SECRET_TOKEN'], payload_body)
  return halt 500, "Signatures didn't match!" unless Rack::Utils.secure_compare(signature, request.env['HTTP_X_HUB_SIGNATURE_256'])
end

Примечание. Полезные данные веб-перехватчика могут содержать символы Юникода. Если в реализации языка и сервера указана кодировка символов, убедитесь, что полезные данные обрабатываются как символы UTF-8.

Используемая вами реализации языка и сервера может отличаться от этого примера кода. Однако есть ряд важных моментов, которые следует учесть:

  • Независимо от используемой реализации хэш-подпись начинается с sha256=, используя ключ секретного маркера и текстовую область полезных данных.

  • Использовать обычный оператор == не рекомендуется. Такой метод, как secure_compare, выполняет сравнение "постоянных во времени" строк, что позволяет снизить определенные атаки по времени на регулярные операторы равенства.