TheKoguryo's 기술 블로그

 Version 2024.04.01

15.3 Resource Manager을 위한 Private Git 서버 구성

Resource Manager는 테라폼 설정 저장소로 GitHub, GitLab을 지원합니다. 퍼블릭 인터넷으로 접근이 가능한 환경은 당연히 Resource Manager에서 연결이 가능합니다. 설정 저장소를 퍼블릭 서버가 아닌 내부 서버를 사용하고자 하는 경우, OCI 상에 Private 하게 설치된 서버는 다음 절차에 따라 연결할 수 있습니다.

Private GitLab CE VM 만들기

Compute 인스턴스 만들기
  1. GitLab CE를 설치할 Compute 인스턴스를 만듭니다.

    • Image: Oracle Linux 7.9를 선택 (아래 설치 내용은 Oracle Linux 7 기준입니다)
    • Networking: Public IP가 없는 Private Subnet을 선택
      • 예시, Private Subnet-ExampleVCN
    • Add SSH Keys: 사용할 키 쌍의 Public Key를 입력
  2. GitLab CE 인스턴스 접속을 위한 JumpBox Compute 인스턴스를 준비합니다.

    • Networking:
      • Public IP를 가지고 GitLab CE 인스턴스에 접근이 가능하도록 설정합니다.
      • Public Subnet을 선택하고 Public IP를 받도록 설정합니다.
      • 예시, Public Subnet-ExampleVCN
    • Add SSH Keys: 사용할 키 쌍의 Public Key를 입력
  3. Private Key를 사용하여 JumpBox에 SSH로 접속합니다.

  4. JumpBox에서 다시 GitLab CE에 SSH로 접속합니다.

    • Private Key를 JumpBox의 홈에 .ssh/id_rsa에 저장하거나, ssh 옵션으로 지정할 수 있습니다.

    • Private Key를 사용하여 GitLab CE 인스턴스에 SSH로 접속합니다.

      [opc@jumpbox ~]$ ssh opc@10.0.1.149
      Last login: Mon Jun 20 04:44:00 2022 from jumpbox.sub06200152300.examplevcn.oraclevcn.com
      [opc@gitlab-ce ~]$
      
GitLab CE 설치하기
  1. 접속한 GitLab CE Compute 인스턴스에 GitLab CE를 설치합니다.

  2. 필요한 OS 라이브러리를 설치합니다.

    sudo yum install -y curl policycoreutils-python openssh-server perl
    # Enable OpenSSH server daemon if not enabled: sudo systemctl status sshd
    sudo systemctl enable sshd
    sudo systemctl start sshd
    # Check if opening the firewall is needed with: sudo systemctl status firewalld
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --permanent --add-service=https
    sudo systemctl reload firewalld
    
  3. Postfix를 통해 이메일 통지를 할 경우 다음을 설치합니다.

    sudo yum install postfix
    sudo systemctl enable postfix
    sudo systemctl start postfix
    
  4. GitLab CE 라파지토리를 설정합니다.

    curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
    
  5. GitLab CE 패키지를 설치합니다.

    EXTERNAL_URL는 DNS를 통해 접속하는 주소로, HTTPS 인증서 등록시 사용될 주소입니다. 원하는 주소로 입력합니다.

    sudo EXTERNAL_URL="https://gitlab.example.com" yum install -y gitlab-ce
    
  6. 서버가 속한 Security List에 Ingress Rule 추가합니다.

    • Security List Name: 예) Security List for Private Subnet-ExampleVCN
    • 대상: 예) VCN(10.0.0.0/16)내의 Source에 대해서 허용하는 경우
    StatelessSourceIP ProtocolSource Port RangeDestination Port RangeDescription
    No10.0.0.0/16TCPAll443GitLab CE
