# デプロイキーの管理

デプロイメントのスクリプトを自動化する際にサーバー上のSSHキーを管理する様々な方法と、どれが最適な方法かを学んでください。

SSHエージェントのフォワーディング、OAuthトークンでのHTTPS、デプロイキー、マシンユーザを使ってデプロイメントスクリプトを自動化する際に、サーバー上のSSHキーを管理できます。

## SSHエージェントの転送

多くの場合、特にプロジェクトの開始時には、SSHエージェントのフォワーディングが最も素早くシンプルに使える方法です。 エージェントのフォワーディングでは、ローカルの開発コンピュータで使うのと同じSSHキーを使います。

### SSH エージェント転送の長所

* 新しいキーを生成したり追跡したりしなくていい。
* キーの管理は不要。ユーザはローカルと同じ権限をサーバーでも持つ。
* サーバーにキーは保存されないので、サーバーが侵害を受けた場合でも、侵害されたキーを追跡して削除する必要はない。

### SSH エージェント転送の短所

* ユーザーは、デプロイに SSH 接続する**必要があります**。自動デプロイ プロセスは使用できません。
* SSH エージェントの転送は、Windows ユーザーに対して実行するのが面倒な場合があります。

### SSH エージェント転送を設定する

1. エージェントのフォワーディングをローカルでオンにしてください。 詳細については、[SSH エージェントの転送に関するガイド](/ja/enterprise-server@3.22/authentication/connecting-to-github-with-ssh/using-ssh-agent-forwarding)を参照してください。
2. エージェントフォワーディングを使用するように、デプロイスクリプトを設定してください。 たとえば、bash スクリプトでは、エージェントの転送を有効にすると、次のようになります: `ssh -A serverA 'bash -s' < deploy.sh`

## OAuthトークンを使ったHTTPSでのクローニング

SSH キーを使用しない場合は、OAuth トークンで HTTPS を使用できます。

### OAuth トークンを使った HTTPS でのクローニングの長所

* サーバーにアクセスできる人なら、リポジトリをデプロイできる。

* ユーザはローカルのSSH設定を変更する必要がない。

* 複数のトークン（ユーザごと）が必要ない。サーバーごとに1つのトークンで十分。

* トークンはいつでも取り消しできるので、本質的には使い捨てのパスワードにすることができる。

