Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법입니다.

개요

클라우드 환경에서 서비스를 하다 보면 회사 내부의 다른 팀이나 외부 고객사에 서버나 오브젝트 스토리지 등 특정 서비스에 접근할 수 있는 API를 제공해야 하는 하는 경우가 생길 수 있습니다.
그런데 Ncloud(네이버 클라우드)에서 제공되는 기본 API Access Key는 기간 제한이 없는 Access Key이기 때문에 외부에 제공하게 되면 보안측면에서 위험한 상황이 생길 수 있습니다. 이때 STS를 이용하면 Access Key를 제한된 기간 동안 일회성으로 제공하거나 유효 기간이 매우 짧은 Access Key를 반복적으로 제공하게 되면 훨씬 안전한 서비스를 유지할 수 있습니다.

STS란

[STS (Secure Token Service)]는 Sub Account에 연관되어 제공되는 서비스로 Ncloud (네이버 클라우드) 내 리소스에 대한 액세스를 제어할 수 있는 기간 제한이 있는 임시 Access Key를 생성하는 서비스입니다.
임시 Access Key는 기간 제한이 없는 서브 계정의 Access Key와 달리 제한된 기간 동안만 유효하며 MFA 등 추가 인증 수단을 적용할 수도 있습니다.

다른 클라우드 서비스에서는 [Security Token Service(STS)], [임시 보안 자격 증명], [Security Token], [API One Day Token] 등으로 찾아볼 수 있습니다.

STS 임시 Access Key 특징

  • 임시 Access Key는 서브계정만 생성할 수 있습니다.
    메인 계정으로 생성하려고 할 때 발생하는 오류 메시지는 메인 계정 Access Key를 사용했을 때 에서 확인 가능합니다.
  • 임시 Access Key는 만료 기한이 존재합니다.
  • Access Key는 몇 분에서 몇 시간까지 지속되도록 생성할 수 있습니다.
  • Access Key가 만료된 후 Ncloud는 더는 그 Access Key를 인식하지 못하거나 그 Access Key를 사용한 API 요청으로부터 이루어지는 어떤 종류의 액세스도 허용하지 않습니다.
  • 임시 Access Key를 생성할 때, MFA 인증을 포함할 수 있습니다. Ncloud는 MFA 수단으로 OTP 인증을 제공합니다.
  • 임시 Access Key가 만료된 후에는 해당 Access Key는 다시 사용할 수 없습니다.
  • 임시 Access Key는 STS API를 호출해서 생성합니다.

Sub Account 생성

STS로 생성하는 임시 Access Key의 권한은 Sub Account의 권한을 그대로 상속 받기 때문에 해당 Access Key를 발급하기 위한 전용 Sub Account를 생성해야 합니다.

Sub Account를 생성하는 방법은 아래 가이드 문서를 참고하시면 됩니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

사용자 정의 정책 생성

Sub Account에 적용할 정책을 기본으로 제공되는 관리형 정책이 아니라 STS 생성만 허가 하기 위한 사용자 정의 정책을 생성합니다.
[Sub Account] - [Policies]에서 [사용자 정의 정책] 탭을 선택하고 [정책 생성] 버튼을 클릭합니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

정책 정보 설정

정책 이름과 설명을 입력합니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

적용 대상 설정

STS는 VPC, Classic 관계없이 적용되므로 플랫폼 항목은 그대로 두고 나머지 항목은 다음과 같이 설정합니다.

  • Product: Sub Account 선택
  • Actions: View 항목에서 STS 탭 선택하고, [getStsSessionToken]을 선택

선택을 마친 후 [적용 대상 추가] 버튼을 클릭합니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

적용 대상 목록

선택한 내용을 마지막으로 확인하고 이상이 없으면 [생성] 버튼을 클릭합니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

생성된 정책 확인

정책이 생성되면 [사용자 정의 정책] 탭에 아래와 같이 정책이 나타납니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

Sub Account에 정책 적용

