안녕하세요 MANVSCLOUD 김수현입니다.
네이버 클라우드에서는 Sub Account 기능을 통해 사용자가 루트 계정을 사용하지 않고도 추가 서브 계정을 생성하여 역할별 권한을 부여하고 관리할 수 있습니다. 이는 프로젝트 진행 시 다양한 업체와 팀 간의 협업을 용이하게 하며 효율적인 리소스 관리를 가능하게 합니다. 하지만 프로젝트 종료 후 또는 인력 변동으로 인해 사용되지 않는 Sub Account가 방치될 경우 불필요한 리소스 낭비는 물론 보안상의 취약점으로 발전할 위험이 있습니다.
이 포스팅에서는 네이버 클라우드 서비스를 활용하여 Sub Account의 최종 접속 일시가 특정 기간을 초과할 경우 자동으로 계정을 비활성화 처리하는 방법을 공유할 것입니다.
How?

네이버 클라우드의 Sub Account 관리 화면에서는 위 사진과 같이 종종 최종 접속 일시가 오래된 계정들이 여전히 “사용 중” 상태로 남아 있는 것을 볼 수 있습니다. 이렇게 오랜 시간동안 사용되지 않고 방치된 Sub Account를 수동으로 확인하고 비활성화하는 과정은 매우 번거롭고 시간이 많이 소요됩니다.
이 문제를 효율적으로 해결할 방법이 필요한데 바로 네이버 클라우드에서 제공하는 API를 활용하는 것입니다. 간단하게 Python 코드를 작성하여 자동화 과정을 구현해보도록 하겠습니다.
Hands On Lab
최종 접속 일시가 90일이 초과된 계정은 [비활성화] 처리되도록 구현해보도록 하겠습니다.
이 과정에서 사용된 Python 버전은 3.11.7이 사용되었습니다.
import requests
import json
import base64
import hashlib
import hmac
import time
from datetime import datetime, timedelta
class SubAccountAPI:
def __init__(self, access_key, secret_key, api_server):
self.access_key = access_key
self.secret_key = bytes(secret_key, 'UTF-8')
self.api_server = api_server
def generate_signature(self, method, uri, timestamp):
message = f"{method} {uri}\n{timestamp}\n{self.access_key}"
message_bytes = bytes(message, 'UTF-8')
signing_key = base64.b64encode(hmac.new(self.secret_key, message_bytes, digestmod=hashlib.sha256).digest())
return signing_key
def make_request(self, method, uri, body=None):
timestamp = str(int(time.time() * 1000))
signature = self.generate_signature(method, uri, timestamp)
headers = {
'Content-Type': 'application/json',
'x-ncp-apigw-signature-v2': signature,
'x-ncp-apigw-timestamp': timestamp,
'x-ncp-iam-access-key': self.access_key
}
if method.upper() == "GET":
response = requests.get(self.api_server + uri, headers=headers)
elif method.upper() == "PUT":
response = requests.put(self.api_server + uri, headers=headers, data=json.dumps(body))
else:
raise ValueError("Unsupported method")
return response.json()
def get_sub_accounts(self):
uri = "/api/v1/sub-accounts"
response_data = self.make_request("GET", uri)
# 최종 접속 일시가 90일이 초과된 경우 기준입니다.
ninety_days_ago = datetime.now() - timedelta(days=90)
accounts_to_modify = []
for item in response_data['items']:
if item['canConsoleAccess']:
last_login_time_str = item.get('lastLoginTime')
if last_login_time_str:
last_login_time = datetime.strptime(last_login_time_str, "%Y-%m-%dT%H:%M:%SZ")
if last_login_time < ninety_days_ago:
accounts_to_modify.append(item)
return accounts_to_modify
def modify_sub_account(self, sub_account_id, body_data):
uri = f"/api/v1/sub-accounts/{sub_account_id}"
response_data = self.make_request("PUT", uri, body_data)
return response_data.get('email')
def main():
# NCLOUD_ACCESS_KEY와 NCLOUD_SECRET_KEY가 입력되는 부분입니다.
api = SubAccountAPI("NCLOUD_ACCESS_KEY", "NCLOUD_SECRET_KEY", "https://subaccount.apigw.ntruss.com")
accounts = api.get_sub_accounts()
for account in accounts:
body_data = {
"active": False,
"name": account.get('name')
}
email = api.modify_sub_account(account['subAccountId'], body_data)
main()
위 코드는 테스트 용도로 사용할 수 있는 임시 코드입니다.
90일이 아닌 다른 날짜로 변경하고자 한다면 코드에서 timedelta(days=90) 부분의 90을 원하시는 숫자로 변경해주시면 됩니다. 또한 이 코드를 정상적으로 작동시키기 위해서는 Sub Account를 조회하고 비활성화할 수 있는 권한의 액세스 키가 필요합니다.
이를 실행시키기 위해 발급한 키는 코드 내 주석에도 작성해두었듯이 CLOUD_ACCESS_KEY와 NCLOUD_SECRET_KEY에 입력하면 동작이 가능합니다. 하지만 보안을 위해 코드 내 직접적으로 KEY를 입력하지 않고 환경 변수를 이용하거나 KEY를 암호화하여 사용할 필요가 있습니다.
원하는 days와 KEY를 모두 추가했다면 실행해봅시다.
정상적으로 잘 실행되었다면 아래와 사진과 같이 최종 접속 일시가 설정한 days보다 오래된 계정들은 비활성화 처리되어 “사용 중”에서 “정지”로 상태가 변경되어 있을 것입니다.

이제 생성된 Python 코드는 cron과 같은 기능을 이용하여 하루에 한번씩 Sub Account의 최종 접속 일시를 점검하고 특정 기간이 초과된 계정을 비활성화 처리되도록 자동화할 수 있습니다.
또한 Cloud Functions을 이용한다면 굳이 서버를 생성하지 않아도 되니 Cloud Functions을 사용하는 것은 매우 좋은 선택지라고 볼 수 있습니다.
Personal Comments
지금까지 최종 접속 일시가 90일을 초과한 Sub Account를 자동으로 비활성화하는 방법을 공유드렸습니다. “[NCLOUD] Sub Account 효율적으로 관리하기 [2편]”에서는 이를 조금 더 응용한 버전으로 Cloud Functions에서 사용하는 방법과 함께 Cloud Outbound Mailer을 이용하여 비활성화된 계정의 이메일로 계정이 비활성화 처리되었다고 알려주는 메일 발송 부분까지 다루어보도록 하겠습니다.
또한 테스트 용도의 임시 코드를 실무에 사용할 수 있도록 리팩토링 작업도 거쳐서 공유드려볼까합니다.
이번 포스팅이 네이버 클라우드를 사용하는 모든 유저들에게 유용한 정보가 되었기를 바랍니다.
긴 글 읽어주셔서 감사합니다.
- [NCLOUD] Sub Account 효율적으로 관리하기 [2편] : https://manvscloud.com/?p=2654

No Comments