Google Cloud

[Secret Manager] API 를 통하여 SSH 비밀 키 추출 및 SFTP 전송

창MIN 2024. 4. 9. 11:04

 

Google Function을 통하여,

Secret Manager에 등록 되어 있는 키 값을 추출하여 SSH 인증을 하고 버킷의 파일을 SFTP 전송 테스트를 해야 함. 

 

해당 테스트를 부여 받고 

크게 3가지 과정으로 나누어 생각해 보았다.

 

사전 과정: SFTP 전송을 위해 prarmiko 라이브러리 사용, SSH 비밀키 공개키 생성, Secret Manager 비밀키 등록

모든 작업은 Cloud Function을 통하여 테스트를 진행하였다.

 

Process:

  1. Secret Manager API 통하여 등록한 키 값 추출
  2. 추출한 Key로 prarmiko 라이브러리 통하여 SFTP conection 확인
  3. bucket 파일 vm 으로 SFTP 전송

 

VM에 접속 이후 .ssh 폴더에 들어가 ssh-keygen 명령어를 통하여 SSH 키 생성

ssh-keygen -t rsa -m pem

 

키 생성 이후 로컬로 다운 받은 뒤, 직접 secret manager에 등록하였다.

 

* 파일을 직접 업로드 하여도 된다.

 

키가 정상적으로 등록 되었으면, 직접 코드로 불러와 보자.

https://cloud.google.com/secret-manager/docs/reference/rest/v1/projects.secrets(docs)

 

REST Resource: projects.secrets  |  Secret Manager Documentation  |  Google Cloud

Send feedback REST Resource: projects.secrets Stay organized with collections Save and categorize content based on your preferences. Resource: Secret A Secret is a logical secret whose value and versions can be accessed.A Secret is made up of zero or more

cloud.google.com

 

  GCP_PROJECT = 'dev-pjt'
  SECRET_NAME = 'test'
  
  def get_sftp_secret():
    try:
        client = secretmanager.SecretManagerServiceClient()
        #access_secret_version의 secret_name 형식
        secret_name = f"projects/{GCP_PROJECT}/secrets/{SECRET_NAME}/versions/latest"
        sftp_credentials = client.access_secret_version(request={"name": secret_name }).payload.data.decode("UTF-8")
        return sftp_credentials
    except Exception as e:
        print(f"get_sftp_secret 에러가 발생하였습니다: {e}")

 

docs 문서를 참고하여 작성!

 

get_sftp_secret()를 실행하였을때 정상적으로 키 값이 표기 되면 Process 1번 성공.

 

추출한 Key로 파일 전송할 VM에 SFTP connection 확인

https://docs.paramiko.org/en/latest/api/keys.html?highlight=rsa#module-paramiko.rsakey

 

def open_connection():
    try:
            logger.info('Using SSH authentication for connection')
            ssh_client = paramiko.SSHClient()
            
            ssh_key = paramiko.RSAKey.from_private_key(StringIO(get_sftp_secret()))
            
            ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh_client.connect(HOST, username=USERNAME, pkey=ssh_key)
            
            sftp_client = ssh_client.open_sftp()

 

이슈: Sftp 커넥션 하는 과정에서 Host의 publish key를 인증 할 수 없다는 오류 발견. 

 

VM에서 SSH 키를 직접 등록 해주는 부분이 필요 하다는 것을 알게 되었다..

 

 

목적지 VM에 ssh 공개키 설정 후 Connect success 확인.(Process 2번 완료)

 

 

간단한 파일 업로드 테스트만 해보기 위해 버킷의 test.csv 파일을 목적지 VM에 Upload

def uplooad_file(sftp_client):
    # 버킷에서 파일을 메모리로 직접 다운로드
    print("업로드 시작")
    try:
        storage_client = storage.Client()
        bucket = storage_client.get_bucket('나의 버킷 이름')

        blob = bucket.blob("test.csv")

        #가상의 파일 생성(바이트 데이터)
        file_obj = BytesIO()
        blob.download_to_file(file_obj)
        file_obj.seek(0) # 파일 읽기 위해 커서 제일 처음으로 이동 
        
        print(file_obj)

        # 메모리에서 읽은 파일을 SFTP 서버에 업로드
        destination_path = os.path.join(BASE_DIRECTORY, "test.csv")
        sftp_client.putfo(file_obj, destination_path)
    except Exception as e:
        raise(e

 

Cloud Function로 작업하기에 메모리 스토리지에 가상의 바이트 데이터를 생성한 뒤에 파일을 읽고 SFTP에 전송 한다.

 

 

Process 3번 완료..

 

생각보다 이번 과정을 통해 배운점이 많았다..

Cloud Function을 통해 Google Cloud API를 활용하는 것들이 조금이나마 편해졌고,

인프라팀에서 세팅해주는 VPC 네트워크 환경과 마주친 여러가지 이슈 상황들도

해결하면서 한 단계 성장 하는 느낌이였다.

 

 

 

 

위 글에서 조언이나 궁금한 사항이 있으면 언제든지 의견 부탁드립니다!