T-CREATOR

GitHub Copilot Enterprise 初期構築:SSO/SCIM・ポリシー・配布ロールアウト設計

GitHub Copilot Enterprise 初期構築:SSO/SCIM・ポリシー・配布ロールアウト設計

GitHub Copilot Enterprise を組織全体で安全かつ効率的に導入するためには、単にライセンスを購入するだけでは不十分です。SSO(Single Sign-On)による認証統合、SCIM(System for Cross-domain Identity Management)によるユーザー管理自動化、そして適切なポリシー設定と段階的なロールアウト戦略が不可欠でしょう。

本記事では、GitHub Copilot Enterprise の初期構築において最も重要となる SSO/SCIM 連携の実装方法、組織のセキュリティを守るポリシー設計、そして現場への円滑な配布戦略について、実践的な手順とともに解説します。

背景

GitHub Copilot Enterprise の位置づけ

GitHub Copilot Enterprise は、個人向けやチーム向けと異なり、組織全体での AI 支援開発を実現するエンタープライズグレードのソリューションです。

組織で AI 支援ツールを導入する際、セキュリティ・コンプライアンス・ガバナンスの観点から、以下のような要件が発生しますね。

  • 認証基盤との統合: 既存の IdP(Identity Provider)との連携
  • ユーザー管理の自動化: 入退社に伴うアカウント管理の効率化
  • アクセス制御: 部署やプロジェクトごとの利用制限
  • 監査ログ: 利用状況の可視化とコンプライアンス対応
  • 段階的展開: 組織全体への計画的なロールアウト

以下の図は、GitHub Copilot Enterprise を組織に導入する際の全体像を示しています。

mermaidflowchart TB
    idp["IdP<br/>(Azure AD/Okta等)"]
    scim["SCIM<br/>プロビジョニング"]
    sso["SSO認証"]

    subgraph github["GitHub Enterprise Cloud"]
        org["Organization"]
        policy["ポリシー設定"]
        copilot["Copilot Enterprise"]
    end

    subgraph users["ユーザー環境"]
        dev1["開発者A"]
        dev2["開発者B"]
        dev3["開発者C"]
    end

    idp -->|ユーザー同期| scim
    idp -->|認証| sso
    scim --> org
    sso --> org
    policy --> copilot
    org --> copilot
    copilot --> dev1
    copilot --> dev2
    copilot --> dev3

図のポイント:

  • IdP を中心とした認証・ユーザー管理の統合
  • GitHub Organization を通じたポリシー適用
  • エンドユーザーへの Copilot 機能提供

エンタープライズ環境での課題

多くの組織では、既に Azure AD(Entra ID)、Okta、Google Workspace などの IdP を導入しており、新しいサービスもこれらと統合することが求められます。

GitHub Copilot Enterprise を導入する際、以下のような課題に直面することが多いでしょう。

#課題カテゴリ具体的な問題
1認証管理複数の認証情報管理によるセキュリティリスク
2ユーザー管理手動でのアカウント作成・削除による運用負荷
3アクセス制御部署や役割に応じた細かな権限設定の困難さ
4コンプライアンス利用状況の追跡と監査対応
5展開戦略一斉導入によるサポート負荷と混乱

これらの課題を解決するために、SSO/SCIM 連携とポリシー設計、計画的なロールアウトが重要になります。

課題

SSO 未導入時のセキュリティリスク

SSO を導入せずに GitHub Copilot Enterprise を利用すると、ユーザーは GitHub 専用のアカウントとパスワードを別途管理する必要があります。

これにより以下のようなリスクが発生するでしょう。

  • パスワードの使い回し: 他サービスと同じパスワードを使用する傾向
  • 退職者アカウントの残存: 手動削除の漏れによるセキュリティホール
  • 多要素認証の未適用: 組織の認証ポリシーが反映されない
  • 認証ログの分散: 監査時の証跡追跡が困難

SCIM 未導入時の運用負荷

SCIM によるプロビジョニング自動化がない場合、以下のような運用上の問題が発生します。

mermaidsequenceDiagram
    participant HR as 人事システム
    participant Admin as IT管理者
    participant IdP as IdP
    participant GitHub as GitHub
    participant User as 新入社員

    Note over HR,User: SCIM未導入の場合
    HR->>Admin: 入社通知
    Admin->>IdP: アカウント作成
    Admin->>GitHub: 手動でアカウント作成
    Admin->>GitHub: 手動でOrganization追加
    Admin->>GitHub: 手動でCopilotライセンス割当
    Admin->>User: 認証情報送付

    Note over Admin: 手動作業が多く<br/>ミスや遅延が発生しやすい

この図が示すように、手動での作業フローでは以下の課題が生じますね。

  • 作業の遅延: 新入社員が初日から Copilot を使えない
  • 設定ミス: 権限の付与漏れや誤設定
  • 退職時の対応漏れ: アカウント削除忘れによるライセンス無駄遣い
  • スケーラビリティの欠如: 大量のユーザー変更に対応できない

ポリシー設定の不備によるリスク

適切なポリシー設定がない場合、以下のようなリスクが発生します。

#リスク項目影響
1パブリックコードへの提案許可機密情報を含むコードの学習リスク
2データ保持期間の未設定プロンプトデータの長期保存による情報漏洩
3IP フィルタリング未設定社外からの不正アクセス
4利用制限の未設定不要な部署へのライセンス配布

