4.10. Git 보안을 사용하여 파이프라인 인증

Git 시크릿은 Git 리포지토리와 안전하게 상호 작용하는 자격 증명으로 구성되며, 종종 인증을 자동화하는 데 사용됩니다. Red Hat OpenShift Pipelines에서는 Git 시크릿을 사용하여 실행 중에 Git 리포지토리와 상호 작용하는 파이프라인 실행 및 작업 실행을 인증할 수 있습니다.

파이프라인 실행 또는 작업 실행은 연결된 서비스 계정을 통해 시크릿에 액세스할 수 있습니다. 파이프라인은 기본 인증 및 SSH 기반 인증을 위해 주석(키-값 쌍)으로 Git 보안을 사용할 수 있도록 지원합니다.

4.10.1. 인증 정보 선택

파이프라인 실행 또는 작업 실행에는 다른 Git 리포지토리에 액세스하려면 여러 인증이 필요할 수 있습니다. Pipeline에서 인증 정보를 사용할 수 있는 도메인에 각 시크릿에 주석을 답니다.

Git 보안에 대한 인증 정보 주석 키는 tekton.dev/git- 로 시작해야 하며 해당 값은 Pipeline에서 해당 인증 정보를 사용할 호스트의 URL입니다.

다음 예제에서 파이프라인은 사용자 이름과 암호를 사용하는 basic-auth 보안을 사용하여 github.com 및 gitlab.com 의 리포지토리에 액세스합니다.

예제: 기본 인증을 위한 여러 인증 정보

apiVersion: v1
kind: Secret
metadata:
  annotations:
    tekton.dev/git-0: github.com
    tekton.dev/git-1: gitlab.com
type: kubernetes.io/basic-auth
stringData:
  username: 1
  password: 2

1
리포지터리의 사용자 이름
2
리포지터리의 암호 또는 개인 액세스 토큰

ssh-auth 시크릿(개인 키)을 사용하여 Git 리포지토리에 액세스할 수도 있습니다.

예제: SSH 기반 인증을 위한 개인 키

apiVersion: v1
kind: Secret
metadata:
  annotations:
    tekton.dev/git-0: https://github.com
type: kubernetes.io/ssh-auth
stringData:
  ssh-privatekey: 1

1
SSH 개인 키 문자열이 포함된 파일의 이름입니다.

4.10.2. Git에 대한 기본 인증 구성

암호로 보호된 리포지토리에서 리소스를 검색하려면 파이프라인에 대한 기본 인증을 구성해야 합니다.

파이프라인에 대한 기본 인증을 구성하려면 지정된 리포지토리의 Git 시크릿에서 인증 정보로 secret .yaml,serviceaccount.yaml을 업데이트하고.yaml 파일을 실행합니다. 이 프로세스를 완료하면 Pipeline에서 해당 정보를 사용하여 지정된 파이프라인 리소스를 검색할 수 있습니다.

참고

GitHub의 경우 일반 암호를 사용한 인증이 더 이상 사용되지 않습니다. 대신 개인 액세스 토큰을 사용합니다.

절차

  1. secret.yaml 파일에서 사용자 이름 및 암호 또는 GitHub 개인 액세스 토큰을 지정하여 대상 Git 리포지토리에 액세스합니다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: basic-user-pass 1
      annotations:
        tekton.dev/git-0: https://github.com
    type: kubernetes.io/basic-auth
    stringData:
      username: 2
      password: 3
    1
    보안의 이름입니다. 예에서는 basic-user-pass 입니다.
    2
    Git 리포지토리의 사용자 이름.
    3
    Git 리포지토리의 암호입니다.
  2. serviceaccount.yaml 파일에서 시크릿을 적절한 서비스 계정과 연결합니다.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-bot 1
    secrets:
      - name: basic-user-pass 2
    1
    서비스 계정 이름입니다. 예에서는 build-bot 입니다.
    2
    보안의 이름입니다. 예에서는 basic-user-pass 입니다.
  3. run.yaml 파일에서 서비스 계정을 작업 실행 또는 파이프라인 실행과 연결합니다.

    • 서비스 계정을 작업 실행과 연결합니다.

      apiVersion: tekton.dev/v1beta1
      kind: TaskRun
      metadata:
        name: build-push-task-run-2 1
      spec:
        serviceAccountName: build-bot 2
        taskRef:
          name: build-push 3
      1
      작업 실행의 이름입니다. 예에서는 build-push-task-run-2 입니다.
      2
      서비스 계정 이름입니다. 예에서는 build-bot 입니다.
      3
      작업 이름입니다. 예에서는 build-push 입니다.
    • 서비스 계정을 PipelineRun 리소스와 연결합니다.

      apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        name: demo-pipeline 1
        namespace: default
      spec:
        serviceAccountName: build-bot 2
        pipelineRef:
          name: demo-pipeline 3
      1
      파이프라인 실행의 이름입니다. 예에서는 demo-pipeline 입니다.
      2
      서비스 계정 이름입니다. 예에서는 build-bot 입니다.
      3
      파이프라인의 이름입니다. 예에서는 demo-pipeline 입니다.
  4. 변경 사항을 적용합니다.

    $ kubectl apply --filename secret.yaml,serviceaccount.yaml,run.yaml

4.10.3. Git에 대한 SSH 인증 구성

SSH 키로 구성된 리포지토리에서 리소스를 검색하려면 해당 파이프라인에 대한 SSH 기반 인증을 구성해야 합니다.

파이프라인에 대한 SSH 기반 인증을 구성하려면 지정된 리포지토리의 SSH 개인 키에서 인증 정보를 사용하여 secret .yaml,serviceaccount.yaml을 업데이트하고.yaml 파일을 실행합니다. 이 프로세스를 완료하면 Pipeline에서 해당 정보를 사용하여 지정된 파이프라인 리소스를 검색할 수 있습니다.

