kmu-leeky / crc-research

0 stars 1 forks source link

Root user IAM limit-permission 할당 조사 및 Instance 연동 #30

Open oryondark opened 5 years ago

kmu-leeky commented 5 years ago

여기서는 아마도 현준이 니 개인 aws 계정으로, 우리 랩의 aws 계정의 자원 사용량을 공유하게끔 해주는 permission 을 주기 위해서는 어떤 permission 항목들을 줘야 하는지 확인해보면 될것 같아.

oryondark commented 5 years ago

네 교수님. 현재 보고 있는 튜토리얼 URL을 통해 해당 이슈를 해결할 수 있을 것으로 보입니다.

  1. 이슈를 찾은 방법 https://aws.amazon.com/ko/premiumsupport/knowledge-center/cross-account-access-iam/

  2. 해결 방법을 위한 튜토리얼 https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html

제안되는 방법은 역할전환을 통한 일반 계정으로부터 루트 계정의 엑세스이며, 일반 계정에 접근하고자 하는 서비스 자원의 대한 권한이 필요. 이를 위한 테스트 및 작업 상황을 이슈로 곧 정리해 두겠습니다.

kmu-leeky commented 5 years ago

good start. 해당기능을 이용해서 자원 접근을 가능하게 해주면 될것 같고, 자원 사용량을 알아오기위한 최소한의 role/policy 들을 찾아보자.

oryondark commented 5 years ago

역할전환 활성화 과정

1. 마스터 계정과 서브 계정의 생성

2. 마스터 계정에서 임대할 권한 객체(인스턴스)를 생성

3. 마스터 계정에서 임시 할당을 해줄 권한의 자원 확인에 필요한 최소 policy

4. 마스터 계정에 권한 할당 역할을 생성 후, 정책 연결

* IAM 역할 생성 후, Custom Policy을 연결 및 역할의 신뢰관계에 접근 가능한 서브 계정을 추가

5. 서브계정에서 역할 전환을 위한 그룹 사용자 생성

6. 마스터 계정(kmubigdata - super user)로부터 제한된 권한 할당 받고, EC2 자원량 조사하기

우선 테스트를 위해 CLI 정상 동작 확인 후, boto3로 간단학 스크립트화하여 Print 결과를 작성했습니다.

#오레곤 지역의 EC2 Instance ID 확보( only-running, non-terminated)
ec2.Instance(id='i-0699d434c8e535df3')
ec2.Instance(id='i-055bd58b94efb9c14')
ec2.Instance(id='i-09c322f9915cfcc12')
ec2.Instance(id='i-07e3c4e8e0bd5055d')
ec2.Instance(id='i-058c39354ff7871ac')
ec2.Instance(id='i-0163937ba39388ae0')
ec2.Instance(id='i-0a53a12574c92e4ef')
ec2.Instance(id='i-0b49aa67de254a940')
ec2.Instance(id='i-0f95ef401738baa7c')
ec2.Instance(id='i-035d838a3da832f7d')

