it-swarm-ja.com

Githubのフックを使用してプライベートリポジトリからのgitプルを自動化するにはどうすればよいですか?

これに似た質問がたくさんあると思いますが、私の質問はもう少し具体的です。テストに使用するサーバーがあり、サイトの所有者は、誰かがリポジトリにプッシュしたときにサーバーが自動的に更新されることを望んでいます。 Githubフックを使用して、特定のURLにデータを送信し、更新の時期であることを通知すると思いました。ただし、リポジトリはプライベートであり、PHPでShell_exec()を実行すると、sshキーを持つことができないwww-dataとして実行されます。パスワードをクリアテキストにしたくありません。ユーザーに認証を許可する方法についてはかなり困惑しています。誰かがアドバイスを提供できますか?かなりシンプルなはずの何かに髪を引っ張っています。

3

git pullステップが失敗する理由は、Ubuntuでは、Apacheがユーザーwww-dataとしてスクリプトを実行するためです。したがって、gitはユーザーwww-dataに関連付けられたsshキーを探し、それらを見つけることができず、git pullリクエストを完了できません。

Ubuntu 16.04では、ユーザーwww-dataにホームディレクトリ/var/wwwが割り当てられます。これは、gitが転送をネゴシエートするためのsshキーを探すディレクトリです。したがって、解決策は、有効なキーのセットを割り当てることで、ユーザーwww-dataが本物であるとGitHubに信じ込ませることです。手順を分解するには:

:これは、Sudoアクセス権があることを前提としています。

  1. /var/www/.sshが所有するwww-data:www-dataディレクトリを作成します

    $ Sudo mkdir -p /var/www/.ssh
    $ Sudo chown -R www-data:www-data /var/www/.ssh
    
  2. ディレクトリにsshキーを作成します

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

    ssh-keygenがキーを配置するディレクトリを要求したら、/var/www/id_rsaを選択します。

  3. キーの許可と所有権が正しいことを確認してください。必要に応じてchownからwww-data:www-dataへ。

    $ 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. id_rsa.pubキーをGitHubリポジトリ設定の承認されたsshキーにコピーします。

  5. ユーザーgit pullとして実行するときに、www-dataが機能することを確認することが重要です。 sshを使用するには、GitHubサーバーIDをknown_hostsファイルに追加する必要もあります。ただし、ユーザーwww-dataにはデフォルトでログインシェルがありません。したがって、簡単なトリックを使用する必要があります。

    $ Sudo vi /etc/passwd
    

    www-dataの行を見つけ、/usr/sbin/nologin/bin/bashに変更して、ファイルを保存します。 www-dataのエントリは次のようになります。

    www-data:x:33:33:www-data:/var/www:/bin/bash
    
  6. ユーザーに変更しますwww-data

    $ Sudo su
    # su - www-data
    
  7. www-dataとしてログインしたら、gitリポジトリに移動し、git pullを手動で実行します。

  8. Sshプロセスでは、GitHubサーバーのIDをknown_hostsファイルに追加し、/var/www/.sshの下のキーペアを使用してgit pullを完了するように求められます。

  9. それが成功した場合、あなたは設定されるべきです。別のコンピューターからGitHubへのコミットをPushしてみて、PHPスクリプトがpullリクエストを実行することを確認してください。

  10. /etc/passwdユーザーのログインシェルをwww-dataとして使用して、/usr/sbin/nologinファイルを元の状態にリセットします。

3
Abhay Ghatpande

多くの方法があります。これが1つです:

  1. この方法では非常に基本的な認証のみが必要なため、認証トークンとして使用するUUIDを生成します。例: https://www.uuidgenerator.net/version4
  2. UUIDをトークンとして追加して、WebhookをトリガーするようにGitHubリポジトリのWebhookを構成します。 http://example.com/webhook.php?token=yourUUID
  3. トークンをチェックし、更新のためにサイトにフラグを立てるだけのwebhook.phpファイルをサイトのルートに配置します。

    <?php
    $token = "yourUUID";
    if($_GET['token'] != $token) {
        die("Unauthorized source!");
    } else {
        touch(__DIR__ . '/git_pull_needed');
    }
    
  4. 頻繁に(毎分?)実行され、git_pull_neededファイルが存在しない場合に終了するcronジョブを作成します。それが存在する場合、ジョブはgit pullを実行でき、その後git_pull_neededファイルを削除します。注:このcronジョブを実行するユーザーは、rootにすることも、できれば「デプロイ」することもできます。GitHubで読み取り専用の権限とwebrootへの書き込み権限を持つSSHキーを持つユーザーです。

この分離された方法の主な利点は、webhook.phpを外部に公開するリスクが低いこと(攻撃者が何らかの方法でトークンを推測した場合にのみgit pullをトリガーできる)、webserver-userと 'の間の切断です。ユーザーがsshキーと組み込みの単純なレート制限を保持している。

1
Martijn Heemels