티스토리 뷰

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 유저가 콘솔 접속 권한(패스워드)이 있는 상태에서 엑세스 키가 있는지 확인하는 내용입니다.

여기서 의문이 들 수 있습니다. 왜? 두 개를 같이 사용하지 말라고 하는가?

예를 들어보겠습니다. access key는 보통 특정 서비스나 반복적인 작업 등을 자동화 하기 위해 사용합니다. 회사에서는 실제 사용자에게 필요한 역할(권한), 사용IP, 필요한 리소스 등 엄격한 곳은 정말 엄격하게 제한을 해서 권한을 부여해줍니다.(실제로 위에서 언급한 것 외의 행동에 대한 탐지를 하는 등 회사마다 siem이나 aws cloudwatch 등에 연동해서 사용 중일겁니다. 아마도...? 저흰 그러거든요.)

왜냐하면 access key를 통한 접근에는 mfa 적용이 불가능하기 때문이죠. 그렇기에 아무리 같은 사용자여도 콘솔과 엑세스 키를 동시에 발급해주면 안됩니다.(더욱 여러가지 이유가 있겠지만요 일단 간단히)

CIS 기준에서는 빨간색 동그라미 친 시간을 비교하고 Last used가 N/A 면 키를 삭제하라고 하지만(사실 Last used가 조금 늦게 갱신되는 경우도 있어서 100% 정확하진 않습니다.), 위에서 말씀드렸듯이 그냥 같이 사용을 하지 않는 것을 추천드립니다.

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

실제로 파란색 동그라미 친 곳들이 CIS에서 봐야하는 곳이라고 해놓았지만, 저는 빨간색으로 체크해둔 값들만을 비교할 예정입니다.(만약 CSPM 같이 현황도 전부 보여주려면 확인은 필요하겠죠?)

조건을 잘 보셔야합니다.

계정명(user) 패스워드설정여부
(password_enabled)
access key 활성화 여부
(access_key_1_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(',')
        user_id = tmp_data[0]
        is_pw_enabled = tmp_data[3]
        is_access_key_actived = tmp_data[8]

        if '<r' in user_id:
            if is_access_key_actived == 'true':
                print(f'{user_id} is vuln.')
            else:
                print(f'{user_id} is safe.')
        elif is_pw_enabled == 'true':
            if is_access_key_actived == 'true':
                print(f'{user_id} is vuln.')
            else:
                print(f'{user_id} is safe.')
        else:
            if is_access_key_actived == 'true':
                print(f'{user_id} is safe.')
            else:
                print(f'{user_id} is delete review required.')

주의하실 점은 '자격 증명 보고서'는 최소 4시간에 한 번씩만 생성 가능하기 때문에 변경하더라도 바로 스캔을 요청하면 결과가 정상적으로 보이지 않습니다.(오해없으시길 바라며..)

참고 링크 입니다. ( AWS 계정의 자격 증명 보고서 가져오기 - AWS Identity and Access Management (amazon.com) )

감사합니다.

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