ドキュメントには頻繁に更新が加えられ、その都度公開されています。本ページの翻訳はまだ未完成な部分があることをご了承ください。最新の情報については、英語のドキュメンテーションをご参照ください。本ページの翻訳に問題がある場合はこちらまでご連絡ください。
GitHub AE is currently under limited release. Please contact our Sales Team to find out more.

webhook のセキュリティ保護

セキュリティ上の理由から、サーバーが想定されているる GitHub リクエストのみを受信していることを確認する必要があります。

ここには以下の内容があります:

ペイロードを受信するようにサーバーが設定されると、設定したエンドポイントに送信されたペイロードがリッスンされます。 セキュリティ上の理由から、GitHub からのリクエストに制限することをお勧めします。 これを行うにはいくつかの方法があります。たとえば、GitHub の IP アドレスからのリクエストを許可することですが、はるかに簡単な方法は、シークレットトークンを設定して情報を検証することです。

You can use the repository, organization, and app webhook REST APIs to create, update, delete, and ping webhooks. You can also use the REST API to change the configuration of the webhook. For example, you can modify the payload URL, content type, SSL verification, and secret. For more information, see:

シークレットトークンを設定する

シークレットトークンは、GitHub とサーバーの 2 か所に設定する必要があります。

GitHub にトークンを設定するには:

  1. webhook を設定しているリポジトリに移動します。
  2. シークレットテキストボックスに入力します。 エントロピーの高いランダムな文字列を使用します (たとえば、ruby -rsecurerandom -e 'puts SecureRandom.hex(20)' を端末で取得することによって)。 webhook シークレットトークンフィールド
  3. [Update Webhook] をクリックします。

次に、このトークンを保存する環境変数をサーバーに設定します。 通常、これは実行と同じくらい簡単です。

$ export SECRET_TOKEN=your_token

トークンをアプリケーションにハードコーディングしないでください

GitHub からのペイロードを検証する

シークレットトークンが設定されると、GitHub AE はそれを使用して各ペイロードでハッシュ署名を作成します。 このハッシュ署名は、X-Hub-Signature-256

たとえば、webhook をリッスンする基本的なサーバーがある場合、次のように設定されている可能性があります。

require 'sinatra'
require 'json'

post '/payload' do
  push = JSON.parse(params[:payload])
  "I got some JSON: #{push.inspect}"
end

目的は、SECRET_TOKEN を使用してハッシュを計算し、結果が GitHub AE のハッシュと一致することを確認することです。 GitHub AE は HMAC hex digest を使用してハッシュを計算するため、サーバーを次のように再設定できます。

post '/payload' do
  request.body.rewind
  payload_body = request.body.read
  verify_signature(payload_body)
  push = JSON.parse(params[:payload])
  "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

Note: Webhook payloads can contain unicode characters. If your language and server implementation specifies a character encoding, ensure that you handle the payload as UTF-8.

言語とサーバーの実装は、この例で使用したコードとは異なる場合があります。 ただし、次のようないくつかの非常に重要な事項があります。

  • どの実装を使用する場合でも、ハッシュ署名は sha256= で始まり、シークレットトークンのキーとペイロード本体を使用します。

  • プレーンな == 演算子を使用することはお勧めしません。 A method like secure_compare performs a "constant time" string comparison, which helps mitigate certain timing attacks against regular equality operators.

Did this doc help you?

Privacy policy

Help us make these docs great!

All GitHub docs are open source. See something that's wrong or unclear? Submit a pull request.

Make a contribution

OR, learn how to contribute.