#CPUUtilization
{i-0699d434c8e535df3
{"Label": "CPUUtilization", "ResponseMetadata": {"RequestId": "fdb52c79-96eb-11e8-a74c-7f1965e79e4e", "HTTPStatusCode": 200, "HTTPHeaders": {"content-type": "text/xml", "vary": "Accept-Encoding", "x-amzn-requestid": "fdb52c79-96eb-11e8-a74c-7f1965e79e4e", "content-length": "2289", "date": "Fri, 03 Aug 2018 07:08:14 GMT"}, "RetryAttempts": 0}, "Datapoints": [{"SampleCount": 40.0, "Average": 1.0625000000000002, "Sum": 42.50000000000001, "Minimum": 0.166666666666515, "Timestamp": datetime.datetime(2018, 8, 3, 6, 0, tzinfo=tzlocal()), "Unit": "Percent", "Maximum": 7.43749999999996}, {"SampleCount": 25.0, "Average": 0.17583703806612502, "Sum": 4.395925951653125, "Minimum": 0.163934426229359, "Timestamp": datetime.datetime(2018, 8, 3, 6, 40, tzinfo=tzlocal()), "Unit": "Percent", "Maximum": 0.229166666666742}, {"SampleCount": 40.0, "Average": 0.7364658585718254, "Sum": 29.45863434287302, "Minimum": 0.208333333333333, "Timestamp": datetime.datetime(2018, 8, 3, 4, 0, tzinfo=tzlocal()), "Unit": "Percent", "Maximum": 4.79166666666666}, {"SampleCount": 31.0, "Average": 1.4193486766037142, "Sum": 43.999808974715144, "Minimum": 0.0833333333333338, "Timestamp": datetime.datetime(2018, 8, 3, 3, 20, tzinfo=tzlocal()), "Unit": "Percent", "Maximum": 7.5}, {"SampleCount": 40.0, "Average": 28.530272297860524, "Sum": 1141.210891914421, "Minimum": 0.166666666666705, "Timestamp": datetime.datetime(2018, 8, 3, 5, 20, tzinfo=tzlocal()), "Unit": "Percent", "Maximum": 97.3958333333333}, {"SampleCount": 40.0, "Average": 1.8473933731592105, "Sum": 73.89573492636842, "Minimum": 0.187499999999995, "Timestamp": datetime.datetime(2018, 8, 3, 4, 40, tzinfo=tzlocal()), "Unit": "Percent", "Maximum": 43.5833333333333}]}

#DiskWriteOps
{"Datapoints": [{"Minimum": 0.0, "Maximum": 0.0, "Sum": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 4, 40, tzinfo=tzlocal()), "Average": 0.0, "SampleCount": 40.0, "Unit": "Count"}, {"Minimum": 0.0, "Maximum": 0.0, "Sum": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 5, 20, tzinfo=tzlocal()), "Average": 0.0, "SampleCount": 40.0, "Unit": "Count"}, {"Minimum": 0.0, "Maximum": 0.0, "Sum": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 4, 0, tzinfo=tzlocal()), "Average": 0.0, "SampleCount": 40.0, "Unit": "Count"}, {"Minimum": 0.0, "Maximum": 0.0, "Sum": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 3, 20, tzinfo=tzlocal()), "Average": 0.0, "SampleCount": 31.0, "Unit": "Count"}, {"Minimum": 0.0, "Maximum": 0.0, "Sum": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 6, 40, tzinfo=tzlocal()), "Average": 0.0, "SampleCount": 30.0, "Unit": "Count"}, {"Minimum": 0.0, "Maximum": 0.0, "Sum": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 6, 0, tzinfo=tzlocal()), "Average": 0.0, "SampleCount": 40.0, "Unit": "Count"}], "Label": "DiskWriteOps", "ResponseMetadata": {"HTTPHeaders": {"x-amzn-requestid": "20bd9188-96ed-11e8-a296-97834ae31afc", "content-type": "text/xml", "content-length": "1948", "date": "Fri, 03 Aug 2018 07:16:23 GMT"}, "RetryAttempts": 0, "RequestId": "20bd9188-96ed-11e8-a296-97834ae31afc", "HTTPStatusCode": 200}}

#DiskWriteOps
{i-0699d434c8e535df3
{"ResponseMetadata": {"RequestId": "583788ac-96ed-11e8-8813-ebb3d267f0d0", "HTTPHeaders": {"date": "Fri, 03 Aug 2018 07:17:55 GMT", "x-amzn-requestid": "583788ac-96ed-11e8-8813-ebb3d267f0d0", "content-type": "text/xml", "content-length": "1948"}, "RetryAttempts": 0, "HTTPStatusCode": 200}, "Label": "DiskWriteOps", "Datapoints": [{"Unit": "Count", "Average": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 4, 40, tzinfo=tzlocal()), "Minimum": 0.0, "Maximum": 0.0, "SampleCount": 40.0, "Sum": 0.0}, {"Unit": "Count", "Average": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 5, 20, tzinfo=tzlocal()), "Minimum": 0.0, "Maximum": 0.0, "SampleCount": 40.0, "Sum": 0.0}, {"Unit": "Count", "Average": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 4, 0, tzinfo=tzlocal()), "Minimum": 0.0, "Maximum": 0.0, "SampleCount": 40.0, "Sum": 0.0}, {"Unit": "Count", "Average": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 3, 20, tzinfo=tzlocal()), "Minimum": 0.0, "Maximum": 0.0, "SampleCount": 31.0, "Sum": 0.0}, {"Unit": "Count", "Average": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 6, 40, tzinfo=tzlocal()), "Minimum": 0.0, "Maximum": 0.0, "SampleCount": 35.0, "Sum": 0.0}, {"Unit": "Count", "Average": 0.0, "Timestamp": datetime.datetime(2018, 8, 3, 6, 0, tzinfo=tzlocal()), "Minimum": 0.0, "Maximum": 0.0, "SampleCount": 40.0, "Sum": 0.0}]}

