2012-01-25 7 views
14

Github offers a way per consentire a un URL di sapere quando un progetto è stato aggiornato tramite webhooks.Come verificare che una richiesta di hook post-ricezione provenga effettivamente da github?

Come si verifica che un post inviato al gancio di post-ricezione del mio server provenga effettivamente da github?

Devo controllare l'indirizzo IP del mittente o posso inviare un controllo di autenticazione da qualche parte? Voglio assicurarmi che qualcuno non provi a spoofare una richiesta fingendo di provenire da github.

Un'opzione è impostare il gancio tramite PubSubHubbub e utilizzare l'opzione hub.secret per creare una firma HMAC SHA1 del corpo del post. Tuttavia, ciò richiederebbe al mio server di configurare la richiesta piuttosto che aspettare che gli utenti configurino la richiamata post-ricezione sul mio sito quando lo desiderano. Preferirei semplicemente chiedere agli utenti di incollare l'URL che ho inserito nell'URL del post.

risposta

7

Si può provare a controllare post-richiesta IP di Github: 207.97.227.253, 50.57.128.197, 108.171.174.178

+1

Così semplice che non consideravano addirittura. I dati non sono molto importanti, voglio solo interrompere semplici invii di spam. – Xeoncross

+2

Secondo Github, gli indirizzi effettivi sono 207.97.227.253, 50.57.128.197, 108.171.174.178. – Joshua

+0

Grazie per questa informazione Joshua – Roch

5

Oltre a @ di mnml risposta, il secondo passo potrebbe essere quello di chiamare proprio sulla API and verify che le informazioni fornite corrispondano all'ultima commit conosciuta per il progetto. È lo stesso processo utilizzato da OpenID per verificare che i dati passati siano validi.

Quindi, prima potevo sconfiggere gli attacchi di risposta stupidi, semplicemente controllando l'IP. Quindi potrei chiedere a Github se le informazioni che ho ricevuto sono corrette.

GET /repos/:user/:repo/commits/:sha 
+0

Sì, uso anche i dati json per attivare capistrano e distribuire in base al ramo del commit. – Roch

+4

** Questo non è sicuro ** - tutti possono aggiungere commit al repository creando richieste pull. Vedi qui: https://api.github.com/repos/github/gitignore/git/commits/85be394529d93cb7f29cd758599e7d103dc002f8. Parte di questa richiesta pull (non unita!): Https://github.com/github/gitignore/pull/542. – Chronial

1

È possibile individuare il webhook in un URL difficile da indovinare. Di ':

https://my-host.com/webhooks/E36006BE2C4BABDEEF307C77E34F415B/my-hook 

(ovvero 128 bit di dati casuali - aumentare a qualsiasi dimensione si senta a proprio agio). Supponendo che tu possa fidarti di github per mantenere questo url sicuro, è molto probabile che un client che sta usando quell'url possa essere considerato affidabile.

Se l'url dovesse mai essere compromesso, è semplice generare un nuovo URL casuale e aggiornare il server web.

Basta fare in modo che si sta utilizzando una buona fonte di entropia ...

+0

Sì, ma se hai un sacco di web hook dovresti aggiornarli tutti con il nuovo URL se il tuo URL è mai stato compromesso. –

+2

L'URL non è in chiaro quando viene utilizzato e inviato su Internet? –

+3

Il percorso della richiesta viene crittografato quando inviato tramite HTTPS. –

7

Date un'occhiata a GitHub's docs on the subject: essi suggeriscono utilizzando HTTPS e l'autenticazione di base.

In particolare, istituito il tuo URL Payload in questo formato:

https://yourUser:[email protected]/path

Se si dispone di un numero di utenti, devi dare a ciascuno un diverso username password &. Supponendo che mantengano tale password privata, puoi quindi fidarti che una richiesta di autenticazione proviene davvero da GitHub e da quell'account.

Consulta anche: https://github.com/blog/237-basic-auth-post-receives

Problemi correlati