ロールアウト戦略の欠如による混乱

一斉展開を行うと、以下のような問題が発生する可能性があります。

  • サポート窓口の混雑: 同時多発的な問い合わせ
  • トレーニング不足: 機能を十分に活用できない
  • 抵抗感の増大: 突然の変更に対する現場の反発
  • 問題の早期発見失敗: パイロット運用なしでの本番展開

解決策

SSO 連携の実装

SSO を実装することで、既存の IdP を通じた統一的な認証が可能になります。

以下は、Azure AD(Entra ID)を使った SSO 連携の全体フローです。

mermaidflowchart LR
    user["ユーザー"]
    github["GitHub"]
    azure["Azure AD"]

    user -->|1. GitHub<br/>アクセス| github
    github -->|2. 認証<br/>リダイレクト| azure
    azure -->|3. 認証画面<br/>表示| user
    user -->|4. 資格情報<br/>入力| azure
    azure -->|5. SAML<br/>アサーション| github
    github -->|6. アクセス<br/>許可| user

SSO 連携のメリット:

  • 既存の認証ポリシー(MFA、条件付きアクセスなど)を適用可能
  • パスワード管理の一元化
  • シングルログアウトによるセキュリティ向上

Azure AD での SSO 設定手順

まずは Azure AD 側でエンタープライズアプリケーションを作成します。

手順 1: Azure AD でのアプリケーション登録

Azure Portal にログインし、以下の手順でアプリケーションを登録してください。

  1. Azure Active Directory > エンタープライズアプリケーション > 新しいアプリケーション を選択
  2. GitHub Enterprise Cloud - Enterprise Account を検索して選択
  3. 任意の名前(例: GitHub-SSO-Production)を入力して作成

手順 2: SAML 設定の構成

アプリケーション作成後、SAML ベースのシングルサインオンを設定します。

typescript// SAML 設定に必要な情報(例)
interface SAMLConfiguration {
  // 基本的な SAML 構成
  identifier: string; // Entity ID
  replyURL: string; // Assertion Consumer Service URL
  signOnURL: string; // Sign-on URL

  // ユーザー属性とクレーム
  claims: {
    nameIdentifier: string; // user.userprincipalname
    emailAddress: string; // user.mail
    givenName: string; // user.givenname
    surname: string; // user.surname
  };
}

Azure Portal の シングルサインオン セクションで以下を設定してください。

typescript// 設定例
const samlConfig: SAMLConfiguration = {
  identifier:
    'https://github.com/enterprises/your-enterprise',
  replyURL:
    'https://github.com/enterprises/your-enterprise/saml/consume',
  signOnURL:
    'https://github.com/enterprises/your-enterprise/sso',

  claims: {
    nameIdentifier: 'user.userprincipalname',
    emailAddress: 'user.mail',
    givenName: 'user.givenname',
    surname: 'user.surname',
  },
};

手順 3: 証明書のダウンロード

SAML 署名証明書をダウンロードし、後ほど GitHub 側の設定で使用します。

  1. SAML 署名証明書 セクションで 証明書(Base64) をダウンロード
  2. ダウンロードした .cer ファイルを安全な場所に保存

手順 4: GitHub Enterprise での SSO 有効化

GitHub Enterprise の管理画面で SSO を設定していきましょう。

GitHub Enterprise アカウントの設定画面にアクセスします。

bash# GitHub Enterprise URL(例)
https://github.com/enterprises/your-enterprise/settings/security

認証設定の入力

以下の情報を GitHub の SSO 設定画面に入力してください。

#項目
1Sign on URLAzure AD の SAML シングルサインオン URL
2IssuerAzure AD のアプリケーション ID URI
3Public Certificateダウンロードした証明書の内容
bash# 証明書内容の確認コマンド(macOS/Linux)
cat downloaded-certificate.cer

証明書の内容(-----BEGIN CERTIFICATE----- から -----END CERTIFICATE----- まで)をコピーして GitHub の設定欄に貼り付けます。

手順 5: SSO のテスト

設定完了後、必ずテストユーザーでログインテストを実施しましょう。

  1. GitHub からログアウト
  2. Enterprise アカウントの SSO URL にアクセス
  3. Azure AD のログイン画面にリダイレクトされることを確認
  4. 認証情報を入力して GitHub にログインできることを確認

SCIM プロビジョニングの実装

SCIM を実装することで、IdP でのユーザー管理が自動的に GitHub に反映されます。

SCIM 連携のアーキテクチャ

以下の図は、SCIM による自動プロビジョニングの流れを示しています。

mermaidsequenceDiagram
    participant HR as 人事システム
    participant IdP as Azure AD/Okta
    participant SCIM as SCIM API
    participant GitHub as GitHub Enterprise
    participant User as ユーザー

    Note over HR,User: SCIM自動プロビジョニング
    HR->>IdP: 新規ユーザー登録
    IdP->>SCIM: POST /Users<br/>(ユーザー作成)
    SCIM->>GitHub: アカウント作成
    GitHub->>SCIM: 200 OK
    SCIM->>IdP: 作成完了通知

    IdP->>SCIM: POST /Groups<br/>(グループ追加)
    SCIM->>GitHub: Organization追加
    GitHub-->>User: 招待メール送信

    Note over User: 自動的にセットアップ<br/>完了している

SCIM のメリット:

  • 人事システムとの連携による完全自動化
  • 即座のアカウント作成・削除
  • グループベースのアクセス管理

