티스토리 뷰
[CIS AWS v1.3.0] 1.13 Ensure there is only one active access key available for any single IAM user
Turtle1000 2021. 2. 21. 23:26aws 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/
실수로 1.12를 건너뛰었습니다. 1.13 이후에 써야겠네요.
이번 내용은 하나의 IAM 계정에 하나의 access key만 존재하는지 확인하는 내용입니다.
IAM -> Users -> 계정 -> Security credentials 탭을 클릭하면 확인 가능한 창입니다.
현재 기준으로는 모든 계정의 키들 상태를 가져오는 명령어가 존재하지 않아(있다면 댓글 부탁드립니다.) 아래 두 가지의 명령을 통해 가져와야 합니다.
aws iam list-users --query "Users[*].UserName"
aws iam list-access-keys --user-name "유저명"
이거 필터링하는 것도 일이군요.. 아무튼 위 그림과 같이 결과가 나오게 됩니다.
CIS 기준 자체는 키가 몇 개 존재하는지를 확인하지만, 좀 더 나아가서 CreateDate와 Status도 추가로 확인해서 사용자에게 출력해줄 수도 있습니다.(검토 권고 등)
이게 아무래도 API를 통해 요청하다보니 시간이 오래 걸릴 수도 있기 때문에 이번엔 multi thread를 적용했습니다.
import subprocess
import json
import time
from threading import Thread, active_count
def get_json(b_obj):
str_tmp = b_obj.decode()
return json.loads(str_tmp)
def worker(user_name):
tmp_dict = {}
worker_cmd = (
'aws iam list-access-keys '
'--query "AccessKeyMetadata[*].[AccessKeyId, Status]" '
'--user-name "{}"'
).format(user_name)
list_access_keys = get_json(subprocess.check_output(worker_cmd, shell=True))
tmp_dict[user_name] = []
for lak in list_access_keys:
access_key_id, status = lak
tmp_dict[user_name] += [access_key_id, status]
print(tmp_dict)
# 2보다 크면 키가 2개 이상인 것임.
if len(tmp_dict[user_name]) > 2:
print(f'{user_name} is vuln.')
print()
if __name__ == '__main__':
cmd = (
'aws iam list-users '
'--query "Users[*].UserName"'
)
list_users = get_json(subprocess.check_output(cmd, shell=True))
for user in list_users:
# 문자열 전달하므로 인자 뒤에 ',' 붙여줌
Thread(target=worker, args=(user,)).start()
while True:
# active_count()가 1이면 main thread만 남았다는 뜻
if active_count() == 1:
break
# 5초에 한 번씩 검사
time.sleep(5)
get_json() 함수를 만들어줬고, 쓰레드 동기화가 필요없기 때문에 active_count() 함수를 통해서 메인 쓰레드만 남을 때 까지 while True로 지속적으로 대기해줍니다.
여기에 추가로 업데이트한다고 하면, 유저수가 많다는 가정하에 쓰레드 수 제한(API 요청 제한에 걸리지 않기 위해), 그리고 위에 언급한 내용들을 추가해볼 수 있을 것 같네요.
계속 소스코드만 올려서 결과 확인이 안돼서 불편하실 분들을 위해 앞으로는 결과도 붙이겠습니다.
감사합니다.
'퍼블릭클라우드 > AWS' 카테고리의 다른 글
- Total
- Today
- Yesterday
- web
- IAM
- temlate
- JavaScript
- teplate
- AWS #CIS
- 우주와컴퓨터
- cloudsecurity
- findinglatestversion
- 2xx
- security
- steampipe
- defaulttheme
- Cloud
- 4xx
- CIS
- ViaAWSService
- fleet manager
- terraform
- stateType
- REACT
- aws
- platform
- opensource
- 계정정보저장
- compliance
- .get()
- scp
- conftest policy
- ControlTower
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |