티스토리 뷰

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

IAM(Identity and Access Management)에 존재하는 사용자들 중 콘솔 패스워드를 갖고 있는 사용자들에게 MFA(Multi-Factor Authentication)이 적용되어 있는지 체크하는 내용입니다.

위와 같이 확인이 가능합니다.

turtle1000.tistory.com/84 <- 해당 글에서 명시한 것과 같이 '내 보안 자격 증명' -> '자격 증명 보고서' -> '보고서 다운로드' 를 통해서 확인 가능합니다.

다운로드한 csv 파일에서 확인할 부분은 user, password_enabled, mfa_active 입니다.

조건을 잘 보셔야합니다.

계정명(user) 패스워드설정여부
(password_enabled)
mfa설정여부(mfa_active) 결과
<root_account> not_supported TRUE 안전
<root_account> not_supported FALSE 취약
일반계정 TRUE TRUE 안전
일반계정 FALSE TRUE 미해당
일반계정 TRUE FALSE 취약
일반계정 FALSE FALSE 미해당

의식의 흐름대로 썻더니 순서가 좀 이상하긴 하군요. 조건에 명시되어있는대로 python으로 코딩하면,

import subprocess
import base64


def get_string(b_obj, idx=0):
    str_tmp = b_obj.decode()
    # -1이 들어올 경우 전체 값 반환
    if idx == -1:
        return str_tmp.splitlines()
    else:
        return str_tmp.splitlines()[idx]


if __name__ == '__main__':
    cmd = (
        'aws iam generate-credential-report '
        '--query "State" --output text'
    )

    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)
    del gcr_result[0]

    for gr in gcr_result:
        tmp_data = gr.split(',')
        if '<r' in tmp_data[0]:
            if tmp_data[7] == 'true':
                print(f'{tmp_data[0]} is safe.')
            else:
                print(f'{tmp_data[0]} is vuln.')
        elif tmp_data[3] == 'true':
            if tmp_data[7] == 'true':
                print(f'{tmp_data[0]} is safe.')
            else:
                print(f'{tmp_data[0]} is vuln.')
        else:
            print(f'{tmp_data[0]} is not applicable.')

오늘은 좀 급하게 작성하느라 코드가 좀 그렇네요. 참고만 부탁드립니다.

감사합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함