После настройки сервера для получения полезных данных он будет ожидать передачи всех полезных данных, отправляемых в настроенную конечную точку. Из соображений безопасности можно разрешить только запросы, поступающие из GitHub. Это можно сделать несколькими способами (например, разрешить запросы с IP-адреса GitHub), но гораздо проще настроить секретный маркер и проверить сведения.
REST API можно использовать для управления веб-перехватчиками репозитория, организации и приложения. Вы можете перечислить доставку веб-перехватчиков для веб-перехватчика или получить и повторно получить отдельную доставку для веб-перехватчика, которую можно интегрировать во внешнее приложение или службу. Вы также можете использовать REST API для изменения конфигурации веб-перехватчика. Например, можно изменить URL-адрес полезных данных, тип контента, проверку SSL и секрет. Дополнительные сведения см. в разделе:
Настройка секретного маркера
Вам потребуется настроить секретный маркер в двух местах: в GitHub и на сервере.
Чтобы задать маркер в GitHub, выполните следующие действия.
-
Перейдите в репозиторий, в котором вы настраиваете веб-перехватчик.
-
Под именем репозитория щелкните Параметры. Если вкладка "Параметры" не отображается, выберите раскрывающееся меню и нажмите кнопку Параметры.
-
На левой боковой панели щелкните веб-перехватчики .
-
Рядом с веб-перехватчиком щелкните Изменить.
-
В поле "Секрет" введите случайную строку с высокой энтропией. Например, можно создать строку с помощью
ruby -rsecurerandom -e 'puts SecureRandom.hex(20)'
в терминале. -
Щелкните Обновить веб-перехватчик.
Затем настройте переменную среды на сервере, в которой хранится этот маркер. Как правило, для этого достаточно просто выполнить:
$ 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
, выполняет сравнение "постоянных во времени" строк, что позволяет снизить определенные атаки по времени на регулярные операторы равенства.