[Sub Account] - [Sub Accounts]에서 해당 Sub Account를 선택하고 [정책] 탭에서 [추가] 버튼을 클릭합니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

정책 추가

정책 추가 팝업에서 위에서 만들었던 정책을 선택하고 [추가] 버튼을 클릭합니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

적용된 정책 확인

Sub Account 상세 정보에서 정책 탭에 추가된 정책을 확인할 수 있습니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

기간 제한 없는 Access Key 발급

여기서는 우선 기간 제한이 없는 Access Key를 발급하고 이 Access Key를 이용해서 나중에 기간 제한이 있는 임시 Access Key를 발급하겠습니다.
[Sub Account] - [Sub Accounts] - [Access Key] 탭에서 [추가] 버튼을 클릭합니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

Access Key 추가

팝업에서 [추가] 버튼을 클릭해 새로운 Access Key를 추가합니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

Access Key 확인

[Access Key] 탭에서 추가된 Access Key와 Secret Key를 확인할 수 있습니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

기간 제한 임시 Access Key 발급

임시 Access Key를 발급 받기 위해서는 STS API를 호출해야 합니다.
STS API를 이용해 기간 제한이 있는 임시 Access Key를 발급 받으면 아래와 같은 정보를 얻을 수 있습니다.

  • Access Key
  • Secret key
  • Create Time: Key 생성 날짜
  • Expire Time: Key 만료 날짜
  • Use MFA: MFA (MultiFactorAuthentication) 사용 여부
Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

API 호출 방법

Ncloud API 호출 방법에 대한 기본 가이드는 아래 문서를 확인하시면 됩니다.

임시 Access Key 발급 PHP 샘플 예제

<?php	
  $unixtimestamp =  round(microtime(true) * 1000);
  $ncloud_sub_account_accesskey = "{기간 제한 없는 Sub Account API Access Key}";
  $ncloud_sub_account_secretkey = "{기간 제한 없는 Sub Account API Secret Key}";	
  $apicall_method = "POST";
  $api_server = "https://sts.apigw.ntruss.com";
  $api_url = "/api/v1/credentials";
  $msg_signature = "";

  $array_postvars = Array (			
    "durationSec" => 900
  );
  $postvars = json_encode($array_postvars);

  $space = " ";
  $new_line = "\n";
  $message = 
    $apicall_method
    .$space
    .$api_url
    .$new_line
    .$unixtimestamp
    .$new_line
    .$ncloud_sub_account_accesskey;	
  $msg_signature = base64_encode(hash_hmac('sha256', $message, $ncloud_sub_account_secretkey, true));

  $http_header = array();    
  $http_header[0] = "Content-Type:application/json; charset=utf-8";
  $http_header[1] = "x-ncp-apigw-timestamp:".$unixtimestamp."";
  $http_header[2] = "x-ncp-iam-access-key:".$ncloud_sub_account_accesskey."";
  $http_header[3] = "x-ncp-apigw-signature-v2:".$msg_signature."";

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $api_server.$api_url);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $http_header);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);		
  curl_setopt($ch, CURLOPT_POST, TRUE);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
  $json_response = curl_exec($ch);
  curl_close($ch);

  if ($json_response)
  {
    $obj_array = json_decode($json_response, 1);

    $sts_accesskey= $obj_array["accessKey"];
    $sts_secretkey= $obj_array["keySecret"];
    $sts_createtime= $obj_array["createTime"];
    $sts_expiretime= $obj_array["expireTime"];
    $sts_use_mfa= $obj_array["useMfa"];	
  }
?>

PHP 예제 코드 상세 설명

위 전체 소소코드 중에서 중요한 부분만 다시 살펴보겠습니다.

기간 제한 없는 API Key

아래 2가지 변수에는 위쪽 기간 제한 없는 Access Key 발급 에서 생성했던 기간 제한 없는 Sub Account API Access Key와 Secret Key를 입력하시면 됩니다.

