Splunk SOAR(이하 Phantom 으로 지칭) 에서 제공하는 AWS 관련 app을 보면 아래와 같이 2가지 방법으로 Phantom 과 AWS를 연결할 수 있다.

첫번째, Access Key / Secret Key 를 입력하는 방법.

두번재, EC2에서 현재 Phantom 을 실행할때 연결된 role 을 사용하는 방법.

위 두가지 방법 중 두번째 방법을 보면 체크 박스에 체크를 하는것만으로도 AWS App 의 Test connectivity 가 정상적으로 Pass가 되는걸 볼수가 있다. (Phantom이 EC2에 실행이 되어야 하고 role을 사용해야 함.) 어떻게 key 또는 ID / PWD가 없이 연결이 되는거지? 라는 의문이 들었다. 해당 의문에 대해서는 다음과 같은 사이트에서 이해할 수 있었다. (https://cloudguardians.medium.com/ec2-instance-metadata-보안-edd23f56b64c)

메타데이터를 이용해 EC2에 대한 정보를 가져올수가 있는데 아래와 같이 curl을 던지면 사용 가능한 meta-data정보 리스트를 확인해볼수 있다.

/iam/security-credentials/ 정보를 체크해보면

해당 Phantom이 설치된 EC2 인스턴스는 bob_role이라는 role을 사용하고 있다는걸 알수 있다. bob_role 를 통해 임시보안자격증명을 하려면 아래와 같이 임시로 쓸수 있는 key와 만료시간을 전달받을 수가 있다.


임시로 쓰는 키지만…다 보여드리기 기분이 좀 그래서 가림..ㅎㅎ
다시 돌아와 Phantom app 에서 use_role을 체크한다면 아래와 같은 boto3를 이용한 소스가 실행되 key 값을 받게된다.

from boto3 import Session, client, resource

if config.get('use_role'):
		credentials = self._handle_get_ec2_role()
		if not credentials:
		    return self.set_status(phantom.APP_ERROR, EC2_ROLE_CREDENTIALS_FAILURE_MSG)
		self._access_key = credentials.access_key
		self._secret_key = credentials.secret_key
		self._session_token = credentials.token
		
		return phantom.APP_SUCCESS
	
self._access_key = config.get(EC2_JSON_ACCESS_KEY)
self._secret_key = config.get(EC2_JSON_SECRET_KEY)

def _handle_get_ec2_role(self):
	  session = Session(region_name=self._region)
	  credentials = session.get_credentials()
	  return credentials

하지만 현재 사용하고 있는 role 이 아닌 다른 role 접근을 하려면 STS를 사용해야 한다.우선 권한이 필요하다. (https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_credentials_temp_control-access_enable-create.html) bob_role 에서 bob_role2 연결을 하려면 아래와 같은 권한이 필요하다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com",
                "AWS": "arn:aws:iam::[bob Account]:role/bob_role"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

권한 부여가 되었으면 python에서 STS를 사용하면 된다.

def _assume_a_role(self, param):
		boto_config = None
		if self._proxy:
		    boto_config = Config(proxies=self._proxy)
		
		self.debug_print("Creating boto3 STS client assuming given role")
		sts_client = client(
		    'sts',
		    region_name=self._region,
		    aws_access_key_id=self._access_key,
		    aws_secret_access_key=self._secret_key,
		    aws_session_token=self._session_token,
		    config=boto_config)
		response = sts_client.assume_role(
		    RoleArn=param['role_arn'],
		    RoleSessionName="AssumeRoleSession2"
	)
	# self._access_key = response['Credentials']['AccessKeyId']
	# self._secret_key = response['Credentials']['SecretAccessKey']
	# self._session_token = response['Credentials']['SessionToken']
	return response['Credentials']


# 사용 예시
if param and 'role_arn' in param:
		try:
		    temp_credentials = self._assume_a_role(param) # ast.literal_eval(param['credentials'])
		    self._access_key = temp_credentials.get('AccessKeyId', '')
		    self._secret_key = temp_credentials.get('SecretAccessKey', '')
		    self._session_token = temp_credentials.get('SessionToken', '')
		
		    self.save_progress("Using temporary assume role credentials for action")
		except Exception as e:
		    return action_result.set_status(phantom.APP_ERROR,
		                                    "Failed to get temporary credentials:{0}".format(e))

 

실행 결과

Status : success 가 나오는걸 확인할 수 있다.

Phantom의 AWS 관련 앱에서 어떻게 key가 없이 연결이 되는지 라는 물음에서 많은 공부가 되었다. 해당 문제를 해결하려면 기본적인 AWS IAM 을 이해해야 해서 관련 문서를 보면 많은 도움이 된다.

잘못되거나 수정해야 할 내용이 있으면 알려주길 바란다.

AWS STS와 Assume Role이란 무엇인가요?

AWS는 클라우드 기술 서비스를 제공하고 있습니다. AWS의 서비스를 사용하면 클라우드에서 간단하고 안전하게 애플리케이션을 실행할 수 있습니다. 그 중 AWS STS와 Assume Role에 대해 알아보겠습니다.

AWS STS란 무엇인가요?

AWS STS(Security Token Service)는 AWS에서 보안 토큰을 생성하는 서비스입니다. AWS STS를 사용하면 AWS IAM 사용자나 AWS 외부 자격 증명을 사용하여 액세스 권한을 부여할 수 있습니다.

AWS STS의 장점

  • AWS STS는 일시적인 보안 자격 증명을 생성하므로 보안성이 높습니다.
  • IAM 사용자 또는 AWS 외부 자격 증명으로 AWS 리소스에 대한 액세스 권한을 제한할 수 있습니다.
  • AWS STS를 사용하면 AWS 리소스에 대한 권한을 부여하는 방법을 보다 더 유연하게 조정할 수 있습니다.

Assume Role이란 무엇인가요?

Assume Role은 AWS IAM에서 지원하는 기능 중 하나입니다. AWS IAM에서 Assume Role을 사용하면 IAM 사용자 또는 AWS 외부 자격 증명으로 다른 AWS 계정 또는 리소스에 액세스할 수 있습니다.

Assume Role의 장점

  • Assume Role을 사용하면 하나의 IAM 사용자 또는 외부 자격 증명을 여러 AWS 계정 또는 리소스에 대해 공유할 수 있습니다.
  • Assume Role을 사용하여 AWS 계정 또는 리소스에 대한 액세스 권한을 조정할 수 있습니다.
  • Assume Role을 사용하면 권한 부여를 간편하게 할 수 있습니다.

AWS STS와 Assume Role을 사용하는 방법

AWS STS와 Assume Role을 사용하는 방법은 다음과 같습니다.

  1. AWS STS를 사용하여 일시적인 자격 증명을 생성합니다.
  2. 생성된 일시적인 자격 증명으로 Assume Role을 호출합니다.
  3. Assume Role이 호출되면, 해당하는 AWS 리소스에 대한 액세스 권한을 부여받게 됩니다.

AWS STS와 Assume Role을 사용하는 이유

AWS STS와 Assume Role을 사용하는 이유는 다음과 같습니다.

  • IAM 사용자나 외부 자격 증명으로 AWS 리소스에 대한 액세스 권한을 부여할 수 있습니다.
  • AWS 리소스에 대한 권한을 더욱 세밀하게 제어할 수 있습니다.
  • 일시적인 자격 증명을 사용하기 때문에 보안성이 높습니다.

AWS STS와 Assume Role을 함께 사용하는 경우

AWS STS와 Assume Role을 함께 사용하면 보다 유연하게 AWS 리소스에 대한 권한을 관리할 수 있습니다. 다음은 AWS STS와 Assume Role을 함께 사용하는 경우입니다.

  1. AWS STS를 사용하여 일시적인 자격 증명을 생성합니다.
  2. Assume Role을 호출하고 생성된 일시적인 자격 증명을 사용하여 IAM 사용자나 외부 자격 증명으로 다른 AWS 계정 또는 리소스에 액세스합니다.

AWS STS와 Assume Role의 보안

AWS STS와 Assume Role은 일시적인 자격 증명을 사용하여 AWS 리소스에 대한 액세스 권한을 부여합니다. 이러한 일시적인 자격 증명은 만료되므로 보안성이 높습니다. 또한 AWS STS와 Assume Role을 사용하면 권한 부여를 보다 세밀하게 제어할 수 있으므로 보안성이 더욱 강화됩니다.

AWS STS와 Assume Role의 사용 사례

AWS STS와 Assume Role은 다양한 사용 사례를 가지고 있습니다. 예를 들어, 다음과 같은 경우에 AWS STS와 Assume Role을 사용할 수 있습니다.

  • 여러 AWS 계정 간의 권한 부여
  • AWS 리소스에 대한 세밀한 권한 부여
  • 일시적인 자격 증명을 사용하여 보안성 강화

결론

AWS STS와 Assume Role은 AWS에서 제공하는 보안 기능 중 하나입니다. 이러한 기능을 사용하면 AWS 리소스에 대한 액세스 권한을 보다 유연하게 관리할 수 있습니다. 또한 보안성을 강화하기 위한 일시적인 자격 증명을 사용하여 권한 부여를 할 수 있습니다.

FAQ

AWS STS와 Assume Role을 사용하는 이유는 무엇인가요?

  • AWS STS와 Assume Role을 사용하면 IAM 사용자나 외부 자격 증명으로 AWS 리소스에 대한 액세스 권한을 부여할 수 있습니다.
  • AWS 리소스에 대한 권한을 더욱 세밀하게 제어할 수 있습니다.
  • 일시적인 자격 증명을 사용하기 때문에 보안성이 높습니다.

AWS STS와 Assume Role을 함께 사용하는 경우는 어떤 경우인가요?

  • AWS STS와 Assume Role을 함께 사용하면 보다 유연하게 AWS 리소스에 대한 권한을 관리할 수 있습니다.

AWS STS와 Assume Role을 사용하면 어떤 보안 이점이 있나요?

  • AWS STS와 Assume Role을 사용하면 일시적인 자격 증명을 사용하여 AWS 리소스에 대한 액세스 권한을 부여합니다.
  • 이러한 일시적인 자격 증명은 만료되므로 보안성이 높습니다.
  • 또한 AWS STS와 Assume Role을 사용하면 권한 부여를 보다 세밀하게 제어할 수 있으므로 보안성이 더욱 강화됩니다.

AWS STS와 Assume Role의 사용 사례는 어떤 것이 있나요?

  • 여러 AWS 계정 간의 권한 부여
  • AWS 리소스에 대한 세밀한 권한 부여
  • 일시적인 자격 증명을 사용하여 보안성 강화

AWS STS와 Assume Role은 보안성을 어떻게 강화하나요?

  • 일시적인 자격 증명을 사용하여 AWS 리소스에 대한 액세스 권한을 부여합니다.
  • 권한 부여를 보다 세밀하게 제어할 수 있습니다.

AWS STS와 Assume Role을 사용하는 방법은 어떻게 되나요?

  • AWS STS를 사용하여 일시적인 자격 증명을 생성합니다.
  • 생성된 일시적인 자격 증명으로 Assume Role을 호출합니다.
  • Assume Role이 호출되면, 해당하는 AWS 리소스에 대한 액세스 권한을 부여받게 됩니다.

AWS STS와 Assume Role은 어떤 기능을 제공하나요?

  • AWS STS는 AWS에서 보안 토큰을 생성하는 서비스입니다.
  • Assume Role은 IAM 사용자나 외부 자격 증명으로 다른 AWS 계정 또는 리소스에 액세스할 수 있는 기능입니다.

AWS STS와 Assume Role을 사용하여 어떤 문제를 해결할 수 있나요?

  • AWS 리소스에 대한 액세스 권한을 보다 세밀하게 제어할 수 있습니다.
  • 하나의 IAM 사용자 또는 외부 자격 증명을 여러 AWS 계정 또는 리소스에 대해 공유할 수 있습니다.

AWS STS와 Assume Role을 사용하여 어떤 장점이 있나요?

  • 일시적인 자격 증명을 사용하기 때문에 보안성이 높습니다.
  • AWS 리소스에 대한 권한을 더욱 세밀하게 제어할 수 있습니다.

AWS STS와 Assume Role을 사용하면 어떤 단점이 있나요?

  • 복잡한 권한 관리가 필요할 수 있습니다.
  • 세밀한 권한 부여가 필요한 경우 복잡해질 수 있습니다.

 

## 2023-06-20 내용 추가
저는 AWS와 SOAR 제품 연동을 위해 STS/Assume Role을 사용했는데 위 내용 이외에 개발 관련 내용을 원하시면
아래 링크를 확인부탁드립니다.
https://kyung123a.tistory.com/entry/AWS-%EC%9E%84%EC%8B%9C%EB%B3%B4%EC%95%88%EC%9E%90%EA%B2%A9

'개발' 카테고리의 다른 글

React useEffect 예제  (0) 2023.03.14
code에서 1.1 + 0.1 == 1.2가 다른 이유  (0) 2023.03.14
flex 화면이 레이어 아래로 내려 갈수 있게  (0) 2014.10.08
유용한 사이트 모음  (0) 2014.06.26

+ Recent posts