현재 Json Decoding이 boto3에서 응답받은 데이터에 날짜 관련 모듈이 오류를 발생시켜 Pretty 변환이 이루어지지 않았습니다. 이 부분은 대체방안(CLI을 이용하는 방법 등)을 사용하여 다시 업데이트 하겠습니다.

oryondark commented 5 years ago

현재 hjkim(수퍼 권한) 계정을 통해 역할 전환을 수행했는데요. 마스터 계정에서 필요한 기능만 할당받은 IAM 사용자를 만들고, 이를 서브계정에 신뢰관계를 연동하여 역할전환만 수행을 할 수 있도록 조치하겠습니다.

kmu-leeky commented 5 years ago

오케이. "#오레곤 지역의 EC2 Instance ID 확보(" 스텝은 어떤 명령어를 사용해서 가지고 오고 있어?

한가지 더. 마스터 계정에서 해야할 작업을 정리해서 ppt 로 하나 만들어줄래? 마스터 계정을 가지고 있는 쪽에 보내줘야 할것 같아. 그걸 따라서 작업해달라고.

oryondark commented 5 years ago

네 교수님 마스터 계정과 서브계정 역할 전환 ppt를 따로 만들어 두겠습니다. 작업을 좀 더 편리하게 진행할 수 있도록 서브계정에서 확인하는 방법도 넣어두겠습니다.

1) 오레곤 지역 Instace Id를 확보하기 위해서, 서브계정에서 우선 마스터 계정으로부터 권한 할당을 받기 위한 assume-role 이 필요합니다.

aws assume-role --role-arn <arn address> --role-session-name <원하는 이름을 작명>

우선 이 부분은 이정도로 간단하게 할 수 있습니다. 이 과정으로부터 임시 access key과 secretkey, 그리고 session token. 즉 3개의 임시 토근을 받습니다.

2) 다음은 오레곤 지역의 CloudWatch를 확인하려면 각 instance ID를 확보해야하는데요. InstaceID를 확보하는 방법은 여러방법이 있지만, CLI에서는 확인했을 때 describe-instances 명령어를 사용했습니다. 테스트에서는 boto3로 할 경우 간편하게 파싱을 할 수 있어서 파이썬으로 진행했습니다.

export AWS_ACCESS_KEY_ID=임시Access
export AWS_SECRET_ACCESS_KEY=시크릿
export AWS_SESSION_TOKEN=토큰

aws ec2 describe-instances --region us-west-2
{ json file
...
...
 { "InstanceId" : "i-0ec176b2fab48a36a" } # 여러 ID를 확인할 수 있었습니다.

}

3) boto3 에서는 다음과 같은 코드를 사용했습니다.

# 확보한 3가지 토큰키로 세션 활성화
sess = boto3.Session(
    aws_access_key_id=accessKey,
    aws_secret_access_key=secretKey,
    aws_session_token=sessionToken
)

#세션을 통해 자원 접근
ec2 = sess.resource('ec2', region_name='us-west-2')

#인스턴스 ID 확보
instanceId = []
for id in ec2.instances.all():
    print(id)
    instanceId.append(id)
kmu-leeky commented 5 years ago

오케이 땡큐. ec2.instances.all() 함수가 저걸 해주는구나.

위에 있는 SESSION TOKEN, ACCESS_KEY 값은 지금 바로 삭제하자.

oryondark commented 5 years ago

네 교수님. 임시토큰 삭제했습니다. ppt는 혹시 언제까지 만들어서 드리면 될까요?

kmu-leeky commented 5 years ago

급하지는 않아. 주말에 일하고 그러지는 말고, 다음주안으로만?

oryondark commented 5 years ago

넵 알겠습니다!