* 新しいトークンの生成は、[OAuth API](/ja/enterprise-server@3.22/rest/oauth-authorizations/oauth-authorizations#create-a-new-authorization) を使用して簡単にスクリプト化できます。

### OAuth トークンを使った HTTPS でのクローニングの短所

* トークンを確実に正しいアクセススコープで設定しなければならない。
* トークンは本質的にはパスワードであり、パスワードと同じように保護しなければならない。

### OAuth トークンを使った HTTPS でのクローニングを設定する

[弊社のpersonal access token作成に関するガイドを参照してください。](/ja/enterprise-server@3.22/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)

## デプロイ キー

デプロイ キーを使用すると、お使いの GitHub Enterprise Server インスタンス のリポジトリからサーバーにプロジェクトを起動できます。デプロイ キーは、単一のリポジトリへのアクセス権を付与する SSH キーです。 GitHub は個人アカウントの代わりに、リポジトリに直接キーのパブリックな部分をアタッチし、キーのプライベートな部分はサーバーに残ります。 詳しくは、「[デプロイメントを配信する](/ja/enterprise-server@3.22/rest/guides/delivering-deployments)」をご覧ください。

書き込みアクセス権を持つキーをデプロイすれば、管理アクセス権を持つOrganizationのメンバー、あるいは個人リポジトリのコラボレータと同じアクションを行えます。 詳細については、「[Organizationのリポジトリロール](/ja/enterprise-server@3.22/organizations/managing-user-access-to-your-organizations-repositories/managing-repository-roles/repository-roles-for-an-organization)」および「[個人アカウントのリポジトリの権限レベル](/ja/enterprise-server@3.22/repositories/managing-your-repositorys-settings-and-features/repository-access-and-collaboration/permission-levels-for-a-personal-account-repository)」を参照してください。

セキュリティを強化し、リポジトリのアクセスとアクセス許可をきめ細かく制御するために、代わりに GitHub アプリを使用することをお勧めします。 「[GitHub アプリをビルドするタイミングを決定する](/ja/enterprise-server@3.22/apps/creating-github-apps/about-creating-github-apps/deciding-when-to-build-a-github-app#github-apps-offer-enhanced-security)」を参照してください。

### デプロイ キーの長所

* リポジトリとサーバーにアクセスできる人は、誰でもプロジェクトをデプロイできる。
* ユーザはローカルのSSH設定を変更する必要がない。
* デプロイ キーは既定では読み取り専用ですが、リポジトリに追加するときに書き込みアクセス権を付与することができます。

### デプロイ キーの短所

* デプロイキーは単一のリポジトリに対するアクセスだけを許可できる。 より複雑なプロジェクトは、同じサーバーからプルする多くのリポジトリを持っていることがある。
* デプロイキーは通常パスフレーズで保護されていないので、サーバーが侵害されると簡単にキーにアクセスされることになる。
* デプロイ キーは、有効期限のない資格情報です。
* デプロイ キーは、Organization のメンバーシップに直接リンクされません。 デプロイ キーは、特定のユーザーではなくリポジトリに関連付けられているため、デプロイ キーを作成したユーザーがリポジトリから削除されても、引き続きアクティブです。

### デプロイ キーを設定する

> \[!NOTE] Organization が Enterprise によって所有されていて、Enterprise 所有者がリポジトリ内のデプロイ キーの使用を制限している場合、Organization 内のポリシーをオーバーライドしてデプロイ キーを作成することはできません。 詳しくは、「[Enterprise でリポジトリ管理ポリシーを適用する](/ja/enterprise-server@3.22/admin/enforcing-policies/enforcing-policies-for-your-enterprise/enforcing-repository-management-policies-in-your-enterprise#enforcing-a-policy-for-deploy-keys)」をご覧ください。

1. サーバーで [`ssh-keygen` 手順を実行](/ja/enterprise-server@3.22/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#generating-a-new-ssh-key)し、生成された公開キーと秘密 RSA キーのペアを保存する場所を覚えておいてください。
2. GitHub で、リポジトリのメイン ページに移動します。
3. リポジトリ名の下にある **<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-gear" aria-label="gear" role="img"><path d="M8 0a8.2 8.2 0 0 1 .701.031C9.444.095 9.99.645 10.16 1.29l.288 1.107c.018.066.079.158.212.224.231.114.454.243.668.386.123.082.233.09.299.071l1.103-.303c.644-.176 1.392.021 1.82.63.27.385.506.792.704 1.218.315.675.111 1.422-.364 1.891l-.814.806c-.049.048-.098.147-.088.294.016.257.016.515 0 .772-.01.147.038.246.088.294l.814.806c.475.469.679 1.216.364 1.891a7.977 7.977 0 0 1-.704 1.217c-.428.61-1.176.807-1.82.63l-1.102-.302c-.067-.019-.177-.011-.3.071a5.909 5.909 0 0 1-.668.386c-.133.066-.194.158-.211.224l-.29 1.106c-.168.646-.715 1.196-1.458 1.26a8.006 8.006 0 0 1-1.402 0c-.743-.064-1.289-.614-1.458-1.26l-.289-1.106c-.018-.066-.079-.158-.212-.224a5.738 5.738 0 0 1-.668-.386c-.123-.082-.233-.09-.299-.071l-1.103.303c-.644.176-1.392-.021-1.82-.63a8.12 8.12 0 0 1-.704-1.218c-.315-.675-.111-1.422.363-1.891l.815-.806c.05-.048.098-.147.088-.294a6.214 6.214 0 0 1 0-.772c.01-.147-.038-.246-.088-.294l-.815-.806C.635 6.045.431 5.298.746 4.623a7.92 7.92 0 0 1 .704-1.217c.428-.61 1.176-.807 1.82-.63l1.102.302c.067.019.177.011.3-.071.214-.143.437-.272.668-.386.133-.066.194-.158.211-.224l.29-1.106C6.009.645 6.556.095 7.299.03 7.53.01 7.764 0 8 0Zm-.571 1.525c-.036.003-.108.036-.137.146l-.289 1.105c-.147.561-.549.967-.998 1.189-.173.086-.34.183-.5.29-.417.278-.97.423-1.529.27l-1.103-.303c-.109-.03-.175.016-.195.045-.22.312-.412.644-.573.99-.014.031-.021.11.059.19l.815.806c.411.406.562.957.53 1.456a4.709 4.709 0 0 0 0 .582c.032.499-.119 1.05-.53 1.456l-.815.806c-.081.08-.073.159-.059.19.162.346.353.677.573.989.02.03.085.076.195.046l1.102-.303c.56-.153 1.113-.008 1.53.27.161.107.328.204.501.29.447.222.85.629.997 1.189l.289 1.105c.029.109.101.143.137.146a6.6 6.6 0 0 0 1.142 0c.036-.003.108-.036.137-.146l.289-1.105c.147-.561.549-.967.998-1.189.173-.086.34-.183.5-.29.417-.278.97-.423 1.529-.27l1.103.303c.109.029.175-.016.195-.045.22-.313.411-.644.573-.99.014-.031.021-.11-.059-.19l-.815-.806c-.411-.406-.562-.957-.53-1.456a4.709 4.709 0 0 0 0-.582c-.032-.499.119-1.05.53-1.456l.815-.806c.081-.08.073-.159.059-.19a6.464 6.464 0 0 0-.573-.989c-.02-.03-.085-.076-.195-.046l-1.102.303c-.56.153-1.113.008-1.53-.27a4.44 4.44 0 0 0-.501-.29c-.447-.222-.85-.629-.997-1.189l-.289-1.105c-.029-.11-.101-.143-.137-.146a6.6 6.6 0 0 0-1.142 0ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM9.5 8a1.5 1.5 0 1 0-3.001.001A1.5 1.5 0 0 0 9.5 8Z"></path></svg> \[Settings]** をクリックします。 \[設定] タブが表示されない場合は、 **\[<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-kebab-horizontal" aria-label="More" role="img"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg>]** ドロップダウン メニューを選び、 **\[設定]** をクリックします。

   ![タブを示すリポジトリ ヘッダーのスクリーンショット。 \[設定\] タブが濃いオレンジ色の枠線で強調表示されています。](/assets/images/help/repository/repo-actions-settings.png)
4. サイドバーにある **\[Deploy Keys] (キーのデプロイ)** をクリックします。
5. **\[Add deploy key] (デプロイ キーの追加)** をクリックします。
6. \[タイトル] フィールドにタイトルを入力します。
7. \[キー] フィールドに公開キーを貼り付けます。
8. このキーにリポジトリへの書き込みアクセス権を付与する場合は、 **\[書き込みアクセスを許可する]** を選択します。 書き込みアクセス権を持つデプロイキーを使うと、リポジトリにデプロイメントのプッシュができるようになります。
9. **\[キーの追加]** をクリックします。

REST API を使用して、デプロイ キーを作成することもできます。 詳しくは、「[デプロイ キー用の REST API エンドポイント](/ja/enterprise-server@3.22/rest/deploy-keys/deploy-keys)」をご覧ください。

その後、SSH を使用してリポジトリを操作できます。 次に例を示します。

```bash
git clone git@my-GHE-hostname.com:OWNER/REPO.git
```

### 1つのサーバー上で複数のリポジトリを利用する

1つのサーバー上で複数のリポジトリを使うなら、それぞれのリポジトリに対して専用のキーペアを生成しなければなりません。 複数のリポジトリでデプロイキーを再利用することはできません。

サーバーの SSH 構成ファイル (通常 `~/.ssh/config`) に、各リポジトリのエイリアス エントリを追加します。 次に例を示します。

```bash
Host my-GHE-hostname.com-repo-0
        Hostname my-GHE-hostname.com
        IdentityFile=/home/user/.ssh/repo-0_deploy_key

Host my-GHE-hostname.com-repo-1
        Hostname my-GHE-hostname.com
        IdentityFile=/home/user/.ssh/repo-1_deploy_key
```

* `Host my-GHE-hostname.com-repo-0` - リポジトリのエイリアス。
* `Hostname my-GHE-hostname.com` - エイリアスで使用するホスト名を構成します。
* `IdentityFile=/home/user/.ssh/repo-0_deploy_key` - 秘密キーをエイリアスに割り当てます。

こうすれば、ホスト名のエイリアスを使ってSSHでリポジトリとやりとりできます。この場合、このエイリアスに割り当てられたユニークなデプロイキーが使われます。 次に例を示します。

```bash
git clone git@my-GHE-hostname.com-repo-1:OWNER/repo-1.git
```

## GitHub App インストール アクセス トークン

サーバーが 1 つ以上の組織のリポジトリにアクセスする必要がある場合は、GitHub Appを使用して必要なアクセスを定義し、その\_\_ からGitHub Appのインストール アクセス トークンを生成できます。 インストール アクセス トークンは単一または複数のリポジトリをスコープとすることができ、アクセス許可を細かく設定できます。 たとえば、リポジトリのコンテンツへの読み取り専用アクセス権を持つトークンを生成できます。

GitHub AppsはGitHubのファースト クラス アクターであるため、インストール アクセス トークンは任意のGitHub ユーザーから切り離されるため、"サービス トークン" に相当します。 さらに、インストール アクセス トークンには、実行される組織の規模に応じてスケーリングされる専用のレート制限があります。 詳細については、「[GitHub Appsのレート制限」を](/ja/enterprise-server@3.22/apps/creating-github-apps/registering-a-github-app/rate-limits-for-github-apps)参照してください。

### インストール アクセス トークンの長所

* 権限設定と有効期限 (1時間、またはAPIで手動で取り消された場合にはそれ以下) が明確に定義された、スコープが厳格なトークン。
* 組織の規模に従って拡大する、独自のレート制限。
* GitHub ユーザーの ID とは切り離されているため、ライセンス を一切消費しません。
* パスワードが付与されないので、直接サインインされない。

### インストール アクセス トークンの短所

* GitHub Appを作成するには、追加のセットアップが必要です。
* インストール アクセス トークンは 1 時間後に期限切れになるので、再生成する必要がある (通常はコードを使用して、オンデマンドで行う)。

### インストール アクセス トークンを設定する

1. GitHub Appをパブリックとプライベートのどちらにするかを決定します。
   GitHub Appが組織内のリポジトリでのみ動作する場合は、プライベートにする必要があります。
2. リポジトリの内容への読み取り専用アクセスなど、 GitHub App に必要なアクセス許可を決定します。
3. 組織の設定ページで GitHub App を作成します。 詳細については、「[GitHub Appの作成」を](/ja/enterprise-server@3.22/apps/creating-github-apps/registering-a-github-app/registering-a-github-app)参照してください。
4. GitHub App
   `id`をメモします。
5. GitHub Appの秘密キーを生成してダウンロードし、安全に保存します。 詳細については、「[秘密キーを生成する](/ja/enterprise-server@3.22/apps/creating-github-apps/authenticating-with-a-github-app/managing-private-keys-for-github-apps)」を参照してください。
6. 操作する必要があるリポジトリに GitHub App をインストールします。必要に応じて、組織内のすべてのリポジトリに GitHub App をインストールできます。
7. `installation_id` と、それがアクセスできる組織リポジトリとの関連性を表す GitHub App を特定します。 各 GitHub App と組織のペアには、最大で 1 つの `installation_id`があります。 「`installation_id`」を通じて[](/ja/enterprise-server@3.22/rest/apps/apps#get-an-organization-installation-for-the-authenticated-app)を識別できます。 これには、JWT を使用したGitHub Appとしての認証が必要です。詳細については、「[GitHub Appとしての認証](/ja/enterprise-server@3.22/apps/creating-github-apps/authenticating-with-a-github-app/authenticating-as-a-github-app)」を参照してください。
8. 対応する REST API エンドポイントを使用して、インストール アクセス トークンを生成します。「[アプリのインストール アクセス トークンを作成する](/ja/enterprise-server@3.22/rest/apps#create-an-installation-access-token-for-an-app)」を参照してください。 これには、JWT を使用したGitHub Appとしての認証が必要です。詳細については、「[GitHub Appとしての認証](/ja/enterprise-server@3.22/apps/creating-github-apps/authenticating-with-a-github-app/authenticating-as-a-github-app)」および「[インストールとしての認証」](/ja/enterprise-server@3.22/apps/creating-github-apps/authenticating-with-a-github-app/authenticating-as-a-github-app-installation)を参照してください。
9. このインストール アクセス トークンを使用して、REST または GraphQL API、あるいは Git クライアント経由でリポジトリとやり取りします。

詳しくは、「[GitHub アプリのインストール アクセス トークンの生成](/ja/enterprise-server@3.22/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app)」をご覧ください。

## マシンユーザ

サーバーが複数のリポジトリにアクセスする必要がある場合は、 お使いの GitHub Enterprise Server インスタンス に新しいアカウントを作成し、自動化専用に使用される SSH キーをアタッチできます。
お使いの GitHub Enterprise Server インスタンスのこのアカウントは人間によって使用されないため、\_マシン ユーザー\_と呼ばれます。 マシン ユーザーを個人リポジトリの [コラボレーター](/ja/enterprise-server@3.22/repositories/managing-your-repositorys-settings-and-features/repository-access-and-collaboration/inviting-collaborators-to-a-personal-repository) (読み取りと書き込みアクセス権の付与)、組織リポジトリの [外部コラボレーター](/ja/enterprise-server@3.22/organizations/managing-user-access-to-your-organizations-repositories/managing-outside-collaborators/adding-outside-collaborators-to-repositories-in-your-organization) (読み取り、書き込み、または管理者アクセス権の付与)、または自動化する必要があるリポジトリへのアクセス権を持つ [チーム](/ja/enterprise-server@3.22/organizations/organizing-members-into-teams/adding-organization-members-to-a-team) (チームのアクセス許可の付与) として追加できます。

### マシン ユーザーの長所

* リポジトリとサーバーにアクセスできる人は、誰でもプロジェクトをデプロイできる。
* （人間の）ユーザがローカルのSSH設定を変更する必要がない。
* 複数のキーは必要ない。サーバーごとに1つでよい。

### マシン ユーザーの短所

* 組織だけがマシンユーザをリードオンリーのアクセスにできる。 個人リポジトリは、常にコラボレータの読み書きアクセスを許可する。
* マシンユーザのキーは、デプロイキーのように、通常パスフレーズで保護されない。

### マシン ユーザーを設定する

1. サーバーで [`ssh-keygen` 手順を実行](/ja/enterprise-server@3.22/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#generating-a-new-ssh-key)し、公開キーをマシン ユーザー アカウントにアタッチします。
2. マシンユーザアカウントに自動化したいリポジトリへのアクセスを付与してください。 これを行うには、アカウントを [コラボレーター](/ja/enterprise-server@3.22/repositories/managing-your-repositorys-settings-and-features/repository-access-and-collaboration/inviting-collaborators-to-a-personal-repository) として、[外部コラボレーター](/ja/enterprise-server@3.22/organizations/managing-user-access-to-your-organizations-repositories/managing-outside-collaborators/adding-outside-collaborators-to-repositories-in-your-organization) として、または組織内の [チーム](/ja/enterprise-server@3.22/organizations/organizing-members-into-teams/adding-organization-members-to-a-team) に追加します。

[ssh-agent-forwarding]: /authentication/connecting-to-github-with-ssh/using-ssh-agent-forwarding

[generating-ssh-keys]: /authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#generating-a-new-ssh-key

[tos]: /free-pro-team@latest/site-policy/github-terms/github-terms-of-service

[collaborator]: /repositories/managing-your-repositorys-settings-and-features/repository-access-and-collaboration/inviting-collaborators-to-a-personal-repository

[outside-collaborator]: /organizations/managing-user-access-to-your-organizations-repositories/managing-outside-collaborators/adding-outside-collaborators-to-repositories-in-your-organization

[team]: /organizations/organizing-members-into-teams/adding-organization-members-to-a-team

## 参考資料

* [GitHub 資格情報の種類のリファレンス](/ja/enterprise-server@3.22/organizations/managing-programmatic-access-to-your-organization/github-credential-types)
* [通知を設定する](/ja/enterprise-server@3.22/subscriptions-and-notifications/get-started/configuring-notifications)