Azure AD での SCIM 設定手順

先ほど作成した Azure AD のエンタープライズアプリケーションで SCIM を有効にします。

手順 1: GitHub での SCIM トークン生成

GitHub Enterprise の設定画面で SCIM 用の Personal Access Token を生成してください。

  1. GitHub Enterprise の Settings > Personal access tokens に移動
  2. Generate new token (classic) をクリック
  3. スコープで admin:enterprise を選択
  4. トークンを生成してコピー(このトークンは二度と表示されません)
bash# 生成されるトークンの形式(例)
ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

手順 2: Azure AD でのプロビジョニング設定

Azure AD のエンタープライズアプリケーション設定に戻り、プロビジョニングを構成します。

  1. プロビジョニング > 開始 をクリック
  2. プロビジョニングモードを 自動 に設定

以下の情報を入力してください。

typescript// プロビジョニング設定
interface ProvisioningConfig {
  tenantURL: string; // SCIM エンドポイント
  secretToken: string; // GitHub PAT
  scope: string; // 同期範囲
}

const config: ProvisioningConfig = {
  tenantURL:
    'https://api.github.com/scim/v2/enterprises/your-enterprise',
  secretToken: 'ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  scope: 'Sync only assigned users and groups', // または "Sync all users and groups"
};

手順 3: 属性マッピングの設定

Azure AD と GitHub の属性を正しくマッピングすることが重要です。

デフォルトのマッピングを確認し、必要に応じてカスタマイズしましょう。

#Azure AD 属性GitHub 属性必須
1userPrincipalNameuserName
2mailemails[type eq "work"].value
3displayNamename.formatted
4givenNamename.givenName-
5surnamename.familyName-
typescript// カスタム属性マッピングの例
interface AttributeMapping {
  sourceAttribute: string; // Azure AD 属性
  targetAttribute: string; // GitHub SCIM 属性
  matchingPriority?: number; // マッチング優先度
  applyMapping: boolean; // マッピング適用
}

const customMappings: AttributeMapping[] = [
  {
    sourceAttribute: 'department',
    targetAttribute:
      'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:department',
    applyMapping: true,
  },
  {
    sourceAttribute: 'employeeId',
    targetAttribute: 'externalId',
    matchingPriority: 1,
    applyMapping: true,
  },
];

手順 4: プロビジョニングのテスト

設定完了後、テストユーザーで動作確認を行います。

  1. Azure AD でテストユーザーをアプリケーションに割り当て
  2. オンデマンドプロビジョニング 機能でテスト実行
  3. GitHub でユーザーが作成されたことを確認
bash# GitHub CLI でユーザー確認(オプション)
gh api /enterprises/your-enterprise/members

手順 5: 自動同期の有効化

テストが成功したら、定期的な自動同期を有効にしましょう。

typescript// 同期設定
interface SyncSettings {
  syncCycle: string; // 同期サイクル
  scope: string; // 同期範囲
  notificationEmail: string; // 通知先
  preventAccidentalDeletion: boolean; // 誤削除防止
}

const syncConfig: SyncSettings = {
  syncCycle: '40 minutes', // Azure AD のデフォルト
  scope: 'assigned', // 割り当てられたユーザーのみ
  notificationEmail: 'admin@example.com',
  preventAccidentalDeletion: true, // 5 件以上の削除時に停止
};
  1. プロビジョニング状態オン に設定
  2. 保存 をクリックして同期を開始

ポリシー設計と実装

GitHub Copilot Enterprise では、組織のセキュリティ要件に応じた細かなポリシー設定が可能です。

コンテンツ除外設定

特定のリポジトリやファイルパターンを Copilot の学習対象から除外できます。

GitHub Enterprise の Settings > Copilot > Policies にアクセスしてください。

typescript// コンテンツ除外設定の例
interface ContentExclusion {
  repositories: string[]; // 除外リポジトリ
  filePatterns: string[]; // 除外ファイルパターン
  pathPatterns: string[]; // 除外パスパターン
}

const exclusionPolicy: ContentExclusion = {
  repositories: [
    'org/security-credentials',
    'org/customer-data',
    'org/compliance-docs',
  ],
  filePatterns: [
    '*.key',
    '*.pem',
    '*.env',
    'secrets.yaml',
    'credentials.json',
  ],
  pathPatterns: [
    '**/config/production/*',
    '**/secrets/**',
    '**/credentials/**',
  ],
};

この設定により、機密情報を含むファイルが Copilot のコンテキストに含まれることを防ぎます。

データ保持ポリシー

Copilot が送信するプロンプトとレスポンスのデータ保持期間を設定しましょう。

typescript// データ保持設定
interface DataRetentionPolicy {
  prompts: {
    retention: string; // プロンプトの保持期間
    anonymization: boolean; // 匿名化処理
  };
  suggestions: {
    retention: string; // サジェスションの保持期間
    telemetry: boolean; // テレメトリ送信
  };
}

const retentionPolicy: DataRetentionPolicy = {
  prompts: {
    retention: '30 days', // 監査用に30日間保持
    anonymization: true, // 個人情報の匿名化
  },
  suggestions: {
    retention: '90 days', // 品質改善のため90日保持
    telemetry: false, // OpenAI へのテレメトリ送信オフ
  },
};

重要: エンタープライズプランでは、デフォルトでプロンプトデータが OpenAI のモデル改善に使用されないよう設定されています。