<?php	  
  $ncloud_sub_account_accesskey = "{기간 제한 없는 Sub Account API Access Key}";
  $ncloud_sub_account_secretkey = "{기간 제한 없는 Sub Account API Secret Key}";
?>

STS API 호출 서버와 URL

STS API 서버와 URL은 아래와 같습니다.
그리고 API 호출 방식은 POST 방식입니다.

<?php
  $apicall_method = "POST";
  $api_server = "https://sts.apigw.ntruss.com";
  $api_url = "/api/v1/credentials";
?>

Request 파라미터

STS 생성을 위한 Request 파라미터는 총 3가지입니다.
여기서는 만료시간을 나타내는 durationSec 값만 설정해보았습니다.

파라미터 필수여부 타입 설명
durationSec N Integer accessKey 지속 시간(초)

default: 43,200 (12시간)
min: 900 (15분)
max: 129,600 (36시간)
serialNumber N String OTP 디바이스 nrn 또는 시리얼 번호
tokenCode N Integer OTP 인증 번호
<?php
  $array_postvars = Array (			
    "durationSec" => 900
  );
?>

API Header 설정

Header를 설정할 때 다른 값들은 보통의 API 호출할 때와 동일한데
STS로 임시 Access Key를 생성할 때에는 Content-Type과 charset을 포함해야 합니다.

<?php
  $http_header = array();    
  $http_header[0] = "Content-Type:application/json; charset=utf-8";
  $http_header[1] = "x-ncp-apigw-timestamp:".$unixtimestamp."";
  $http_header[2] = "x-ncp-iam-access-key:".$ncloud_sub_account_accesskey."";
  $http_header[3] = "x-ncp-apigw-signature-v2:".$msg_signature."";
?>

API 호출

STS API를 호출할 때에는 반드시 POST 방식으로 호출해야 합니다.
<?php 
  curl_setopt($ch, CURLOPT_POST, TRUE);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
?>

API 호출 테스트

STS로 생성한 기간 제한 임시 Access Key로 Ncloud API를 호출하는 테스트를 진행해보겠습니다.

테스트로 호출할 API 정보는 다음과 같습니다.

  • getServerInstanceList: 사용 중인 서버 인스턴스(VM) 리스트를 조회

권한 없이 호출

우선 Sub Account에 아무 권한도 주지 않은 상태에서 호출해보면 다음과 같은 결과 메시지를 확인할 수 있습니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

권한 정책 추가

이제는 권한을 추가해서 테스트 해보겠습니다.
[Sub Account] - [Sub Accounts]에서 Sub Account를 선택하고 [정책] 탭에서 [추가] 버튼을 클릭합니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

정책 추가

정책 추가 팝업에서 연관 상품에서 [Server (VPC)]를 선택하면 나타나는 정책 리스트에서 [NCP_VPC_SERVER_VIEWER] 정책을 선택하고 [추가] 버튼을 클릭합니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

추가된 정책 확인

정책 추가 후에 Sub Account 상세 정보 화면에서 추가된 정책을 확인할 수 있습니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

권한 추가 후 호출

권한 정책을 추가 후에 호출해보면 아래와 같이 호출이 성공하고 Success 메시지가 리턴되는 것을 확인할 수 있습니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

Access Key 기한 만료

STS로 기간 제한 있는 임시 Access Key를 만들때 설정했던 만료기한이 지난 후에 해당 Access Key를 사용해 API를 호출하면 아래와 같이 인증 실패 메시지가 리턴됩니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

메인 계정 Access Key를 사용했을 때

처음에 설명한 것처럼 STS 임시 Access Key는 Sub Account로만 생성할 수 있습니다.
혹시나 메인 계정으로 생성하려고 하면 아래와 같이 오류 메시지가 리턴됩니다.

Ncloud Sub Account의 STS (Secure Token Service) 기능을 이용해 기간 제한 임시 API AccessKey 발급하는 방법

참고 URL

  1. Sub Account 사용 가이드
  2. STS API 사용 가이드