[NCP] STS를 통한 임시자격 증명


STS

STS(Security Token Service)는 클라우드 자원에 접근하기 위한 임시 자격 증명을 발급하는 서비스이다. 이 서비스는 장기적으로 노출될 수 있는 Access Key와 Secret Key를 사용하는 대신, 제한된 기간 동안만 유효한 임시 키를 제공함으로써 보안성을 높이는 데 목적이 있다.

임시 Access Key의 장점

  • 애플리케이션에 기간 제한이 없는 Access Key를 배포하거나 포함할 필요가 없다 
  • 임시 Access Key는 설정된 만료 기한에 따라 자동으로 만료 되며, 만료 후에는 재사용할 수 없습니다. 따라서 필요하지 않을 때 별도로 교체할 필요가 없다. 

1. Sub Account 생성

STS 전용 서브 계정을 하나 생성한다. 

2. STS 정책을 생성

sub account에 적용할 sts 정책을 생성해준다.

3. 서브 계정에 STS 적용

이전에 만들었던 STS 정책을 서브 계정에 추가 해줍니다. 정책 적용이 완료 되었으면 Access Key 발급을 해준다. 

4. Access Key 발급

Access Key 발급을 이용한 후 Python을 이용해서 임시 자격 증명 Access Key 와 Secret Key를 발급 받겠다. 기존에 만들어두었던 sub account 계정을 사용하도록 하겠다. 

5. Python을 통한 STS 생성

import hashlib
import hmac
import base64
import requests
import time
import json

# NCP API 키 설정
ncloud_accesskey = ""  # Access Key
ncloud_secretkey = ""  # Secret Key

# API 서버 정보 (STS API)
api_server = "https://sts.apigw.ntruss.com"
api_url = "/api/v1/credentials"

# 현재 Unix timestamp를 밀리초로 설정
unixtimestamp = str(int(time.time() * 1000))

# 요청 파라미터 설정
postvars = json.dumps({"durationSec": 900})  # 15분

# 서명할 메시지 생성
apicall_method = "POST"
space = " "
new_line = "\n"
message = f"{apicall_method}{space}{api_url}{new_line}{unixtimestamp}{new_line}{ncloud_accesskey}"
message_bytes = message.encode('utf-8')
ncloud_secretkey_bytes = ncloud_secretkey.encode('utf-8')

# hmac_sha256 암호화
signature = base64.b64encode(hmac.new(ncloud_secretkey_bytes, message_bytes, hashlib.sha256).digest()).decode('utf-8')

# HTTP 헤더 설정
http_header = {
    'Content-Type': 'application/json; charset=utf-8',
    'x-ncp-apigw-timestamp': unixtimestamp,
    'x-ncp-iam-access-key': ncloud_accesskey,
    'x-ncp-apigw-signature-v2': signature
}

# STS API 호출 (임시 자격 증명 발급)
response = requests.post(api_server + api_url, headers=http_header, data=postvars)
json_response = response.json()

# STS 결과 확인
if response.ok:
    sts_accesskey = json_response.get("accessKey")
    sts_secretkey = json_response.get("keySecret")
    sts_createtime = json_response.get("createTime")
    sts_expiretime = json_response.get("expireTime")
    sts_use_mfa = json_response.get("useMfa")

    print("임시 Access Key:", sts_accesskey)
    print("임시 Secret Key:", sts_secretkey)
    print("생성 시간:", sts_createtime)
    print("만료 시간:", sts_expiretime)
    print("MFA 사용 여부:", sts_use_mfa)
else:
    print("STS 발급 실패:", json_response)

 Python 코드를 이용해 STS키를 발급받아야 한다. 다음 Python 코드에 전에 생성해두었던 키값을 넣어주고 실행해주면 된다. 

다음과 같이 15분 동안만 사용할 수 있는 STS 키를 생성하였다. 그러나 이 키에는 현재 서브 계정에서 정책이 설정되어 있지 않기 때문에, 어떤 NCP 리소스에도 접근할 수 없습니다. 이를 해결하기 위해, 테스트로 특정 VPC를 조회할 수 있는 정책을 추가한 후 테스트를 진행해보겠다. 

NCP_SERVER_OBSERVER 정책을 넣어준 후 NCP CLI를 통해 확인해보도록 하겠다. 키값은 발급받은 STS키를 넣어주면 된다. 

kimdongju@gimdongjuui-MacBookPro cli_linux:~/cli_linux# ./ncloud vpc getVpcList - regionCode KR - vpcStatusCode RUN
{
 "getVpcListResponse": {
 "totalRows": 2,
 "vpcList": [
 {
 "vpcNo": "62764",
 "vpcName": "test-vpc",
 "ipv4CidrBlock": "192.168.0.0/16",
 "vpcStatus": {
 "code": "RUN",
 "codeName": "운영중"
 },
 "regionCode": "KR",
 "createDate": "2024–05–10T14:21:54+0900"
 },
 {
 "vpcNo": "46814",
 "vpcName": "bm-vpc-test",
 "ipv4CidrBlock": "10.0.0.0/16",
 "vpcStatus": {
 "code": "RUN",
 "codeName": "운영중"
 },
 "regionCode": "KR",
 "createDate": "2023–09–19T10:36:01+0900"
 }
 ],
 "requestId": "18ab542e-b69b-4efa-b4b9-d62648550a53",
 "returnCode": "0",
 "returnMessage": "success"
 }
}

 다음과 같이 VPC가 정상적으로 잘 조회되었다.