Come automatizzo i pull di git da un repository privato usando gli hook di Github?


3

Sono sicuro che ci sono molte domande simili a questa, ma la mia è un po 'più specifica. Ho un server utilizzato per i test e il proprietario del sito vuole che si aggiorni automaticamente quando qualcuno spinge nei repository. Ho pensato di utilizzare gli hook di Github per inviare alcuni dati a un URL specifico, segnalando che è ora di un aggiornamento. Tuttavia, i nostri repository sono privati ​​e se eseguo shell_exec () in PHP, lo esegue come www-data, che non può avere chiavi ssh. Non voglio mettere le password in chiaro, e sono piuttosto sconcertato su come permetterò all'utente di autenticarsi. Qualcuno può fornire qualche consiglio? Ho tolto i capelli per troppo tempo su qualcosa che sembra che dovrebbe essere piuttosto semplice.

Risposte:


3

Il motivo per cui il git pullpassaggio fallisce è perché su Ubuntu, Apache esegue lo script come utente www-data. Quindi, gitcerca le chiavi ssh associate all'utente www-datae non riuscendo a trovarle, non è in grado di completare la git pullrichiesta.

Su Ubuntu 16.04, all'utente www-dataviene assegnata la home directory /var/www. Questa è la directory in cui gitcerca le chiavi ssh per negoziare il trasferimento. Quindi la soluzione è far credere a GitHub che l'utente www-datasia reale assegnandogli un set di chiavi valido. Per scomporre i passaggi:

Nota : questo presuppone che tu abbia sudoaccesso.

  1. Crea una directory di /var/www/.ssh proprietà diwww-data:www-data

    $ sudo mkdir -p /var/www/.ssh
    $ sudo chown -R www-data:www-data /var/www/.ssh
    
  2. Crea chiavi ssh nella directory

    $ cd /var/www/.ssh
    $ sudo ssh-keygen -t rsa -b 2048
    

    Quando viene ssh-keygenrichiesta la directory in cui inserire le chiavi, scegliere/var/www/id_rsa

  3. Accertarsi che le convinzioni e la proprietà delle chiavi siano corrette. chownper www-data:www-dataquanto necessario.

    $ ls -la /var/www/.ssh/
    total 24K
    drwxr-xr-x 2 www-data www-data 4.0K Apr 29 23:58 ./
    drwxr-xr-x 5 root     root     4.0K Apr 30 00:06 ../
    -rw------- 1 www-data www-data 1.7K Apr 29 23:33 id_rsa
    -rw-r--r-- 1 www-data www-data  394 Apr 29 23:33 id_rsa.pub
    
  4. Copia la id_rsa.pubchiave nelle chiavi ssh autorizzate nelle impostazioni del repository GitHub.

  5. È importante assicurarsi che i git pulllavori vengano eseguiti come utente www-data. L'uso di ssh deve anche aggiungere l'identità del server GitHub al known_hostsfile. Tuttavia, l'utente www-datanon dispone di una shell di accesso per impostazione predefinita. Quindi dobbiamo usare un semplice trucco:

    $ sudo vi /etc/passwd
    

    Trova la riga per www-datae modifica il /usr/sbin/nologinto /bin/bashe salva il file. La voce per www-datadovrebbe essere simile a:

    www-data:x:33:33:www-data:/var/www:/bin/bash
    
  6. Passa all'utente www-data

    $ sudo su
    # su - www-data
    
  7. Una volta effettuato l'accesso come www-data, vai al repository git ed esegui git pullmanualmente.

  8. Il processo ssh ti chiederà di aggiungere l'identità del server GitHub al known_hostsfile e di usare la coppia di chiavi sotto /var/www/.sshper completare il file git pull.

  9. Se riesce, dovresti essere impostato. Prova a pusheseguire il commit su GitHub da un altro computer e verifica che lo script PHP esegua la pullrichiesta.

  10. Ripristina il /etc/passwdfile allo stato originale con la shell di accesso www-datadell'utente come/usr/sbin/nologin


1

Ci sono molti modi. Eccone uno:

  1. Questo metodo richiede solo un'autenticazione di base, quindi genera un UUID da utilizzare come token di autenticazione. Ad esempio: https://www.uuidgenerator.net/version4
  2. Configura il webhook del repository GitHub per attivare il tuo webhook, aggiungendo l'UUID come token: http://example.com/webhook.php?token=yourUUID
  3. Inserisci un webhook.phpfile nella radice del tuo sito che controlla il token e non fa altro che contrassegnare il sito per un aggiornamento:

    <?php
    $token = "yourUUID";
    if($_GET['token'] != $token) {
        die("Unauthorized source!");
    } else {
        touch(__DIR__ . '/git_pull_needed');
    }
    
  4. Crea un cronjob che viene eseguito spesso (ogni minuto?) Ed esce se il git_pull_neededfile non esiste. Se non esiste, il lavoro può eseguire un git pulldopo di che cancella il git_pull_neededfile. Nota: l'utente che esegue questo cronjob può essere root o preferibilmente un utente "deploy" che ha una chiave SSH con autorizzazione di sola lettura su GitHub e autorizzazione di scrittura sul webroot.

I principali vantaggi di questo metodo disaccoppiato sono il basso rischio di esporre il webhook.php all'esterno (un attaccante può innescare un solo git pullse in qualche modo indovina il token), la disconnessione tra l'utente del server web e l'utente che tiene l'ssh -key e il semplice limitatore di velocità incorporato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.