티스토리 뷰

aws cli 버전 : aws-cli/2.1.11 Python/3.7.9 Windows/10 exe/AMD64 prompt/off

python 버전 : 3.8.5

CIS Benchmark 다운로드 링크 : www.cisecurity.org/blog/foundational-cloud-security-with-cis-benchmarks/

 

Blog | Foundational Cloud Security with CIS Benchmarks

Implementiong foundational cloud security systems to harden environments protect against cyber-attacks and misconfiguration.

www.cisecurity.org

어? 왜 1.6 hardware MFA가 없나요?

답변 : 어차피 1.5랑 비슷하기도 하고, 그 정돈 찾아서 해보셔도 될 것 같아 스킵했습니다.

이번 내용은 루트 계정이 사용중인지 체크하는 내용입니다.

위와 같이 콘솔에서 확인 가능하며 '보고서 다운로드' 클릭 시 콘솔에서는 파일이 다운로드 됩니다.

다운로드된 csv 파일을 열면 아래와 같이 나오는데 저희 확인할 부분은 A(1), E(5), K(11), O(16) 열 입니다.

각각 user, password_last_used, access_key_1_last_used_date, access_key_2_last_used_date 값 입니다.

조건은 user가 <root_account>이고 나머지 값이 모두 N/A 면 안전한 것으로 판단 가능합니다.

그냥 그림판 쓸걸

위와 같이 결과가 나옵니다.

원래 최초에 aws iam generate-credential-report를 사용하면 State가 STARTED로 나옵니다.

aws iam get-credential-report 명령을 통해 출력되는 Content 값을 base64 디코딩해서 사용하면 될 것 같습니다.(이건 직접 해보세요.)

aws iam generate-credential-report
aws iam get-credential-report --query "Content"

아래는 python으로 코딩해서 사용할 때,

import subprocess
import base64


# idx를 추가한 이유는 <root_account>를 가져오기 위해
# 기본 0이라서 필요없으면 아무 값도 전달 X
def get_string(b_obj, idx=0):
    str_tmp = b_obj.decode()
    return str_tmp.splitlines()[idx]


if __name__ == '__main__':
    # output text를 안주면 COMPLETE가 아닌 "COMPLETE"가 출력됨
    cmd = (
        'aws iam generate-credential-report '
        '--query "State" --output text'
    )

    # COMPLETE 가 나올때 까지 무한루프
    while True:
        gcr_state = get_string(subprocess.check_output(cmd, shell=True))
        if gcr_state == 'COMPLETE':
            print('[+] CREDENTIAL REPORT GENERATED!')
            break
        else:
            print('[*] CREDENTIAL REPORT GENERATING...')

    tmp_list = []
    cmd = (
        'aws iam get-credential-report '
        '--query "Content"'
    )
    gcr_result = get_string(base64.b64decode(subprocess.check_output(cmd, shell=True)), 1)
    
    tmp_list = gcr_result.split(',')
    if tmp_list[0] == '<root_account>' and \
       (tmp_list[4] == 'N/A' and tmp_list[10] == 'N/A' and tmp_list[15] == 'N/A'):
        print('safe')
    else:
        print('vuln')

이 외에도 다른 값들을 활용해서 일전에 제가 쓴 것들을 확인 가능한 것도 있습니다. 확인해보세요.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함