IP アドレス制限

特定の IP アドレス範囲からのみ Copilot の利用を許可できます。

typescript// IP 制限設定
interface IPAllowlist {
  enabled: boolean;
  allowedRanges: string[]; // 許可する CIDR 範囲
  blockByDefault: boolean; // デフォルトでブロック
}

const ipPolicy: IPAllowlist = {
  enabled: true,
  allowedRanges: [
    '203.0.113.0/24', // 本社オフィス
    '198.51.100.0/24', // 支社オフィス
    '192.0.2.0/24', // VPN 接続
  ],
  blockByDefault: true,
};

この設定は GitHub Enterprise の Settings > Security > IP allow list で構成します。

組織レベルでのポリシー適用

以下のポリシーを組織レベルで設定することで、一貫したガバナンスを実現できますね。

#ポリシー項目推奨設定説明
1パブリックコード提案無効内部コードのみを参照
2プロンプトデータ共有無効OpenAI へのデータ送信オフ
3組織外コラボレーター制限外部ユーザーの利用制限
4プラグイン使用承認制サードパーティ統合の制御
5モバイルアクセス条件付きMDM 管理端末のみ許可
typescript// 組織ポリシー設定(GitHub REST API 経由)
interface OrganizationPolicy {
  copilot: {
    publicCodeSuggestions: 'disabled' | 'enabled';
    ideIntegrations: string[];
    excludedLanguages: string[];
  };
  security: {
    ipAllowlist: boolean;
    samlRequired: boolean;
    twoFactorRequired: boolean;
  };
}

const orgPolicy: OrganizationPolicy = {
  copilot: {
    publicCodeSuggestions: 'disabled',
    ideIntegrations: [
      'vscode',
      'visualstudio',
      'jetbrains',
      'neovim',
    ],
    excludedLanguages: [], // 特定言語の除外(必要に応じて)
  },
  security: {
    ipAllowlist: true,
    samlRequired: true,
    twoFactorRequired: true,
  },
};

ロールアウト戦略の設計

段階的なロールアウトにより、リスクを最小化しながら組織全体に展開できます。

4 段階ロールアウトモデル

以下の図は、推奨する 4 段階のロールアウトプロセスを示しています。

mermaidflowchart TD
    phase1["Phase 1:<br/>パイロット運用<br/>(5-10名)"]
    phase2["Phase 2:<br/>アーリーアダプター<br/>(50-100名)"]
    phase3["Phase 3:<br/>部門展開<br/>(部門単位)"]
    phase4["Phase 4:<br/>全社展開<br/>(全開発者)"]

    eval1["評価・<br/>フィードバック"]
    eval2["評価・<br/>改善"]
    eval3["評価・<br/>最適化"]

    phase1 --> eval1
    eval1 --> phase2
    phase2 --> eval2
    eval2 --> phase3
    phase3 --> eval3
    eval3 --> phase4

各フェーズの詳細を見ていきましょう。

Phase 1: パイロット運用(1〜2 週間)

最初のパイロットグループは、技術的に熟練した 5〜10 名で構成します。

typescript// パイロットグループの選定基準
interface PilotCriteria {
  technicalSkill: 'high' | 'medium' | 'low';
  willingness: boolean; // 新技術への積極性
  feedbackCapability: boolean; // フィードバック能力
  diversity: string[]; // 技術スタックの多様性
}

const pilotSelection: PilotCriteria = {
  technicalSkill: 'high',
  willingness: true,
  feedbackCapability: true,
  diversity: [
    'frontend',
    'backend',
    'infrastructure',
    'mobile',
  ],
};

パイロット期間中に以下を評価してください。

  • 生産性の変化(コード作成速度、バグ率)
  • ユーザー満足度(アンケート実施)
  • セキュリティインシデントの有無
  • サポート問い合わせの内容と頻度

Phase 2: アーリーアダプター(2〜4 週間)

パイロットで問題がなければ、50〜100 名のアーリーアダプターグループに展開します。

typescript// アーリーアダプターの Azure AD グループ設定
interface EarlyAdopterGroup {
  groupName: string;
  members: number;
  trainingRequired: boolean;
  supportChannel: string;
}

const earlyAdopterConfig: EarlyAdopterGroup = {
  groupName: 'GitHub-Copilot-EarlyAdopters',
  members: 75,
  trainingRequired: true,
  supportChannel: '#copilot-support', // Slack/Teams チャンネル
};

Azure AD でグループを作成し、SCIM 経由で自動的に Copilot ライセンスを割り当てます。

  1. Azure AD で新しいグループ GitHub-Copilot-EarlyAdopters を作成
  2. グループをエンタープライズアプリケーションに割り当て
  3. SCIM が自動的にメンバーに Copilot を有効化

Phase 3: 部門展開(1〜2 ヶ月)

アーリーアダプターからのフィードバックを反映し、部門単位で展開していきます。

typescript// 部門別展開計画
interface DepartmentRollout {
  departmentName: string;
  azureADGroup: string;
  scheduledDate: string;
  trainingSession: string;
  champion: string; // 部門内のチャンピオン
}

