mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-basic-information/REA
This commit is contained in:
@@ -26,7 +26,7 @@ AWS에는 **루트 계정**이 있으며, 이는 **조직의 모든 계정에
|
||||
|
||||
관리 계정은 **지불 계정의 책임**을 지며, 멤버 계정에서 발생하는 모든 요금을 지불할 책임이 있습니다. 조직의 관리 계정을 변경할 수 없습니다.
|
||||
|
||||
- **멤버 계정**은 조직의 나머지 모든 계정을 구성합니다. 계정은 한 번에 하나의 조직의 멤버일 수 있습니다. 계정에 정책을 부착하여 해당 계정에만 제어를 적용할 수 있습니다.
|
||||
- **멤버 계정**은 조직의 나머지 모든 계정을 구성합니다. 계정은 한 번에 하나의 조직의 멤버일 수 있습니다. 계정에 정책을 연결하여 해당 계정에만 제어를 적용할 수 있습니다.
|
||||
- 멤버 계정은 **유효한 이메일 주소를 사용해야** 하며 **이름**을 가질 수 있습니다. 일반적으로 청구를 관리할 수는 없지만 접근 권한이 부여될 수 있습니다.
|
||||
```
|
||||
aws organizations create-account --account-name testingaccount --email testingaccount@lalala1233fr.com
|
||||
@@ -40,13 +40,13 @@ aws organizations create-organizational-unit --parent-id r-lalala --name TestOU
|
||||
```
|
||||
### Service Control Policy (SCP)
|
||||
|
||||
A **service control policy (SCP)**는 SCP가 영향을 미치는 계정에서 사용자가 사용할 수 있는 서비스 및 작업을 지정하는 정책입니다. SCP는 **IAM** 권한 정책과 유사하지만 **권한을 부여하지 않습니다**. 대신, SCP는 조직, 조직 단위(OU) 또는 계정에 대한 **최대 권한**을 지정합니다. SCP를 조직 루트 또는 OU에 연결하면 **회원 계정의 엔터티에 대한 권한을 제한합니다**.
|
||||
A **service control policy (SCP)**는 SCP가 영향을 미치는 계정에서 사용자가 사용할 수 있는 서비스 및 작업을 지정하는 정책입니다. SCP는 **IAM** 권한 정책과 유사하지만 **권한을 부여하지 않습니다**. 대신, SCP는 조직, 조직 단위(OU) 또는 계정에 대한 **최대 권한**을 지정합니다. SCP를 조직 루트 또는 OU에 연결하면 **회원 계정의 엔티티에 대한 권한이 제한됩니다**.
|
||||
|
||||
이것은 **루트 사용자조차도 무언가를 하는 것을 막을 수 있는 유일한 방법**입니다. 예를 들어, 사용자가 CloudTrail을 비활성화하거나 백업을 삭제하는 것을 막는 데 사용할 수 있습니다.\
|
||||
이를 우회하는 유일한 방법은 SCP를 구성하는 **마스터 계정**도 손상시키는 것입니다(마스터 계정은 차단할 수 없습니다).
|
||||
|
||||
> [!WARNING]
|
||||
> **SCP는 계정의 주체만 제한**하므로 다른 계정에는 영향을 미치지 않습니다. 이는 SCP가 `s3:GetObject`를 거부하더라도 사람들이 **귀하의 계정의 공개 S3 버킷에 접근하는 것을 막지 않습니다**.
|
||||
> **SCP는 계정 내의 주체만 제한**하므로 다른 계정에는 영향을 미치지 않습니다. 이는 SCP가 `s3:GetObject`를 거부하더라도 사람들이 **귀하의 계정에서 공개 S3 버킷에 접근하는 것을 막지 않습니다**.
|
||||
|
||||
SCP 예시:
|
||||
|
||||
@@ -55,10 +55,10 @@ SCP 예시:
|
||||
- 화이트리스트에 있는 서비스만 허용
|
||||
- GuardDuty, CloudTrail 및 S3 공개 차단 액세스 비활성화를 거부
|
||||
|
||||
- 보안/사고 대응 역할이 삭제되거나 수정되는 것을 거부.
|
||||
- 보안/사고 대응 역할이 삭제되거나 수정되는 것을 거부합니다.
|
||||
|
||||
- 백업이 삭제되는 것을 거부.
|
||||
- IAM 사용자 및 액세스 키 생성을 거부
|
||||
- 백업이 삭제되는 것을 거부합니다.
|
||||
- IAM 사용자 및 액세스 키 생성을 거부합니다.
|
||||
|
||||
**JSON 예시**는 [https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps_examples.html](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps_examples.html)에서 확인하세요.
|
||||
|
||||
@@ -81,18 +81,18 @@ AWS에는 4개의 파티션이 있지만 이를 호출하는 방법은 3가지
|
||||
IAM은 AWS 계정 내에서 **인증**, **권한 부여** 및 **액세스 제어**를 관리할 수 있게 해주는 서비스입니다.
|
||||
|
||||
- **인증** - 신원을 정의하고 그 신원을 검증하는 과정입니다. 이 과정은 식별 및 검증으로 세분화될 수 있습니다.
|
||||
- **권한 부여** - 인증된 후 시스템 내에서 신원이 접근할 수 있는 것을 결정합니다.
|
||||
- **액세스 제어** - 안전한 리소스에 대한 액세스가 부여되는 방법과 과정입니다.
|
||||
- **권한 부여** - 신원이 인증된 후 시스템 내에서 어떤 리소스에 접근할 수 있는지를 결정합니다.
|
||||
- **액세스 제어** - 안전한 리소스에 대한 접근이 어떻게 부여되는지를 정의하는 방법과 과정입니다.
|
||||
|
||||
IAM은 AWS 계정 내 리소스에 대한 신원의 인증, 권한 부여 및 액세스 제어 메커니즘을 관리, 제어 및 통치하는 능력으로 정의될 수 있습니다.
|
||||
|
||||
### [AWS account root user](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html) <a href="#id_root" id="id_root"></a>
|
||||
|
||||
Amazon Web Services (AWS) 계정을 처음 생성하면 **모든** AWS 서비스와 리소스에 **완전한 액세스**를 가진 단일 로그인 신원으로 시작합니다. 이것이 AWS 계정 _**루트 사용자**_이며, **계정을 생성할 때 사용한 이메일 주소와 비밀번호로 로그인하여 접근합니다**.
|
||||
Amazon Web Services (AWS) 계정을 처음 생성하면 **모든** AWS 서비스와 리소스에 **완전한 접근 권한**을 가진 단일 로그인 신원으로 시작합니다. 이것이 AWS 계정 _**루트 사용자**_이며, **계정을 생성할 때 사용한 이메일 주소와 비밀번호로 로그인하여 접근합니다**.
|
||||
|
||||
새로운 **관리자 사용자**는 **루트 사용자보다 권한이 적습니다**.
|
||||
|
||||
보안 관점에서 볼 때, 다른 사용자를 생성하고 이 사용자를 사용하는 것을 피하는 것이 좋습니다.
|
||||
보안 관점에서 볼 때, 다른 사용자를 생성하고 이 사용자를 사용하는 것을 피하는 것이 권장됩니다.
|
||||
|
||||
### [IAM users](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) <a href="#id_iam-users" id="id_iam-users"></a>
|
||||
|
||||
@@ -104,24 +104,24 @@ IAM 사용자를 생성할 때, 적절한 권한 정책이 첨부된 **사용자
|
||||
|
||||
#### CLI
|
||||
|
||||
- **Access Key ID**: 20개의 무작위 대문자 알phanumeric 문자, 예: AKHDNAPO86BSHKDIRYT
|
||||
- **Secret access key ID**: 40개의 무작위 대소문자 문자: S836fh/J73yHSb64Ag3Rkdi/jaD6sPl6/antFtU (잃어버린 비밀 액세스 키 ID를 복구할 수 없습니다).
|
||||
- **Access Key ID**: 20개의 무작위 대문자 알파벳 숫자 조합, 예: AKHDNAPO86BSHKDIRYT
|
||||
- **Secret access key ID**: 40개의 무작위 대소문자 조합: S836fh/J73yHSb64Ag3Rkdi/jaD6sPl6/antFtU (잃어버린 비밀 액세스 키 ID를 복구할 수 없습니다).
|
||||
|
||||
**Access Key**를 **변경해야 할 때** 따라야 할 과정은 다음과 같습니다:\
|
||||
_새 액세스 키 생성 -> 시스템/애플리케이션에 새 키 적용 -> 원래 키를 비활성화로 표시 -> 새 액세스 키가 작동하는지 테스트 및 확인 -> 이전 액세스 키 삭제_
|
||||
_새 액세스 키 생성 -> 시스템/애플리케이션에 새 키 적용 -> 원래 키를 비활성화로 표시 -> 새 액세스 키가 작동하는지 테스트 및 검증 -> 이전 액세스 키 삭제_
|
||||
|
||||
### MFA - Multi Factor Authentication
|
||||
|
||||
기존 방법(예: 비밀번호) 외에 **인증을 위한 추가 요소를 생성**하는 데 사용되며, 따라서 다단계 인증 수준을 생성합니다.\
|
||||
**무료 가상 애플리케이션 또는 물리적 장치**를 사용할 수 있습니다. Google 인증과 같은 앱을 무료로 사용하여 AWS에서 MFA를 활성화할 수 있습니다.
|
||||
**무료 가상 애플리케이션 또는 물리적 장치**를 사용할 수 있습니다. Google 인증기와 같은 앱을 무료로 사용하여 AWS에서 MFA를 활성화할 수 있습니다.
|
||||
|
||||
MFA 조건이 있는 정책은 다음에 첨부될 수 있습니다:
|
||||
|
||||
- IAM 사용자 또는 그룹
|
||||
- Amazon S3 버킷, Amazon SQS 큐 또는 Amazon SNS 주제와 같은 리소스
|
||||
- 사용자가 가정할 수 있는 IAM 역할의 신뢰 정책
|
||||
- 사용자가 수용할 수 있는 IAM 역할의 신뢰 정책
|
||||
|
||||
**MFA를 확인하는** 리소스에 **CLI를 통해 접근**하려면 **`GetSessionToken`**을 호출해야 합니다. 그러면 MFA에 대한 정보가 포함된 토큰이 제공됩니다.\
|
||||
**CLI를 통해** MFA를 **확인하는 리소스에 접근**하려면 **`GetSessionToken`**을 호출해야 합니다. 그러면 MFA에 대한 정보가 포함된 토큰이 제공됩니다.\
|
||||
**`AssumeRole` 자격 증명에는 이 정보가 포함되어 있지 않습니다**.
|
||||
```bash
|
||||
aws sts get-session-token --serial-number <arn_device> --token-code <code>
|
||||
@@ -130,22 +130,22 @@ As [**stated here**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credent
|
||||
|
||||
### [IAM 사용자 그룹](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html) <a href="#id_iam-groups" id="id_iam-groups"></a>
|
||||
|
||||
IAM [사용자 그룹](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)은 **여러 사용자에게 정책을 동시에 연결하는** 방법으로, 이러한 사용자의 권한을 관리하기 쉽게 만들어 줍니다. **역할과 그룹은 그룹의 일부가 될 수 없습니다.**
|
||||
IAM [사용자 그룹](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)은 **여러 사용자에게 정책을 동시에 연결하는** 방법으로, 이러한 사용자의 권한을 관리하기 쉽게 만들어 줍니다. **역할과 그룹은 그룹의 일부가 될 수 없습니다**.
|
||||
|
||||
**사용자 그룹에 신원 기반 정책을 연결**할 수 있어, 사용자 그룹의 **모든 사용자**가 **정책의 권한을 받게** 됩니다. **정책**(예: 리소스 기반 정책)에서 **`Principal`**로 **사용자 그룹**을 식별할 수 **없습니다**. 그룹은 인증이 아닌 권한과 관련이 있으며, 주체는 인증된 IAM 엔터티입니다.
|
||||
|
||||
사용자 그룹의 몇 가지 중요한 특성은 다음과 같습니다:
|
||||
|
||||
- 사용자 **그룹**은 **많은 사용자**를 **포함할 수 있으며**, **사용자**는 **여러 그룹에 속할 수 있습니다.**
|
||||
- 사용자 **그룹**은 **많은 사용자**를 **포함할 수 있으며**, **사용자**는 **여러 그룹에 속할 수 있습니다**.
|
||||
- **사용자 그룹은 중첩될 수 없습니다**; 사용자만 포함할 수 있으며, 다른 사용자 그룹은 포함할 수 없습니다.
|
||||
- **AWS 계정의 모든 사용자를 자동으로 포함하는 기본 사용자 그룹은 없습니다.** 그런 사용자 그룹을 원하면, 직접 생성하고 각 새로운 사용자를 할당해야 합니다.
|
||||
- **AWS 계정의 모든 사용자를 자동으로 포함하는 기본 사용자 그룹은 없습니다**. 그런 사용자 그룹을 원하면, 직접 생성하고 각 새로운 사용자를 할당해야 합니다.
|
||||
- AWS 계정의 IAM 리소스 수와 크기, 예를 들어 그룹 수와 사용자가 속할 수 있는 그룹 수는 제한되어 있습니다. 자세한 내용은 [IAM 및 AWS STS 할당량](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html)을 참조하세요.
|
||||
|
||||
### [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) <a href="#id_iam-roles" id="id_iam-roles"></a>
|
||||
|
||||
IAM **역할**은 **사용자**와 매우 **유사**하며, AWS에서 **무엇을 할 수 있고 할 수 없는지를 결정하는 권한 정책을 가진 **신원**입니다. 그러나 역할은 **자격 증명**(비밀번호 또는 액세스 키)이 없습니다. 역할은 특정 개인과 고유하게 연결되는 것이 아니라, **필요한 사람 누구나 (충분한 권한이 있는 경우)** **가정할 수 있도록** 설계되었습니다. **IAM 사용자는 특정 작업을 위해 임시로** 다른 권한을 취득하기 위해 역할을 **가정할 수 있습니다.** 역할은 IAM 대신 외부 신원 공급자를 사용하여 로그인하는 [**연합 사용자**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html)에게 **할당될 수 있습니다.**
|
||||
IAM **역할**은 **사용자**와 매우 **유사**하며, AWS에서 **무엇을 할 수 있고 할 수 없는지를 결정하는 권한 정책을 가진 **신원**입니다. 그러나 역할은 **자격 증명**(비밀번호 또는 액세스 키)이 없습니다. 역할은 특정 개인과 고유하게 연결되는 것이 아니라, **필요한 사람 누구나 (충분한 권한이 있는 경우)** **가정할 수 있도록** 설계되었습니다. **IAM 사용자는 특정 작업을 위해** 다른 권한을 일시적으로 **가정할 수 있습니다**. 역할은 IAM 대신 외부 신원 공급자를 사용하여 로그인하는 [**연합 사용자**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html)에게 **할당될 수 있습니다**.
|
||||
|
||||
IAM 역할은 **두 가지 유형의 정책**으로 구성됩니다: **신뢰 정책**, 비어 있을 수 없으며 **누가 역할을 가정할 수 있는지를 정의하고**, **권한 정책**, 비어 있을 수 없으며 **무엇에 접근할 수 있는지를 정의합니다.**
|
||||
IAM 역할은 **두 가지 유형의 정책**으로 구성됩니다: **신뢰 정책**, 비어 있을 수 없으며 **누가 역할을 가정할 수 있는지를 정의**하고, **권한 정책**, 비어 있을 수 없으며 **무엇에 접근할 수 있는지를 정의**합니다.
|
||||
|
||||
#### AWS 보안 토큰 서비스 (STS)
|
||||
|
||||
@@ -153,7 +153,7 @@ AWS 보안 토큰 서비스 (STS)는 **임시, 제한된 권한 자격 증명**
|
||||
|
||||
### [IAM의 임시 자격 증명](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) <a href="#id_temp-creds" id="id_temp-creds"></a>
|
||||
|
||||
**임시 자격 증명은 주로 IAM 역할과 함께 사용되지만**, 다른 용도도 있습니다. 표준 IAM 사용자보다 더 제한된 권한 세트를 가진 임시 자격 증명을 요청할 수 있습니다. 이는 **더 제한된 자격 증명으로 허용되지 않는 작업을 실수로 수행하는 것을 방지합니다.** 임시 자격 증명의 장점은 설정된 기간 후에 자동으로 만료된다는 것입니다. 자격 증명이 유효한 기간을 제어할 수 있습니다.
|
||||
**임시 자격 증명은 주로 IAM 역할과 함께 사용되지만**, 다른 용도도 있습니다. 표준 IAM 사용자보다 더 제한된 권한 세트를 가진 임시 자격 증명을 요청할 수 있습니다. 이는 **더 제한된 자격 증명으로 허용되지 않는 작업을 실수로 수행하는 것을 방지**합니다. 임시 자격 증명의 장점은 설정된 기간 후에 자동으로 만료된다는 것입니다. 자격 증명이 유효한 기간을 제어할 수 있습니다.
|
||||
|
||||
### 정책
|
||||
|
||||
@@ -161,8 +161,8 @@ AWS 보안 토큰 서비스 (STS)는 **임시, 제한된 권한 자격 증명**
|
||||
|
||||
권한을 할당하는 데 사용됩니다. 두 가지 유형이 있습니다:
|
||||
|
||||
- AWS 관리 정책 (AWS에서 미리 구성한 정책)
|
||||
- 고객 관리 정책: 사용자가 구성한 정책입니다. AWS 관리 정책을 기반으로 정책을 생성할 수 있으며(그 중 하나를 수정하고 자신만의 정책을 생성), 정책 생성기(권한을 부여하고 거부하는 데 도움을 주는 GUI 보기)를 사용하거나 직접 작성할 수 있습니다.
|
||||
- AWS 관리형 정책 (AWS에서 미리 구성)
|
||||
- 고객 관리형 정책: 사용자가 구성. AWS 관리형 정책을 기반으로 정책을 생성할 수 있습니다 (그 중 하나를 수정하고 자신의 것을 생성), 정책 생성기를 사용하거나 (권한을 부여하고 거부하는 데 도움을 주는 GUI 보기) 직접 작성할 수 있습니다.
|
||||
|
||||
**기본적으로 접근은** **거부됩니다**, 명시적인 역할이 지정된 경우에만 접근이 허용됩니다.\
|
||||
**단일 "거부"가 존재하면 "허용"을 무시합니다**, AWS 계정의 루트 보안 자격 증명을 사용하는 요청은 기본적으로 허용됩니다.
|
||||
@@ -193,18 +193,18 @@ AWS 보안 토큰 서비스 (STS)는 **임시, 제한된 권한 자격 증명**
|
||||
|
||||
#### 인라인 정책
|
||||
|
||||
이러한 종류의 정책은 **사용자, 그룹 또는 역할에 직접 할당**됩니다. 따라서 다른 사용자가 사용할 수 있는 정책 목록에는 나타나지 않습니다.\
|
||||
인라인 정책은 **정책과 적용되는 정체성 간의 엄격한 일대일 관계를 유지**하려는 경우에 유용합니다. 예를 들어, 정책의 권한이 의도된 정체성 외의 다른 정체성에 우연히 할당되지 않도록 하려는 경우입니다. 인라인 정책을 사용할 때, 정책의 권한은 잘못된 정체성에 우연히 연결될 수 없습니다. 또한, AWS Management Console을 사용하여 해당 정체성을 삭제할 때, 정체성에 내장된 정책도 함께 삭제됩니다. 이는 그것들이 주체 엔터티의 일부이기 때문입니다.
|
||||
이러한 정책은 **사용자, 그룹 또는 역할에 직접 할당**됩니다. 따라서 다른 사용자가 사용할 수 있는 정책 목록에는 나타나지 않습니다.\
|
||||
인라인 정책은 **정책과 적용되는 정체성 간의 엄격한 일대일 관계를 유지**하고자 할 때 유용합니다. 예를 들어, 정책의 권한이 의도된 정체성 외의 다른 정체성에 우연히 할당되지 않도록 하려는 경우입니다. 인라인 정책을 사용할 때, 정책의 권한은 잘못된 정체성에 우연히 연결될 수 없습니다. 또한, AWS Management Console을 사용하여 해당 정체성을 삭제할 때, 정체성에 내장된 정책도 함께 삭제됩니다. 이는 그것들이 주체 엔티티의 일부이기 때문입니다.
|
||||
|
||||
#### 리소스 버킷 정책
|
||||
|
||||
이것은 **리소스**에서 정의할 수 있는 **정책**입니다. **모든 AWS 리소스가 이를 지원하는 것은 아닙니다**.
|
||||
|
||||
주체가 이에 대한 명시적인 거부가 없고, 리소스 정책이 그들에게 접근을 허용하면, 그들은 허용됩니다.
|
||||
주체가 이에 대한 명시적 거부가 없고, 리소스 정책이 그들에게 접근을 허용하면, 그들은 허용됩니다.
|
||||
|
||||
### IAM 경계
|
||||
|
||||
IAM 경계는 **사용자 또는 역할이 접근할 수 있는 권한을 제한하는 데 사용**될 수 있습니다. 이렇게 하면, **다른 정책**에 의해 사용자에게 다른 권한 세트가 부여되더라도, 그가 이를 사용하려고 하면 작업이 **실패**합니다.
|
||||
IAM 경계는 **사용자 또는 역할이 접근할 수 있는 권한을 제한하는 데 사용**될 수 있습니다. 이렇게 하면, **다른 정책**에 의해 사용자에게 다른 권한 세트가 부여되더라도, 그가 이를 사용하려고 할 경우 작업이 **실패**합니다.
|
||||
|
||||
경계는 사용자에게 첨부된 정책으로, **사용자 또는 역할이 가질 수 있는 최대 권한 수준을 나타냅니다**. 따라서, **사용자가 관리자 접근 권한을 가지고 있더라도**, 경계가 그가 S· 버킷만 읽을 수 있다고 나타내면, 그것이 그가 할 수 있는 최대입니다.
|
||||
|
||||
@@ -226,74 +226,74 @@ aws sts assume-role \
|
||||
|
||||
따라서 "... 세션 정책이 ...을 허용하지 않기 때문에"라는 오류에 직면하게 되면, 역할이 해당 작업을 수행할 수 있는 접근 권한이 있음에도 불구하고 **세션 정책이 이를 방지하고 있는 것입니다**.
|
||||
|
||||
### Identity Federation
|
||||
### 아이덴티티 연합
|
||||
|
||||
Identity federation은 **AWS 외부의 ID 공급자에서 사용자**가 AWS 리소스에 안전하게 접근할 수 있도록 하며, 유효한 IAM 사용자 계정의 AWS 사용자 자격 증명을 제공할 필요가 없습니다.\
|
||||
ID 공급자의 예로는 귀사의 **Microsoft Active Directory** (via **SAML**) 또는 **OpenID** 서비스 (예: **Google**)가 있습니다. 연합된 접근은 그 안의 사용자들이 AWS에 접근할 수 있도록 합니다.
|
||||
아이덴티티 연합은 **AWS 외부의 아이덴티티 제공자**에서 사용자가 AWS 리소스에 안전하게 접근할 수 있도록 하며, 유효한 IAM 사용자 계정의 AWS 사용자 자격 증명을 제공할 필요가 없습니다.\
|
||||
아이덴티티 제공자의 예로는 귀사의 **Microsoft Active Directory** (via **SAML**) 또는 **OpenID** 서비스 (예: **Google**)가 있습니다. 연합된 접근은 그 안의 사용자들이 AWS에 접근할 수 있도록 합니다.
|
||||
|
||||
이 신뢰를 구성하기 위해 **IAM ID 공급자(SAML 또는 OAuth)**가 생성되어 **다른 플랫폼을 신뢰**합니다. 그런 다음, 최소한 하나의 **IAM 역할이 ID 공급자에게 (신뢰하는) 할당됩니다**. 신뢰된 플랫폼의 사용자가 AWS에 접근하면, 언급된 역할로 접근하게 됩니다.
|
||||
이 신뢰를 구성하기 위해 **IAM 아이덴티티 제공자(SAML 또는 OAuth)**가 생성되어 **다른 플랫폼을 신뢰**합니다. 그런 다음, 최소한 하나의 **IAM 역할이 아이덴티티 제공자에 할당(신뢰)**됩니다. 신뢰된 플랫폼의 사용자가 AWS에 접근하면, 언급된 역할로 접근하게 됩니다.
|
||||
|
||||
그러나 일반적으로 **사용자의 그룹에 따라 다른 역할을 부여하고 싶어할 것입니다**. 그러므로 여러 **IAM 역할이** 제3자 ID 공급자를 신뢰할 수 있으며, 제3자 플랫폼이 사용자가 하나의 역할 또는 다른 역할을 가정할 수 있도록 허용합니다.
|
||||
그러나 일반적으로 **사용자의 그룹에 따라 다른 역할을 부여하고 싶어할 것입니다**. 그러므로 여러 **IAM 역할이** 제3자 아이덴티티 제공자를 신뢰할 수 있으며, 제3자 플랫폼이 사용자가 하나의 역할 또는 다른 역할을 가정하도록 허용하는 것입니다.
|
||||
|
||||
<figure><img src="../../../images/image (247).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### IAM Identity Center
|
||||
### IAM 아이덴티티 센터
|
||||
|
||||
AWS IAM Identity Center (AWS Single Sign-On의 후속 제품)는 AWS Identity and Access Management (IAM)의 기능을 확장하여 **사용자 및 AWS** 계정과 클라우드 애플리케이션에 대한 접근을 **중앙에서 관리할 수 있는 장소**를 제공합니다.
|
||||
AWS IAM 아이덴티티 센터(AWS Single Sign-On의 후속 제품)는 AWS 아이덴티티 및 접근 관리(IAM)의 기능을 확장하여 **사용자 및 그들의 AWS** 계정 및 클라우드 애플리케이션에 대한 접근 관리를 통합하는 **중앙 장소**를 제공합니다.
|
||||
|
||||
로그인 도메인은 `<user_input>.awsapps.com`과 같은 형식이 될 것입니다.
|
||||
|
||||
사용자를 로그인시키기 위해 사용할 수 있는 3가지 ID 소스가 있습니다:
|
||||
사용자를 로그인시키기 위해 사용할 수 있는 3가지 아이덴티티 소스가 있습니다:
|
||||
|
||||
- Identity Center Directory: 일반 AWS 사용자
|
||||
- Active Directory: 다양한 커넥터 지원
|
||||
- External Identity Provider: 모든 사용자 및 그룹이 외부 ID 공급자(IdP)에서 옵니다.
|
||||
- 아이덴티티 센터 디렉토리: 일반 AWS 사용자
|
||||
- 액티브 디렉토리: 다양한 커넥터 지원
|
||||
- 외부 아이덴티티 제공자: 모든 사용자 및 그룹이 외부 아이덴티티 제공자(IdP)에서 옵니다.
|
||||
|
||||
<figure><img src="../../../images/image (279).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Identity Center 디렉토리의 가장 간단한 경우, **Identity Center는 사용자 및 그룹 목록을 보유**하고 있으며, **정책을 할당**하여 **조직의 모든 계정**에 적용할 수 있습니다.
|
||||
아이덴티티 센터 디렉토리의 가장 간단한 경우, **아이덴티티 센터는 사용자 및 그룹 목록을 보유**하고 있으며, **정책을 할당**하여 **조직의 모든 계정**에 적용할 수 있습니다.
|
||||
|
||||
Identity Center 사용자/그룹에게 계정에 대한 접근을 부여하기 위해 **Identity Center를 신뢰하는 SAML ID 공급자가 생성**되고, **지정된 정책으로 ID 공급자를 신뢰하는 역할이 대상 계정에 생성됩니다**.
|
||||
아이덴티티 센터 사용자/그룹에게 계정에 대한 접근을 부여하기 위해 **아이덴티티 센터를 신뢰하는 SAML 아이덴티티 제공자가 생성**되고, **지정된 정책으로 아이덴티티 제공자를 신뢰하는 역할이 대상 계정에 생성**됩니다.
|
||||
|
||||
#### AwsSSOInlinePolicy
|
||||
|
||||
**IAM Identity Center를 통해 생성된 역할에 인라인 정책을 통해 권한을 부여하는 것이 가능합니다**. AWS Identity Center에서 **인라인 정책을 가진 역할**이 생성된 계정은 **`AwsSSOInlinePolicy`**라는 인라인 정책에서 이러한 권한을 가집니다.
|
||||
**IAM 아이덴티티 센터를 통해 생성된 역할에 인라인 정책을 통해 권한을 부여하는 것이 가능합니다**. AWS 아이덴티티 센터에서 **인라인 정책을 가진 역할**이 생성된 계정은 **`AwsSSOInlinePolicy`**라는 인라인 정책에서 이러한 권한을 가집니다.
|
||||
|
||||
따라서 **`AwsSSOInlinePolicy`**라는 인라인 정책을 가진 2개의 역할이 보이더라도, **동일한 권한을 가진다는 의미는 아닙니다**.
|
||||
따라서 **`AwsSSOInlinePolicy`**라는 인라인 정책을 가진 2개의 역할을 보더라도, **동일한 권한을 가진다는 의미는 아닙니다**.
|
||||
|
||||
### Cross Account Trusts and Roles
|
||||
### 크로스 계정 신뢰 및 역할
|
||||
|
||||
**사용자**(신뢰하는)는 일부 정책을 가진 Cross Account Role을 생성한 다음, **다른 사용자**(신뢰받는)가 **자신의 계정에 접근할 수 있도록 허용할 수 있습니다**. 그러나 **새 역할 정책에 명시된 접근만 허용됩니다**. 이를 생성하려면 새 역할을 만들고 Cross Account Role을 선택하면 됩니다. Cross-Account Access를 위한 역할은 두 가지 옵션을 제공합니다. 소유한 AWS 계정 간의 접근을 제공하거나, 소유한 계정과 제3자 AWS 계정 간의 접근을 제공합니다.\
|
||||
신뢰하는 사용자를 **구체적으로 지정하고 일반적인 내용을 넣지 않는 것이 좋습니다**. 그렇지 않으면, 연합된 사용자와 같은 다른 인증된 사용자가 이 신뢰를 남용할 수 있습니다.
|
||||
**사용자**(신뢰하는)는 일부 정책을 가진 크로스 계정 역할을 생성한 다음, **다른 사용자**(신뢰받는)가 **자신의 계정에 접근할 수 있도록 허용**하지만 **새 역할 정책에 명시된 접근만 허용**합니다. 이를 생성하려면 새 역할을 만들고 크로스 계정 역할을 선택하면 됩니다. 크로스 계정 접근을 위한 역할은 두 가지 옵션을 제공합니다. 소유한 AWS 계정 간의 접근을 제공하거나, 소유한 계정과 제3자 AWS 계정 간의 접근을 제공합니다.\
|
||||
신뢰받는 사용자를 **구체적으로 지정하고 일반적인 내용을 넣지 않는 것이 좋습니다**. 그렇지 않으면, 연합된 사용자와 같은 다른 인증된 사용자가 이 신뢰를 남용할 수 있습니다.
|
||||
|
||||
### AWS Simple AD
|
||||
|
||||
지원되지 않음:
|
||||
|
||||
- Trust Relations
|
||||
- AD Admin Center
|
||||
- 신뢰 관계
|
||||
- AD 관리 센터
|
||||
- 전체 PS API 지원
|
||||
- AD Recycle Bin
|
||||
- Group Managed Service Accounts
|
||||
- Schema Extensions
|
||||
- AD 재활용 빈
|
||||
- 그룹 관리 서비스 계정
|
||||
- 스키마 확장
|
||||
- OS 또는 인스턴스에 대한 직접 접근 없음
|
||||
|
||||
#### Web Federation or OpenID Authentication
|
||||
#### 웹 연합 또는 OpenID 인증
|
||||
|
||||
앱은 AssumeRoleWithWebIdentity를 사용하여 임시 자격 증명을 생성합니다. 그러나 이는 AWS 콘솔에 대한 접근을 부여하지 않으며, AWS 내의 리소스에 대한 접근만 부여합니다.
|
||||
|
||||
### Other IAM options
|
||||
### 기타 IAM 옵션
|
||||
|
||||
- **비밀번호 정책 설정**에서 최소 길이 및 비밀번호 요구 사항과 같은 옵션을 설정할 수 있습니다.
|
||||
- 현재 자격 증명에 대한 정보(예: 사용자 생성 시간, 비밀번호 사용 가능 여부 등)를 포함한 **"Credential Report"를 다운로드**할 수 있습니다. 자격 증명 보고서는 최대 **4시간마다** 생성할 수 있습니다.
|
||||
- **비밀번호 정책 설정**을 통해 최소 길이 및 비밀번호 요구 사항과 같은 옵션을 설정할 수 있습니다.
|
||||
- 현재 자격 증명에 대한 정보(예: 사용자 생성 시간, 비밀번호 사용 가능 여부 등)를 포함한 **"자격 증명 보고서"를 다운로드**할 수 있습니다. 자격 증명 보고서는 최대 **4시간마다** 생성할 수 있습니다.
|
||||
|
||||
AWS Identity and Access Management (IAM)는 AWS 전반에 걸쳐 **세밀한 접근 제어**를 제공합니다. IAM을 사용하면 **누가 어떤 서비스와 리소스에 접근할 수 있는지** 및 어떤 조건에서 접근할 수 있는지를 지정할 수 있습니다. IAM 정책을 통해 인력과 시스템에 대한 권한을 관리하여 **최소 권한 원칙**을 보장합니다.
|
||||
AWS 아이덴티티 및 접근 관리(IAM)는 AWS 전반에 걸쳐 **세밀한 접근 제어**를 제공합니다. IAM을 사용하면 **누가 어떤 서비스와 리소스에 접근할 수 있는지** 및 어떤 조건에서 접근할 수 있는지를 지정할 수 있습니다. IAM 정책을 통해 인력과 시스템에 대한 권한을 관리하여 **최소 권한 원칙**을 보장합니다.
|
||||
|
||||
### IAM ID Prefixes
|
||||
### IAM ID 접두사
|
||||
|
||||
[**이 페이지**](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids)에서 키의 성격에 따라 **IAM ID 접두사**를 찾을 수 있습니다:
|
||||
|
||||
| Identifier Code | Description |
|
||||
| 식별자 코드 | 설명 |
|
||||
| ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| ABIA | [AWS STS 서비스 베어러 토큰](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_bearer.html) |
|
||||
|
||||
@@ -307,9 +307,9 @@ AWS Identity and Access Management (IAM)는 AWS 전반에 걸쳐 **세밀한 접
|
||||
| APKA | 공개 키 |
|
||||
| AROA | 역할 |
|
||||
| ASCA | 인증서 |
|
||||
| ASIA | [임시 (AWS STS) 액세스 키 ID](https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html)는 이 접두사를 사용하지만, 비밀 액세스 키 및 세션 토큰과 조합하여야만 고유합니다. |
|
||||
| ASIA | [임시(AWS STS) 액세스 키 ID](https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html)는 이 접두사를 사용하지만, 비밀 액세스 키 및 세션 토큰과 조합하여야만 고유합니다. |
|
||||
|
||||
### Recommended permissions to audit accounts
|
||||
### 계정 감사에 권장되는 권한
|
||||
|
||||
다음 권한은 메타데이터에 대한 다양한 읽기 접근을 부여합니다:
|
||||
|
||||
@@ -322,12 +322,12 @@ AWS Identity and Access Management (IAM)는 AWS 전반에 걸쳐 **세밀한 접
|
||||
- `directconnect:DescribeConnections`
|
||||
- `dynamodb:ListTables`
|
||||
|
||||
## Misc
|
||||
## 기타
|
||||
|
||||
### CLI Authentication
|
||||
### CLI 인증
|
||||
|
||||
일반 사용자가 CLI를 통해 AWS에 인증하기 위해서는 **로컬 자격 증명**이 필요합니다. 기본적으로 `~/.aws/credentials`에서 **수동으로** 구성하거나 **`aws configure`를 실행하여** 구성할 수 있습니다.\
|
||||
해당 파일에는 여러 프로필을 가질 수 있으며, **aws cli**를 사용할 때 **프로필**이 지정되지 않으면 해당 파일의 **`[default]`**라는 프로필이 사용됩니다.\
|
||||
해당 파일에는 하나 이상의 프로필을 가질 수 있으며, **aws cli**를 사용할 때 **프로필**이 지정되지 않으면 해당 파일의 **`[default]`**라는 프로필이 사용됩니다.\
|
||||
여러 프로필이 있는 자격 증명 파일의 예:
|
||||
```
|
||||
[default]
|
||||
@@ -351,11 +351,11 @@ role_session_name = <session_name>
|
||||
source_profile = <profile_with_assume_role>
|
||||
sts_regional_endpoints = regional
|
||||
```
|
||||
이 구성 파일을 사용하면 aws cli를 다음과 같이 사용할 수 있습니다:
|
||||
이 구성 파일을 사용하여 aws cli를 다음과 같이 사용할 수 있습니다:
|
||||
```
|
||||
aws --profile acc2 ...
|
||||
```
|
||||
비슷한 것을 **브라우저**용으로 찾고 있다면 **확장 프로그램** [**AWS Extend Switch Roles**](https://chrome.google.com/webstore/detail/aws-extend-switch-roles/jpmkfafbacpgapdghgdpembnojdlgkdl?hl=en)를 확인해 보세요.
|
||||
이와 유사한 것을 **브라우저**용으로 찾고 있다면 **확장 프로그램** [**AWS Extend Switch Roles**](https://chrome.google.com/webstore/detail/aws-extend-switch-roles/jpmkfafbacpgapdghgdpembnojdlgkdl?hl=en)를 확인해 보세요.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
+15
-15
@@ -4,7 +4,7 @@
|
||||
|
||||
## **CloudTrail**
|
||||
|
||||
AWS CloudTrail **는 AWS 환경 내의 활동을 기록하고 모니터링합니다**. 이는 AWS 리소스와의 모든 상호작용에 대해 누가 무엇을, 언제, 어디서 했는지를 포함한 상세한 **이벤트 로그**를 캡처합니다. 이는 변경 사항 및 작업의 감사 추적을 제공하여 보안 분석, 규정 준수 감사 및 리소스 변경 추적에 도움을 줍니다. CloudTrail은 사용자 및 리소스 행동을 이해하고, 보안 태세를 강화하며, 규제 준수를 보장하는 데 필수적입니다.
|
||||
AWS CloudTrail **는 AWS 환경 내 활동을 기록하고 모니터링합니다**. 이는 AWS 리소스와의 모든 상호작용에 대해 누가 무엇을, 언제, 어디서 했는지를 포함한 상세한 **이벤트 로그**를 캡처합니다. 이는 변경 사항 및 작업의 감사 추적을 제공하여 보안 분석, 규정 준수 감사 및 리소스 변경 추적에 도움을 줍니다. CloudTrail은 사용자 및 리소스 행동을 이해하고, 보안 태세를 강화하며, 규제 준수를 보장하는 데 필수적입니다.
|
||||
|
||||
각 기록된 이벤트에는 다음이 포함됩니다:
|
||||
|
||||
@@ -19,7 +19,7 @@ AWS CloudTrail **는 AWS 환경 내의 활동을 기록하고 모니터링합니
|
||||
- 요청 매개변수: `requestParameters`
|
||||
- 응답 요소: `responseElements`
|
||||
|
||||
이벤트는 **약 5분마다 JSON 파일로 새로운 로그 파일에 기록되며**, CloudTrail에 의해 보관되고 최종적으로 로그 파일은 **약 15분 후 S3로 전달됩니다**.\
|
||||
이벤트는 **약 5분마다 JSON 파일로 새로운 로그 파일에 기록되며**, CloudTrail에 의해 보관되고 최종적으로 로그 파일은 **약 15분 후 S3에 전달됩니다**.\
|
||||
CloudTrail 로그는 **계정 및 지역 간에 집계될 수 있습니다.**\
|
||||
CloudTrail은 **로그 파일 무결성을 사용하여 로그 파일이 CloudTrail이 전달한 이후 변경되지 않았음을 확인할 수 있도록 합니다**. 이는 로그 내부의 SHA-256 해시를 생성합니다. 새로운 로그의 sha-256 해시는 매시간 생성됩니다.\
|
||||
Trail을 생성할 때 이벤트 선택기를 사용하여 기록할 Trail을 관리, 데이터 또는 인사이트 이벤트로 지정할 수 있습니다.
|
||||
@@ -51,7 +51,7 @@ Trail을 생성할 때 이벤트 선택기를 사용하여 기록할 Trail을
|
||||
그러나 모든 로그를 동일한 S3 버킷에 저장할 수 있지만, 여러 계정의 CloudTrail 로그를 단일 AWS 계정에 속하는 CloudWatch Logs로 집계할 수는 없습니다.
|
||||
|
||||
> [!CAUTION]
|
||||
> 계정은 **다른 Trails**를 CloudTrail **에서 활성화하여** 동일한(또는 다른) 로그를 서로 다른 버킷에 저장할 수 있습니다.
|
||||
> 계정은 **다른 Trails**를 CloudTrail **에서 활성화하여** 동일한(또는 다른) 로그를 서로 다른 버킷에 저장할 수 있음을 기억하십시오.
|
||||
|
||||
### 모든 조직 계정의 CloudTrail을 1개로
|
||||
|
||||
@@ -69,8 +69,8 @@ aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [-
|
||||
```
|
||||
### Logs to CloudWatch
|
||||
|
||||
**CloudTrail은 로그를 CloudWatch로 자동으로 전송할 수 있으므로 의심스러운 활동이 수행될 때 경고를 설정할 수 있습니다.**\
|
||||
CloudTrail이 CloudWatch로 로그를 전송할 수 있도록 하려면 **역할**을 생성해야 합니다. 가능하다면 이러한 작업을 수행하기 위해 AWS 기본 역할을 사용하는 것이 권장됩니다. 이 역할은 CloudTrail이 다음을 수행할 수 있도록 합니다:
|
||||
**CloudTrail은 로그를 CloudWatch로 자동으로 전송할 수 있으므로 의심스러운 활동이 수행될 때 경고하는 알림을 설정할 수 있습니다.**\
|
||||
CloudTrail이 로그를 CloudWatch로 전송할 수 있도록 하려면 **역할**을 생성해야 합니다. 가능하다면 이러한 작업을 수행하기 위해 AWS 기본 역할을 사용하는 것이 권장됩니다. 이 역할은 CloudTrail이 다음을 수행할 수 있도록 합니다:
|
||||
|
||||
- CreateLogStream: CloudWatch Logs 로그 스트림을 생성할 수 있습니다.
|
||||
- PutLogEvents: CloudTrail 로그를 CloudWatch Logs 로그 스트림에 전달합니다.
|
||||
@@ -90,16 +90,16 @@ CloudTrail Event History는 기록된 로그를 테이블 형식으로 검사할
|
||||
### Security
|
||||
| Control Name | Implementation Details |
|
||||
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| CloudTrail Log File Integrity | <ul><li>로그가 변조되었는지(수정되거나 삭제됨) 확인</li><li><p>다이제스트 파일 사용(각 파일에 대한 해시 생성)</p><ul><li>SHA-256 해싱</li><li>디지털 서명을 위한 SHA-256과 RSA</li><li>Amazon이 소유한 개인 키</li></ul></li><li>다이제스트 파일 생성에 1시간 소요(매 시간 정각에 수행)</li></ul> |
|
||||
| CloudTrail Log File Integrity | <ul><li>로그가 변조되었는지(수정되었거나 삭제되었는지) 확인</li><li><p>다이제스트 파일 사용(각 파일에 대한 해시 생성)</p><ul><li>SHA-256 해싱</li><li>디지털 서명을 위한 SHA-256과 RSA</li><li>Amazon이 소유한 개인 키</li></ul></li><li>다이제스트 파일 생성에 1시간 소요(매 시간 정각에 수행)</li></ul> |
|
||||
| Stop unauthorized access | <ul><li><p>IAM 정책 및 S3 버킷 정책 사용</p><ul><li>보안 팀 —> 관리자 접근</li><li>감사자 —> 읽기 전용 접근</li></ul></li><li>로그를 암호화하기 위해 SSE-S3/SSE-KMS 사용</li></ul> |
|
||||
| Prevent log files from being deleted | <ul><li>IAM 및 버킷 정책으로 삭제 접근 제한</li><li>S3 MFA 삭제 구성</li><li>로그 파일 검증으로 확인</li></ul> |
|
||||
|
||||
## Access Advisor
|
||||
|
||||
AWS Access Advisor는 마지막 400일 동안의 AWS **CloudTrail 로그를 기반으로 인사이트를 수집합니다**. CloudTrail은 AWS 계정에서 수행된 AWS API 호출 및 관련 이벤트의 기록을 캡처합니다. Access Advisor는 이 데이터를 활용하여 **서비스가 마지막으로 언제 접근되었는지** 보여줍니다. CloudTrail 로그를 분석함으로써 Access Advisor는 IAM 사용자 또는 역할이 어떤 AWS 서비스에 접근했는지와 그 접근이 언제 발생했는지를 파악할 수 있습니다. 이는 AWS 관리자가 **권한을 세분화하는 데 정보에 기반한 결정을 내리는 데 도움을 줍니다**, 사용되지 않은 서비스들을 식별하고 실제 사용 패턴에 따라 지나치게 넓은 권한을 줄일 수 있습니다.
|
||||
AWS Access Advisor는 마지막 400일 동안의 AWS **CloudTrail 로그를 기반으로 인사이트를 수집합니다**. CloudTrail은 AWS 계정에서 수행된 AWS API 호출 및 관련 이벤트의 기록을 캡처합니다. Access Advisor는 이 데이터를 활용하여 **서비스가 마지막으로 언제 접근되었는지** 보여줍니다. CloudTrail 로그를 분석함으로써 Access Advisor는 IAM 사용자 또는 역할이 어떤 AWS 서비스에 접근했는지와 그 접근이 언제 발생했는지를 파악할 수 있습니다. 이는 AWS 관리자가 **권한을 세분화**하는 데 정보에 기반한 결정을 내리는 데 도움을 줍니다. 관리자는 오랜 기간 동안 접근되지 않은 서비스를 식별하고 실제 사용 패턴에 따라 지나치게 넓은 권한을 줄일 수 있습니다.
|
||||
|
||||
> [!TIP]
|
||||
> 따라서 Access Advisor는 **사용자에게 부여된 불필요한 권한**에 대해 알리므로 관리자가 이를 제거할 수 있습니다.
|
||||
> 따라서 Access Advisor는 **사용자에게 부여된 불필요한 권한**에 대해 알림을 제공하여 관리자가 이를 제거할 수 있도록 합니다.
|
||||
|
||||
<figure><img src="../../../../images/image (78).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@@ -181,19 +181,19 @@ return (e)
|
||||
|
||||
print("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML")))
|
||||
```
|
||||
Check more information in the [**orginal research**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489).
|
||||
더 많은 정보는 [**원본 연구**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489)에서 확인하세요.
|
||||
|
||||
#### 로그 생성하지 않기
|
||||
|
||||
가장 효과적인 기술은 사실 간단합니다. 방금 찾은 키를 사용하여 자신의 공격자 계정 내의 일부 서비스에 접근하세요. 이렇게 하면 **CloudTrail이 당신의 AWS 계정 내에 로그를 생성하고 피해자의 계정에는 생성하지 않습니다**.
|
||||
|
||||
문제는 출력에 계정 ID와 계정 이름을 나타내는 오류가 표시되므로 **Honeytoken인지 확인할 수 있다는 것입니다**.
|
||||
문제는 출력에 오류가 표시되어 계정 ID와 계정 이름을 나타내므로 **Honeytoken인지 확인할 수 있다는 것입니다**.
|
||||
|
||||
#### 로그가 없는 AWS 서비스
|
||||
|
||||
과거에는 **CloudTrail에 로그를 전송하지 않는 AWS 서비스가 있었습니다** (여기에서 [목록을 찾으세요](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-unsupported-aws-services.html)). 이러한 서비스 중 일부는 **무단 접근** (Honeytoken 키)이 시도될 경우 **키 역할의 ARN**을 포함하는 **오류**로 **응답**합니다.
|
||||
과거에는 **CloudTrail에 로그를 전송하지 않는 AWS 서비스가 있었습니다** (여기에서 [목록을 찾으세요](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-unsupported-aws-services.html)). 이러한 서비스 중 일부는 **허가되지 않은** (Honeytoken 키) 사용자가 접근하려고 할 경우 **키 역할의 ARN**을 포함한 **오류**로 **응답**합니다.
|
||||
|
||||
이렇게 하면 **공격자는 로그를 트리거하지 않고 키의 ARN을 얻을 수 있습니다**. ARN에서 공격자는 **AWS 계정 ID와 이름**을 확인할 수 있으며, HoneyToken의 회사 계정 ID와 이름을 쉽게 알 수 있으므로, 이를 통해 공격자는 토큰이 HoneyToken인지 식별할 수 있습니다.
|
||||
이렇게 하면 **공격자가 로그를 트리거하지 않고 키의 ARN을 얻을 수 있습니다**. ARN에서 공격자는 **AWS 계정 ID와 이름**을 확인할 수 있으며, HoneyToken의 회사 계정 ID와 이름을 쉽게 알 수 있으므로, 이를 통해 공격자는 토큰이 HoneyToken인지 식별할 수 있습니다.
|
||||
|
||||
.png>)
|
||||
|
||||
@@ -204,7 +204,7 @@ Check more information in the [**orginal research**](https://medium.com/@TalBeer
|
||||
|
||||
### 제3 인프라 접근
|
||||
|
||||
특정 AWS 서비스는 **데이터베이스**나 **Kubernetes** 클러스터 (EKS)와 같은 **인프라를 생성**합니다. 사용자가 **이러한 서비스** (Kubernetes API와 같은)와 **직접 통신**할 경우 **AWS API를 사용하지 않으므로**, CloudTrail은 이 통신을 볼 수 없습니다.
|
||||
특정 AWS 서비스는 **데이터베이스**나 **Kubernetes** 클러스터 (EKS)와 같은 **인프라를 생성**합니다. 사용자가 이러한 서비스 (예: Kubernetes API)와 **직접 통신**할 경우 **AWS API를 사용하지 않으므로**, CloudTrail은 이 통신을 볼 수 없습니다.
|
||||
|
||||
따라서 EKS에 접근할 수 있는 사용자가 EKS API의 URL을 발견하면 로컬에서 토큰을 생성하고 **CloudTrail에 감지되지 않고 API 서비스와 직접 통신할 수 있습니다**.
|
||||
|
||||
@@ -236,7 +236,7 @@ aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '
|
||||
# Remove all selectors (stop Insights)
|
||||
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[]' --region <region>
|
||||
```
|
||||
첫 번째 예에서는 단일 이벤트 선택기가 단일 객체로 구성된 JSON 배열로 제공됩니다. `"ReadWriteType": "ReadOnly"`는 **이벤트 선택기가 읽기 전용 이벤트만 캡처해야 함을 나타냅니다** (예를 들어 CloudTrail 인사이트는 **쓰기** 이벤트를 확인하지 않습니다).
|
||||
첫 번째 예에서는 단일 이벤트 선택기가 단일 객체로 구성된 JSON 배열로 제공됩니다. `"ReadWriteType": "ReadOnly"`는 **이벤트 선택기가 읽기 전용 이벤트만 캡처해야 함**을 나타냅니다 (예를 들어 CloudTrail 인사이트는 **쓰기** 이벤트를 확인하지 않습니다).
|
||||
|
||||
특정 요구 사항에 따라 이벤트 선택기를 사용자 정의할 수 있습니다.
|
||||
|
||||
@@ -248,7 +248,7 @@ aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration
|
||||
|
||||
- S3 버킷 삭제
|
||||
- CloudTrail 서비스에서의 모든 쓰기를 거부하도록 버킷 정책 변경
|
||||
- 객체 삭제를 위한 S3 버킷의 수명 주기 정책 추가
|
||||
- 객체 삭제를 위한 S3 버킷에 생애 주기 정책 추가
|
||||
- CloudTrail 로그를 암호화하는 데 사용되는 kms 키 비활성화
|
||||
|
||||
### Cloudtrail 랜섬웨어
|
||||
|
||||
+27
-27
@@ -4,7 +4,7 @@
|
||||
|
||||
## CloudWatch
|
||||
|
||||
**CloudWatch**는 로그/메트릭/이벤트 형태로 모니터링 및 운영 **데이터**를 수집하여 **AWS 리소스**, 애플리케이션 및 서비스에 대한 **통합된 뷰**를 제공합니다.\
|
||||
**CloudWatch**는 로그/메트릭/이벤트 형태로 모니터링 및 운영 **데이터**를 수집하여 **AWS 리소스**, 애플리케이션 및 서비스에 대한 **통합 뷰**를 제공합니다.\
|
||||
CloudWatch 로그 이벤트는 **각 로그 라인에 대해 256KB의 크기 제한**이 있습니다.\
|
||||
고해상도 알람을 설정하고, **로그**와 **메트릭**을 나란히 시각화하며, 자동화된 작업을 수행하고, 문제를 해결하며, 애플리케이션을 최적화하기 위한 통찰력을 발견할 수 있습니다.
|
||||
|
||||
@@ -45,15 +45,15 @@ CloudWatch 로그 이벤트는 **각 로그 라인에 대해 256KB의 크기 제
|
||||
|
||||
### Units
|
||||
|
||||
단위는 메트릭과 관련된 측정 유형입니다. 단위는 메트릭 데이터에 컨텍스트와 의미를 제공합니다. 일반적인 단위에는 퍼센트, 바이트, 초, 수가 포함됩니다.
|
||||
단위는 메트릭과 관련된 측정 유형입니다. 단위는 메트릭 데이터에 맥락과 의미를 제공하는 데 도움이 됩니다. 일반적인 단위에는 백분율, 바이트, 초, 수가 포함됩니다.
|
||||
|
||||
- **예시**: CPUUtilization은 퍼센트로 측정될 수 있고, NetworkIn은 바이트로 측정될 수 있습니다.
|
||||
- **예시**: CPUUtilization은 백분율로 측정될 수 있고, NetworkIn은 바이트로 측정될 수 있습니다.
|
||||
|
||||
## CloudWatch Features
|
||||
|
||||
### Dashboard
|
||||
|
||||
**CloudWatch 대시보드**는 AWS CloudWatch 메트릭의 사용자 정의 가능한 **뷰**를 제공합니다. 다양한 AWS 서비스의 여러 메트릭을 결합하여 단일 뷰에서 데이터를 시각화하고 리소스를 모니터링하기 위해 대시보드를 생성하고 구성할 수 있습니다.
|
||||
**CloudWatch 대시보드**는 **AWS CloudWatch 메트릭**의 사용자 정의 가능한 **뷰**를 제공합니다. 다양한 AWS 서비스의 여러 메트릭을 결합하여 단일 뷰에서 데이터를 시각화하고 리소스를 모니터링하기 위해 대시보드를 생성하고 구성할 수 있습니다.
|
||||
|
||||
**주요 기능**:
|
||||
|
||||
@@ -66,14 +66,14 @@ CloudWatch 로그 이벤트는 **각 로그 라인에 대해 256KB의 크기 제
|
||||
|
||||
### Metric Stream and Metric Data
|
||||
|
||||
AWS CloudWatch의 **Metric Streams**는 CloudWatch 메트릭을 선택한 대상으로 거의 실시간으로 지속적으로 스트리밍할 수 있게 해줍니다. 이는 AWS 외부 도구를 사용하여 고급 모니터링, 분석 및 사용자 정의 대시보드에 특히 유용합니다.
|
||||
AWS CloudWatch의 **메트릭 스트림**은 CloudWatch 메트릭을 선택한 대상으로 거의 실시간으로 지속적으로 스트리밍할 수 있게 해줍니다. 이는 AWS 외부 도구를 사용하여 고급 모니터링, 분석 및 사용자 정의 대시보드에 특히 유용합니다.
|
||||
|
||||
**Metric Streams** 내의 메트릭 데이터는 스트리밍되는 실제 측정값 또는 데이터 포인트를 나타냅니다. 이러한 데이터 포인트는 AWS 리소스의 CPU 활용도, 메모리 사용량 등 다양한 메트릭을 나타냅니다.
|
||||
**메트릭 데이터**는 메트릭 스트림 내에서 스트리밍되는 실제 측정값 또는 데이터 포인트를 나타냅니다. 이러한 데이터 포인트는 AWS 리소스의 CPU 활용도, 메모리 사용량 등 다양한 메트릭을 나타냅니다.
|
||||
|
||||
**예시 사용 사례**:
|
||||
|
||||
- 고급 분석을 위해 실시간 메트릭을 타사 모니터링 서비스로 전송.
|
||||
- 장기 저장 및 규정 준수를 위해 Amazon S3 버킷에 메트릭 아카이브.
|
||||
- 장기 저장 및 규정 준수를 위해 Amazon S3 버킷에 메트릭 아카이빙.
|
||||
|
||||
### Alarm
|
||||
|
||||
@@ -92,12 +92,12 @@ AWS CloudWatch의 **Metric Streams**는 CloudWatch 메트릭을 선택한 대상
|
||||
|
||||
### Anomaly Detectors
|
||||
|
||||
**Anomaly Detectors**는 기계 학습을 사용하여 메트릭의 이상치를 자동으로 감지합니다. 정상 패턴에서의 편차를 식별하기 위해 모든 CloudWatch 메트릭에 이상 감지를 적용할 수 있습니다.
|
||||
**이상 탐지기**는 기계 학습을 사용하여 메트릭의 이상을 자동으로 감지합니다. 정상 패턴에서의 편차를 식별하기 위해 모든 CloudWatch 메트릭에 이상 탐지를 적용할 수 있습니다.
|
||||
|
||||
**주요 구성 요소**:
|
||||
|
||||
- **모델 훈련**: CloudWatch는 과거 데이터를 사용하여 모델을 훈련하고 정상 동작이 어떤 모습인지 설정합니다.
|
||||
- **이상 감지 밴드**: 메트릭의 예상 값 범위를 시각적으로 나타냅니다.
|
||||
- **모델 훈련**: CloudWatch는 과거 데이터를 사용하여 모델을 훈련하고 정상 행동이 어떤 모습인지 설정합니다.
|
||||
- **이상 탐지 밴드**: 메트릭의 예상 값 범위를 시각적으로 나타냅니다.
|
||||
|
||||
**예시 사용 사례**:
|
||||
|
||||
@@ -105,39 +105,39 @@ AWS CloudWatch의 **Metric Streams**는 CloudWatch 메트릭을 선택한 대상
|
||||
|
||||
### Insight Rules and Managed Insight Rules
|
||||
|
||||
**Insight Rules**는 **강력한 수학적 표현**을 사용하여 메트릭 데이터에서 트렌드를 식별하고, 스파이크 또는 기타 관심 패턴을 감지할 수 있게 해줍니다. 이러한 규칙은 리소스 성능 및 활용도에서 이상치나 비정상적인 행동을 식별하는 데 도움이 됩니다.
|
||||
**인사이트 규칙**은 **강력한 수학적 표현**을 사용하여 메트릭 데이터에서 추세를 식별하고, 급증 또는 기타 관심 패턴을 감지할 수 있게 해줍니다. 이러한 규칙은 리소스 성능 및 활용도에서 이상이나 비정상적인 행동을 식별하는 데 도움이 됩니다.
|
||||
|
||||
**Managed Insight Rules**는 AWS에서 제공하는 미리 구성된 **인사이트 규칙**입니다. 특정 AWS 서비스 또는 일반 사용 사례를 모니터링하도록 설계되었으며, 세부 구성 없이 활성화할 수 있습니다.
|
||||
**관리형 인사이트 규칙**은 AWS에서 제공하는 미리 구성된 **인사이트 규칙**입니다. 특정 AWS 서비스 또는 일반 사용 사례를 모니터링하도록 설계되었으며, 세부 구성 없이 활성화할 수 있습니다.
|
||||
|
||||
**예시 사용 사례**:
|
||||
|
||||
- RDS 성능 모니터링: CPU 활용도, 메모리 사용량 및 디스크 I/O와 같은 주요 성능 지표를 모니터링하는 Amazon RDS에 대한 관리 인사이트 규칙을 활성화합니다. 이러한 메트릭 중 하나라도 안전한 운영 임계값을 초과하면 규칙이 경고 또는 자동 완화 작업을 트리거할 수 있습니다.
|
||||
- RDS 성능 모니터링: CPU 활용도, 메모리 사용량 및 디스크 I/O와 같은 주요 성능 지표를 모니터링하는 Amazon RDS에 대한 관리형 인사이트 규칙 활성화. 이러한 메트릭 중 하나라도 안전한 운영 임계값을 초과하면 규칙이 경고 또는 자동 완화 작업을 트리거할 수 있습니다.
|
||||
|
||||
### CloudWatch Logs <a href="#cloudwatch-logs" id="cloudwatch-logs"></a>
|
||||
|
||||
애플리케이션 및 시스템의 **로그를 집계하고 모니터링**할 수 있게 해줍니다. **AWS 서비스**(CloudTrail 포함) 및 **앱/시스템**에서 로그를 수집할 수 있습니다(**CloudWatch Agent**는 호스트에 설치할 수 있습니다). 로그는 **무기한 저장**될 수 있으며(로그 그룹 설정에 따라) 내보낼 수 있습니다.
|
||||
**AWS 서비스**(CloudTrail 포함) 및 **앱/시스템**에서 **로그를 집계하고 모니터링**할 수 있습니다(**CloudWatch Agent**는 호스트에 설치할 수 있습니다). 로그는 **무기한 저장**될 수 있으며(로그 그룹 설정에 따라) 내보낼 수 있습니다.
|
||||
|
||||
**요소**:
|
||||
| 용어 | 정의 |
|
||||
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **로그 그룹** | 동일한 보존, 모니터링 및 액세스 제어 설정을 공유하는 **로그 스트림의 모음** |
|
||||
| **로그 스트림** | **동일한 소스**를 공유하는 **로그 이벤트의 시퀀스** |
|
||||
| **구독 필터** | 특정 로그 그룹에서 이벤트와 일치하는 **필터 패턴을 정의**하고, 이를 Kinesis Data Firehose 스트림, Kinesis 스트림 또는 Lambda 함수로 전송 |
|
||||
| **로그 스트림** | **동일한 소스**를 공유하는 **로그 이벤트의 순서** |
|
||||
| **구독 필터** | 특정 로그 그룹에서 **이벤트와 일치하는 필터 패턴을 정의**하고, 이를 Kinesis Data Firehose 스트림, Kinesis 스트림 또는 Lambda 함수로 전송 |
|
||||
|
||||
### CloudWatch Monitoring & Events
|
||||
|
||||
CloudWatch는 **기본적으로** 데이터를 **5분마다** 집계합니다( **상세**는 **1분마다** 집계). 집계 후, 알람의 임계값을 **확인하여** 트리거할 필요가 있는지 확인합니다.\
|
||||
이 경우, CloudWatch는 이벤트를 전송하고 일부 자동 작업(AWS Lambda 함수, SNS 주제, SQS 큐, Kinesis 스트림)을 수행할 준비가 될 수 있습니다.
|
||||
이 경우, CloudWatch는 이벤트를 전송하고 자동 작업(AWS Lambda 함수, SNS 주제, SQS 큐, Kinesis 스트림)을 수행할 준비가 될 수 있습니다.
|
||||
|
||||
### Agent Installation
|
||||
|
||||
기계/컨테이너 내에 에이전트를 설치하여 로그를 자동으로 CloudWatch로 전송할 수 있습니다.
|
||||
|
||||
- **역할**을 **생성**하고 **인스턴스에 연결**하여 CloudWatch가 인스턴스에서 데이터를 수집하고 AWS Systems Manager SSM과 상호 작용할 수 있는 권한을 부여합니다(CloudWatchAgentAdminPolicy 및 AmazonEC2RoleforSSM).
|
||||
- **에이전트를 다운로드**하고 **EC2 인스턴스에 설치**합니다 ([https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip](https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip)). EC2 내에서 다운로드하거나 AWS Systems Manager를 사용하여 패키지 AWS-ConfigureAWSPackage를 선택하여 자동으로 설치할 수 있습니다.
|
||||
- **역할**을 **생성**하고 **인스턴스에 연결**하여 CloudWatch가 인스턴스에서 데이터를 수집하고 AWS 시스템 관리자 SSM과 상호 작용할 수 있는 권한을 부여합니다(CloudWatchAgentAdminPolicy & AmazonEC2RoleforSSM).
|
||||
- **에이전트를 다운로드**하고 **EC2 인스턴스에 설치**합니다 ([https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip](https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip)). EC2 내에서 다운로드하거나 AWS 시스템 관리자를 사용하여 패키지 AWS-ConfigureAWSPackage를 선택하여 자동으로 설치할 수 있습니다.
|
||||
- **CloudWatch Agent를 구성**하고 **시작**합니다.
|
||||
|
||||
로그 그룹에는 여러 스트림이 있습니다. 스트림에는 여러 이벤트가 있습니다. 각 스트림 내에서 이벤트는 순서대로 보장됩니다.
|
||||
로그 그룹은 여러 스트림을 가집니다. 스트림은 여러 이벤트를 가집니다. 각 스트림 내에서 이벤트는 순서대로 보장됩니다.
|
||||
|
||||
## Enumeration
|
||||
```bash
|
||||
@@ -279,9 +279,9 @@ aws cloudwatch put-composite-alarm --alarm-name <value> --alarm-rule <value> [--
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**잠재적 영향**: 중요한 이벤트에 대한 알림 부족, 잠재적으로 감지되지 않은 문제, 잘못된 경고, 진정한 경고 억제 및 실제 사건의 탐지를 놓칠 가능성.
|
||||
**잠재적 영향**: 중요한 이벤트에 대한 알림 부족, 잠재적인 미탐지 문제, 잘못된 경고, 진정한 경고 억제 및 실제 사건의 탐지를 놓칠 가능성.
|
||||
|
||||
### **`cloudwatch:DeleteAlarmActions`, `cloudwatch:EnableAlarmActions` , `cloudwatch:SetAlarmState`**
|
||||
### **`cloudwatch:DeleteAlarmActions`, `cloudwatch:EnableAlarmActions`, `cloudwatch:SetAlarmState`**
|
||||
|
||||
경고 작업을 삭제함으로써 공격자는 경고 상태에 도달했을 때 관리자에게 알리거나 자동 확장 활동을 트리거하는 등의 중요한 알림과 자동 응답이 발생하지 않도록 할 수 있습니다. 경고 작업을 부적절하게 활성화하거나 재활성화하는 것도 이전에 비활성화된 작업을 다시 활성화하거나 어떤 작업이 트리거되는지를 수정함으로써 예기치 않은 행동을 초래할 수 있으며, 이는 사건 대응에서 혼란과 잘못된 방향으로 이어질 수 있습니다.
|
||||
|
||||
@@ -293,11 +293,11 @@ aws cloudwatch disable-alarm-actions --alarm-names <value>
|
||||
aws cloudwatch enable-alarm-actions --alarm-names <value>
|
||||
aws cloudwatch set-alarm-state --alarm-name <value> --state-value <OK | ALARM | INSUFFICIENT_DATA> --state-reason <value> [--state-reason-data <value>]
|
||||
```
|
||||
**잠재적 영향**: 중요한 이벤트에 대한 알림 부족, 잠재적으로 감지되지 않은 문제, 잘못된 경고, 진정한 경고 억제 및 실제 사건의 탐지를 놓칠 가능성.
|
||||
**잠재적 영향**: 중요한 이벤트에 대한 알림 부족, 잠재적인 미탐지 문제, 잘못된 경고, 진정한 경고 억제 및 실제 사건의 탐지를 놓칠 가능성.
|
||||
|
||||
### **`cloudwatch:DeleteAnomalyDetector`, `cloudwatch:PutAnomalyDetector`**
|
||||
|
||||
공격자는 메트릭 데이터에서 비정상적인 패턴이나 이상을 탐지하고 대응하는 능력을 손상시킬 수 있습니다. 기존의 이상 탐지기를 삭제함으로써 공격자는 중요한 경고 메커니즘을 비활성화할 수 있으며, 이를 생성하거나 수정함으로써 모니터링을 방해하거나 압도하기 위해 잘못 구성하거나 잘못된 긍정 결과를 생성할 수 있습니다.
|
||||
공격자는 메트릭 데이터에서 비정상적인 패턴이나 이상을 탐지하고 대응하는 능력을 손상시킬 수 있습니다. 기존의 이상 탐지기를 삭제함으로써, 공격자는 중요한 경고 메커니즘을 비활성화할 수 있으며, 이를 생성하거나 수정함으로써 모니터링을 방해하거나 압도하기 위해 잘못 구성하거나 잘못된 긍정 결과를 생성할 수 있습니다.
|
||||
```bash
|
||||
aws cloudwatch delete-anomaly-detector [--cli-input-json <value> | --namespace <value> --metric-name <value> --dimensions <value> --stat <value>]
|
||||
aws cloudwatch put-anomaly-detector [--cli-input-json <value> | --namespace <value> --metric-name <value> --dimensions <value> --stat <value> --configuration <value> --metric-characteristics <value>]
|
||||
@@ -351,7 +351,7 @@ aws cloudwatch put-anomaly-detector [--cli-input-json <value> | --namespace <val
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**잠재적 영향**: 비정상적인 패턴이나 보안 위협의 탐지에 직접적인 영향을 미칩니다.
|
||||
**잠재적 영향**: 비정상적인 패턴이나 보안 위협의 탐지에 직접적인 영향을 미침.
|
||||
|
||||
### **`cloudwatch:DeleteDashboards`, `cloudwatch:PutDashboard`**
|
||||
|
||||
@@ -364,7 +364,7 @@ aws cloudwatch put-dashboard --dashboard-name <value> --dashboard-body <value>
|
||||
|
||||
### **`cloudwatch:DeleteInsightRules`, `cloudwatch:PutInsightRule` ,`cloudwatch:PutManagedInsightRule`**
|
||||
|
||||
인사이트 규칙은 이상 징후를 감지하고 성능을 최적화하며 리소스를 효과적으로 관리하는 데 사용됩니다. 기존 인사이트 규칙을 삭제함으로써 공격자는 중요한 모니터링 기능을 제거하여 시스템이 성능 문제 및 보안 위협에 대해 맹목적으로 만들 수 있습니다. 또한 공격자는 인사이트 규칙을 생성하거나 수정하여 오해의 소지가 있는 데이터를 생성하거나 악의적인 활동을 숨길 수 있으며, 이로 인해 잘못된 진단과 운영 팀의 부적절한 대응이 초래될 수 있습니다.
|
||||
인사이트 규칙은 이상 징후를 감지하고 성능을 최적화하며 리소스를 효과적으로 관리하는 데 사용됩니다. 기존 인사이트 규칙을 삭제함으로써 공격자는 중요한 모니터링 기능을 제거하여 시스템이 성능 문제 및 보안 위협에 대해 맹목적으로 만들 수 있습니다. 또한 공격자는 인사이트 규칙을 생성하거나 수정하여 오해의 소지가 있는 데이터를 생성하거나 악의적인 활동을 숨길 수 있으며, 이는 잘못된 진단 및 운영 팀의 부적절한 대응으로 이어질 수 있습니다.
|
||||
```bash
|
||||
aws cloudwatch delete-insight-rules --rule-names <value>
|
||||
aws cloudwatch put-insight-rule --rule-name <value> --rule-definition <value> [--rule-state <value>]
|
||||
@@ -386,7 +386,7 @@ aws cloudwatch enable-insight-rules --rule-names <value>
|
||||
**`cloudwatch:DeleteMetricStream`** , **`cloudwatch:PutMetricStream`** 권한을 가진 공격자는 메트릭 데이터 스트림을 생성하고 삭제할 수 있어 보안, 모니터링 및 데이터 무결성이 손상될 수 있습니다:
|
||||
|
||||
- **악성 스트림 생성**: 민감한 데이터를 무단 목적지로 전송하기 위해 메트릭 스트림을 생성합니다.
|
||||
- **리소스 조작**: 과도한 데이터로 새로운 메트릭 스트림을 생성하면 많은 잡음이 발생하여 잘못된 경고를 유발하고 실제 문제를 가릴 수 있습니다.
|
||||
- **리소스 조작**: 과도한 데이터로 새로운 메트릭 스트림을 생성하면 많은 노이즈가 발생하여 잘못된 경고를 유발하고 실제 문제를 가릴 수 있습니다.
|
||||
- **모니터링 중단**: 메트릭 스트림을 삭제함으로써 공격자는 모니터링 데이터의 지속적인 흐름을 방해할 수 있습니다. 이렇게 하면 그들의 악의적인 활동이 효과적으로 숨겨집니다.
|
||||
|
||||
유사하게, **`cloudwatch:PutMetricData`** 권한을 통해 메트릭 스트림에 데이터를 추가할 수 있습니다. 이는 부적절한 데이터가 추가되어 완전히 쓸모없게 만들기 때문에 DoS를 초래할 수 있습니다.
|
||||
|
||||
+1
-1
@@ -26,7 +26,7 @@ az storage blob download \
|
||||
```
|
||||
### `Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write`
|
||||
|
||||
이 권한을 가진 주체는 **컨테이너에 파일을 쓰고 덮어쓸 수** 있으며, 이는 그가 손상을 초래하거나 권한을 상승시킬 수 있게 할 수 있습니다 (예: blob에 저장된 일부 코드를 덮어쓰기).
|
||||
이 권한을 가진 주체는 **컨테이너에 파일을 작성하고 덮어쓸 수** 있으며, 이는 그가 손상을 초래하거나 권한을 상승시킬 수 있게 할 수 있습니다 (예: blob에 저장된 일부 코드를 덮어쓰기).
|
||||
```bash
|
||||
# e.g. Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write
|
||||
az storage blob upload \
|
||||
|
||||
+2
-2
@@ -47,7 +47,7 @@ az cosmosdb sql database create \
|
||||
```
|
||||
### `Microsoft.DocumentDB/databaseAccounts/failoverPriorityChange/action`
|
||||
|
||||
이 권한을 사용하면 Azure Cosmos DB 데이터베이스 계정의 지역에 대한 장애 조치 우선 순위를 변경할 수 있습니다. 이 작업은 장애 조치 이벤트 중에 지역이 기본이 되는 순서를 결정합니다. 이 권한을 부적절하게 사용하면 데이터베이스의 고가용성이 중단되거나 의도하지 않은 운영 영향이 발생할 수 있습니다.
|
||||
이 권한을 사용하면 Azure Cosmos DB 데이터베이스 계정의 지역에 대한 장애 조치 우선 순위를 변경할 수 있습니다. 이 작업은 장애 조치 이벤트 중에 지역이 기본이 되는 순서를 결정합니다. 이 권한을 부적절하게 사용하면 데이터베이스의 고가용성이 중단되거나 의도하지 않은 운영 영향을 초래할 수 있습니다.
|
||||
```bash
|
||||
az cosmosdb failover-priority-change \
|
||||
--name <database_account_name> \
|
||||
@@ -103,7 +103,7 @@ az cosmosdb sql trigger create \
|
||||
--operation All
|
||||
```
|
||||
### `Microsoft.DocumentDB/databaseAccounts/mongodbDatabases/collections/read` && `Microsoft.DocumentDB/databaseAccounts/mongodbDatabases/collections/write`
|
||||
이 권한을 사용하면 Azure Cosmos DB 계정 내의 MongoDB 데이터베이스에서 컬렉션을 생성하거나 수정할 수 있습니다. 컬렉션은 문서를 저장하고 데이터의 구조와 파티셔닝을 정의하는 데 사용됩니다.
|
||||
이 권한을 사용하면 Azure Cosmos DB 계정 내의 MongoDB 데이터베이스에서 컬렉션을 생성하거나 수정할 수 있습니다. 컬렉션은 문서를 저장하고 데이터의 구조 및 파티셔닝을 정의하는 데 사용됩니다.
|
||||
```bash
|
||||
az cosmosdb mongodb collection create \
|
||||
--account-name <account_name> \
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@
|
||||
|
||||
파일 공유 후 익스플로잇
|
||||
|
||||
파일 공유에 대한 더 많은 정보는 다음을 확인하세요:
|
||||
파일 공유에 대한 자세한 정보는 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-file-shares.md
|
||||
@@ -30,7 +30,7 @@ az storage file download \
|
||||
```
|
||||
### `Microsoft.Storage/storageAccounts/fileServices/fileshares/files/write`, `Microsoft.Storage/storageAccounts/fileServices/writeFileBackupSemantics/action`
|
||||
|
||||
이 권한을 가진 주체는 **파일 공유에 파일을 쓰고 덮어쓸 수** 있으며, 이는 그가 일부 손상을 초래하거나 권한을 상승시킬 수 있게 할 수 있습니다(예: 파일 공유에 저장된 일부 코드를 덮어쓰기).
|
||||
이 권한을 가진 주체는 **파일 공유에 파일을 작성하고 덮어쓸 수** 있으며, 이는 그가 일부 손상을 초래하거나 권한을 상승시킬 수 있게 할 수 있습니다 (예: 파일 공유에 저장된 일부 코드를 덮어쓰기).
|
||||
```bash
|
||||
az storage blob upload \
|
||||
--account-name <acc-name> \
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Logic Apps 데이터베이스 포스트 익스플로잇
|
||||
## Logic Apps Database Post Exploitation
|
||||
Logic Apps에 대한 자세한 정보는 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
# Az - PostgreSQL 포스트 익스플로이테이션
|
||||
# Az - PostgreSQL Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
+4
-4
@@ -4,7 +4,7 @@
|
||||
|
||||
## SQL Database Post Exploitation
|
||||
|
||||
SQL Database에 대한 자세한 정보는 다음을 확인하세요:
|
||||
SQL Database에 대한 자세한 내용은 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-sql.md
|
||||
@@ -42,7 +42,7 @@ az sql elastic-pool update \
|
||||
```
|
||||
### `Microsoft.Sql/servers/auditingSettings/read` && `Microsoft.Sql/servers/auditingSettings/write`
|
||||
|
||||
이 권한을 사용하면 Azure SQL Server의 감사 설정을 수정하거나 활성화할 수 있습니다. 이는 공격자나 권한이 있는 사용자가 감사 구성을 조작하여 흔적을 감추거나 감사 로그를 자신이 제어하는 위치로 리디렉션할 수 있게 할 수 있습니다. 이는 보안 모니터링을 방해하거나 행동을 추적할 수 있게 할 수 있습니다. 주의: Blob Storage를 사용하여 Azure SQL Server에 대한 감사를 활성화하려면 감사 로그를 저장할 수 있는 스토리지 계정을 연결해야 합니다.
|
||||
이 권한을 사용하면 Azure SQL Server의 감사 설정을 수정하거나 활성화할 수 있습니다. 이는 공격자나 권한이 있는 사용자가 감사 구성을 조작하여 흔적을 감추거나 감사 로그를 자신이 제어하는 위치로 리디렉션할 수 있게 할 수 있습니다. 이는 보안 모니터링을 방해하거나 행동을 추적하는 데 도움이 될 수 있습니다. 주의: Blob Storage를 사용하여 Azure SQL Server에 대한 감사를 활성화하려면 감사 로그를 저장할 수 있는 스토리지 계정을 연결해야 합니다.
|
||||
```bash
|
||||
az sql server audit-policy update \
|
||||
--server <server_name> \
|
||||
@@ -62,7 +62,7 @@ az sql server connection-policy update \
|
||||
```
|
||||
### `Microsoft.Sql/servers/databases/export/action`
|
||||
|
||||
이 권한을 사용하면 Azure SQL Server에서 스토리지 계정으로 데이터베이스를 내보낼 수 있습니다. 이 권한을 가진 공격자 또는 승인된 사용자는 데이터베이스에서 민감한 데이터를 내보내어 자신이 제어하는 위치로 유출할 수 있으며, 이는 상당한 데이터 유출 위험을 초래합니다. 이를 수행하기 위해서는 스토리지 키를 아는 것이 중요합니다.
|
||||
이 권한을 사용하면 Azure SQL Server에서 스토리지 계정으로 데이터베이스를 내보낼 수 있습니다. 이 권한을 가진 공격자 또는 승인된 사용자는 데이터베이스에서 민감한 데이터를 내보내어 자신이 제어하는 위치로 전송할 수 있으며, 이는 상당한 데이터 유출 위험을 초래합니다. 이를 수행하기 위해서는 스토리지 키를 아는 것이 중요합니다.
|
||||
```bash
|
||||
az sql db export \
|
||||
--server <server_name> \
|
||||
@@ -76,7 +76,7 @@ az sql db export \
|
||||
```
|
||||
### `Microsoft.Sql/servers/databases/import/action`
|
||||
|
||||
이 권한을 사용하면 Azure SQL Server에 데이터베이스를 가져올 수 있습니다. 이 권한을 가진 공격자 또는 승인된 사용자는 악의적이거나 조작된 데이터베이스를 업로드할 수 있습니다. 이는 민감한 데이터에 대한 제어를 얻거나 가져온 데이터베이스 내에 해로운 스크립트나 트리거를 삽입하는 결과를 초래할 수 있습니다. 추가로, Azure의 자신의 서버로 가져올 수 있습니다. 주의: 서버는 Azure 서비스와 리소스가 서버에 접근할 수 있도록 허용해야 합니다.
|
||||
이 권한을 사용하면 Azure SQL Server에 데이터베이스를 가져올 수 있습니다. 공격자 또는 이 권한이 있는 승인된 사용자는 악의적이거나 조작된 데이터베이스를 업로드할 수 있습니다. 이는 민감한 데이터에 대한 제어를 얻거나 가져온 데이터베이스 내에 유해한 스크립트나 트리거를 삽입하는 결과를 초래할 수 있습니다. 추가로, 이를 Azure의 자신의 서버로 가져올 수 있습니다. 주의: 서버는 Azure 서비스와 리소스가 서버에 접근할 수 있도록 허용해야 합니다.
|
||||
```bash
|
||||
az sql db import --admin-user <admin-user> \
|
||||
--admin-password <admin-password> \
|
||||
|
||||
+16
-16
@@ -55,14 +55,14 @@ az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
```
|
||||
이 구성은 일반적으로 Storage Account에서 코드를 다운로드하기 위한 **SAS URL**을 포함합니다.
|
||||
이 구성은 일반적으로 **Storage Account에서 코드를 다운로드할 SAS URL**을 포함합니다.
|
||||
|
||||
> [!CAUTION]
|
||||
> **zip** 형식의 코드를 포함하는 blob 컨테이너에 연결할 수 있는 충분한 권한이 있으면 Function에서 임의의 코드를 실행하고 권한을 상승시킬 수 있습니다.
|
||||
> **zip에 코드가 포함된** blob 컨테이너에 연결할 수 있는 충분한 권한이 있으면 Function에서 임의의 코드를 실행하고 권한을 상승시킬 수 있습니다.
|
||||
|
||||
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)`
|
||||
|
||||
이전 경우와 마찬가지로, 배포가 Github Actions를 통해 이루어지면 Storage Account에서 코드의 zip과 `WEBSITE_RUN_FROM_PACKAGE` 설정에 있는 zip에 대한 SAS URL을 포함하는 **`github-actions-deploy`** 폴더를 찾을 수 있습니다.
|
||||
이전 경우와 마찬가지로, 배포가 Github Actions를 통해 이루어지면 Storage Account에서 코드의 zip과 `WEBSITE_RUN_FROM_PACKAGE` 설정의 zip에 대한 SAS URL을 포함하는 **`github-actions-deploy`** 폴더를 찾을 수 있습니다.
|
||||
|
||||
- **`scm-releases`**`(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` 및 `WEBSITE_CONTENTSHARE`)
|
||||
|
||||
@@ -166,7 +166,7 @@ az functionapp keys set --resource-group <res_group> --key-name <key-name> --key
|
||||
|
||||
### `Microsoft.Web/sites/host/systemKeys/write`
|
||||
|
||||
이 권한은 지정된 함수에 시스템 함수 키를 생성/업데이트할 수 있게 해줍니다:
|
||||
이 권한은 지정된 함수에 대해 시스템 함수 키를 생성/업데이트할 수 있게 해줍니다:
|
||||
```bash
|
||||
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
|
||||
```
|
||||
@@ -176,16 +176,16 @@ az functionapp keys set --resource-group <res_group> --key-name <key-name> --key
|
||||
```bash
|
||||
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
|
||||
```
|
||||
또한, 이 권한은 **SCM 사용자 이름과 비밀번호** (활성화된 경우)를 다음과 같이 가져올 수 있습니다:
|
||||
또한, 이 권한은 **SCM 사용자 이름과 비밀번호**(활성화된 경우)를 다음과 같이 가져올 수 있습니다:
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/publishingcredentials/list?api-version=2018-11-01"
|
||||
```
|
||||
### `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/write`
|
||||
|
||||
이 권한은 이전에 본 것처럼 함수의 구성 값을 나열할 수 있을 뿐만 아니라 **이 값을 수정할 수** 있게 해줍니다. 이 설정은 함수 내에서 실행할 코드가 어디에 위치하는지를 나타내기 때문에 유용합니다.
|
||||
이 권한은 이전에 본 것처럼 함수의 구성 값을 나열할 수 있을 뿐만 아니라 **이 값을 수정할 수** 있게 해줍니다. 이 설정은 함수 내에서 실행할 코드가 위치한 곳을 나타내기 때문에 유용합니다.
|
||||
|
||||
따라서 웹 애플리케이션 내에서 실행할 새 코드가 포함된 URL zip 파일을 가리키는 **`WEBSITE_RUN_FROM_PACKAGE`** 설정의 값을 설정할 수 있습니다:
|
||||
따라서 **`WEBSITE_RUN_FROM_PACKAGE`** 설정의 값을 웹 애플리케이션 내에서 실행할 새 코드가 포함된 URL zip 파일을 가리키도록 설정할 수 있습니다:
|
||||
|
||||
- 현재 구성을 가져오는 것으로 시작합니다.
|
||||
```bash
|
||||
@@ -205,7 +205,7 @@ ngrok http 8000
|
||||
```
|
||||
- 함수를 수정하고 이전 매개변수를 유지하며 끝에 **`WEBSITE_RUN_FROM_PACKAGE`**를 추가하여 코드가 포함된 **zip**의 URL을 가리키도록 합니다.
|
||||
|
||||
다음은 **내 설정의 예로, 귀하의 값으로 변경해야 할 것입니다**. 끝에 `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"` 값이 있습니다. 여기서 제가 앱을 호스팅하고 있었습니다.
|
||||
다음은 **내 설정의 예로, 값을 귀하의 값으로 변경해야 합니다.** 끝에 `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`가 있습니다. 여기서 제가 앱을 호스팅하고 있던 곳입니다.
|
||||
```bash
|
||||
# Modify the function
|
||||
az rest --method PUT \
|
||||
@@ -264,7 +264,7 @@ az rest --method PUT \
|
||||
```
|
||||
- **Method SCM**
|
||||
|
||||
그런 다음, **기본 인증 자격 증명으로 SCM URL**에 접근하여 환경 변수의 값을 가져올 수 있습니다:
|
||||
그런 다음, **기본 인증 자격 증명을 사용하여 SCM URL**에 접근하여 환경 변수의 값을 가져올 수 있습니다:
|
||||
```bash
|
||||
# Get settings values
|
||||
curl -u '<username>:<password>' \
|
||||
@@ -275,7 +275,7 @@ zip function_app.zip function_app.py # Your code in function_app.py
|
||||
curl -u '<username>:<password>' -X POST --data-binary "@<zip_file_path>" \
|
||||
https://<app-name>.scm.azurewebsites.net/api/zipdeploy
|
||||
```
|
||||
_**SCM 사용자 이름**은 일반적으로 문자 "$" 다음에 앱 이름이 오므로: `$<app-name>`입니다._
|
||||
_참고로 **SCM 사용자 이름**은 일반적으로 문자 "$" 다음에 앱 이름이 오므로: `$<app-name>`입니다._
|
||||
|
||||
웹 페이지에 `https://<app-name>.scm.azurewebsites.net/BasicAuth`에서 접근할 수 있습니다.
|
||||
|
||||
@@ -307,9 +307,9 @@ az rest --url "https://management.azure.com/subscriptions/<subscription-id>/reso
|
||||
```
|
||||
### `Microsoft.Web/sites/functions/token/action`
|
||||
|
||||
이 권한을 사용하면 [**관리자 토큰**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01)을 가져올 수 있으며, 이 토큰은 나중에 **마스터 키**를 검색하는 데 사용될 수 있으며, 따라서 함수의 코드를 액세스하고 수정할 수 있습니다.
|
||||
이 권한을 사용하면 [**관리자 토큰**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01)을 가져올 수 있으며, 이 토큰은 나중에 **마스터 키**를 검색하는 데 사용될 수 있으므로 함수의 코드를 액세스하고 수정할 수 있습니다.
|
||||
|
||||
그러나 최근 확인한 결과 토큰이 반환되지 않았으므로 비활성화되었거나 더 이상 작동하지 않을 수 있지만, 다음은 이를 수행하는 방법입니다:
|
||||
하지만 최근 확인한 결과 토큰이 반환되지 않았으므로 비활성화되었거나 더 이상 작동하지 않을 수 있습니다. 하지만 다음은 이를 수행하는 방법입니다:
|
||||
```bash
|
||||
# Get admin token
|
||||
az rest --method GET \
|
||||
@@ -321,7 +321,7 @@ curl "https://<app-name>.azurewebsites.net/admin/host/systemkeys/_master" \
|
||||
```
|
||||
### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`)
|
||||
|
||||
이 권한은 **비활성화된 함수**를 **활성화**하거나 (또는 비활성화) 할 수 있게 해줍니다.
|
||||
이 권한은 **비활성화된 함수**를 **활성화**하거나 (또는 비활성화할 수 있습니다).
|
||||
```bash
|
||||
# Enable a disabled function
|
||||
az functionapp config appsettings set \
|
||||
@@ -329,7 +329,7 @@ az functionapp config appsettings set \
|
||||
--resource-group <res-group> \
|
||||
--settings "AzureWebJobs.http_trigger1.Disabled=false"
|
||||
```
|
||||
다음 URL에서 함수가 활성화되었는지 비활성화되었는지 확인할 수도 있습니다(괄호 안의 권한 사용):
|
||||
다음 URL에서 함수가 활성화되었는지 비활성화되었는지 확인할 수 있습니다(괄호 안의 권한 사용):
|
||||
```bash
|
||||
az rest --url "https://management.azure.com/subscriptions/<subscripntion-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions/<func-name>/properties/state?api-version=2024-04-01"
|
||||
```
|
||||
@@ -358,14 +358,14 @@ az functionapp identity assign \
|
||||
```bash
|
||||
az functionapp show --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
`Microsoft.Web/sites/config/write` 권한이 있으면 함수를 디버깅 모드로 설정할 수 있습니다 (다음 명령은 `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` 및 `Microsoft.Web/sites/Read` 권한도 필요합니다).
|
||||
`Microsoft.Web/sites/config/write` 권한이 있으면 함수를 디버깅 모드로 설정할 수도 있습니다(다음 명령은 `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` 및 `Microsoft.Web/sites/Read` 권한도 필요합니다).
|
||||
```bash
|
||||
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
### Change Github repo
|
||||
|
||||
나는 배포가 발생하는 Github 리포지토리를 변경하기 위해 다음 명령어를 실행했지만, 변경되었음에도 불구하고 **새 코드가 로드되지 않았다** (아마도 Github Action이 코드를 업데이트하기를 기대하고 있기 때문).\
|
||||
게다가, **관리되는 ID 연합 자격 증명이 새 리포지토리를 허용하도록 업데이트되지 않았다**. 그래서 이것이 그리 유용하지 않은 것 같다.
|
||||
게다가, **관리되는 ID 연합 자격 증명이 새 리포지토리를 허용하도록 업데이트되지 않았다**. 그래서 이것이 그리 유용하지 않은 것처럼 보인다.
|
||||
```bash
|
||||
# Remove current
|
||||
az functionapp deployment source delete \
|
||||
|
||||
@@ -29,4 +29,14 @@ az keyvault set-policy \
|
||||
--certificate-permissions all \
|
||||
--storage-permissions all
|
||||
```
|
||||
### 네트워크 제한 수정
|
||||
|
||||
민감한 데이터(예: 비밀의 값)에 접근할 수 있는 충분한 권한이 있을 수 있지만, 키 볼트가 특정 네트워크로 제한되어 있어 접근할 수 없을 수 있습니다. 네트워크 제한을 수정할 수 있는 권한이 있다면, 허용된 IP 목록에 자신의 IP를 추가할 수 있습니다.
|
||||
```bash
|
||||
# Get the current network restrictions
|
||||
az keyvault network-rule list --name <vault-name>
|
||||
|
||||
# Add your IP to the list
|
||||
az keyvault network-rule add --name <vault-name> --ip-address <your-ip>
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -31,13 +31,13 @@ az mysql flexible-server update \
|
||||
--name <server_name> \
|
||||
--admin-password <password_to_update>
|
||||
```
|
||||
또한 비공개 엔드포인트가 아닌 곳에서 접근하려면 공개 액세스를 활성화해야 합니다. 활성화하려면:
|
||||
또한 비공개 엔드포인트가 아닌 곳에서 접근하려면 공용 액세스를 활성화해야 합니다. 활성화하려면:
|
||||
```bash
|
||||
az mysql flexible-server update --resource-group <resource_group_name> --server-name <server_name> --public-access Enabled
|
||||
```
|
||||
### `Microsoft.DBforMySQL/flexibleServers/read`, `Microsoft.DBforMySQL/flexibleServers/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.DBforMySQL/flexibleServers/administrators/write` && `Microsoft.DBforMySQL/flexibleServers/administrators/read`
|
||||
|
||||
이 권한을 사용하면 MySQL Flexible Server에 대한 Azure Active Directory (AD) 관리자를 구성할 수 있습니다. 이는 자신 또는 다른 계정을 AD 관리자으로 설정하여 MySQL 서버에 대한 전체 관리 권한을 부여함으로써 악용될 수 있습니다. flexible-server에 사용자가 할당된 관리 ID가 있어야 한다는 점이 중요합니다.
|
||||
이 권한을 사용하면 MySQL Flexible Server에 대한 Azure Active Directory (AD) 관리자를 구성할 수 있습니다. 이는 자신 또는 다른 계정을 AD 관리자으로 설정하여 MySQL 서버에 대한 전체 관리 권한을 부여함으로써 악용될 수 있습니다. flexible-server에 사용자가 할당된 관리 ID가 있어야 합니다.
|
||||
```bash
|
||||
az mysql flexible-server ad-admin create \
|
||||
--resource-group <ResourceGroupName> \
|
||||
|
||||
+2
-2
@@ -31,7 +31,7 @@ az postgres flexible-server update \
|
||||
--name <server_name> \
|
||||
--admin-password <password_to_update>
|
||||
```
|
||||
또한 비공개 엔드포인트가 아닌 곳에서 접근하려면 공용 액세스를 활성화해야 합니다. 활성화하려면:
|
||||
또한 비공식 엔드포인트에서 액세스하려면 공용 액세스를 활성화해야 합니다. 활성화하려면:
|
||||
```bash
|
||||
az postgres flexible-server update --resource-group <resource_group_name> --server-name <server_name> --public-access Enabled
|
||||
```
|
||||
@@ -39,7 +39,7 @@ az postgres flexible-server update --resource-group <resource_group_name> --serv
|
||||
|
||||
이 권한을 사용하면 PostgreSQL Flexible Server에 대한 Azure Active Directory (AD) 관리자를 구성할 수 있습니다. 이는 자신 또는 다른 계정을 AD 관리자으로 설정하여 PostgreSQL 서버에 대한 전체 관리 권한을 부여함으로써 악용될 수 있습니다. 기존 주체를 업데이트하는 것은 아직 지원되지 않으므로, 생성된 것이 있다면 먼저 삭제해야 합니다.
|
||||
|
||||
유연한 서버에 사용하기 위해 사용자 할당 관리 ID가 있어야 합니다.
|
||||
유연한 서버에 사용하기 위해 사용자 할당 관리 ID가 있는 것이 중요합니다.
|
||||
```bash
|
||||
az postgres flexible-server ad-admin create \
|
||||
--resource-group <ResourceGroupName> \
|
||||
|
||||
+2
-2
@@ -83,7 +83,7 @@ print("----------------------------")
|
||||
```
|
||||
### 메시지 수신. 작업: `Microsoft.ServiceBus/namespaces/authorizationRules/listkeys/action` 또는 `Microsoft.ServiceBus/namespaces/authorizationRules/regenerateKeys/action`
|
||||
|
||||
PrimaryConnectionString을 검색할 수 있으며, 이는 Service Bus 네임스페이스의 자격 증명 역할을 합니다. 이 연결 문자열을 사용하여 네임스페이스 내의 모든 큐 또는 구독에서 메시지를 수신할 수 있으며, 이는 잠재적으로 민감하거나 중요한 데이터에 접근할 수 있게 하여 데이터 유출을 가능하게 하거나 메시지 처리 및 애플리케이션 워크플로에 간섭할 수 있습니다.
|
||||
PrimaryConnectionString을 검색할 수 있으며, 이는 Service Bus 네임스페이스의 자격 증명으로 사용됩니다. 이 연결 문자열을 사용하여 네임스페이스 내의 모든 큐 또는 구독에서 메시지를 수신할 수 있으며, 이는 잠재적으로 민감하거나 중요한 데이터에 대한 접근을 허용하고, 데이터 유출을 가능하게 하거나 메시지 처리 및 애플리케이션 워크플로에 간섭할 수 있습니다.
|
||||
```python
|
||||
#You need to install the following libraries
|
||||
#pip install azure-servicebus
|
||||
@@ -129,7 +129,7 @@ print("----------------------------")
|
||||
```
|
||||
### `Microsoft.ServiceBus/namespaces/authorizationRules/read` & `Microsoft.ServiceBus/namespaces/authorizationRules/write`
|
||||
|
||||
이 권한이 있으면 공유 액세스 키를 읽거나 생성하여 권한을 상승시킬 수 있습니다. 이러한 키는 Service Bus 네임스페이스에 대한 전체 제어를 허용하며, 큐, 주제 관리 및 메시지 전송/수신을 포함하여 역할 기반 액세스 제어(RBAC)를 우회할 수 있습니다.
|
||||
이 권한이 있으면 공유 액세스 키를 읽거나 생성하여 권한을 상승시킬 수 있습니다. 이러한 키는 Service Bus 네임스페이스에 대한 전체 제어를 허용하며, 큐, 주제 관리 및 메시지 송수신을 포함하여 역할 기반 액세스 제어(RBAC)를 우회할 수 있습니다.
|
||||
```bash
|
||||
az servicebus namespace authorization-rule update \
|
||||
--resource-group <MyResourceGroup> \
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## SQL Database Privesc
|
||||
|
||||
SQL Database에 대한 자세한 내용은 다음을 확인하세요:
|
||||
SQL Database에 대한 자세한 정보는 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-sql.md
|
||||
@@ -74,7 +74,7 @@ az sql server firewall-rule create \
|
||||
|
||||
### `Microsoft.Sql/servers/administrators/write` && `Microsoft.Sql/servers/administrators/read`
|
||||
|
||||
이 권한을 사용하면 Azure SQL Server 환경에서 SQL 데이터베이스에 접근하고 중요한 정보를 검색하여 권한 상승을 할 수 있습니다. 아래 명령어를 사용하면 공격자 또는 권한이 있는 사용자가 자신 또는 다른 계정을 Azure AD 관리자으로 설정할 수 있습니다. "Microsoft Entra Authentication Only"가 활성화되어 있으면 서버 및 해당 인스턴스에 접근할 수 있습니다. SQL 서버의 Azure AD 관리자를 설정하는 명령어는 다음과 같습니다:
|
||||
이 권한을 사용하면 Azure SQL Server 환경에서 SQL 데이터베이스에 접근하고 중요한 정보를 검색하여 권한 상승을 할 수 있습니다. 아래 명령어를 사용하면 공격자 또는 권한이 있는 사용자가 자신 또는 다른 계정을 Azure AD 관리자 권한으로 설정할 수 있습니다. "Microsoft Entra Authentication Only"가 활성화된 경우 서버 및 해당 인스턴스에 접근할 수 있습니다. SQL 서버의 Azure AD 관리자를 설정하는 명령어는 다음과 같습니다:
|
||||
```bash
|
||||
az sql server ad-admin create \
|
||||
--server <server_name> \
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
### `Microsoft.Storage/storageAccounts/listkeys/action`
|
||||
|
||||
이 권한을 가진 주체는 저장소 계정의 **액세스 키** 목록(및 비밀 값)을 나열할 수 있습니다. 이는 주체가 저장소 계정에 대한 권한을 상승시킬 수 있게 합니다.
|
||||
이 권한을 가진 주체는 저장소 계정의 **액세스 키** 목록(및 비밀 값)을 나열할 수 있습니다. 이는 주체가 저장소 계정에 대한 권한을 상승시킬 수 있도록 합니다.
|
||||
```bash
|
||||
az storage account keys list --account-name <acc-name>
|
||||
```
|
||||
@@ -58,19 +58,19 @@ az storage container immutability-policy update \
|
||||
|
||||
### `Microsoft.Storage/storageAccounts/fileServices/takeOwnership/action`
|
||||
|
||||
이 권한을 가진 사용자는 공유 파일 시스템 내의 파일 소유권을 가질 수 있습니다.
|
||||
이 권한을 가진 사용자는 공유 파일 시스템 내의 파일 소유권을 가져올 수 있어야 합니다.
|
||||
|
||||
### `Microsoft.Storage/storageAccounts/fileServices/fileshares/files/modifypermissions/action`
|
||||
|
||||
이 권한을 가진 사용자는 공유 파일 시스템 내의 파일 권한을 수정할 수 있습니다.
|
||||
이 권한을 가진 사용자는 공유 파일 시스템 내의 파일 권한을 수정할 수 있어야 합니다.
|
||||
|
||||
### `Microsoft.Storage/storageAccounts/fileServices/fileshares/files/actassuperuser/action`
|
||||
|
||||
이 권한을 가진 사용자는 파일 시스템 내에서 슈퍼유저로서 작업을 수행할 수 있습니다.
|
||||
이 권한을 가진 사용자는 파일 시스템 내에서 슈퍼유저로서 작업을 수행할 수 있어야 합니다.
|
||||
|
||||
### `Microsoft.Storage/storageAccounts/localusers/write (Microsoft.Storage/storageAccounts/localusers/read)`
|
||||
|
||||
이 권한을 통해 공격자는 Azure Storage 계정(계층적 네임스페이스로 구성됨)에 대한 새로운 로컬 사용자를 생성하고 업데이트할 수 있으며(`Microsoft.Storage/storageAccounts/localusers/read` 권한이 있는 경우), 사용자의 권한 및 홈 디렉터리를 지정할 수 있습니다. 이 권한은 공격자가 읽기(r), 쓰기(w), 삭제(d), 목록(l) 등과 같은 특정 권한으로 스토리지 계정에 자신을 부여할 수 있게 해주기 때문에 중요합니다. 추가적으로, 이 권한은 Azure에서 생성된 비밀번호와 SSH 키 쌍을 사용할 수 있습니다. 사용자가 이미 존재하는지에 대한 확인이 없으므로, 이미 존재하는 다른 사용자를 덮어쓸 수 있습니다. 공격자는 권한을 상승시켜 스토리지 계정에 SSH 접근을 얻을 수 있으며, 이는 잠재적으로 민감한 데이터를 노출하거나 손상시킬 수 있습니다.
|
||||
이 권한을 통해 공격자는 Azure Storage 계정(계층적 네임스페이스로 구성됨)에 대한 새로운 로컬 사용자를 생성하고 업데이트할 수 있으며(`Microsoft.Storage/storageAccounts/localusers/read` 권한이 있는 경우), 사용자의 권한 및 홈 디렉터리를 지정할 수 있습니다. 이 권한은 공격자가 읽기(r), 쓰기(w), 삭제(d), 목록(l) 등과 같은 특정 권한으로 스토리지 계정에 자신을 부여할 수 있게 해주기 때문에 중요합니다. 추가적으로, 이 권한은 Azure에서 생성된 비밀번호와 SSH 키 쌍을 인증 방법으로 사용할 수 있습니다. 사용자가 이미 존재하는지에 대한 확인이 없으므로, 이미 존재하는 다른 사용자를 덮어쓸 수 있습니다. 공격자는 권한을 상승시켜 스토리지 계정에 SSH 접근을 얻을 수 있으며, 이는 민감한 데이터를 노출하거나 손상시킬 수 있습니다.
|
||||
```bash
|
||||
az storage account local-user create \
|
||||
--account-name <STORAGE_ACCOUNT_NAME> \
|
||||
|
||||
@@ -184,9 +184,9 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Azure에 **CLI**를 통해 로그인할 때, **Microsoft**에 속한 **tenant**의 **Azure Application**을 사용하고 있습니다. 이러한 애플리케이션은 귀하의 계정에서 생성할 수 있는 것과 같이 **클라이언트 ID**를 가지고 있습니다. **콘솔에서 볼 수 있는 허용된 애플리케이션 목록**에서 모든 애플리케이션을 **볼 수는 없지만**, 기본적으로 허용됩니다.
|
||||
Azure에 **CLI**를 통해 로그인할 때, **Microsoft**에 속한 **tenant**의 **Azure Application**을 사용하고 있습니다. 이러한 애플리케이션은 귀하의 계정에서 생성할 수 있는 것처럼 **클라이언트 ID**를 가지고 있습니다. **콘솔에서 볼 수 있는 허용된 애플리케이션 목록**에서 모든 애플리케이션을 **볼 수는 없지만**, 기본적으로 허용됩니다.
|
||||
|
||||
예를 들어, **`1950a258-227b-4e31-a9cf-717495945fc2`** 클라이언트 ID를 가진 앱을 사용하는 **powershell 스크립트**가 **인증**을 수행합니다. 앱이 콘솔에 나타나지 않더라도, 시스템 관리자는 사용자가 해당 앱을 통해 연결할 수 없도록 **해당 애플리케이션을 차단**할 수 있습니다.
|
||||
예를 들어, **인증**을 수행하는 **powershell 스크립트**는 클라이언트 ID **`1950a258-227b-4e31-a9cf-717495945fc2`**를 가진 앱을 사용합니다. 애플리케이션이 콘솔에 나타나지 않더라도, 시스템 관리자는 사용자가 해당 앱을 통해 연결할 수 없도록 **해당 애플리케이션을 차단**할 수 있습니다.
|
||||
|
||||
그러나 **Azure에 연결할 수 있는 다른 클라이언트 ID**의 애플리케이션이 있습니다:
|
||||
```bash
|
||||
@@ -363,15 +363,15 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText
|
||||
|
||||
(Get-AzureADUser -All $true | ?{$_.UserPrincipalName -eq "victim@corp.onmicrosoft.com"}).ObjectId | Set- AzureADUserPassword -Password $password –Verbose
|
||||
```
|
||||
### MFA 및 조건부 액세스 정책
|
||||
### MFA & Conditional Access Policies
|
||||
|
||||
모든 사용자에게 MFA를 추가하는 것이 강력히 권장되지만, 일부 회사는 이를 설정하지 않거나 특정 위치, 브라우저 또는 **일부 조건**에서 로그인할 경우에만 MFA를 요구하는 조건부 액세스를 설정할 수 있습니다. 이러한 정책이 올바르게 구성되지 않으면 **우회**에 취약할 수 있습니다. 확인하세요:
|
||||
모든 사용자에게 MFA를 추가하는 것이 강력히 권장되지만, 일부 회사는 이를 설정하지 않거나 특정 위치, 브라우저 또는 **일부 조건**에서 로그인할 경우에만 MFA를 요구하는 Conditional Access를 설정할 수 있습니다. 이러한 정책이 올바르게 구성되지 않으면 **bypasses**에 취약할 수 있습니다. 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
### 그룹
|
||||
### Groups
|
||||
|
||||
Entra ID 그룹에 대한 자세한 정보는 다음을 확인하세요:
|
||||
|
||||
@@ -487,7 +487,7 @@ Get-AzureADGroup -ObjectId <id> | Get-AzureADGroupAppRoleAssignment | fl *
|
||||
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
|
||||
```
|
||||
> [!WARNING]
|
||||
> 그룹은 동적일 수 있으며, 이는 기본적으로 **사용자가 특정 조건을 충족하면 그룹에 추가된다는 의미**입니다. 물론, 조건이 **사용자가** **제어할 수 있는** **속성**에 기반할 경우, 그는 이 기능을 악용하여 **다른 그룹에 들어갈 수 있습니다**.\
|
||||
> 그룹은 동적일 수 있으며, 이는 기본적으로 **사용자가 특정 조건을 충족하면 그룹에 추가된다는 의미**입니다. 물론, 조건이 **사용자가 제어할 수 있는 속성**에 기반할 경우, 그는 이 기능을 악용하여 **다른 그룹에 들어갈 수 있습니다**.\
|
||||
> 동적 그룹을 악용하는 방법은 다음 페이지를 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
@@ -792,21 +792,21 @@ Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *
|
||||
{{#endtabs }}
|
||||
|
||||
> [!WARNING]
|
||||
> **`AppRoleAssignment.ReadWrite`** 권한이 있는 앱은 **Global Admin**으로 **승격**할 수 있습니다.\
|
||||
> 자세한 내용은 [**여기에서 확인하세요**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48).
|
||||
> **`AppRoleAssignment.ReadWrite`** 권한을 가진 앱은 **Global Admin**으로 **승격**할 수 있습니다.\
|
||||
> 더 많은 정보는 [**여기 확인하세요**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48).
|
||||
|
||||
> [!NOTE]
|
||||
> 애플리케이션이 토큰을 요청할 때 자신의 신원을 증명하는 데 사용하는 비밀 문자열은 애플리케이션 비밀번호입니다.\
|
||||
> 따라서 이 **비밀번호**를 찾으면 **서비스 주체**로 **테넌트** **내부**에 접근할 수 있습니다.\
|
||||
> 이 비밀번호는 생성될 때만 볼 수 있습니다(변경할 수는 있지만 다시 얻을 수는 없습니다).\
|
||||
> **애플리케이션**의 **소유자**는 이를 **가짜로** 사용할 수 있도록 **비밀번호**를 **추가**할 수 있습니다.\
|
||||
> **애플리케이션**의 **소유자**는 이를 **가짜로** 사용할 수 있도록 **비밀번호**를 추가할 수 있습니다.\
|
||||
> 이러한 서비스 주체로의 로그인은 **위험한 것으로 표시되지 않으며** **MFA가 없습니다.**
|
||||
|
||||
Microsoft에 속하는 일반적으로 사용되는 App ID 목록을 찾는 것은 가능합니다 [https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications](https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications)
|
||||
|
||||
### 관리되는 ID
|
||||
|
||||
관리되는 ID에 대한 자세한 내용은 다음을 확인하세요:
|
||||
관리되는 ID에 대한 더 많은 정보는 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../az-basic-information/
|
||||
@@ -1088,9 +1088,9 @@ Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
|
||||
|
||||
### 권한 있는 ID 관리 (PIM)
|
||||
|
||||
Azure의 권한 있는 ID 관리 (PIM)는 **불필요하게 사용자에게 과도한 권한이 부여되는 것을 방지**하는 데 도움을 줍니다.
|
||||
Azure의 권한 있는 ID 관리(PIM)는 **불필요하게 사용자에게 과도한 권한이 부여되는 것을 방지**하는 데 도움을 줍니다.
|
||||
|
||||
PIM이 제공하는 주요 기능 중 하나는 항상 활성 상태인 주체에게 역할을 할당하지 않고, **일정 기간(예: 6개월)** 동안 자격을 부여할 수 있다는 것입니다. 그런 다음 사용자가 해당 역할을 활성화하고 싶을 때, 필요한 권한의 시간을 지정하여 요청해야 합니다(예: 3시간). 그런 다음 **관리자가** 요청을 승인해야 합니다.\
|
||||
PIM이 제공하는 주요 기능 중 하나는 항상 활성화된 주체에게 역할을 할당하지 않고, **일정 기간(예: 6개월)** 동안 자격을 부여할 수 있다는 것입니다. 그런 다음 사용자가 해당 역할을 활성화하고 싶을 때, 필요한 권한의 시간을 명시하여 요청해야 합니다(예: 3시간). 그런 다음 **관리자가** 요청을 승인해야 합니다.\
|
||||
사용자는 또한 시간을 **연장** 요청할 수 있습니다.
|
||||
|
||||
또한, **PIM은** 권한 있는 역할이 누군가에게 할당될 때마다 이메일을 보냅니다.
|
||||
@@ -1118,21 +1118,21 @@ PIM이 활성화되면 각 역할에 대해 다음과 같은 특정 요구 사
|
||||
|
||||
### Entra ID 보호
|
||||
|
||||
Entra ID 보호는 **사용자 또는 로그인 시도가 너무 위험할 때 이를 감지**하여 사용자를 **차단**할 수 있는 보안 서비스입니다.
|
||||
Entra ID 보호는 **사용자 또는 로그인 시도가 너무 위험할 때 이를 감지**하여 사용자를 **차단**하거나 로그인 시도를 차단할 수 있는 보안 서비스입니다.
|
||||
|
||||
관리자가 "낮음 이상", "중간 이상" 또는 "높음"일 때 시도를 **차단**하도록 구성할 수 있습니다. 그러나 기본적으로 완전히 **비활성화**되어 있습니다:
|
||||
|
||||
<figure><img src="../../../images/image (356).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!TIP]
|
||||
> 현재 가능한 경우 조건부 액세스 정책을 통해 이러한 제한을 추가하는 것이 권장됩니다.
|
||||
> 현재 이러한 제한을 조건부 액세스 정책을 통해 추가하는 것이 권장되며, 동일한 옵션을 구성할 수 있습니다.
|
||||
|
||||
### Entra 비밀번호 보호
|
||||
|
||||
Entra 비밀번호 보호 ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade))는 **여러 번의 로그인 시도가 실패할 때 계정을 잠금으로써 약한 비밀번호의 남용을 방지**하는 보안 기능입니다.\
|
||||
또한 제공해야 하는 **사용자 정의 비밀번호 목록을 금지**할 수 있습니다.
|
||||
|
||||
클라우드 수준과 온프레미스 Active Directory 모두에 **적용**될 수 있습니다.
|
||||
이는 **클라우드 수준과 온프레미스 Active Directory 모두에 적용**될 수 있습니다.
|
||||
|
||||
기본 모드는 **감사**입니다:
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Azure Cloud Shell
|
||||
|
||||
**Azure Cloud Shell**는 Azure 리소스를 관리하기 위해 설계된 대화형 인증 브라우저 접근 터미널로, Bash 또는 PowerShell 중 하나로 작업할 수 있는 유연성을 제공합니다. 이 터미널은 비활성 상태가 20분이 지나면 타임아웃되는 임시 세션 호스트에서 실행되며, $HOME 위치에 5-GB 파일 공유를 사용하여 파일을 유지합니다. Cloud Shell은 Azure 포털, shell.azure.com, Azure CLI 및 PowerShell 문서, Azure 모바일 앱, Visual Studio Code Azure 계정 확장 등 여러 지점을 통해 접근할 수 있습니다.
|
||||
**Azure Cloud Shell**는 Azure 리소스를 관리하기 위해 설계된 대화형 인증 브라우저 접근 터미널로, Bash 또는 PowerShell 중 하나로 작업할 수 있는 유연성을 제공합니다. 이 서비스는 비활성 상태가 20분이 지나면 타임아웃되는 임시 세션 호스트에서 실행되며, $HOME 위치에 5-GB 파일 공유를 사용하여 파일을 유지합니다. Cloud Shell은 Azure 포털, shell.azure.com, Azure CLI 및 PowerShell 문서, Azure 모바일 앱, Visual Studio Code Azure 계정 확장 등 여러 지점을 통해 접근할 수 있습니다.
|
||||
|
||||
이 서비스에는 권한이 할당되지 않으므로 권한 상승 기술이 없습니다. 또한 어떤 종류의 열거도 없습니다.
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
**환경**: Azure Cloud Shell은 클라우드 인프라를 위해 설계된 Microsoft의 자체 Linux 배포판인 Azure Linux에서 실행되어 안전한 환경을 제공합니다. Azure Linux 리포지토리에 포함된 모든 패키지는 공급망 공격을 방지하기 위해 Microsoft에 의해 내부적으로 컴파일됩니다.
|
||||
**사전 설치된 도구**: Cloud Shell에는 Azure CLI, Azure PowerShell, Terraform, Docker CLI, Ansible, Git 및 vim, nano, emacs와 같은 텍스트 편집기와 같은 포괄적인 사전 설치 도구 세트가 포함되어 있습니다. 이러한 도구는 즉시 사용할 수 있습니다. 설치된 패키지 및 모듈을 나열하려면 "Get-Module -ListAvailable", "tdnf list" 및 "pip3 list"를 사용할 수 있습니다.
|
||||
**$HOME 지속성**: Azure Cloud Shell을 처음 시작할 때, 연결된 스토리지 계정이 있거나 없거나 사용할 수 있습니다. 스토리지를 연결하지 않으면 세션이 종료될 때 파일이 삭제되는 일시적인 세션이 생성됩니다. 세션 간에 파일을 유지하려면 스토리지 계정을 마운트해야 하며, 이는 자동으로 **$HOME\clouddrive**로 연결되며, **$HOME** 디렉토리는 Azure File Share에 **.img** 파일로 저장됩니다. 그러나 $HOME 외부의 파일과 머신 상태는 유지되지 않습니다. SSH 키와 같은 비밀을 안전하게 저장하려면 Azure Key Vault를 사용하십시오.
|
||||
**$HOME 지속성**: Azure Cloud Shell을 처음 시작할 때, 연결된 스토리지 계정이 있거나 없거나 사용할 수 있습니다. 스토리지를 연결하지 않으면 세션이 종료될 때 파일이 삭제되는 일시적인 세션이 생성됩니다. 세션 간 파일을 지속적으로 유지하려면 스토리지 계정을 마운트해야 하며, 이는 자동으로 **$HOME\clouddrive**로 연결되며, **$HOME** 디렉토리는 Azure File Share에 **.img** 파일로 저장됩니다. 그러나 $HOME 외부의 파일과 머신 상태는 지속되지 않습니다. SSH 키와 같은 비밀을 안전하게 저장하려면 Azure Key Vault를 사용하십시오.
|
||||
**Azure 드라이브 (Azure:)**: Azure Cloud Shell의 PowerShell에는 Azure 리소스(Compute, Network, Storage 등)를 파일 시스템과 유사한 명령을 사용하여 쉽게 탐색할 수 있는 Azure 드라이브(Azure:)가 포함되어 있습니다. cd Azure:로 Azure 드라이브로 전환하고 cd ~로 홈 디렉토리로 돌아갈 수 있습니다. 여전히 Azure PowerShell cmdlet을 사용하여 모든 드라이브에서 리소스를 관리할 수 있습니다.
|
||||
**사용자 정의 도구 설치**: 스토리지 계정으로 Cloud Shell을 구성한 사용자는 루트 권한이 필요하지 않은 추가 도구를 설치할 수 있습니다. 이 기능은 Cloud Shell 환경을 추가로 사용자 정의할 수 있게 하여 사용자가 특정 요구에 맞게 설정을 조정할 수 있도록 합니다.
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
- [https://learn.microsoft.com/en-us/azure/cloud-shell/features](https://learn.microsoft.com/en-us/azure/cloud-shell/features)
|
||||
- [https://learn.microsoft.com/en-us/azure/cloud-shell/using-the-shell-window](https://learn.microsoft.com/en-us/azure/cloud-shell/using-the-shell-window)
|
||||
|
||||
|
||||
## Persistence
|
||||
|
||||
{{#ref}}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
Azure Cosmos DB는 문서, 관계형, 키-값, 그래프 및 열 패밀리 데이터 모델을 사용하여 실제 데이터를 모델링하기 위한 여러 데이터베이스 API를 제공합니다. 이 API는 NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin 및 Table입니다.
|
||||
|
||||
CosmosDB의 주요 측면 중 하나는 Azure Cosmos Account입니다. **Azure Cosmos Account**는 데이터베이스에 대한 진입점 역할을 합니다. 계정은 글로벌 분배, 일관성 수준 및 사용할 특정 API(예: NoSQL)와 같은 주요 설정을 결정합니다. 계정을 통해 여러 지역에서 데이터에 대한 저지연 액세스를 보장하기 위해 글로벌 복제를 구성할 수 있습니다. 또한 성능과 데이터 정확성 간의 균형을 맞추는 일관성 수준을 선택할 수 있으며, 옵션은 Strong에서 Eventual consistency까지 다양합니다.
|
||||
CosmosDB의 주요 측면 중 하나는 Azure Cosmos Account입니다. **Azure Cosmos Account**는 데이터베이스에 대한 진입점 역할을 합니다. 계정은 글로벌 분배, 일관성 수준 및 사용할 특정 API(예: NoSQL)와 같은 주요 설정을 결정합니다. 계정을 통해 데이터가 여러 지역에서 저지연 액세스를 위해 사용 가능하도록 글로벌 복제를 구성할 수 있습니다. 또한 성능과 데이터 정확성 간의 균형을 맞추는 일관성 수준을 선택할 수 있으며, 옵션은 Strong에서 Eventual consistency까지 다양합니다.
|
||||
|
||||
### NoSQL (sql)
|
||||
Azure Cosmos DB NoSQL API는 JSON을 데이터 형식으로 사용하는 문서 기반 API입니다. JSON 객체를 쿼리하기 위한 SQL 유사 쿼리 구문을 제공하여 구조화된 데이터 및 반구조화된 데이터 작업에 적합합니다. 서비스의 엔드포인트는:
|
||||
@@ -19,7 +19,7 @@ https://<Account-Name>.documents.azure.com:443/
|
||||
계정 내에서 하나 이상의 데이터베이스를 생성할 수 있으며, 이는 컨테이너의 논리적 그룹으로 작용합니다. 데이터베이스는 리소스 관리 및 사용자 권한의 경계 역할을 합니다. 데이터베이스는 컨테이너 간에 프로비저닝된 처리량을 공유하거나 개별 컨테이너에 전용 처리량을 할당할 수 있습니다.
|
||||
|
||||
#### 컨테이너
|
||||
데이터 저장의 핵심 단위는 컨테이너로, JSON 문서를 보유하고 있으며 효율적인 쿼리를 위해 자동으로 인덱싱됩니다. 컨테이너는 탄력적으로 확장 가능하며, 사용자 정의 파티션 키에 의해 결정된 파티션에 분산됩니다. 파티션 키는 최적의 성능과 고른 데이터 분포를 보장하는 데 중요합니다. 예를 들어, 컨테이너는 "customerId"를 파티션 키로 하여 고객 데이터를 저장할 수 있습니다.
|
||||
데이터 저장의 핵심 단위는 컨테이너로, JSON 문서를 보유하며 효율적인 쿼리를 위해 자동으로 인덱싱됩니다. 컨테이너는 탄력적으로 확장 가능하며, 사용자 정의 파티션 키에 의해 결정된 파티션에 분산됩니다. 파티션 키는 최적의 성능과 고른 데이터 분포를 보장하는 데 중요합니다. 예를 들어, 컨테이너는 고객 데이터를 저장할 수 있으며, "customerId"가 파티션 키로 사용될 수 있습니다.
|
||||
|
||||
#### 열거
|
||||
|
||||
@@ -180,7 +180,7 @@ MongoDB NoSQL API는 JSON과 유사한 BSON(이진 JSON)을 데이터 형식으
|
||||
mongodb://<hostname>:<port>/<database>
|
||||
```
|
||||
#### 데이터베이스
|
||||
MongoDB에서는 인스턴스 내에서 하나 이상의 데이터베이스를 생성할 수 있습니다. 각 데이터베이스는 컬렉션의 논리적 그룹으로 작용하며, 리소스 조직 및 관리를 위한 경계를 제공합니다. 데이터베이스는 서로 다른 애플리케이션이나 프로젝트를 위해 데이터를 논리적으로 분리하고 관리하는 데 도움을 줍니다.
|
||||
MongoDB에서는 인스턴스 내에 하나 이상의 데이터베이스를 생성할 수 있습니다. 각 데이터베이스는 컬렉션의 논리적 그룹으로 작용하며, 리소스 조직 및 관리를 위한 경계를 제공합니다. 데이터베이스는 서로 다른 애플리케이션이나 프로젝트를 위해 데이터를 논리적으로 분리하고 관리하는 데 도움을 줍니다.
|
||||
|
||||
#### 컬렉션
|
||||
MongoDB에서 데이터 저장의 핵심 단위는 컬렉션으로, 문서를 보유하며 효율적인 쿼리 및 유연한 스키마 설계를 위해 설계되었습니다. 컬렉션은 탄력적으로 확장 가능하며, 분산 설정에서 여러 노드에 걸쳐 높은 처리량 작업을 지원할 수 있습니다.
|
||||
@@ -310,7 +310,7 @@ print(f"Inserted document with ID: {result.inserted_id}")
|
||||
|
||||
* 여기 DB의 나머지 부분, 테이블, 카산드라, 그렘린...
|
||||
* 포스트 익스플로잇 "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" 및 역할 정의를 살펴보세요. 여기서 권한 상승이 있을 수 있습니다.
|
||||
* 복원 살펴보기
|
||||
* 복원 작업을 살펴보세요.
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## 기본 정보
|
||||
|
||||
**Azure Files**는 표준 **SMB (Server Message Block)** 및 **NFS (Network File System)** 프로토콜을 통해 접근할 수 있는 공유 파일 저장소를 제공하는 완전 관리형 클라우드 파일 저장 서비스입니다. 주 프로토콜로는 SMB가 사용되지만 NFS Azure 파일 공유는 Windows에서 지원되지 않습니다 (자세한 내용은 [**docs**](https://learn.microsoft.com/en-us/azure/storage/files/files-nfs-protocol) 참조). 여러 가상 머신(VM) 또는 온프레미스 시스템에서 동시에 접근할 수 있는 고가용성 네트워크 파일 공유를 생성할 수 있어 환경 간 원활한 파일 공유가 가능합니다.
|
||||
**Azure Files**는 표준 **SMB (Server Message Block)** 및 **NFS (Network File System)** 프로토콜을 통해 접근할 수 있는 공유 파일 저장소를 제공하는 완전 관리형 클라우드 파일 저장 서비스입니다. 주 프로토콜로는 SMB가 사용되지만 NFS Azure 파일 공유는 Windows에서 지원되지 않습니다 (자세한 내용은 [**docs**](https://learn.microsoft.com/en-us/azure/storage/files/files-nfs-protocol) 참조). 여러 가상 머신(VM) 또는 온프레미스 시스템에서 동시에 접근할 수 있는 고가용성 네트워크 파일 공유를 생성할 수 있어 환경 간 원활한 파일 공유를 가능하게 합니다.
|
||||
|
||||
### 액세스 계층
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
|
||||
- **온프레미스 AD DS 인증**: 온프레미스 Active Directory 자격 증명을 사용하여 Microsoft Entra ID와 동기화된 신원 기반 액세스를 제공합니다. 온프레미스 AD DS에 대한 네트워크 연결이 필요합니다.
|
||||
- **Microsoft Entra 도메인 서비스 인증**: Microsoft Entra 자격 증명을 사용하여 액세스를 제공하기 위해 Microsoft Entra 도메인 서비스(클라우드 기반 AD)를 활용합니다.
|
||||
- **하이브리드 ID를 위한 Microsoft Entra Kerberos**: Microsoft Entra 사용자가 Kerberos를 사용하여 인터넷을 통해 Azure 파일 공유를 인증할 수 있도록 합니다. 온프레미스 도메인 컨트롤러에 대한 연결 없이 하이브리드 Microsoft Entra 가입 또는 Microsoft Entra 가입 VM을 지원합니다. 그러나 클라우드 전용 ID는 지원하지 않습니다.
|
||||
- **Linux 클라이언트를 위한 AD Kerberos 인증**: Linux 클라이언트가 온프레미스 AD DS 또는 Microsoft Entra 도메인 서비스를 통해 SMB 인증을 위해 Kerberos를 사용할 수 있도록 합니다.
|
||||
- **하이브리드 ID를 위한 Microsoft Entra Kerberos**: Microsoft Entra 사용자가 Kerberos를 사용하여 인터넷을 통해 Azure 파일 공유를 인증할 수 있게 합니다. 온프레미스 도메인 컨트롤러에 대한 연결 없이 하이브리드 Microsoft Entra 가입 또는 Microsoft Entra 가입 VM을 지원합니다. 그러나 클라우드 전용 ID는 지원하지 않습니다.
|
||||
- **Linux 클라이언트를 위한 AD Kerberos 인증**: Linux 클라이언트가 온프레미스 AD DS 또는 Microsoft Entra 도메인 서비스를 통해 SMB 인증을 위해 Kerberos를 사용할 수 있게 합니다.
|
||||
|
||||
## 열거
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## 기본 정보
|
||||
|
||||
**Azure Function Apps**는 **서버리스 컴퓨트 서비스**로, 기본 인프라를 관리하지 않고도 **함수**라고 불리는 작은 코드 조각을 실행할 수 있게 해줍니다. 이들은 **HTTP 요청, 타이머 또는 Blob Storage나 Event Hubs와 같은 다른 Azure 서비스의 이벤트**와 같은 다양한 트리거에 응답하여 코드를 실행하도록 설계되었습니다. Function Apps는 C#, Python, JavaScript, Java 등 여러 프로그래밍 언어를 지원하여 **이벤트 기반 애플리케이션**, 워크플로 자동화 또는 서비스 통합을 구축하는 데 유용합니다. 일반적으로 코드가 실행될 때 사용된 컴퓨트 시간에 대해서만 비용을 지불하므로 비용 효율적입니다.
|
||||
**Azure Function Apps**는 **서버리스 컴퓨트 서비스**로, 기본 인프라를 관리하지 않고도 **함수**라고 불리는 작은 코드 조각을 실행할 수 있게 해줍니다. 이들은 **HTTP 요청, 타이머 또는 Blob Storage나 Event Hubs와 같은 다른 Azure 서비스의 이벤트**와 같은 다양한 트리거에 응답하여 코드를 실행하도록 설계되었습니다. Function Apps는 C#, Python, JavaScript, Java를 포함한 여러 프로그래밍 언어를 지원하여 **이벤트 기반 애플리케이션**, 워크플로 자동화 또는 서비스 통합을 구축하는 데 유용합니다. 일반적으로 코드가 실행될 때 사용된 컴퓨트 시간에 대해서만 비용을 지불하므로 비용 효율적입니다.
|
||||
|
||||
> [!NOTE]
|
||||
> **Functions는 App Services의 하위 집합**이므로, 여기서 논의된 많은 기능은 Azure Apps(`webapp` in cli)로 생성된 애플리케이션에서도 사용됩니다.
|
||||
@@ -34,42 +34,42 @@ Functions는 또한 코드를 원격 위치에 저장할 수 있으며, 그 URL
|
||||
|
||||
### 네트워킹
|
||||
|
||||
HTTP 트리거를 사용할 때:
|
||||
HTTP 트리거를 사용하여:
|
||||
|
||||
- **모든 인터넷에서 함수에 대한 액세스를 제공**할 수 있으며, 인증을 요구하지 않거나 IAM 기반으로 액세스를 제공할 수 있습니다. 이 액세스를 제한하는 것도 가능합니다.
|
||||
- **모든 인터넷에서 함수에 대한 액세스를 제공**하거나 IAM 기반으로 액세스를 제공할 수 있습니다. 이 액세스를 제한하는 것도 가능합니다.
|
||||
- **내부 네트워크(VPC)**에서 Function App에 대한 액세스를 **제공하거나 제한**할 수 있습니다.
|
||||
|
||||
> [!CAUTION]
|
||||
> 공격자의 관점에서 매우 흥미로운 점은 취약한 Function이 인터넷에 노출될 경우 **내부 네트워크로 피벗할 수 있는 가능성이 있다는 점입니다.**
|
||||
> 공격자의 관점에서 매우 흥미로운 점은 취약한 Function이 인터넷에 노출되면 **내부 네트워크로 피벗할 수 있는 가능성이 있다는 점입니다.**
|
||||
|
||||
### **Function App 설정 및 환경 변수**
|
||||
|
||||
앱 내에서 환경 변수를 구성할 수 있으며, 이 변수는 민감한 정보를 포함할 수 있습니다. 또한 기본적으로 **`AzureWebJobsStorage`** 및 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**(기타 포함)과 같은 환경 변수가 생성됩니다. 이들은 **애플리케이션 데이터가 포함된 스토리지 계정을 완전 권한으로 제어할 수 있는 계정 키를 포함**하고 있어 특히 흥미롭습니다. 이러한 설정은 스토리지 계정에서 코드를 실행하는 데에도 필요합니다.
|
||||
앱 내에서 환경 변수를 구성할 수 있으며, 이 변수는 민감한 정보를 포함할 수 있습니다. 또한 기본적으로 **`AzureWebJobsStorage`** 및 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**(기타 포함)과 같은 env 변수가 생성됩니다. 이들은 **애플리케이션 데이터가 포함된 스토리지 계정을 완전 권한으로 제어할 수 있는 계정 키를 포함**하고 있어 특히 흥미롭습니다. 이러한 설정은 스토리지 계정에서 코드를 실행하는 데에도 필요합니다.
|
||||
|
||||
이러한 환경 변수 또는 구성 매개변수는 함수가 코드를 실행하는 방식을 제어하며, 예를 들어 **`WEBSITE_RUN_FROM_PACKAGE`**가 존재하면 애플리케이션 코드가 위치한 URL을 나타냅니다.
|
||||
이러한 env 변수 또는 구성 매개변수는 함수가 코드를 실행하는 방식을 제어합니다. 예를 들어 **`WEBSITE_RUN_FROM_PACKAGE`**가 존재하면 애플리케이션 코드가 위치한 URL을 나타냅니다.
|
||||
|
||||
### **Function Sandbox**
|
||||
|
||||
리눅스 샌드박스 내에서 소스 코드는 **`/home/site/wwwroot`**의 **`function_app.py`** 파일에 위치하며(파이썬을 사용하는 경우), 코드를 실행하는 사용자는 **`app`**입니다(권한 없음).
|
||||
리눅스 샌드박스 내에서 소스 코드는 **`/home/site/wwwroot`**의 **`function_app.py`**(Python 사용 시)에 위치하며, 코드를 실행하는 사용자는 **`app`**(sudo 권한 없음)입니다.
|
||||
|
||||
**Windows** 함수에서 NodeJS를 사용하는 경우 코드는 **`C:\home\site\wwwroot\HttpTrigger1\index.js`**에 위치하며, 사용자 이름은 **`mawsFnPlaceholder8_f_v4_node_20_x86`**이고, **그룹**은 `Mandatory Label\High Mandatory Level Label`, `Everyone`, `BUILTIN\Users`, `NT AUTHORITY\INTERACTIVE`, `CONSOLE LOGON`, `NT AUTHORITY\Authenticated Users`, `NT AUTHORITY\This Organization`, `BUILTIN\IIS_IUSRS`, `LOCAL`, `10-30-4-99\Dwas Site Users`입니다.
|
||||
|
||||
### **관리되는 ID 및 메타데이터**
|
||||
|
||||
[**VMs**](vms/index.html)와 마찬가지로, Functions는 두 가지 유형의 **Managed Identities**를 가질 수 있습니다: 시스템 할당 및 사용자 할당.
|
||||
[**VMs**](vms/index.html)와 마찬가지로 Functions는 두 가지 유형의 **Managed Identities**를 가질 수 있습니다: 시스템 할당 및 사용자 할당.
|
||||
|
||||
**시스템 할당**된 ID는 **해당 함수**만 사용할 수 있는 관리되는 ID이며, **사용자 할당**된 관리 ID는 **다른 Azure 서비스가 사용할 수 있는 관리되는 ID**입니다.
|
||||
**시스템 할당**된 ID는 **해당 함수**만 사용할 수 있는 관리되는 ID이며, **사용자 할당**된 관리되는 ID는 **다른 Azure 서비스가 사용할 수 있는 관리되는 ID**입니다.
|
||||
|
||||
> [!NOTE]
|
||||
> [**VMs**](vms/index.html)와 마찬가지로, Functions는 **1개의 시스템 할당** 관리 ID와 **여러 사용자 할당** 관리 ID를 가질 수 있으므로, 함수를 손상시키면 모든 관리 ID를 찾는 것이 항상 중요합니다. 하나의 Function에서 여러 관리 ID로 권한을 상승시킬 수 있습니다.
|
||||
> [**VMs**](vms/index.html)와 마찬가지로 Functions는 **1개의 시스템 할당** 관리되는 ID와 **여러 사용자 할당** 관리되는 ID를 가질 수 있으므로, 함수를 손상시키면 모든 관리되는 ID를 찾는 것이 항상 중요합니다. 하나의 Function에서 여러 관리되는 ID로 권한을 상승시킬 수 있습니다.
|
||||
>
|
||||
> 시스템 관리 ID가 사용되지 않고 하나 이상의 사용자 관리 ID가 함수에 연결된 경우, 기본적으로 토큰을 얻을 수 없습니다.
|
||||
> 시스템 관리 ID가 사용되지 않고 하나 이상의 사용자 관리 ID가 함수에 연결된 경우 기본적으로 토큰을 얻을 수 없습니다.
|
||||
|
||||
[**PEASS 스크립트**](https://github.com/peass-ng/PEASS-ng)를 사용하여 메타데이터 엔드포인트에서 기본 관리 ID의 토큰을 얻을 수 있습니다. 또는 다음과 같이 **수동으로** 얻을 수 있습니다:
|
||||
|
||||
{% embed url="https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#azure-vm" %}
|
||||
|
||||
함수가 연결된 모든 관리 ID를 **확인하는 방법을 찾아야** 하며, 이를 지정하지 않으면 메타데이터 엔드포인트는 **기본 ID만 사용**합니다(자세한 내용은 이전 링크를 확인하세요).
|
||||
함수가 연결된 **모든 관리되는 ID를 확인하는 방법**을 찾아야 합니다. 그렇지 않으면 메타데이터 엔드포인트는 **기본 ID만 사용**합니다(자세한 내용은 이전 링크를 확인하세요).
|
||||
|
||||
## 액세스 키
|
||||
|
||||
@@ -96,7 +96,7 @@ HTTP 트리거를 사용하여 함수 내에서 엔드포인트를 생성할 때
|
||||
|
||||
### 기본 인증
|
||||
|
||||
App Services와 마찬가지로, Functions는 **SCM** 및 **FTP**에 연결하여 코드를 배포하기 위해 Azure에서 제공하는 **사용자 이름과 비밀번호가 포함된 URL**을 사용하여 기본 인증을 지원합니다. 이에 대한 자세한 내용은:
|
||||
App Services와 마찬가지로 Functions는 **SCM** 및 **FTP**에 연결하여 코드를 배포하기 위해 Azure에서 제공하는 **사용자 이름과 비밀번호가 포함된 URL**을 사용하여 기본 인증을 지원합니다. 이에 대한 자세한 내용은:
|
||||
|
||||
{{#ref}}
|
||||
az-app-services.md
|
||||
@@ -104,7 +104,7 @@ az-app-services.md
|
||||
|
||||
### Github 기반 배포
|
||||
|
||||
함수가 Github 리포지토리에서 생성될 때 Azure 웹 콘솔은 **특정 리포지토리에서 Github Workflow를 자동으로 생성**할 수 있도록 하여 이 리포지토리가 업데이트될 때마다 함수의 코드가 업데이트됩니다. 실제로 파이썬 함수에 대한 Github Action yaml은 다음과 같습니다:
|
||||
함수가 Github 리포지토리에서 생성될 때 Azure 웹 콘솔은 **특정 리포지토리에서 자동으로 Github Workflow를 생성**할 수 있게 해주며, 이 리포지토리가 업데이트될 때마다 함수의 코드가 업데이트됩니다. 실제로 Python 함수에 대한 Github Action yaml은 다음과 같습니다:
|
||||
|
||||
<details>
|
||||
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
|
||||
## 기본 정보
|
||||
|
||||
Azure Logic Apps는 Microsoft Azure에서 제공하는 클라우드 기반 서비스로, 개발자가 **다양한 서비스**, 데이터 소스 및 애플리케이션을 통합하는 워크플로를 **생성하고 실행**할 수 있게 해줍니다. 이러한 워크플로는 **비즈니스 프로세스를 자동화**하고, 작업을 조정하며, 다양한 플랫폼 간 데이터 통합을 수행하도록 설계되었습니다.
|
||||
Azure Logic Apps는 Microsoft Azure에서 제공하는 클라우드 기반 서비스로, 개발자가 **다양한 서비스**, 데이터 소스 및 애플리케이션을 통합하는 워크플로를 **생성하고 실행**할 수 있게 해줍니다. 이러한 워크플로는 **비즈니스 프로세스를 자동화**하고, 작업을 조정하며, 다양한 플랫폼 간의 데이터 통합을 수행하도록 설계되었습니다.
|
||||
|
||||
Logic Apps는 **광범위한 사전 구축된 커넥터**를 사용하여 워크플로를 생성할 수 있는 시각적 디자이너를 제공하며, 이를 통해 Office 365, Dynamics CRM, Salesforce 등 다양한 서비스에 쉽게 연결하고 상호작용할 수 있습니다. 또한 특정 요구에 맞는 사용자 정의 커넥터를 생성할 수도 있습니다.
|
||||
Logic Apps는 **광범위한 사전 구축된 커넥터**를 사용하여 워크플로를 생성할 수 있는 시각적 디자이너를 제공하므로, Office 365, Dynamics CRM, Salesforce 등 다양한 서비스에 쉽게 연결하고 상호작용할 수 있습니다. 또한 특정 요구에 맞는 사용자 정의 커넥터를 생성할 수도 있습니다.
|
||||
|
||||
### 예시
|
||||
|
||||
@@ -38,8 +38,8 @@ curl -XPOST 'https://prod-44.westus.logic.azure.com:443/workflows/2d8de4be6e9741
|
||||
- **다중 테넌트**: 공유 컴퓨팅 리소스를 제공하며, 퍼블릭 클라우드에서 운영되고, 작업당 요금 모델을 따릅니다. 이는 경량 및 비용 효율적인 작업에 이상적입니다.
|
||||
* **표준**
|
||||
- **워크플로우 서비스 계획**: 네트워킹을 위한 VNET 통합이 있는 전용 컴퓨팅 리소스와 워크플로우 서비스 계획 인스턴스당 요금을 부과합니다. 이는 더 많은 제어가 필요한 요구가 많은 작업에 적합합니다.
|
||||
- **앱 서비스 환경 V3**: 완전한 격리 및 확장성을 갖춘 전용 컴퓨팅 리소스입니다. 네트워킹을 위해 VNET과 통합되며, 환경 내 앱 서비스 인스턴스를 기반으로 한 요금 모델을 사용합니다. 이는 높은 격리가 필요한 기업 규모의 애플리케이션에 이상적입니다.
|
||||
- **하이브리드**: 로컬 처리 및 다중 클라우드 지원을 위해 설계되었습니다. 고객 관리 컴퓨팅 리소스를 로컬 네트워크 접근과 함께 허용하며, Kubernetes 이벤트 기반 자동 확장(KEDA)을 활용합니다.
|
||||
- **앱 서비스 환경 V3**: 완전한 격리 및 확장성을 갖춘 전용 컴퓨팅 리소스입니다. 또한 네트워킹을 위해 VNET과 통합되며, 환경 내의 앱 서비스 인스턴스를 기반으로 한 요금 모델을 사용합니다. 이는 높은 격리가 필요한 기업 규모의 애플리케이션에 이상적입니다.
|
||||
- **하이브리드**: 로컬 처리 및 다중 클라우드 지원을 위해 설계되었습니다. 고객 관리형 컴퓨팅 리소스를 로컬 네트워크 접근과 함께 허용하며, Kubernetes 이벤트 기반 자동 확장(KEDA)을 활용합니다.
|
||||
|
||||
### 열거
|
||||
|
||||
@@ -251,7 +251,7 @@ Get-AzIntegrationAccountSchema -ResourceGroupName <resource-group-name> -Integra
|
||||
|
||||
## 권한 상승
|
||||
|
||||
로직 앱 권한 상승과 동일:
|
||||
로직 앱 권한 상승과 동일합니다:
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-logic-apps-privesc.md
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure MySQL
|
||||
Azure Database for MySQL은 MySQL Community Edition을 기반으로 하는 완전 관리형 관계형 데이터베이스 서비스로, 다양한 애플리케이션 요구에 대한 확장성, 보안 및 유연성을 제공합니다. 두 가지 배포 모델이 있습니다:
|
||||
Azure Database for MySQL는 MySQL Community Edition을 기반으로 한 완전 관리형 관계형 데이터베이스 서비스로, 다양한 애플리케이션 요구에 대한 확장성, 보안 및 유연성을 제공하도록 설계되었습니다. 두 가지 배포 모델이 있습니다:
|
||||
|
||||
* **Single Server** (은 퇴역 경로에 있음):
|
||||
- 비용 효율적이고 관리하기 쉬운 MySQL 배포를 위해 최적화됨.
|
||||
@@ -11,7 +11,7 @@ Azure Database for MySQL은 MySQL Community Edition을 기반으로 하는 완
|
||||
- 예측 가능한 작업 부하를 가진 애플리케이션에 적합.
|
||||
* **Flexible Server**:
|
||||
- 데이터베이스 관리 및 구성에 대한 더 많은 제어 제공.
|
||||
- 고가용성 지원 (동일 영역 및 영역 중복).
|
||||
- 고가용성 지원(동일 영역 및 영역 중복).
|
||||
- 탄력적 확장, 패치 관리 및 작업 부하 최적화 기능 포함.
|
||||
- 비용 절감을 위한 정지/시작 기능 제공.
|
||||
|
||||
@@ -97,7 +97,7 @@ Get-AzMySqlFlexibleServerLog -ResourceGroupName <resource-group-name> -ServerNam
|
||||
|
||||
### 연결
|
||||
|
||||
rdbms-connect 확장을 사용하여 데이터베이스에 액세스할 수 있습니다:
|
||||
rdbms-connect 확장을 사용하여 데이터베이스에 접근할 수 있습니다:
|
||||
```bash
|
||||
az mysql flexible-server connect -n <server-name> -u <username> -p <password> --interactive
|
||||
|
||||
@@ -147,7 +147,7 @@ az mysql flexible-server deploy run \
|
||||
|
||||
## 할 일
|
||||
|
||||
* mysql flexible-server ad-admin으로 접근할 방법을 찾아서 이것이 권한 상승 방법인지 확인하기
|
||||
* mysql flexible-server ad-admin에 접근할 방법을 찾아서 이것이 권한 상승 방법인지 확인하십시오.
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure PostgreSQL
|
||||
**Azure Database for PostgreSQL**는 **PostgreSQL** Community Edition을 기반으로 하는 완전 관리형 **관계형 데이터베이스 서비스**입니다. 다양한 애플리케이션 요구에 대한 확장성, 보안 및 유연성을 제공하도록 설계되었습니다. Azure MySQL과 유사하게 PostgreSQL은 두 가지 배포 모델을 제공합니다:
|
||||
**Azure Database for PostgreSQL**는 **PostgreSQL** 커뮤니티 에디션을 기반으로 하는 완전 관리형 **관계형 데이터베이스 서비스**입니다. 다양한 애플리케이션 요구에 대한 확장성, 보안 및 유연성을 제공하도록 설계되었습니다. Azure MySQL과 유사하게 PostgreSQL은 두 가지 배포 모델을 제공합니다:
|
||||
|
||||
* **Single Server** (퇴역 경로에 있음):
|
||||
- 간단하고 비용 효율적인 PostgreSQL 배포를 위해 최적화되었습니다.
|
||||
@@ -18,7 +18,7 @@
|
||||
### 주요 기능
|
||||
|
||||
* **사용자 정의 유지 관리 창**: 중단을 최소화하기 위해 업데이트를 예약합니다.
|
||||
* **활성 모니터링**: 데이터베이스 성능을 추적하고 개선하기 위한 자세한 메트릭 및 로그에 접근합니다.
|
||||
* **활성 모니터링**: 데이터베이스 성능을 추적하고 개선하기 위한 상세한 메트릭 및 로그에 접근합니다.
|
||||
* **서버 중지/시작**: 사용자가 서버를 중지하고 시작할 수 있습니다.
|
||||
* **자동 백업**: 최대 35일 동안 구성 가능한 보존 기간을 가진 내장된 일일 백업.
|
||||
* **역할 기반 접근**: Azure Active Directory를 통해 사용자 권한 및 관리 접근을 제어합니다.
|
||||
@@ -93,7 +93,7 @@ Get-AzPostgreSqlServer -ResourceGroupName <resource-group-name>
|
||||
|
||||
### 연결
|
||||
|
||||
rdbms-connect 확장을 사용하여 데이터베이스에 액세스할 수 있습니다:
|
||||
rdbms-connect 확장을 사용하여 데이터베이스에 접근할 수 있습니다:
|
||||
```bash
|
||||
az postgres flexible-server connect -n <server-name> -u <username> -p <password> --interactive
|
||||
|
||||
@@ -106,7 +106,7 @@ az postgres flexible-server execute \
|
||||
--querytext "SELECT * FROM <table-name>;"
|
||||
|
||||
```
|
||||
Or
|
||||
또는
|
||||
```bash
|
||||
psql -h testpostgresserver1994.postgres.database.azure.com -p 5432 -U adminuser <database-name>
|
||||
```
|
||||
|
||||
@@ -9,14 +9,14 @@ Azure Service Bus는 **애플리케이션의 다양한 부분 또는 별도의
|
||||
### Key Concepts
|
||||
|
||||
1. **Queues:** 그 목적은 수신자가 준비될 때까지 메시지를 저장하는 것입니다.
|
||||
- 메시지는 순서가 있으며, 타임스탬프가 찍히고, 내구성 있게 저장됩니다.
|
||||
- 메시지는 순서가 있으며, 타임스탬프가 찍히고, 내구성이 있게 저장됩니다.
|
||||
- 풀 모드(요청 시 검색)로 전달됩니다.
|
||||
- 포인트 투 포인트 통신을 지원합니다.
|
||||
2. **Topics:** 방송을 위한 게시-구독 메시징입니다.
|
||||
- 여러 독립적인 구독이 메시지의 복사본을 수신합니다.
|
||||
- 구독은 전달을 제어하거나 메타데이터를 추가하기 위한 규칙/필터를 가질 수 있습니다.
|
||||
- 다대다 통신을 지원합니다.
|
||||
3. **Namespaces:** 모든 메시징 구성 요소, 큐 및 주제를 위한 컨테이너로, 강력한 Azure 클러스터의 자신의 슬라이스와 같으며, 전용 용량을 제공하고 선택적으로 세 개의 가용성 영역에 걸쳐 확장할 수 있습니다.
|
||||
3. **Namespaces:** 모든 메시징 구성 요소, 큐 및 주제를 위한 컨테이너로, 강력한 Azure 클러스터의 자신의 조각과 같으며, 전용 용량을 제공하고 선택적으로 세 개의 가용성 영역에 걸쳐 확장할 수 있습니다.
|
||||
|
||||
### Advance Features
|
||||
|
||||
@@ -128,7 +128,6 @@ Get-AzServiceBusTopic -ResourceGroupName <ResourceGroupName> -NamespaceName <Nam
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
|
||||
### 권한 상승
|
||||
|
||||
{{#ref}}
|
||||
|
||||
@@ -40,17 +40,17 @@ Azure 가상 머신(VMs)은 유연하고, 필요에 따라 사용할 수 있는
|
||||
- VmAvailabilityMetric이 1 미만
|
||||
- **상태 모니터**: 기본적으로 포트 80에서 HTTP 프로토콜을 확인합니다.
|
||||
- **잠금**: VM을 잠가 읽기 전용(**ReadOnly** 잠금)으로 설정하거나 읽고 업데이트할 수 있지만 삭제할 수 없는(**CanNotDelete** 잠금) 상태로 설정할 수 있습니다.
|
||||
- 대부분의 VM 관련 리소스는 **잠금을 지원**합니다. 예: 디스크, 스냅샷...
|
||||
- 대부분의 VM 관련 리소스는 **디스크, 스냅샷** 등과 같은 잠금을 **지원합니다.**
|
||||
- 잠금은 **리소스 그룹 및 구독 수준**에서도 적용할 수 있습니다.
|
||||
|
||||
## 디스크 및 스냅샷
|
||||
|
||||
- **2개 이상의 VM에 디스크를 연결할 수 있도록 활성화**할 수 있습니다.
|
||||
- 기본적으로 모든 디스크는 **암호화**되어 있습니다.
|
||||
- **2개 이상의 VM에 디스크를 연결할 수 있도록 활성화할 수 있습니다.**
|
||||
- 기본적으로 모든 디스크는 **플랫폼 키로 암호화**됩니다.
|
||||
- 스냅샷에서도 동일합니다.
|
||||
- 기본적으로 모든 네트워크에서 **디스크를 공유**할 수 있지만 특정 **개인 접근**으로 **제한**하거나 **공개 및 개인 접근을 완전히 비활성화**할 수 있습니다.
|
||||
- 기본적으로 모든 네트워크에서 **디스크를 공유할 수 있지만**, 특정 **개인 접근**으로 **제한**하거나 **공개 및 개인 접근을 완전히 비활성화**할 수 있습니다.
|
||||
- 스냅샷에서도 동일합니다.
|
||||
- **디스크를 내보내기 위해 SAS URI**(최대 60일)를 **생성**할 수 있으며, 인증이 필요하도록 구성할 수 있습니다.
|
||||
- **디스크를 내보내기 위해 SAS URI**(최대 60일)를 **생성할 수 있으며**, 인증이 필요하도록 구성할 수 있습니다.
|
||||
- 스냅샷에서도 동일합니다.
|
||||
|
||||
{{#tabs}}
|
||||
@@ -189,11 +189,11 @@ Get-AzBastion
|
||||
|
||||
## 메타데이터
|
||||
|
||||
Azure 인스턴스 메타데이터 서비스(IMDS)는 **실행 중인 가상 머신 인스턴스에 대한 정보를 제공**하여 관리 및 구성에 도움을 줍니다. SKU, 스토리지, 네트워크 구성 및 예정된 유지 관리 이벤트에 대한 정보와 같은 세부 정보를 제공하며, **비라우터 IP 주소 169.254.169.254**에서 사용할 수 있는 REST API를 통해 접근할 수 있으며, 이는 VM 내에서만 접근 가능합니다. VM과 IMDS 간의 통신은 호스트 내에서 이루어져 안전한 접근을 보장합니다. IMDS를 쿼리할 때, VM 내의 HTTP 클라이언트는 적절한 통신을 보장하기 위해 웹 프록시를 우회해야 합니다.
|
||||
Azure 인스턴스 메타데이터 서비스(IMDS)는 **실행 중인 가상 머신 인스턴스에 대한 정보를 제공**하여 관리 및 구성에 도움을 줍니다. SKU, 스토리지, 네트워크 구성 및 예정된 유지 관리 이벤트에 대한 정보와 같은 세부정보를 제공하며, **비라우터 IP 주소 169.254.169.254**에서 사용할 수 있는 REST API를 통해 접근할 수 있으며, 이는 VM 내에서만 접근 가능합니다. VM과 IMDS 간의 통신은 호스트 내에서 이루어져 안전한 접근을 보장합니다. IMDS를 쿼리할 때, VM 내의 HTTP 클라이언트는 적절한 통신을 보장하기 위해 웹 프록시를 우회해야 합니다.
|
||||
|
||||
또한, 메타데이터 엔드포인트에 연락하기 위해 HTTP 요청에는 **`Metadata: true`** 헤더가 있어야 하며 **`X-Forwarded-For`** 헤더는 없어야 합니다.
|
||||
|
||||
어떻게 열거하는지 확인하세요:
|
||||
다음에서 이를 열거하는 방법을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#azure-vm
|
||||
@@ -559,7 +559,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
|
||||
|
||||
<summary>DesiredStateConfiguration (DSC)</summary>
|
||||
|
||||
이것은 Microsoft에 속하는 **VM 확장**으로, Azure Windows VM의 구성을 관리하기 위해 PowerShell DSC를 사용합니다. 따라서 이 확장을 통해 Windows VM에서 **임의의 명령을 실행**하는 데 사용할 수 있습니다:
|
||||
이것은 Azure Windows VM의 구성을 관리하기 위해 PowerShell DSC를 사용하는 Microsoft의 **VM 확장**입니다. 따라서 이 확장을 통해 Windows VM에서 **임의의 명령을 실행**하는 데 사용할 수 있습니다:
|
||||
```bash
|
||||
# Content of revShell.ps1
|
||||
Configuration RevShellConfig {
|
||||
@@ -633,7 +633,7 @@ az sig gallery-application list --gallery-name <gallery-name> --resource-group <
|
||||
새로운 애플리케이션 설치 방법은 [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli)에서 확인하세요.
|
||||
|
||||
> [!CAUTION]
|
||||
> **개별 앱과 갤러리를 다른 구독이나 테넌트와 공유하는 것이 가능합니다**. 이는 공격자가 애플리케이션에 백도어를 설치하고 다른 구독 및 테넌트로 이동할 수 있게 할 수 있기 때문에 매우 흥미롭습니다.
|
||||
> **개별 앱과 갤러리를 다른 구독이나 테넌트와 공유하는 것이 가능합니다**. 이는 공격자가 애플리케이션에 백도어를 설치하고 다른 구독 및 테넌트로 이동할 수 있게 해줄 수 있기 때문에 매우 흥미롭습니다.
|
||||
|
||||
하지만 **vm 앱을 위한 "마켓플레이스"는 존재하지 않습니다**. 확장 프로그램을 위한 마켓플레이스와는 다릅니다.
|
||||
|
||||
@@ -729,17 +729,17 @@ az vm application set \
|
||||
|
||||
### 사용자 데이터
|
||||
|
||||
이것은 언제든지 메타데이터 엔드포인트에서 검색할 수 있는 **지속적인 데이터**입니다. Azure에서 사용자 데이터는 AWS 및 GCP와 다르다는 점에 유의하세요. **여기에 스크립트를 배치하면 기본적으로 실행되지 않습니다**.
|
||||
이것은 **지속적인 데이터**로, 메타데이터 엔드포인트에서 언제든지 검색할 수 있습니다. Azure에서 사용자 데이터는 AWS 및 GCP와 다르다는 점에 유의하세요. **여기에 스크립트를 배치하면 기본적으로 실행되지 않습니다**.
|
||||
|
||||
### 사용자 정의 데이터
|
||||
|
||||
예상 경로에 저장될 데이터를 VM에 전달하는 것이 가능합니다:
|
||||
|
||||
- **Windows**에서는 사용자 정의 데이터가 `%SYSTEMDRIVE%\AzureData\CustomData.bin`에 이진 파일로 배치되며 처리되지 않습니다.
|
||||
- **Windows**에서는 사용자 정의 데이터가 `%SYSTEMDRIVE%\AzureData\CustomData.bin`에 이진 파일로 저장되며 처리되지 않습니다.
|
||||
- **Linux**에서는 `/var/lib/waagent/ovf-env.xml`에 저장되었고 현재는 `/var/lib/waagent/CustomData/ovf-env.xml`에 저장됩니다.
|
||||
- **Linux 에이전트**: 기본적으로 사용자 정의 데이터를 처리하지 않으며, 데이터가 활성화된 사용자 정의 이미지가 필요합니다.
|
||||
- **cloud-init:** 기본적으로 사용자 정의 데이터를 처리하며 이 데이터는 [**여러 형식**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html)일 수 있습니다. 사용자 정의 데이터에 스크립트만 보내면 쉽게 스크립트를 실행할 수 있습니다.
|
||||
- Ubuntu와 Debian이 여기에서 제공한 스크립트를 실행하는 것을 확인했습니다.
|
||||
- Ubuntu와 Debian이 여기에 넣은 스크립트를 실행하는 것을 확인했습니다.
|
||||
- 이 스크립트가 실행되기 위해 사용자 데이터를 활성화할 필요도 없습니다.
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
@@ -9,7 +9,7 @@ Azure는 사용자가 Azure 클라우드 내에서 **격리된** **네트워크*
|
||||
|
||||
## 가상 네트워크(VNET) 및 서브넷
|
||||
|
||||
Azure 가상 네트워크(VNet)는 클라우드에서 자신의 네트워크를 나타내며, 구독에 전념하는 Azure 환경 내에서 **논리적 격리**를 제공합니다. VNet은 Azure에서 가상 사설 네트워크(VPN)를 프로비저닝하고 관리할 수 있게 하며, 가상 머신(VM), 데이터베이스 및 애플리케이션 서비스와 같은 리소스를 호스팅합니다. 이들은 IP 주소 범위, 서브넷 생성, 라우트 테이블 및 네트워크 게이트웨이를 포함한 **네트워크 설정에 대한 완전한 제어**를 제공합니다.
|
||||
Azure 가상 네트워크(VNet)는 클라우드에서 귀하의 네트워크를 나타내며, 귀하의 구독에 전념하는 Azure 환경 내에서 **논리적 격리**를 제공합니다. VNet은 Azure에서 가상 사설 네트워크(VPN)를 프로비저닝하고 관리할 수 있게 하며, 가상 머신(VM), 데이터베이스 및 애플리케이션 서비스와 같은 리소스를 호스팅합니다. 이들은 IP 주소 범위, 서브넷 생성, 라우트 테이블 및 네트워크 게이트웨이를 포함한 **네트워크 설정에 대한 완전한 제어**를 제공합니다.
|
||||
|
||||
**서브넷**은 특정 **IP 주소 범위**로 정의된 VNet 내의 세분화입니다. VNet을 여러 서브넷으로 분할함으로써 네트워크 아키텍처에 따라 리소스를 조직하고 보호할 수 있습니다.\
|
||||
기본적으로 동일한 Azure 가상 네트워크(VNet) 내의 모든 서브넷은 **서로 통신할 수 있습니다**.
|
||||
@@ -22,7 +22,7 @@ Azure 가상 네트워크(VNet)는 클라우드에서 자신의 네트워크를
|
||||
|
||||
### 열거
|
||||
|
||||
Azure 계정의 모든 VNet 및 서브넷을 나열하려면 Azure Command-Line Interface (CLI)를 사용할 수 있습니다. 다음은 단계입니다:
|
||||
Azure 계정의 모든 VNet 및 서브넷을 나열하려면 Azure 명령줄 인터페이스(CLI)를 사용할 수 있습니다. 다음은 단계입니다:
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="az cli" }}
|
||||
@@ -91,19 +91,19 @@ Get-AzNetworkSecurityGroup -Name <NSGName> -ResourceGroupName <ResourceGroupName
|
||||
|
||||
## Azure Firewall
|
||||
|
||||
Azure Firewall는 클라우드 리소스를 보호하기 위해 트래픽을 검사하고 제어하는 **관리형 네트워크 보안 서비스**입니다. 이는 **상태 저장 방화벽**으로, Layer 3에서 7까지의 규칙에 따라 트래픽을 필터링하며, **Azure 내**(동서 트래픽) 및 **외부 네트워크와의**(남북 트래픽) 통신을 지원합니다. **가상 네트워크(VNet) 수준**에서 배포되어 VNet의 모든 서브넷에 대한 중앙 집중식 보호를 제공합니다. Azure Firewall은 트래픽 수요를 처리하기 위해 자동으로 확장되며, 수동 설정 없이 높은 가용성을 보장합니다.
|
||||
Azure Firewall는 클라우드 리소스를 보호하기 위해 트래픽을 검사하고 제어하는 **관리형 네트워크 보안 서비스**입니다. 이는 **상태 저장 방화벽**으로, Layer 3에서 7까지의 규칙에 따라 트래픽을 필터링하며, **Azure 내**(동서 트래픽) 및 **외부 네트워크와의 통신**(남북 트래픽)을 지원합니다. **가상 네트워크(VNet) 수준**에 배포되어 VNet의 모든 서브넷에 대한 중앙 집중식 보호를 제공합니다. Azure Firewall은 트래픽 수요에 맞게 자동으로 확장되며, 수동 설정 없이 높은 가용성을 보장합니다.
|
||||
|
||||
세 가지 SKU—**Basic**, **Standard**, **Premium**—로 제공되며, 각각 특정 고객 요구에 맞춰져 있습니다:
|
||||
세 가지 SKU—**Basic**, **Standard**, **Premium**—로 제공되며, 각각 특정 고객 요구에 맞춰 조정됩니다:
|
||||
|
||||
| Criteria/Feature | Option 1 | Option 2 | Option 3 |
|
||||
| ------------------------------ | ------------------------------------------------- | ------------------------------------------- | --------------------------------------------------------- |
|
||||
| **추천 사용 사례** | 제한된 요구를 가진 중소기업(SMB) | 일반 기업 사용, Layer 3–7 필터링 | 매우 민감한 환경(예: 결제 처리) |
|
||||
| **성능** | 최대 250 Mbps 처리량 | 최대 30 Gbps 처리량 | 최대 100 Gbps 처리량 |
|
||||
| **위협 인텔리전스** | 경고만 제공 | 경고 및 차단(악성 IP/도메인) | 경고 및 차단(고급 위협 인텔리전스) |
|
||||
| **L3–L7 필터링** | 기본 필터링 | 프로토콜 전반에 걸친 상태 저장 필터링 | 고급 검사를 통한 상태 저장 필터링 |
|
||||
| **고급 위협 보호** | 사용 불가 | 위협 인텔리전스 기반 필터링 | 침입 탐지 및 방지 시스템(IDPS) 포함 |
|
||||
| **TLS 검사** | 사용 불가 | 사용 불가 | 수신/발신 TLS 종료 지원 |
|
||||
| **가용성** | 고정 백엔드(2 VM) | 자동 확장 | 자동 확장 |
|
||||
| **L3–L7 필터링** | 기본 필터링 | 프로토콜 전반에 걸친 상태 저장 필터링 | 고급 검사를 통한 상태 저장 필터링 |
|
||||
| **고급 위협 보호** | 사용 불가 | 위협 인텔리전스 기반 필터링 | 침입 탐지 및 방지 시스템(IDPS) 포함 |
|
||||
| **TLS 검사** | 사용 불가 | 사용 불가 | 인바운드/아웃바운드 TLS 종료 지원 |
|
||||
| **가용성** | 고정 백엔드(2 VMs) | 자동 확장 | 자동 확장 |
|
||||
| **관리 용이성** | 기본 제어 | 방화벽 관리자 통해 관리 | 방화벽 관리자 통해 관리 |
|
||||
|
||||
### Enumeration
|
||||
@@ -143,7 +143,7 @@ Get-AzFirewall
|
||||
|
||||
## Azure Route Tables
|
||||
|
||||
Azure **Route Tables**는 서브넷 내에서 네트워크 트래픽의 라우팅을 제어하는 데 사용됩니다. 이들은 패킷이 Azure 리소스, 인터넷 또는 Virtual Appliance나 Azure Firewall과 같은 특정 다음 홉으로 어떻게 전달되어야 하는지를 지정하는 규칙을 정의합니다. 라우트 테이블을 **서브넷**과 연결할 수 있으며, 해당 서브넷 내의 모든 리소스는 테이블의 경로를 따릅니다.
|
||||
Azure **Route Tables**는 서브넷 내에서 네트워크 트래픽의 라우팅을 제어하는 데 사용됩니다. 이들은 패킷이 Azure 리소스, 인터넷 또는 Virtual Appliance나 Azure Firewall과 같은 특정 다음 홉으로 전달되는 방법을 지정하는 규칙을 정의합니다. 라우트 테이블을 **서브넷**과 연결할 수 있으며, 해당 서브넷 내의 모든 리소스는 테이블의 경로를 따릅니다.
|
||||
|
||||
**예:** 서브넷이 검사를 위해 Network Virtual Appliance (NVA)를 통해 아웃바운드 트래픽을 라우팅해야 하는 리소스를 호스팅하는 경우, 라우트 테이블에 **라우트**를 생성하여 모든 트래픽(예: `0.0.0.0/0`)을 NVA의 개인 IP 주소로 다음 홉으로 리디렉션할 수 있습니다.
|
||||
|
||||
@@ -208,7 +208,7 @@ Get-AzPrivateEndpoint | Select-Object Name, Location, ResourceGroupName, Private
|
||||
|
||||
## Azure Service Endpoints
|
||||
|
||||
Azure Service Endpoints는 가상 네트워크의 개인 주소 공간과 VNet의 ID를 Azure 서비스에 직접 연결하여 확장합니다. 서비스 엔드포인트를 활성화하면, **VNet의 리소스가 Azure의 백본 네트워크를 사용하여 Azure 서비스에 안전하게 연결할 수 있습니다**. 이는 **VNet에서 Azure 서비스로의 트래픽이 Azure 네트워크 내에 유지되도록 보장하여** 보다 안전하고 신뢰할 수 있는 경로를 제공합니다.
|
||||
Azure Service Endpoints는 가상 네트워크의 개인 주소 공간과 VNet의 ID를 Azure 서비스에 직접 연결하여 확장합니다. 서비스 엔드포인트를 활성화하면, **VNet의 리소스가 Azure의 백본 네트워크를 사용하여 Azure 서비스에 안전하게 연결할 수 있습니다**. 이는 **VNet에서 Azure 서비스로의 트래픽이 Azure 네트워크 내에 유지되도록 하여**, 보다 안전하고 신뢰할 수 있는 경로를 제공합니다.
|
||||
|
||||
**예시:**
|
||||
|
||||
@@ -239,7 +239,7 @@ Get-AzVirtualNetwork
|
||||
|
||||
### 서비스 엔드포인트와 프라이빗 링크의 차이
|
||||
|
||||
Microsoft는 [**docs**](https://learn.microsoft.com/en-us/azure/virtual-network/vnet-integration-for-azure-services#compare-private-endpoints-and-service-endpoints)에서 프라이빗 링크 사용을 권장합니다:
|
||||
Microsoft는 [**문서**](https://learn.microsoft.com/en-us/azure/virtual-network/vnet-integration-for-azure-services#compare-private-endpoints-and-service-endpoints)에서 프라이빗 링크 사용을 권장합니다:
|
||||
|
||||
<figure><img src="../../../../images/image (25).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@@ -256,7 +256,7 @@ Microsoft는 [**docs**](https://learn.microsoft.com/en-us/azure/virtual-network/
|
||||
- 프라이빗 링크는 Azure 서비스를 VNet 내의 프라이빗 엔드포인트를 통해 매핑하며, 이는 VNet 내의 프라이빗 IP 주소를 가진 네트워크 인터페이스입니다.
|
||||
- Azure 서비스는 이 프라이빗 IP 주소를 사용하여 접근되며, 마치 네트워크의 일부인 것처럼 보입니다.
|
||||
- 프라이빗 링크를 통해 연결된 서비스는 VNet 또는 연결된 네트워크에서만 접근할 수 있으며, 서비스에 대한 공용 인터넷 접근은 없습니다.
|
||||
- Azure 서비스 또는 Azure에 호스팅된 자체 서비스에 대한 안전한 연결을 가능하게 하며, 다른 사람들이 공유하는 서비스에 대한 연결도 제공합니다.
|
||||
- Azure 서비스 또는 Azure에 호스팅된 자체 서비스에 대한 안전한 연결을 가능하게 하며, 다른 사람이 공유하는 서비스에 대한 연결도 제공합니다.
|
||||
- 서비스 엔드포인트와 달리 VNet 내의 프라이빗 엔드포인트를 통해 더 세분화된 접근 제어를 제공합니다.
|
||||
|
||||
요약하자면, 서비스 엔드포인트와 프라이빗 링크 모두 Azure 서비스에 대한 안전한 연결을 제공하지만, **프라이빗 링크는 서비스를 공용 인터넷에 노출하지 않고 프라이빗하게 접근하도록 보장함으로써 더 높은 수준의 격리와 보안을 제공합니다**. 반면 서비스 엔드포인트는 VNet 내에서 프라이빗 IP가 필요 없는 일반적인 경우에 Azure 서비스에 대한 간단하고 안전한 접근을 설정하기가 더 쉽습니다.
|
||||
@@ -300,7 +300,7 @@ Azure Application Gateway는 **웹 트래픽 로드 밸런서**로, **웹** 애
|
||||
|
||||
**예시:**
|
||||
|
||||
사용자 계정 및 결제 처리와 같은 다양한 기능을 위한 여러 하위 도메인을 포함하는 전자상거래 웹사이트가 있다고 가정해 보십시오. Azure Application Gateway는 **URL 경로에 따라 적절한 웹 서버로 트래픽을 라우팅**할 수 있습니다. 예를 들어, `example.com/accounts`로의 트래픽은 사용자 계정 서비스로, `example.com/pay`로의 트래픽은 결제 처리 서비스로 라우팅될 수 있습니다.\
|
||||
사용자 계정 및 결제 처리와 같은 다양한 기능을 위한 여러 하위 도메인을 포함하는 전자 상거래 웹사이트가 있다고 가정해 보십시오. Azure Application Gateway는 **URL 경로에 따라 적절한 웹 서버로 트래픽을 라우팅**할 수 있습니다. 예를 들어, `example.com/accounts`로의 트래픽은 사용자 계정 서비스로, `example.com/pay`로의 트래픽은 결제 처리 서비스로 라우팅될 수 있습니다.\
|
||||
그리고 **WAF 기능을 사용하여 웹사이트를 공격으로부터 보호합니다.**
|
||||
|
||||
### **열거**
|
||||
@@ -322,12 +322,12 @@ az network application-gateway waf-config list --gateway-name <AppGatewayName> -
|
||||
|
||||
## Azure Hub, Spoke & VNet Peering
|
||||
|
||||
**VNet Peering**는 Azure의 네트워킹 기능으로 **서로 다른 가상 네트워크(VNet)를 직접적으로 원활하게 연결할 수 있게 해줍니다**. VNet 피어링을 통해 한 VNet의 리소스는 **마치 같은 네트워크에 있는 것처럼** 다른 VNet의 리소스와 개인 IP 주소를 사용하여 통신할 수 있습니다.\
|
||||
**VNet Peering**는 Azure의 네트워킹 기능으로 **서로 다른 가상 네트워크(VNet)를 직접적이고 원활하게 연결할 수 있게 해줍니다**. VNet 피어링을 통해 한 VNet의 리소스는 **마치 같은 네트워크에 있는 것처럼** 다른 VNet의 리소스와 개인 IP 주소를 사용하여 통신할 수 있습니다.\
|
||||
**VNet Peering은 온프레미스 네트워크와도 사용할 수 있으며**, 사이트 간 VPN 또는 Azure ExpressRoute를 설정하여 가능합니다.
|
||||
|
||||
**Azure Hub and Spoke**는 Azure에서 네트워크 트래픽을 관리하고 조직하는 데 사용되는 네트워크 토폴로지입니다. **"허브"는 서로 다른 "스포크" 간의 트래픽을 제어하고 라우팅하는 중앙 지점입니다**. 허브는 일반적으로 네트워크 가상 장치(NVA), Azure VPN Gateway, Azure Firewall 또는 Azure Bastion과 같은 공유 서비스를 포함합니다. **"스포크"는 워크로드를 호스팅하고 VNet 피어링을 사용하여 허브에 연결되는 VNet입니다**, 이를 통해 허브 내의 공유 서비스를 활용할 수 있습니다. 이 모델은 여러 VNet에 걸쳐 있는 여러 워크로드가 사용할 수 있는 공통 서비스를 중앙 집중화하여 복잡성을 줄이고 깔끔한 네트워크 레이아웃을 촉진합니다.
|
||||
|
||||
> [!CAUTION] > **Azure에서 VNET 피어링은 비전이전적입니다**, 즉 스포크 1이 스포크 2에 연결되고 스포크 2가 스포크 3에 연결되어 있더라도 스포크 1은 스포크 3과 직접 통신할 수 없습니다.
|
||||
> [!CAUTION] > **Azure에서 VNET 피어링은 비전이적입니다**, 즉 스포크 1이 스포크 2에 연결되고 스포크 2가 스포크 3에 연결되어 있더라도 스포크 1은 스포크 3과 직접 통신할 수 없습니다.
|
||||
|
||||
**예시:**
|
||||
|
||||
@@ -364,7 +364,7 @@ Get-AzFirewall
|
||||
|
||||
## Site-to-Site VPN
|
||||
|
||||
Azure의 Site-to-Site VPN은 **온프레미스 네트워크를 Azure Virtual Network (VNet)**에 연결하여 Azure 내의 VM과 같은 리소스가 로컬 네트워크에 있는 것처럼 보이게 합니다. 이 연결은 **두 네트워크 간의 트래픽을 암호화하는 VPN 게이트웨이를 통해 설정됩니다**.
|
||||
Azure의 Site-to-Site VPN은 **온프레미스 네트워크를 Azure 가상 네트워크(VNet)에 연결**할 수 있게 해주며, Azure 내의 VM과 같은 리소스가 로컬 네트워크에 있는 것처럼 보이게 합니다. 이 연결은 **두 네트워크 간의 트래픽을 암호화하는 VPN 게이트웨이를 통해 설정됩니다.**
|
||||
|
||||
**예시:**
|
||||
|
||||
@@ -395,11 +395,11 @@ Get-AzVirtualNetworkGatewayConnection -ResourceGroupName <ResourceGroupName>
|
||||
|
||||
## Azure ExpressRoute
|
||||
|
||||
Azure ExpressRoute는 **온프레미스 인프라와 Azure 데이터 센터 간의 개인 전용 고속 연결을 제공하는 서비스**입니다. 이 연결은 연결 제공자를 통해 이루어지며, 공용 인터넷을 우회하여 일반 인터넷 연결보다 더 높은 신뢰성, 더 빠른 속도, 더 낮은 대기 시간 및 더 높은 보안을 제공합니다.
|
||||
Azure ExpressRoute는 **온프레미스 인프라와 Azure 데이터 센터 간의 개인적이고 전용의 고속 연결을 제공하는 서비스**입니다. 이 연결은 연결 제공자를 통해 이루어지며, 공용 인터넷을 우회하여 일반 인터넷 연결보다 더 높은 신뢰성, 더 빠른 속도, 더 낮은 대기 시간 및 더 높은 보안을 제공합니다.
|
||||
|
||||
**예시:**
|
||||
|
||||
다국적 기업은 **데이터 양이 많고 높은 처리량이 필요하기 때문에 Azure 서비스에 대한 일관되고 신뢰할 수 있는 연결**이 필요합니다. 이 회사는 온프레미스 데이터 센터를 Azure에 직접 연결하기 위해 Azure ExpressRoute를 선택하여, 일일 백업 및 실시간 데이터 분석과 같은 대규모 데이터 전송을 향상된 개인 정보 보호 및 속도로 용이하게 합니다.
|
||||
다국적 기업은 **데이터의 높은 양과 높은 처리량의 필요성으로 인해 Azure 서비스에 대한 일관되고 신뢰할 수 있는 연결**이 필요합니다. 이 회사는 Azure ExpressRoute를 선택하여 온프레미스 데이터 센터를 Azure에 직접 연결하여 일일 백업 및 실시간 데이터 분석과 같은 대규모 데이터 전송을 촉진하며, 향상된 개인 정보 보호 및 속도를 제공합니다.
|
||||
|
||||
### **Enumeration**
|
||||
|
||||
|
||||
+13
-13
@@ -17,23 +17,23 @@ Pod의 보안 컨텍스트를 지정할 때 여러 속성을 사용할 수 있
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroup</strong></a><br><em>정수</em></p> | <p><strong>모든 컨테이너에 적용되는 특별 보조 그룹</strong>. 일부 볼륨 유형은 Kubelet이 해당 볼륨의 소유권을 Pod에 의해 소유되도록 <strong>변경</strong>할 수 있게 합니다:<br>1. 소유 GID는 FSGroup이 됩니다.<br>2. setgid 비트가 설정됩니다 (볼륨에서 생성된 새 파일은 FSGroup에 의해 소유됩니다).<br>3. 권한 비트는 rw-rw----와 OR 연산됩니다. 설정되지 않으면 Kubelet은 볼륨의 소유권 및 권한을 수정하지 않습니다.</p> |
|
||||
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroupChangePolicy</strong></a><br><em>문자열</em></p> | Pod 내부에서 노출되기 전에 **볼륨의 소유권 및 권한을 변경하는** 동작을 정의합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsGroup</strong></a><br><em>정수</em></p> | 컨테이너 프로세스의 **진입점 실행을 위한 GID**. 설정되지 않으면 런타임 기본값을 사용합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsGroup</strong></a><br><em>정수</em></p> | **컨테이너 프로세스의 진입점 실행을 위한 GID**. 설정되지 않으면 런타임 기본값을 사용합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>부울</em></p> | 컨테이너가 비루트 사용자로 실행되어야 함을 나타냅니다. true인 경우 Kubelet은 런타임에서 이미지를 검증하여 UID 0(루트)로 실행되지 않도록 하며, 그렇다면 컨테이너 시작에 실패합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsUser</strong></a><br><em>정수</em></p> | 컨테이너 프로세스의 **진입점 실행을 위한 UID**. 지정되지 않으면 이미지 메타데이터에 지정된 사용자로 기본값을 설정합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>에 대한 더 많은 정보</em> <em><strong>seLinux</strong></em></p> | 모든 컨테이너에 적용될 **SELinux 컨텍스트**. 지정되지 않으면 컨테이너 런타임은 각 컨테이너에 대해 무작위 SELinux 컨텍스트를 할당합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a><br><em>에 대한 더 많은 정보</em> <em><strong>Seccomp</strong></em></p> | 이 Pod의 컨테이너에서 사용할 **seccomp 옵션**. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>supplementalGroups</strong></a><br><em>정수 배열</em></p> | 각 컨테이너에서 실행되는 첫 번째 프로세스에 적용되는 **그룹 목록**, 컨테이너의 기본 GID 외에 추가로. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>sysctls</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#sysctl-v1-core"><em>Sysctl</em></a> <em>배열</em><br><em>에 대한 더 많은 정보</em> <a href="https://www.garron.me/en/go2linux/sysctl-linux.html"><em><strong>sysctls</strong></em></a></p> | Sysctls는 **Pod에 사용되는 네임스페이스가 있는 sysctls 목록**을 보유합니다. 지원되지 않는 sysctls가 있는 Pods(컨테이너 런타임에 의해)는 시작에 실패할 수 있습니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsUser</strong></a><br><em>정수</em></p> | **컨테이너 프로세스의 진입점 실행을 위한 UID**. 지정되지 않으면 이미지 메타데이터에 지정된 사용자로 기본값을 설정합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>에 대한 더 많은 정보</em> <em><strong>seLinux</strong></em></p> | **모든 컨테이너에 적용될 SELinux 컨텍스트**. 지정되지 않으면 컨테이너 런타임이 각 컨테이너에 대해 무작위 SELinux 컨텍스트를 할당합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a><br><em>에 대한 더 많은 정보</em> <em><strong>Seccomp</strong></em></p> | 이 Pod의 **컨테이너에서 사용할 seccomp 옵션**. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>supplementalGroups</strong></a><br><em>정수 배열</em></p> | **각 컨테이너에서 실행되는 첫 번째 프로세스에 적용되는 그룹 목록**, 컨테이너의 기본 GID 외에 추가로. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>sysctls</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#sysctl-v1-core"><em>Sysctl</em></a> <em>배열</em><br><em>에 대한 더 많은 정보</em> <a href="https://www.garron.me/en/go2linux/sysctl-linux.html"><em><strong>sysctls</strong></em></a></p> | Sysctls는 **Pod에 사용되는 네임스페이스가 있는 sysctls 목록**을 보유합니다. 지원되지 않는 sysctls가 있는 Pod(컨테이너 런타임에 의해)는 시작에 실패할 수 있습니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p> | 모든 컨테이너에 적용되는 Windows 특정 설정. 지정되지 않으면 컨테이너의 SecurityContext 내의 옵션이 사용됩니다. |
|
||||
|
||||
## SecurityContext
|
||||
|
||||
[**문서에서:**](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core)
|
||||
|
||||
이 컨텍스트는 **컨테이너 정의** 내부에 설정됩니다. 방어적 보안 관점에서 고려해야 할 사항은 다음과 같습니다:
|
||||
이 컨텍스트는 **컨테이너 정의** 내에서 설정됩니다. 방어적 보안 관점에서 고려해야 할 사항은 다음과 같습니다:
|
||||
|
||||
- **allowPrivilegeEscalation**을 **False**로 설정
|
||||
- 민감한 **capabilities**를 추가하지 않음(필요 없는 것 제거)
|
||||
- 민감한 **capabilities**를 추가하지 않음(필요 없는 것들은 제거)
|
||||
- **privileged**를 **False**로 설정
|
||||
- 가능하다면 **readOnlyFilesystem**을 **True**로 설정
|
||||
- **runAsNonRoot**를 **True**로 설정하고 **runAsUser**를 설정
|
||||
@@ -42,16 +42,16 @@ Pod의 보안 컨텍스트를 지정할 때 여러 속성을 사용할 수 있
|
||||
|
||||
**SecurityContext와 PodSecurityContext** 모두에 설정된 속성은 **SecurityContext**에 지정된 값이 **우선**합니다.
|
||||
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>allowPrivilegeEscalation</strong></a><br><em>부울</em></p> | **AllowPrivilegeEscalation**은 프로세스가 부모 프로세스보다 **더 많은 권한을 얻을 수 있는지** 제어합니다. 이 bool은 컨테이너 프로세스에서 no_new_privs 플래그가 설정될지 여부를 직접 제어합니다. AllowPrivilegeEscalation은 컨테이너가 **Privileged**로 실행되거나 **CAP_SYS_ADMIN**을 가질 때 항상 true입니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>allowPrivilegeEscalation</strong></a><br><em>부울</em></p> | **AllowPrivilegeEscalation**은 프로세스가 부모 프로세스보다 **더 많은 권한을 얻을 수 있는지** 제어합니다. 이 bool은 컨테이너 프로세스에 no_new_privs 플래그가 설정될지 여부를 직접 제어합니다. AllowPrivilegeEscalation은 컨테이너가 **Privileged**로 실행되거나 **CAP_SYS_ADMIN**을 가질 때 항상 true입니다. |
|
||||
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>capabilities</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#capabilities-v1-core"><em>Capabilities</em></a><br><em>에 대한 더 많은 정보</em> <em><strong>Capabilities</strong></em></p> | 컨테이너 실행 시 **추가/제거할 수 있는 권한**. 기본적으로 기본 권한 세트를 사용합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>capabilities</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#capabilities-v1-core"><em>Capabilities</em></a><br><em>에 대한 더 많은 정보</em> <em><strong>Capabilities</strong></em></p> | **컨테이너 실행 시 추가/제거할 수 있는 capabilities**. 기본적으로 기본 capabilities 세트를 사용합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>privileged</strong></a><br><em>부울</em></p> | 특권 모드에서 컨테이너를 실행합니다. 특권 컨테이너의 프로세스는 본질적으로 **호스트의 루트와 동등합니다**. 기본값은 false입니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>procMount</strong></a><br><em>문자열</em></p> | procMount는 **컨테이너에 사용할 proc 마운트의 유형**을 나타냅니다. 기본값은 DefaultProcMount로, 읽기 전용 경로 및 마스킹된 경로에 대한 컨테이너 런타임 기본값을 사용합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>readOnlyRootFilesystem</strong></a><br><em>부울</em></p> | 이 **컨테이너가 읽기 전용 루트 파일 시스템을 가지고 있는지** 여부. 기본값은 false입니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsGroup</strong></a><br><em>정수</em></p> | 컨테이너 프로세스의 **진입점 실행을 위한 GID**. 설정되지 않으면 런타임 기본값을 사용합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsGroup</strong></a><br><em>정수</em></p> | **컨테이너 프로세스의 진입점을 실행하기 위한 GID**. 설정되지 않으면 런타임 기본값을 사용합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>부울</em></p> | 컨테이너가 **비루트 사용자로 실행되어야 함**을 나타냅니다. true인 경우 Kubelet은 런타임에서 이미지를 검증하여 UID 0(루트)로 실행되지 않도록 하며, 그렇다면 컨테이너 시작에 실패합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsUser</strong></a><br><em>정수</em></p> | 컨테이너 프로세스의 **진입점 실행을 위한 UID**. 지정되지 않으면 이미지 메타데이터에 지정된 사용자로 기본값을 설정합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>에 대한 더 많은 정보</em> <em><strong>seLinux</strong></em></p> | 컨테이너에 적용될 **SELinux 컨텍스트**. 지정되지 않으면 컨테이너 런타임은 각 컨테이너에 대해 무작위 SELinux 컨텍스트를 할당합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsUser</strong></a><br><em>정수</em></p> | **컨테이너 프로세스의 진입점을 실행하기 위한 UID**. 지정되지 않으면 이미지 메타데이터에 지정된 사용자로 기본값을 설정합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>에 대한 더 많은 정보</em> <em><strong>seLinux</strong></em></p> | **컨테이너에 적용될 SELinux 컨텍스트**. 지정되지 않으면 컨테이너 런타임이 각 컨테이너에 대해 무작위 SELinux 컨텍스트를 할당합니다. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a></p> | 이 컨테이너에서 사용할 **seccomp 옵션**. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p> | 모든 컨테이너에 적용되는 **Windows 특정 설정**. |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user