OCI Certificate 서비스에서 Certificate Authority 만들기
  • Resource Manager에서 HTTPS기반 Private Git Server를 지원합니다.
  • Private Git Server를 HTTPS로 연결시 사용할 Certificate은 OCI Certificate으로 등록되어 있어야 합니다.
    • 별도 공인기관 Certificate인 경우 사전에 임포트 합니다.
    • OCI Certificate 서비스가 Self-Signed Certificate에 대한 임포트를 지원하지 않기 때문에, 별도 공인 Certificate이 없는 경우 OCI Certificate 서비스에서 만들어서 사용합니다. 여기에서는 OCI Certificate 서비스를 통해 CA와 Certificate을 만듭니다.
  1. OCI 콘솔에서 내비게이션 메뉴의 Identity & Security » Dynamic Group을 클릭합니다.

  2. CA를 위한 Dynamic Group을 만듭니다.

    • Name: 예시, ca-dynamic-group
    resource.type='certificateauthority'
    
  3. Policy를 만듭니다.

    • Name: 예시, ca-policy
    Allow dynamic-group <YourDynamicGroupName> to use keys in compartment <YourCompartmentName>
    Allow dynamic-group <YourDynamicGroupName> to manage objects in compartment <YourCompartmentName>
    
  4. OCI 콘솔에서 내비게이션 메뉴의 Identity & Security » Vault를 클릭합니다.

  5. 새 Vault를 만듭니다.

    • Name: 예시, my-vault
  6. 만들어진 Vault로 이동합니다.

  7. 새 Master Encryption Key를 만듭니다.

    • OCI Certificate에서 사용하기 위해서는 HSM 모드로, 비대칭 키(여기서는 RSA 기반 키)를 만듭니다.

    image-20220620182043090

  8. OCI 콘솔에서 내비게이션 메뉴의 Identity & Security » Certificate » Certificate Authorities를 클릭합니다.

  9. Create Certificate Authority를 클릭합니다.

  10. Certificate Authority 생성 정보를 입력합니다.

  • 기본 정보

    • CA 타입: Root Certificate Authority
    • Name: 예시, my-oci-root-ca
  • Subject Information

    • Common Name: 예시, My OCI Root CA
  • Authority Configuration

    • 앞서 만든 Vault의 Master Encryption Key를 선택합니다.

    image-20220621144727219

  • Expire Rule

    • Maximum Validity Duration for Certificates (Days): 하위 인증서의 최대 유효 기간으로 기본 90일
  • Revocation Configuration

    • Skip Revocation을 체크합니다.
  • Summary

    • 설정 내용 확인후 CA를 만듭니다.

    image-20220621145521391

OCI Certificate 만들기
  1. 앞서 만든 CA 화면으로 이동합니다.

  2. Resources > Certificates에서 Issue Certificate을 클릭합니다.

  3. Certificate 생성 정보를 입력합니다.

    • 기본 정보

      • CA 타입: Issued by internal CA
      • Name: 예시, gitlab.example.com
    • Subject Information

      • Common Name: HTTPS로 접속시 사용할 주소명을 입력합니다. GitLab CE 설정이 EXTERNAL_URL 값과 동일해야 합니다.
        • 예시, gitlab.example.com
    • Certificate Configuration

      • 만료 날짜(Not Valid After)를 설정된 날짜의 전날로 지정합니다.
        • 그렇치 않으면, 타임존에 의한 약간 시간차로 최대 만료기간(예시, 90일)을 초과하여 생성시 “The validity period 7838778727 exceeds the maximum validity period allowed 7776000000.“과 같은 오류가 발생합니다.
      • 나머지는 기본설정 그대로 사용
    • Rules

      • 그대로 사용
    • Summary

      • 설정 내용 확인후 Certificate를 만듭니다.

      image-20220621155502790