const rolloutPlan: DepartmentRollout[] = [
  {
    departmentName: 'プラットフォーム開発部',
    azureADGroup: 'GitHub-Copilot-Platform',
    scheduledDate: '2025-02-01',
    trainingSession: '2025-01-25',
    champion: '田中太郎',
  },
  {
    departmentName: 'Web アプリケーション開発部',
    azureADGroup: 'GitHub-Copilot-WebApp',
    scheduledDate: '2025-02-15',
    trainingSession: '2025-02-08',
    champion: '佐藤花子',
  },
  {
    departmentName: 'モバイルアプリ開発部',
    azureADGroup: 'GitHub-Copilot-Mobile',
    scheduledDate: '2025-03-01',
    trainingSession: '2025-02-22',
    champion: '鈴木一郎',
  },
];

各部門で「チャンピオン」を任命し、現場での質問対応やベストプラクティスの共有を担当してもらいましょう。

Phase 4: 全社展開

すべての部門での運用が安定したら、全開発者に展開します。

bash# Azure AD で全開発者グループをエンタープライズアプリに割り当て
az ad group member add \
  --group "GitHub-Copilot-AllDevelopers" \
  --member-id <user-object-id>
typescript// 全社展開時のモニタリング設定
interface MonitoringConfig {
  metrics: string[];
  alertThreshold: {
    errorRate: number;
    supportTickets: number;
    licenseUsage: number;
  };
  reportingFrequency: string;
}

const monitoring: MonitoringConfig = {
  metrics: [
    'active-users',
    'code-acceptance-rate',
    'support-tickets',
    'security-incidents',
  ],
  alertThreshold: {
    errorRate: 5, // 5% 以上のエラー率で警告
    supportTickets: 50, // 週間 50 件以上で警告
    licenseUsage: 90, // 90% 以上で追加購入検討
  },
  reportingFrequency: 'weekly',
};

具体例

実装シナリオ:500 名規模の組織

ここでは、従業員 500 名(開発者 200 名)の架空の企業「テックイノベーション株式会社」での具体的な実装例を紹介します。

環境情報

#項目内容
1従業員数500 名(開発者 200 名)
2IdPAzure AD(Entra ID)
3既存認証SAML + MFA(条件付きアクセス)
4開発組織4 部門(Web、モバイル、インフラ、データ)
5GitHub 環境GitHub Enterprise Cloud

Step 1: SSO 設定(初日)

IT 管理者の山田さんが SSO を設定していきます。

Azure AD でのアプリケーション作成

bash# Azure CLI を使用した自動化例(オプション)
az ad sp create \
  --id 00000000-0000-0000-0000-000000000000 \
  --display-name "GitHub Enterprise SSO"

Azure Portal での手動設定も可能です。

  1. エンタープライズアプリケーションで GitHub Enterprise Cloud - Enterprise Account を追加
  2. アプリケーション名を GitHub-SSO-Production に設定
  3. SAML 設定で以下を構成
typescript// テックイノベーション社の SAML 設定
const techInnovationSAML = {
  identifier:
    'https://github.com/enterprises/tech-innovation',
  replyURL:
    'https://github.com/enterprises/tech-innovation/saml/consume',
  signOnURL:
    'https://github.com/enterprises/tech-innovation/sso',

  // カスタムクレーム
  claims: {
    nameIdentifier: 'user.userprincipalname',
    emailAddress: 'user.mail',
    displayName: 'user.displayname',
    department: 'user.department',
    employeeId: 'user.employeeid',
  },
};

条件付きアクセスポリシーの適用

GitHub アクセス時に MFA を必須化します。

typescript// 条件付きアクセス設定
interface ConditionalAccessPolicy {
  name: string;
  conditions: {
    applications: string[];
    locations: string[];
    platforms: string[];
  };
  controls: {
    mfa: boolean;
    compliantDevice: boolean;
    approvedApp: boolean;
  };
}

const githubAccessPolicy: ConditionalAccessPolicy = {
  name: 'GitHub-Copilot-Access-Policy',
  conditions: {
    applications: ['GitHub Enterprise SSO'],
    locations: ['All locations'],
    platforms: ['All platforms'],
  },
  controls: {
    mfa: true, // MFA 必須
    compliantDevice: true, // 準拠デバイスのみ
    approvedApp: false,
  },
};

Step 2: SCIM プロビジョニング設定(2 日目)

SCIM 連携を有効にして、ユーザー管理を自動化します。

GitHub での SCIM トークン生成

山田さんが GitHub Enterprise の管理者として PAT を生成します。

bash# GitHub CLI での PAT 生成(対話型)
gh auth login --scopes admin:enterprise

# または Web UI で生成
# https://github.com/enterprises/tech-innovation/settings/tokens

Azure AD でのプロビジョニング設定

typescript// プロビジョニング構成
const provisioningSetup = {
  tenantURL:
    'https://api.github.com/scim/v2/enterprises/tech-innovation',
  secretToken: 'ghp_xxxxx...', // 生成した PAT

  // 属性マッピング
  attributeMappings: [
    {
      source: 'userPrincipalName',
      target: 'userName',
      matchingPriority: 1,
    },
    {
      source: 'mail',
      target: 'emails[type eq "work"].value',
    },
    {
      source: 'department',
      target:
        'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:department',
    },
  ],
};

テストユーザーでの動作確認

bash# テストユーザー(test.user@tech-innovation.com)をアプリに割り当て
# Azure AD の「オンデマンドプロビジョニング」でテスト実行

ログで以下が確認できれば成功です。

json{
  "status": "success",
  "details": {
    "action": "Create",
    "targetSystem": "GitHub Enterprise",
    "user": {
      "userName": "test.user@tech-innovation.com",
      "emails": [
        { "value": "test.user@tech-innovation.com" }
      ],
      "name": { "givenName": "Test", "familyName": "User" }
    }
  }
}

