GitHub을 OAuth 2.0 인증 제공자로 사용하기

Tier: Free, Premium, Ultimate Offering: Self-Managed

GitHub.com 및 GitHub Enterprise와 GitLab 인스턴스를 통합할 수 있습니다. GitHub에서 프로젝트를 가져오거나 GitHub 자격 증명으로 GitLab에 로그인할 수 있습니다.

GitHub에서 OAuth 앱 생성

GitHub OmniAuth 제공자를 활성화하려면 GitHub에서 OAuth 2.0 클라이언트 ID 및 클라이언트 시크릿이 필요합니다:

  1. GitHub에 로그인합니다.
  2. OAuth 앱을 생성합니다 그리고 다음 정보를 제공합니다:
    • GitLab 인스턴스의 URL(예: https://gitlab.example.com).
    • 권한 부여 콜백 URL(예: https://gitlab.example.com/users/auth). GitLab 인스턴스가 기본 포트를 사용하지 않으면 포트 번호를 포함합니다.

보안 취약점 확인

일부 통합에서는 OAuth 2 암시적 리디렉트 취약점으로 GitLab 계정이 compromise될 수 있습니다. 이 취약점을 완화하기 위해 권한 부여 콜백 URL에 /users/auth를 추가합니다.

그러나 우리의 지식으로는 GitHub이 redirect_uri의 하위 도메인 부분을 유효성 검사하지 않습니다. 따라서 웹사이트의 어떤 서브도메인에서라도 하위 도메인 탈취, XSS 또는 오픈 리디렉트가 암시적 리디렉트 공격을 가능하게 할 수 있습니다.

GitLab에서 GitHub OAuth 활성화

  1. 공통 설정을 구성하여 github를 단일 로그인 제공자로 추가합니다. 이를 통해 기존 GitLab 계정이 없는 사용자들을 위한 즉시 계정 프로비저닝이 가능해집니다.

  2. 다음 정보를 사용하여 GitLab 구성 파일을 편집합니다:

    GitHub 설정 GitLab 구성 파일의 값 설명
    클라이언트 ID YOUR_APP_ID OAuth 2.0 클라이언트 ID
    클라이언트 시크릿 YOUR_APP_SECRET OAuth 2.0 클라이언트 시크릿
    URL https://github.example.com/ GitHub 배포 URL
    • Linux 패키지 설치의 경우:

      1. /etc/gitlab/gitlab.rb 파일을 엽니다.

        GitHub.com의 경우, 다음 섹션을 업데이트합니다:

        gitlab_rails['omniauth_providers'] = [
          {
            name: "github",
            # label: "Provider name", # 로그인 버튼에 대한 선택적 레이블, 기본값은 "GitHub"
            app_id: "YOUR_APP_ID",
            app_secret: "YOUR_APP_SECRET",
            args: { scope: "user:email" }
          }
        ]
        

        GitHub Enterprise의 경우, 다음 섹션을 업데이트하고 https://github.example.com/을 GitHub URL로 교체합니다:

        gitlab_rails['omniauth_providers'] = [
          {
            name: "github",
            # label: "Provider name", # 로그인 버튼에 대한 선택적 레이블, 기본값은 "GitHub"
            app_id: "YOUR_APP_ID",
            app_secret: "YOUR_APP_SECRET",
            url: "https://github.example.com/",
            args: { scope: "user:email" }
          }
        ]
        
      2. 파일을 저장하고, GitLab을 재구성합니다.

    • 직접 빌드한 설치의 경우:

      1. config/gitlab.yml 파일을 엽니다.

        GitHub.com의 경우, 다음 섹션을 업데이트합니다:

        - { name: 'github',
            # label: 'Provider name', # 로그인 버튼에 대한 선택적 레이블, 기본값은 "GitHub"
            app_id: 'YOUR_APP_ID',
            app_secret: 'YOUR_APP_SECRET',
            args: { scope: 'user:email' } }
        

        GitHub Enterprise의 경우, 다음 섹션을 업데이트하고 https://github.example.com/을 GitHub URL로 교체합니다:

        - { name: 'github',
            # label: 'Provider name', # 로그인 버튼에 대한 선택적 레이블, 기본값은 "GitHub"
            app_id: 'YOUR_APP_ID',
            app_secret: 'YOUR_APP_SECRET',
            url: "https://github.example.com/",
            args: { scope: 'user:email' } }
        
      2. 파일을 저장하고, GitLab을 다시 시작합니다.

  3. GitLab 로그인 페이지를 새로 고침합니다. GitHub 아이콘이 로그인 양식 아래에 표시되어야 합니다.

  4. 아이콘을 선택합니다. GitHub에 로그인하고 GitLab 응용 프로그램을 승인합니다.

문제 해결

자체 서명 인증서로부터의 GitHub Enterprise 가져오기 실패

자체 서명 인증서를 사용하여 GitHub Enterprise에서 프로젝트를 가져오면 가져오기가 실패합니다.

이 문제를 해결하려면 SSL 검증을 비활성화해야 합니다:

  1. 설정 파일의 verify_sslfalse로 설정합니다.

    • Linux 패키지 설치의 경우:

      gitlab_rails['omniauth_providers'] = [
        {
          name: "github",
          # label: "Provider name", # 로그인 버튼에 대한 선택적 레이블, 기본값은 "GitHub"
          app_id: "YOUR_APP_ID",
          app_secret: "YOUR_APP_SECRET",
          url: "https://github.example.com/",
          verify_ssl: false,
          args: { scope: "user:email" }
        }
      ]
      
    • 직접 빌드한 설치의 경우:

      - { name: 'github',
          # label: 'Provider name', # 로그인 버튼에 대한 선택적 레이블, 기본값은 "GitHub"
          app_id: 'YOUR_APP_ID',
          app_secret: 'YOUR_APP_SECRET',
          url: "https://github.example.com/",
          verify_ssl: false,
          args: { scope: 'user:email' } }
      
  2. GitLab 서버에서 전역 Git sslVerify 옵션을 false로 변경합니다.

    • GitLab 15.3 이상을 실행하는 Linux 패키지 설치의 경우:

      gitaly['gitconfig'] = [
         {key: "http.sslVerify", value: "false"},
      ]
      
    • GitLab 15.2 이전을 실행하는 Linux 패키지 설치의 경우 (이전 방법):

      omnibus_gitconfig['system'] = { "http" => ["sslVerify = false"] }
      
    • GitLab 15.3 이상을 실행하는 직접 빌드한 설치의 경우, Gitaly 구성 (gitaly.toml)을 수정합니다:

      [[git.config]]
      key = "http.sslVerify"
      value = "false"
      
    • GitLab 15.2 이전을 실행하는 직접 빌드한 설치의 경우 (이전 방법):

      git config --global http.sslVerify false
      
  3. Linux 패키지를 사용하여 설치했다면 GitLab을 재구성, 직접 빌드한 설치였다면 GitLab을 재시작합니다.

GitHub Enterprise를 사용하여 로그인하면 500 오류가 발생합니다

이 오류는 GitLab 인스턴스와 GitHub Enterprise 간의 네트워크 연결 문제로 발생할 수 있습니다.

연결 문제를 확인하려면:

  1. GitLab 서버의 production.log로 이동하여 다음 오류를 찾습니다:

    Faraday::ConnectionFailed (execution expired)
    
  2. 레일즈 콘솔을 시작하고 다음 명령을 실행합니다. <github_url>을(를) GitHub Enterprise 인스턴스의 URL로 교체합니다:

    uri = URI.parse("https://<github_url>") # 실제 GitHub URL로 교체하세요
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = 1
    response = http.request(Net::HTTP::Get.new(uri.request_uri))
    
  3. 유사한 execution expired 오류가 반환되면, 이는 연결 문제로 인한 오류임을 확인합니다. GitLab 서버가 GitHub Enterprise 인스턴스에 연결할 수 있는지 확인하세요.

사전에 GitLab 계정이 없는 경우 GitHub 계정을 사용하여 로그인하는 것이 허용되지 않습니다

GitLab에 로그인할 때 다음 오류가 발생합니다:

사전에 GitLab 계정이 없는 경우 GitHub 계정을 사용하여 로그인하는 것이 허용되지 않습니다. 먼저 GitLab 계정을 만든 다음 GitHub 계정에 연결하세요.

이 문제를 해결하려면 GitLab에서 GitHub 로그인을 활성화해야 합니다:

  1. 왼쪽 사이드바에서 아바타를 선택합니다.
  2. 프로필 편집을 선택합니다.
  3. 왼쪽 사이드바에서 계정을 선택합니다.
  4. 서비스 로그인 섹션에서 GitHub에 연결을 선택합니다.