강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

taeho Kim님의 프로필 이미지
taeho Kim

작성한 질문수

[DevOps] 빠르고 안전한 어플리케이션 배포 파이프라인(CI/CD) 만들기

2.1. [SECRET] gitleaks 소개 및 파이프라인 적용

gitleaks 시크릿 스캔의 기준에 대한 질문입니다.

작성

·

6

1

1. 무엇을 하고 싶으신가요?

 gitleaks가 secret을 판별하는 기준에 대해서, 또 지금 현 상황에 대한 이유가 궁금합니다.

 

2. 언제, 어떤 오류가 발생하시나요?

from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello_world():
    return "AROAWU22AXDEPO3JX44FD"


@app.route("/rextest")
def rextest():
    return "REXTEST_PATH"


if __name__ == "__main__":
    app.run(
        host="0.0.0.0",
        port=8080,
        debug=True,
    ) 

app.py 코드를 위처럼 작성해서 MR을 날릴 경우, 파이프라인에서 gitleaks에 시크릿 값(AWS 예제)가 스캔되지 않습니다. 때문에 build job까지 문제 없이 실행이 됩니다.

 

3. 어떤 시도를 해보셨나요?

로컬 환경에서 강사님 코드를 pull 하고 tools 디렉토리의 gitleaks 디렉토리에서 gitleaks detect -v --no-git 명령을 수행해도 디스코드 예제와 깃랩 예제 2 종류만 스캔될 뿐 AWS 예제는 스캔되지 않습니다.

 

그래서 app.py 파일에 디스코드 예제를 넣어서 파이프라인을 실행할 경우, 정상적으로 gitleaks에서 시크릿이 스캔되어 job이 실패합니다.

 

이러한 경우, 코드 문제가 아니라 gitleaks에 대한 문제라고 생각이 드는데, 강의 영상에서는 AWS 예제가 스캔되어 job이 실패되고 저는 정상적으로 실행되는 이유가 궁금합니다.

 

4. 작성한 코드를 공유해주세요.

stages:
  - gitleaks
  - build
  - deploy

default:
  image:
    name: bentolor/docker-dind-awscli
  id_tokens:
    GITLAB_OIDC_TOKEN:
      aud: https://gitlab.com

variables:
  AWS_DEFAULT_REGION: ap-northeast-2
  IMAGE: ${CI_PROJECT_NAME}:latest
  REMOTE_LATEST_IMAGE: ${AWS_ECR_REPO_URL}:latest
  REMOTE_REGULAR_IMAGE: ${AWS_ECR_REPO_URL}:${CI_COMMIT_SHORT_SHA}

.get_aws_role: &get_aws_role
  - >
    export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s"
    $(aws sts assume-role-with-web-identity
    --role-arn ${AWS_ROLE_ARN}
    --role-session-name "GitLabRunner-${CI_PROJECT_ID}-${CI_PIPELINE_ID}"
    --web-identity-token ${GITLAB_OIDC_TOKEN}
    --duration-seconds 3600
    --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]'
    --output text))

.get_ecr_token: &get_ecr_token
  - *get_aws_role
  - aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${AWS_ECR_REPO_URL}

gitleaks:
  stage: gitleaks
  image:
    name: zricethezav/gitleaks:latest
    entrypoint: [""]
  script:
    - gitleaks detect -v --no-git --redact --report-format json
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        paths:
          - app.py
          - Dockerfile
          - requirements.txt

build-container-image:
  stage: build
  services:
    - name: docker:dind
  before_script:
    - *get_ecr_token
  script:
    - docker build -t ${IMAGE} .
    - docker tag ${IMAGE} ${REMOTE_LATEST_IMAGE}
    - docker push ${REMOTE_LATEST_IMAGE}
    - docker tag ${IMAGE} ${REMOTE_REGULAR_IMAGE}
    - docker push ${REMOTE_REGULAR_IMAGE}
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes: 
        paths:
          - app.py
          - Dockerfile
          - requirements.txt

deploy:
  stage: deploy
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  before_script: *get_aws_role
  variables:
    AWS_DEFAULT_REGION: ap-northeast-1
  script:
    - |
      export SERVICE_NAME="${CI_PROJECT_NAME}-service"
      export AR_SERVICE_NAME=$(aws apprunner list-services --query "ServiceSummaryList[?ServiceName=='${SERVICE_NAME}'].ServiceName | [0]" --output text)

      # AppRunner에 해당 레포의 매핑되는 서비스가 없는 경우
      if [ ${AR_SERVICE_NAME} != ${SERVICE_NAME} ]; then 
          export AR_SERVICE_ARN=$(aws apprunner create-service --service-name "${SERVICE_NAME}" --source-configuration "{\"AuthenticationConfiguration\": {\"AccessRoleArn\": \"${AWS_APP_RUNNER_SERVICE_ROLE_ARN}\"}, \"ImageRepository\": {\"ImageIdentifier\": \"${REMOTE_LATEST_IMAGE}\", \"ImageRepositoryType\": \"ECR\"}}" --instance-configuration 'Cpu="0.25 vCPU",Memory="0.5 GB"' --output text --query "Service.ServiceArn")
          echo "[+] Creating ${AR_SERVICE_ARN}"
      # AppRunner 서비스가 존재하는 경우
      else
          export AR_SERVICE_ARN=$(aws apprunner list-services --query "ServiceSummaryList[?ServiceName=='${SERVICE_NAME}'].ServiceArn | [0]" --output text)
          aws apprunner start-deployment --service-arn ${AR_SERVICE_ARN}
          echo "[+] Deploying ${AR_SERVICE_ARN}"
      fi

      export AR_SERVICE_STATUS=$(aws apprunner describe-service --service-arn ${AR_SERVICE_ARN} --output text --query "Service.Status")
      while [ ${AR_SERVICE_STATUS} != "RUNNING" ]; do
          echo "[*] Waiting..."
          sleep 10

          export AR_SERVICE_STATUS=$(aws apprunner describe-service --service-arn ${AR_SERVICE_ARN} --output text --query "Service.Status")
          if [ ${AR_SERVICE_STATUS} = "CREATE_FAILED" ]; then
              echo "[-] ${AR_SERVICE_ARN} ${AR_SERVICE_STATUS}"
              exit 1
          fi
      done

      echo "[+] ${AR_SERVICE_ARN} deployed!"
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      changes: 
        paths:
          - app.py
          - Dockerfile
          - requirements.txt

답변 1

0

천강민님의 프로필 이미지
천강민
지식공유자

안녕하세요.

확인해보니 gitleaks가 업데이트 되면서 오탐으로 분류된 것으로 보입니다.

https://github.com/gitleaks/gitleaks/pull/1307

위 링크 참고 부탁드릴게요.

감사합니다. 천강민 드림.

taeho Kim님의 프로필 이미지
taeho Kim

작성한 질문수

질문하기