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

Tier: 무료, 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 계정을 침해할 수 있습니다. 이 취약점을 완화하려면 권한 부여 콜백 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
    • 리눅스 패키지 설치의 경우:

      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로 설정합니다.

    • 리눅스 패키지 설치의 경우:

      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 이상의 경우:

      gitaly['gitconfig'] = [
         {key: "http.sslVerify", value: "false"},
      ]
      
    • GitLab 15.2 이하 버전(레거시 방법)에서 실행 중인 리눅스 패키지 설치의 경우:

      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. 리눅스 패키지를 사용하여 설치한 경우 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. Service sign-in 섹션에서 Connect to GitHub을 선택합니다.