참고

기본 인증이 아닌 SSH 기반 인증을 사용하는 것이 좋습니다.

절차

  1. SSH 개인 키를 생성하거나 일반적으로 ~/.ssh/id_rsa 파일에서 사용할 수 있는 기존 개인 키를 복사합니다.
  2. secret.yaml 파일에서 ssh-privatekey 값을 SSH 개인 키 파일의 이름으로 설정하고 known_hosts 값을 알려진 호스트 파일의 이름으로 설정합니다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: ssh-key 1
      annotations:
        tekton.dev/git-0: github.com
    type: kubernetes.io/ssh-auth
    stringData:
      ssh-privatekey: 2
      known_hosts: 3
    1
    SSH 개인 키가 포함된 시크릿의 이름입니다. 예에서는 ssh-key 입니다.
    2
    SSH 개인 키 문자열이 포함된 파일의 이름입니다.
    3
    알려진 호스트 목록을 포함하는 파일의 이름입니다.
    경고

    개인 키를 생략하면 Pipeline에서 모든 서버의 공개 키를 허용합니다.

  3. 선택 사항: 사용자 지정 SSH 포트를 지정하려면 주석 값 끝에 :<port number> 를 추가합니다. 예를 들면 tekton.dev/git-0: github.com:2222 입니다.
  4. serviceaccount.yaml 파일에서 ssh-key 시크릿을 build- bot 서비스 계정과 연결합니다.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-bot 1
    secrets:
      - name: ssh-key 2
    1
    서비스 계정 이름입니다. 예에서는 build-bot 입니다.
    2
    SSH 개인 키가 포함된 시크릿의 이름입니다. 예에서는 ssh-key 입니다.
  5. run.yaml 파일에서 서비스 계정을 작업 실행 또는 파이프라인 실행과 연결합니다.

    • 서비스 계정을 작업 실행과 연결합니다.

      apiVersion: tekton.dev/v1beta1
      kind: TaskRun
      metadata:
        name: build-push-task-run-2 1
      spec:
        serviceAccountName: build-bot 2
        taskRef:
          name: build-push 3
      1
      작업 실행의 이름입니다. 예에서는 build-push-task-run-2 입니다.
      2
      서비스 계정 이름입니다. 예에서는 build-bot 입니다.
      3
      작업 이름입니다. 예에서는 build-push 입니다.
    • 서비스 계정을 파이프라인 실행과 연결합니다.

      apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        name: demo-pipeline 1
        namespace: default
      spec:
        serviceAccountName: build-bot 2
        pipelineRef:
          name: demo-pipeline 3
      1
      파이프라인 실행의 이름입니다. 예에서는 demo-pipeline 입니다.
      2
      서비스 계정 이름입니다. 예에서는 build-bot 입니다.
      3
      파이프라인의 이름입니다. 예에서는 demo-pipeline 입니다.
  6. 변경 사항을 적용합니다.

    $ kubectl apply --filename secret.yaml,serviceaccount.yaml,run.yaml

4.10.4. Git 유형 작업에서 SSH 인증 사용

Git 명령을 호출할 때 작업 단계에서 직접 SSH 인증을 사용할 수 있습니다. SSH 인증은 $HOME 변수를 무시하고 /etc/passwd 파일에 지정된 사용자의 홈 디렉터리만 사용합니다. 따라서 작업의 각 단계에서 /tekton/home/.ssh 디렉토리를 연결된 사용자의 홈 디렉토리로 심볼릭해야 합니다.

그러나 git 유형의 파이프라인 리소스를 사용하거나 Tekton 카탈로그에서 사용할 수 있는 git -clone 작업을 사용하는 경우에는 명시적 심볼릭 링크가 필요하지 않습니다.

git 유형 작업에서 SSH 인증을 사용하는 예제는 authenticateating -git-commands.yaml 을 참조하십시오.

4.10.5. root가 아닌 사용자로 보안 사용

다음과 같이 특정 시나리오에서 루트가 아닌 사용자로 시크릿을 사용해야 할 수 있습니다.

  • 컨테이너가 실행을 실행하는 데 사용하는 사용자 및 그룹은 플랫폼에 의해 무작위화됩니다.
  • 작업의 단계에서는 루트가 아닌 보안 컨텍스트를 정의합니다.
  • 작업은 작업의 모든 단계에 적용되는 글로벌 루트가 아닌 보안 컨텍스트를 지정합니다.

이러한 시나리오에서는 작업 실행 및 파이프라인 실행에 대한 다음 측면을 루트가 아닌 사용자로 고려합니다.

  • Git에 대한 SSH 인증에는 사용자에게 /etc/passwd 디렉터리에 구성된 유효한 홈 디렉터리가 있어야 합니다. 유효한 홈 디렉터리가 없는 UID를 지정하면 인증에 실패합니다.
  • SSH 인증은 $HOME 환경 변수를 무시합니다. 따라서 Pipeline(/tekton/home)에서 루트가 아닌 사용자의 유효한 홈 디렉터리로 정의된 $HOME 디렉토리에서 적절한 시크릿 파일을 가져와야 합니다.

또한 루트가 아닌 보안 컨텍스트에서 SSH 인증을 구성하려면 git 명령을 인증하는 예를 참조하십시오.

4.10.6. 특정 단계에 대한 보안 액세스 제한

기본적으로 파이프라인의 시크릿은 $HOME/tekton/home 디렉터리에 저장되며 작업의 모든 단계에서 사용할 수 있습니다.

특정 단계로 보안을 제한하려면 secret 정의를 사용하여 볼륨을 지정하고 특정 단계에서 볼륨을 마운트합니다.