Step 3: ポリシー設定(3 日目)

セキュリティチームと協議の上、以下のポリシーを設定します。

コンテンツ除外ルール

機密リポジトリを Copilot のインデックス対象から除外しましょう。

GitHub Enterprise の Settings > Copilot > Content Exclusions で設定します。

typescript// 除外対象リポジトリとパターン
const exclusionRules = {
  repositories: [
    'tech-innovation/customer-database',
    'tech-innovation/payment-processing',
    'tech-innovation/employee-data',
    'tech-innovation/security-keys',
  ],

  filePatterns: [
    '*.key',
    '*.pem',
    '*.pfx',
    '.env*',
    'secrets.yaml',
    'credentials.json',
    'config/production/*.yml',
  ],

  pathPatterns: [
    '**/config/production/**',
    '**/secrets/**',
    '**/credentials/**',
    '**/keys/**',
  ],
};

IP アドレス制限

オフィスと VPN からのアクセスのみを許可します。

typescript// IP 許可リスト
const ipAllowlist = {
  enabled: true,
  ranges: [
    {
      name: '本社オフィス',
      cidr: '203.0.113.0/24',
      description: '東京オフィス',
    },
    {
      name: '大阪支社',
      cidr: '198.51.100.0/24',
      description: '大阪オフィス',
    },
    {
      name: 'VPN接続',
      cidr: '192.0.2.0/24',
      description: '企業 VPN ゲートウェイ',
    },
  ],
};

GitHub の Settings > Security > IP allow list で各 CIDR を追加します。

Step 4: パイロット運用(Week 1-2)

開発部長の佐藤さんと相談し、パイロットメンバーを選定します。

パイロットグループの構成

typescript// パイロットメンバー(8名)
const pilotMembers = [
  {
    name: '鈴木一郎',
    department: 'Web開発部',
    role: 'シニアエンジニア',
    techStack: ['React', 'TypeScript', 'Node.js'],
  },
  {
    name: '田中花子',
    department: 'モバイル開発部',
    role: 'リードエンジニア',
    techStack: ['React Native', 'Swift', 'Kotlin'],
  },
  {
    name: '高橋太郎',
    department: 'インフラ部',
    role: 'DevOpsエンジニア',
    techStack: ['Terraform', 'Python', 'Go'],
  },
  // ... 残り5名
];

Azure AD グループでの管理

bash# Azure AD で専用グループを作成
az ad group create \
  --display-name "GitHub-Copilot-Pilot" \
  --mail-nickname "copilot-pilot"

# メンバーを追加
az ad group member add \
  --group "GitHub-Copilot-Pilot" \
  --member-id <user-object-id>

このグループを Azure AD のエンタープライズアプリケーションに割り当てると、SCIM が自動的に GitHub でライセンスを有効化します。

キックオフミーティング(Day 1)

山田さんがパイロットメンバーに以下を説明します。

  1. Copilot の基本的な使い方(30 分)
  2. セキュリティポリシーと注意事項(15 分)
  3. フィードバック方法の説明(15 分)
typescript// フィードバック収集計画
interface FeedbackPlan {
  channels: string[];
  frequency: string;
  metrics: string[];
  survey: {
    week1: string;
    week2: string;
  };
}

const feedbackPlan: FeedbackPlan = {
  channels: [
    '#copilot-pilot (Slack)',
    '週次ミーティング (30分)',
    '個別ヒアリング',
  ],
  frequency: 'daily',
  metrics: [
    'コード受入率',
    '生産性の変化',
    '満足度 (1-10)',
    '問題点・改善要望',
  ],
  survey: {
    week1: '初期印象・使いやすさ',
    week2: '総合評価・推奨度',
  },
};

Week 2: パイロット評価

2 週間後、以下のような結果が得られました。

#評価項目結果備考
1平均満足度8.5 / 10高評価
2コード受入率37%業界平均的
3生産性向上+25%自己申告ベース
4セキュリティインシデント0 件問題なし
5サポート問い合わせ12 件軽微な質問のみ

フィードバックから以下の改善点が見つかりました。

typescript// 改善アクション
const improvements = [
  {
    issue: 'プロンプトの書き方がわからない',
    action: 'ベストプラクティスガイドを作成',
    owner: '山田',
  },
  {
    issue: '特定の言語(Go)での精度が低い',
    action: 'コンテキスト設定を見直し',
    owner: '高橋',
  },
  {
    issue: 'ショートカットキーを覚えられない',
    action: 'チートシート配布',
    owner: '鈴木',
  },
];

Step 5: アーリーアダプター展開(Week 3-6)

パイロットの成功を受け、75 名のアーリーアダプターに展開します。

グループ管理

bash# アーリーアダプターグループ作成
az ad group create \
  --display-name "GitHub-Copilot-EarlyAdopters" \
  --mail-nickname "copilot-early"

# 部門ごとのサブグループも作成
az ad group create --display-name "Copilot-Early-Web"
az ad group create --display-name "Copilot-Early-Mobile"
az ad group create --display-name "Copilot-Early-Infra"
az ad group create --display-name "Copilot-Early-Data"

トレーニングセッション

各部門で 1 時間のハンズオントレーニングを実施しましょう。

