AWS IAM(신원 및 액세스 관리)은 AWS 리소스에 대한 액세스를 정의하는 서비스입니다. IAM의 핵심 구성 요소 중 하나는 ID 또는 리소스에 연결될 때 해당 권한을 정의하는 정책입니다. 아이덴티티(사용자, 그룹 또는 역할)에 권한을 부여하는 정책을 아이덴티티 기반 정책이라고 합니다. 이러한 정책은 리소스 목록에 대해 미리 정의된 일련의 작업을 수행할 수 있는 기능을 ID에 추가합니다.
다음은 사용자에게 자신의 액세스 키를 관리할 수 있는 기능을 부여하는 제한된 권한 집합을 정의하는 정책 문서의 예입니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:CreateAccessKey",
"iam:DeleteAccessKey",
"iam:ListAccessKeys",
"iam:UpdateAccessKey"
],
"Resource": "arn:aws:iam::245500951992:user/${aws:username}",
"Effect": "Allow",
"Sid": "AllowManageOwnAccessKeys"
}
]
}
권한 에스컬레이션은 일반적으로 ID 정책에서 ID에 이미 가지고 있는 권한보다 더 많은 권한을 부여할 수 있는 기능을 제공할 때 발생합니다. 다음은 권한 에스컬레이션을 숨기는 정책 문서의 또 다른 예입니다. 이 정책은 높은 권한을 가진 사용자를 포함하여 계정의 모든 사용자에 대해 새 액세스 키를 생성할 수 있도록 허용합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:CreateAccessKey",
"iam:DeleteAccessKey",
"iam:ListAccessKeys",
"iam:UpdateAccessKey"
],
"Resource": "*",
"Effect": "Allow",
"Sid": "AllowManageOwnAccessKeys"
}
]
}
이 정책은 제한된 권한만 부여하는 것처럼 보이지만, 실제로는 연결된 아이디에 가장 높은 권한을 부여합니다.
권한 상승은 악의적인 사용자가 자신이 제어하던 낮은 권한의 계정에서 높은 권한의 계정으로 쉽게 에스컬레이션할 수 있게 해주기 때문에 심각한 문제입니다.
위의 예는 많은 권한 상승 벡터 중 하나에 불과합니다. 다음은 규칙이 탐지할 수 있는 벡터 목록입니다:
벡터 이름 | 요약 |
---|---|
정책 버전 만들기 | 새 IAM 정책을 만들고 기본값으로 설정합니다. |
기본 정책 버전 설정 | 다른 IAM 정책 버전을 기본값으로 설정합니다. |
Create AccessKey | 사용자에 대한 새 액세스 키를 만듭니다. |
로그인 프로필 만들기 | 공격자가 선택한 비밀번호로 로그인 프로필 만들기 |
로그인 프로필 업데이트 | 기존 비밀번호를 공격자가 선택한 비밀번호로 업데이트합니다. |
사용자 정책 첨부 | 공격자가 제어하는 사용자에게 “AdministratorAccess”와 같은 허용 IAM 정책을 첨부합니다. |
그룹 정책 첨부 | 공격자가 제어하는 사용자가 포함된 그룹에 “AdministratorAccess”와 같은 허용 IAM 정책을 첨부합니다. |
역할 정책 첨부 | 공격자가 제어하는 사용자가 맡을 수 있는 역할에 “AdministratorAccess”와 같은 허용 IAM 정책을 첨부합니다. |
사용자 정책 넣기 | 공격자가 제어하는 사용자로부터 기존 인라인 IAM 정책을 변경합니다. |
그룹 정책 넣기 | 공격자가 제어하는 사용자가 포함된 그룹에서 기존 인라인 IAM 정책을 변경합니다. |
역할 정책 넣기 | 기존 인라인 IAM 역할 정책을 변경합니다. 그러면 공격자가 제어하는 사용자에게 규칙이 적용됩니다. |
그룹에 사용자 추가 | 공격자가 제어하는 사용자를 더 넓은 범위의 권한이 있는 그룹에 추가합니다. |
역할 정책 가정 업데이트 | 공격자가 제어하는 사용자가 역할을 가정할 수 있도록 역할의 “역할 정책 문서”를 업데이트합니다. |
EC2 | 높은 권한으로 실행할 EC2 인스턴스 만들기 |
람다 생성 및 호출 | 높은 권한으로 실행할 람다 함수를 생성하고 이를 호출합니다. |
람다 생성 및 권한 추가 | 높은 권한으로 실행할 람다 함수를 생성하고 사용자 또는 서비스에 호출할 권한을 부여합니다. |
외부 이벤트로 트리거된 람다 | 높은 권한으로 실행할 람다 함수를 만들고 외부 이벤트에 연결합니다. |
람다 코드 업데이트 | 높은 권한으로 실행되는 람다 함수의 코드를 업데이트합니다. |
CloudFormation | 높은 권한으로 실행할 CloudFormation 스택을 생성합니다. |
데이터 파이프라인 | 높은 권한으로 실행할 파이프라인 만들기 |
Glue 개발 엔드포인트 | 높은 권한으로 실행할 Glue 개발 엔드포인트 만들기 |
Update Glue 개발 엔드포인트 | Glue 엔드포인트에 연결된 SSH 키를 업데이트합니다. |
권한 상승을 방지하기 위한 일반적인 권장 사항은 민감한 권한이 부여되는 리소스를 제한하는 것입니다. 위의 첫 번째 예는 권한 에스컬레이션이 불가능한 좁은 범위의 리소스에 민감한 권한이 사용되는 것을 보여주는 좋은 예입니다.
규칙을 어긴 코드
다음 정책에 따라 공격자는 모든 람다 함수의 코드를 업데이트할 수 있습니다. 공격자는 높은 권한으로 실행되는 람다의 코드를 변경하여 권한 상승을 달성할 수 있습니다.
from aws_cdk.aws_iam import Effect, PolicyDocument, PolicyStatement
PolicyDocument(
statements=[
PolicyStatement(
effect=Effect.ALLOW,
actions=["lambda:UpdateFunctionCode"],
resources=["*"] # 규칙을 어긴 코드
)
]
)
규칙을 준수한 해결책
특정 람다 함수의 코드에 대한 업데이트만 허용되도록 정책을 좁히세요.
from aws_cdk.aws_iam import Effect, PolicyDocument, PolicyStatement
PolicyDocument(
statements=[
PolicyStatement(
effect=Effect.ALLOW,
actions=["lambda:UpdateFunctionCode"],
resources=[
"arn:aws:lambda:us-east-2:123456789012:function:my-function:1"
]
)
]
)
같이보면 좋은 자료
- OWASP Top 10 2021 Category A1 - 취약한 접근 제어
- Rhino Security Labs - AWS IAM 권한 에스컬레이션 - 방법과 완화 방법
- OWASP Top 10 2017 Category A5 - 취약한 접근 제어
-
MITRE, CWE-269 - 부적절한 권한 관리
If you like SONARKUBE, don’t forget to give me a star.