GitLab CE에 OCI Certificate으로 HTTPS 설정하기
  1. HTTPS 설정시에는 Certificate PEM과 Private Key PEM 파일이 필요합니다.

  2. Certificate PEM 다운로드

    • 생성한 Certificate 화면 오른쪽 아이콘을 클릭하여 View Content 클릭

      image-20220621162027782

    • 위쪽 Certificate PEM 영역의 값을 복사하여 gitlab.example.com.crt 파일명으로 저장합니다.

  3. Private Key 다운로드

    • 오라클 클라우드 콘솔에서 직접 다운받을 수 없어 OCI CLI로 다운로드 받을 수 있습니다.

    • 편의상 OCI CLI가 바로 사용가능한 Cloud Shell로 접속합니다.

    • OCI CLI로 다음명령을 수행하여 Private Key PEM 값을 저장합니다. gitlab.example.com.key 파일명으로 저장합니다.

      • –certificate-id는 앞서 생성한 Certificate의 OCID 값을 사용
      oci certificates certificate-bundle get --certificate-id=ocid1.certificate.oc1.... --bundle-type=CERTIFICATE_CONTENT_WITH_PRIVATE_KEY --query 'data."private-key-pem"' --raw-output
      
  4. OCI CLI가 설치된 앞서와 동일한 방식으로 JumpBox를 통해 GitLab CE Compute 인스턴스에 SSH로 접속합니다.

  5. /etc/gitlab/gitlab.rb 파일에서 external_url 값을 확인합니다

    ## GitLab URL
    ...
    external_url 'https://gitlab.example.com'
    
  6. /etc/gitlab/gitlab.rb에서 Let’s Encrypt을 비활성화 합니다.

    ################################################################################
    # Let's Encrypt integration
    ################################################################################
    letsencrypt['enable'] = false
    
  7. /etc/gitlab/ssl 폴더를 생성하고 앞서 다운로드 및 OCI CLI로 받은 Certificate PEM과 Private Key PEM 파일을 복사합니다.

    sudo mkdir -p /etc/gitlab/ssl/bak
    sudo chmod 755 /etc/gitlab/ssl
    sudo mv /etc/gitlab/ssl/*.* /etc/gitlab/ssl/bak/
    sudo cp gitlab.example.com.key gitlab.example.com.crt /etc/gitlab/ssl/
    
  8. GitLab 재구성 및 재시작

    최초 설치이후 24시간이 지난후 gitlab-ctl reconfigure를 돌린 경우 초기 root의 암호 파일이 삭제될 수 있습니다. 실행 전에 미리 확인합니다.

    sudo gitlab-ctl reconfigure
    sudo gitlab-ctl restart
    
GitLab 접속 테스트
  1. GitLab을 웹으로 접속하기 위해서 JumpBox를 통해 GitLab 서버로 SSH 터널링합니다.

    • GitLab CE 인스턴스의 Private IP가 10.0.1.149인 경우
    ssh opc@jumpbox -L 8443:10.0.1.149:443
    
  2. 로컬에서 웹브라우저로 접속합니다.

    • 접속주소: https://localhost:8443
    • 맥에서 크롬브라우저 예시입니다.
    • 접속후 인증서를 확인합니다.

    image-20220621182531484

    • 인증서 발급자(CA)와 인증서 정보를 확인할 수 있솝니다.

      image-20220621182754136

  3. root 암호를 확인합니다. 최초 설치이후 24시간이 지난후 gitlab-ctl reconfigure를 돌린 경우 삭제될 수 있습니다.

    sudo cat /etc/gitlab/initial_root_password
    
  4. root 유저로 접속을 확인합니다.

    image-20220621183040531

  5. Private Git 서버로 사용할 GitLab CE 서버의 기본 구성이 완료되었습니다.

Resource Manager에서 Private Git 서버 연결하기

Terraform 구성정보를 저장할 GitLab Repository 및 접속 계정 만들기
  1. 새 GitLab 프로젝트를 만듭니다.

    • 새 blank 프로젝트를 만듭니다.
    • 프로젝트 이름: 예) orm-project
  2. 메뉴에서 Admin 페이지로 이동합니다.

    image-20220621184123496

  3. Resource Manager에서 연결할 유저를 만듭니다.

    • Admin 메뉴에서 Overview > Users 를 클릭합니다.
    • 오른쪽 상단 New user를 클릭합니다.
    • 유저 기본 정보를 입력하여 유저를 생성합니다.
    • 유저 Account 오른쪽 위에 있는 Edit 버튼을 클릭하여 임시 패스워드를 입력합니다.
  4. 생성한 프로젝트에 유저를 추가합니다.

    • 프로젝트 페이지로 이동합니다.
    • Project Information > Members 메뉴로 이동합니다.
    • Invite Member를 통해 생성한 유저를 Maintainer 역할로 추가합니다.
  5. 생성한 유저로 로그인합니다.

  6. Resource Manager에서 사용할 Access Token을 만듭니다.

    • 유저 프로파일을 변경화면으로 이동합니다.

    • 왼쪽 User Settings 메뉴에서 Access Token을 클릭합니다.

    • GitLab의 경우 read_api 권한을 추가하여 생성합니다.

      image-20220621212553231

    • 생성된 Personal Access Token을 복사해 둡니다.

Private Endpoint 만들기

Private Access는 OCI 서비스에서 인터넷을 거치지 않고, 사용자의 Private 환경에 접근하는 것을 뜻합니다. OCI Resource Manager에서도 인터넷을 통하지 않고 사용자의 Private IP를 통해 대상 서버, 여기서는 Private Git Server를 접근하기 위해 Private Subneet에 연결 포인트인 Private Endpoint를 만듭니다.

  1. OCI 콘솔에서 내비게이션 메뉴의 Developer Services » Resource Manager » Private Endpoints를 클릭합니다.

  2. Create private endpoint를 클릭합니다.

  3. private endpoint 생성 정보하여 생성합니다.

    • Name: 예시, gitlab-private-endpoint
    • VCN, Subnet: GitLab 서버에 접근이 가능한 서브넷을 선택합니다.
      • 예시, Private Subnet-ExampleVCN
    • Resource Manager에서 Source Provider로 설정하기 위해 다음을 체크합니다.
      • Allow this private endpoint to be used with a configuration source provider

    image-20220621214303068

  4. Private Endpoint를 위한 내부 구성을 하는 데 일정 시간이 소요됩니다. 테스트 환경에서는 Private Endpoint가 Active 상태로 되기까지 5~6 분 정도 소요되었습니다.

Private DNS Zone 만들기
  1. OCI 콘솔에서 내비게이션 메뉴의 Networking » DNS Management » Zones를 클릭합니다.

  2. Private Zones 탭을 클릭합니다.

  3. VCN 생성시 만들어진 내부 DNS Zone 정보가 보입니다. Create Zone을 클릭하여 새 Zone을 만듭니다.

    image-20220621215528999

  4. Private Endpoint를 속한 DNS Private View내에서, Private Git Server를 위한 Zone을 추가합니다.

    image-20220621215913870

  5. 생성된 Zone에 Private Git Server를 위한 레코드를 추가합니다.

  6. 앞서 생성한 GitLab CE의 DNS 이름과 Private IP 주소를 아래와 같이 추가합니다.

    image-20220621220546121

  7. Publish Changes를 클릭하여, 변경사항을 반영합니다.

  8. 이제 해당 VCN내에서 gitlab.example.com와 Private IP가 매핑이 됩니다. 같은 VCN 상인 JumpBox에서 아래와 같이 조회됩니다.

    [opc@jumpbox ~]$ nslookup gitlab.example.com
    Server:		169.xxx.xxx.xxx
    Address:	169.xxx.xxx.xxx#53
    
    Non-authoritative answer:
    Name:	gitlab.example.com
    Address: 10.0.1.149
    
    [opc@jumpbox ~]$
    
Source Provider 만들기
  1. 다시 Resource Manager로 돌아갑니다.

  2. OCI 콘솔에서 내비게이션 메뉴의 Developer Services » Resource Manager » Configuration Source Providers를 클릭합니다.

  3. Create Configuration Source Provider를 클릭합니다.

  4. Source Provider 정보를 입력하여 만듭니다.

    • Name: 예시, private-gitlab
    • Private endpoint 유형 선택
    • Private Endpoints: 앞서 만든 gitlab-private-endpoint 선택
    • SSL certificate: GitLab CE 서버에서 사용중인 OCI Certificate 선택

    image-20220621221648125

    • Type: GitLab 선택
    • Server URL: GitLab CE 서버 설치시 EXTERNAL_URL이자, OCI Certificate 생성시 Common Name으로 등록한 DNS Name을 사용한 주소를 입력합니다.
    • Personal Access Token: Resource Manager에서 사용하기 위해 앞서 GitLab CE에 추가 생성한 유저의 Access Token 입력

    image-20220621221850633

  5. 만들어진 Source Provider를 클릭합니다.

    image-20220621222451682

  6. 연결 테스트를 위해 Validate connection을 클릭합니다.

    image-20220621222634466

  7. 연결을 성공하였습니다.

    image-20220621222759867

  8. Source Provider에서 Create Stack을 클릭합니다.

  9. Private Git Repository 조회 테스트

    • 테라폼 구성의 소스가 앞서 만든 Private Git 서버가 자동으로 선택됩니다.
    • 해당 서버에 있는 Repository가 조회되는 것을 볼 수 있습니다.

    image-20220621223324255

  10. 여기서는 일단 잘 조회되는지 테스트만 하고 다음 단계로 넘어갑니다.

Private Git Server에 테라폼 설정 만들기
  1. Private Git Server에 접근이 가능한 JumpBox를 SSH로 접속합니다.

  2. 오라클 클라우드 콘솔에서 앞서 만든 OCI Certificate의 상세화면으로 이동합니다.

  3. Certificate Chain PEM 다운로드

    • 생성한 Certificate 화면 오른쪽 아이콘을 클릭하여 View Content 클릭

      image-20220621162027782

    • 아래 Certificate Chain PEM 영역의 값을 복사하여 my-oci-root-ca.crt 파일명으로 저장합니다.

  4. OCI Certificate 서비스에서 만든 Root CA를 JumpBox에 신뢰할 수 있는 CA로 다음과 같이 추가합니다.

    • Oracle Linux 기준 명령입니다.
    sudo cp my-oci-root-ca.crt /etc/pki/ca-trust/source/anchors/
    sudo update-ca-trust
    
  5. GitLab 접속 브라우저로 돌아가 Repository의 주소를 복사합니다.

    image-20220621225034591

  6. JumpBox에서 git clone 명령을 수행합니다.

    • 앞서 만든 GitLab 유저와 패스워드를 사용합니다.
    • Root CA를 등록했기 때문에서, SSL 관련 에러 없이 정상적으로 클론에 성공했습니다.
    [opc@jumpbox ~]$ git clone https://gitlab.example.com/gitlab-instance-ed05d7b9/orm-project.git
    Cloning into 'orm-project'...
    Username for 'https://gitlab.example.com': orm-user
    Password for 'https://orm-user@gitlab.example.com':
    remote: Enumerating objects: 3, done.
    remote: Counting objects: 100% (3/3), done.
    remote: Compressing objects: 100% (2/2), done.
    remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
    Receiving objects: 100% (3/3), done.
    
  7. 복제된 프로젝트 폴더로 이동합니다.

  8. 여기에 이전 가이드(15.1 Resource Manager 사용하기)를 참고하여 테라폼 설정 파일을 만듭니다.

  9. 변경된 파일을 반영합니다.

    image-20220621231657308

Resource Manager에서 Private Git Server를 통해 자원 생성하기
  1. 오라클 클라우드 콘솔에서 내비게이션 메뉴의 Developer Services » Resource Manager » Stack를 클릭합니다.

  2. Create Stack을 클릭합니다.

  3. 설정파일 위치를 Source Code Control System로 선택합니다.

  4. 앞서 설정한 private-gitlab Source Provider에 테라폼 설정이 있는 Repository를 선택합니다.

  5. 아래 그림과 같이 Repository에 있는 스키마 정보를 정상적으로 가져오는 것을 볼 수 있습니다.

    image-20220621232206087

  6. 나머지 값을 기본 값을 이용해 Stack을 생성합니다.

  7. 만들어진 Stack을 Apply를 클릭하여 테라폼 설정을 적용합니다.

  8. Private Git Server상의 테라폼 설정을 통해 정상적으로 생성된 것을 볼 수 있습니다.

    image-20220621234418985



이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 21 Jun 2022