typescript// トレーニングアジェンダ
const trainingAgenda = {
  duration: '60 minutes',
  contents: [
    {
      topic: 'Copilot の基礎',
      time: '15分',
      format: 'デモ + ハンズオン',
    },
    {
      topic: '効果的なプロンプト',
      time: '20分',
      format: '実践演習',
    },
    {
      topic: 'セキュリティベストプラクティス',
      time: '15分',
      format: 'レクチャー',
    },
    {
      topic: 'Q&A',
      time: '10分',
      format: '質疑応答',
    },
  ],
  materials: [
    'クイックスタートガイド.pdf',
    'プロンプト例集.md',
    'セキュリティチェックリスト.pdf',
  ],
};

4 週間後の評価

typescript// アーリーアダプター期間の KPI
const earlyAdopterKPI = {
  activeUsers: 72, // 75名中72名が利用中(96%)
  avgSatisfaction: 8.2, // 平均満足度
  productivityGain: '+23%', // 生産性向上
  securityIncidents: 0, // セキュリティ問題なし
  supportTickets: 48, // サポート問い合わせ

  topFeedback: [
    '単純なコードの自動生成が便利',
    'テストコード作成時間が半減',
    '新しい API の学習が早くなった',
  ],
};

Step 6: 部門展開(Month 2-3)

部門ごとに段階的に展開していきます。

展開スケジュール

typescript// 部門別ロールアウト詳細計画
const departmentRollout = [
  {
    phase: 'Week 7-8',
    department: 'Web開発部(50名)',
    azureGroup: 'GitHub-Copilot-Web',
    training: '2025-02-05',
    activation: '2025-02-08',
    champion: '鈴木一郎',
  },
  {
    phase: 'Week 9-10',
    department: 'インフラ部(30名)',
    azureGroup: 'GitHub-Copilot-Infra',
    training: '2025-02-19',
    activation: '2025-02-22',
    champion: '高橋太郎',
  },
  {
    phase: 'Week 11-12',
    department: 'モバイル開発部(25名)',
    azureGroup: 'GitHub-Copilot-Mobile',
    training: '2025-03-05',
    activation: '2025-03-08',
    champion: '田中花子',
  },
  {
    phase: 'Week 13-14',
    department: 'データ分析部(20名)',
    azureGroup: 'GitHub-Copilot-Data',
    training: '2025-03-19',
    activation: '2025-03-22',
    champion: '伊藤次郎',
  },
];

自動化スクリプト

部門展開時の作業を自動化します。

bash#!/bin/bash
# 部門展開自動化スクリプト(例: Web開発部)

DEPARTMENT="Web"
GROUP_NAME="GitHub-Copilot-${DEPARTMENT}"
TRAINING_DATE="2025-02-05"

# 1. Azure AD グループ作成
az ad group create \
  --display-name "${GROUP_NAME}" \
  --mail-nickname "copilot-${DEPARTMENT,,}"

# 2. メンバーを一括追加(CSV から読み込み)
while IFS=, read -r email; do
  USER_ID=$(az ad user show --id "$email" --query objectId -o tsv)
  az ad group member add --group "${GROUP_NAME}" --member-id "$USER_ID"
done < "${DEPARTMENT}_members.csv"

# 3. エンタープライズアプリケーションにグループを割り当て
# (Azure Portal で手動、または Graph API を使用)

echo "部門 ${DEPARTMENT} の展開準備が完了しました"
echo "トレーニング日: ${TRAINING_DATE}"

Step 7: 全社展開(Month 4)

すべての部門で安定運用を確認後、全開発者(200 名)に展開します。

最終チェックリスト

typescript// 全社展開前のチェックリスト
const preRolloutChecklist = [
  {
    item: 'SSO/SCIM が安定稼働している',
    status: '✓',
    verifiedBy: '山田',
  },
  {
    item: '全部門でパイロット運用完了',
    status: '✓',
    verifiedBy: '佐藤',
  },
  {
    item: 'セキュリティポリシーが適用済み',
    status: '✓',
    verifiedBy: 'セキュリティチーム',
  },
  {
    item: 'サポート体制が整っている',
    status: '✓',
    verifiedBy: 'IT部門',
  },
  {
    item: 'トレーニング資料が完備',
    status: '✓',
    verifiedBy: '山田',
  },
  {
    item: 'ライセンス数が十分',
    status: '✓',
    verifiedBy: '調達部門',
  },
];

全社アナウンス

markdown# 【重要】GitHub Copilot Enterprise 全社展開のお知らせ

開発者の皆様

2025 年 4 月 1 日より、GitHub Copilot Enterprise を全開発者にご利用いただけるようになります。

# スケジュール

- 4 月 1 日: 全開発者に自動有効化
- 3 月 25 日: オンライントレーニング開催(任意参加)
- 3 月中: オンデマンドビデオ・ドキュメント公開

# 利用開始方法

1. VS Code / JetBrains IDE に Copilot 拡張機能をインストール
2. GitHub アカウントでサインイン(SSO 経由)
3. すぐに利用開始可能

# サポート

- Slack: #copilot-support
- ドキュメント: https://wiki.tech-innovation.local/copilot
- トレーニング動画: https://learning.tech-innovation.local/copilot

開発生産性向上にぜひご活用ください!

IT 部門 山田

モニタリングダッシュボード

全社展開後、継続的にメトリクスを監視します。

typescript// 監視指標
interface MonitoringMetrics {
  daily: {
    activeUsers: number;
    codeAcceptanceRate: number;
    apiErrors: number;
    supportTickets: number;
  };
  weekly: {
    newUsers: number;
    averageSatisfaction: number;
    topIssues: string[];
  };
  monthly: {
    licenseUtilization: number;
    costPerDeveloper: number;
    productivityROI: string;
  };
}

// 実際のデータ(展開1ヶ月後)
const monthlyMetrics: MonitoringMetrics['monthly'] = {
  licenseUtilization: 187 / 200, // 93.5% 利用率
  costPerDeveloper: 39, // 月額 $39/
  productivityROI: '+22%', // 平均生産性向上
};

トラブルシューティング例

実装中に発生しやすい問題と解決方法を紹介しましょう。

問題 1: SCIM 同期エラー

エラーコード: Error 400: Invalid SCIM schema

エラーメッセージ:

json{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "status": "400",
  "detail": "Invalid value for attribute 'userName': email format required"
}

発生条件:

Azure AD の userPrincipalName が email 形式でない場合(例: user1 のみ)

解決方法:

属性マッピングを mail 属性に変更します。

typescript// 修正前
const incorrectMapping = {
  source: 'userPrincipalName', // "user1" のような値
  target: 'userName',
};

// 修正後
const correctMapping = {
  source: 'mail', // "user@example.com" 形式
  target: 'userName',
};

Azure AD のプロビジョニング設定で以下を実施してください。

  1. プロビジョニング > 属性マッピング を開く
  2. userName のマッピングソースを mail に変更
  3. 保存 して再同期を実行

問題 2: SSO ループ

エラーコード: Error: Infinite redirect loop detected

発生条件:

  • SAML 設定の ReplyURL が間違っている
  • GitHub と Azure AD の Entity ID が一致していない

解決方法:

設定を再確認し、正しい URL を設定します。

typescript// 正しい設定値の確認
const correctSAMLConfig = {
  entityID:
    'https://github.com/enterprises/your-enterprise',
  acsURL:
    'https://github.com/enterprises/your-enterprise/saml/consume',
  // 間違い例: /saml/acs(GitHub は /saml/consume を使用)
};

Azure Portal で以下を修正してください。

  1. エンタープライズアプリ > シングルサインオン を開く
  2. 基本的な SAML 構成応答 URL を確認
  3. 末尾が ​/​saml​/​consume であることを確認
  4. GitHub 側の設定とも照合

問題 3: Copilot が特定のリポジトリで動作しない

エラーメッセージ:

vbnetCopilot: This repository is excluded from Copilot suggestions

発生条件:

コンテンツ除外ルールでリポジトリが除外されている

解決方法:

除外ルールを見直します。

typescript// 除外ルールの確認
const checkExclusion = async (repoName: string) => {
  const exclusions = await getContentExclusions();

  const isExcluded = exclusions.repositories.some(
    (pattern) => new RegExp(pattern).test(repoName)
  );

  if (isExcluded) {
    console.log(`Repository ${repoName} is excluded`);
    console.log(
      'Matching patterns:',
      exclusions.repositories.filter((p) =>
        new RegExp(p).test(repoName)
      )
    );
  }

  return isExcluded;
};

// 使用例
await checkExclusion('tech-innovation/web-app');
// 出力: Repository tech-innovation/web-app is excluded
//      Matching patterns: ["tech-innovation/web-*"]

除外が意図的でない場合、GitHub Enterprise の Settings > Copilot > Content Exclusions でパターンを修正してください。

まとめ

GitHub Copilot Enterprise の初期構築では、SSO/SCIM による認証・ユーザー管理の自動化、適切なポリシー設定、そして計画的なロールアウト戦略が成功の鍵となります。

本記事でご紹介した内容を振り返りましょう。

実装のポイント

SSO 連携では、既存の IdP(Azure AD や Okta)と GitHub を統合することで、パスワード管理を一元化し、MFA などの組織の認証ポリシーを適用できます。SAML 設定を正しく構成し、証明書の有効期限管理も忘れずに行いましょう。

SCIM プロビジョニングにより、人事システムでのユーザー変更が自動的に GitHub に反映されるため、手動作業によるミスや遅延を防げますね。属性マッピングを適切に設定し、定期的な同期ログの確認も重要です。

ポリシー設計では、コンテンツ除外によって機密情報を保護し、IP アドレス制限で不正アクセスを防止します。組織のセキュリティ要件に応じて、データ保持期間やパブリックコード提案の可否も検討してください。

ロールアウト戦略として、パイロット運用からアーリーアダプター、部門展開、全社展開という 4 段階のアプローチを推奨します。各段階でフィードバックを収集し、問題を早期に発見・解決することで、全社展開時のリスクを最小化できるでしょう。

成功のための推奨事項

初期構築を成功させるために、以下の点に注意してください。

#推奨事項理由
1テスト環境での事前検証本番への影響を防ぐため
2セキュリティチームとの連携ポリシー設計の妥当性確認
3詳細なドキュメント作成運用引き継ぎと問題解決の効率化
4継続的なモニタリング利用状況とセキュリティの可視化
5フィードバックループの確立ユーザー満足度と改善の継続

GitHub Copilot Enterprise は、適切に構築・運用することで、開発組織全体の生産性を大きく向上させる強力なツールです。本記事の手順を参考に、皆様の組織でも安全かつ効果的な導入を実現していただければ幸いです。

関連リンク