diff --git a/src/pentesting-cloud/azure-security/az-services/az-sql.md b/src/pentesting-cloud/azure-security/az-services/az-sql.md index c9191f5d6..b9f91aa07 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-sql.md +++ b/src/pentesting-cloud/azure-security/az-services/az-sql.md @@ -4,45 +4,47 @@ ## Azure SQL -Azure SQL은 **Azure 클라우드의 SQL Server 데이터베이스 엔진**을 사용하는 관리형, 안전하고 지능적인 제품군입니다. 이는 서버의 물리적 관리에 대해 걱정할 필요가 없으며, 데이터 관리에 집중할 수 있음을 의미합니다. +Azure SQL은 **Azure cloud의 SQL Server database engine**을 사용하는 관리형, 보안성 높은, 지능형 제품군입니다. 즉, 서버의 물리적 관리에 신경 쓸 필요가 없고, 데이터 관리에 집중할 수 있습니다. -Azure SQL은 네 가지 주요 제공 사항으로 구성됩니다: +Azure SQL은 네 가지 주요 서비스로 구성됩니다: -1. **Azure SQL Server**: SQL Server 데이터베이스의 **배포 및 관리**를 위해 필요한 서버입니다. -2. **Azure SQL Database**: Azure 클라우드에서 개별 데이터베이스를 호스팅할 수 있는 **완전 관리형 데이터베이스 서비스**입니다. -3. **Azure SQL Managed Instance**: 더 큰 규모의 전체 SQL Server 인스턴스 범위 배포를 위한 것입니다. -4. **Azure SQL Server on Azure VMs**: 운영 체제와 SQL Server 인스턴스에 대한 **제어**를 원하는 아키텍처에 가장 적합합니다. +1. **Azure SQL Server**: SQL Server databases의 **deployment and management**에 필요합니다. +2. **Azure SQL Database**: Azure cloud에서 개별 databases를 호스팅할 수 있는 **fully-managed database service**입니다. +3. **Azure SQL Managed Instance**: 더 큰 규모의, 전체 SQL Server instance 범위 배포를 위한 것입니다. +4. **Azure SQL Server on Azure VMs**: 운영 체제와 SQL Server instance에 대한 **control**을 원할 때 가장 적합합니다. -### SQL Server 보안 기능 +### SQL Server Security Features -**네트워크 접근:** +**Network access:** -- 공용 엔드포인트(특정 네트워크에 대한 접근 제한 가능). -- 사설 엔드포인트. -- 도메인 이름에 따라 연결을 제한하는 것도 가능합니다. -- Azure 서비스가 접근할 수 있도록 허용하는 것도 가능합니다(예: 포털에서 쿼리 편집기를 사용하거나 Azure VM이 연결하도록 허용). +- Public endpoint(특정 networks로의 access를 제한할 수 있음). +- Private endpoints. +- domain names를 기준으로 connections를 제한할 수도 있습니다. +- Azure services가 접근하도록 허용할 수도 있습니다(예: portal의 Query editor를 사용하거나 Azure VM이 connect하도록 허용). +- SQL Server에 *Allow Azure services and resources to access this server*가 "Enabled"로 설정되어 있으면, Azure는 Azure에서 시작된 모든 network traffic이 SQL Server에 connect할 수 있도록 하는 hidden firewall rule을 자동으로 생성합니다 — 다른 tenant의 resources도 포함됩니다. +- 즉, 유효한 SQL credentials를 획득했다면, 자신의 attacker‑controlled tenant 내부의 Azure VM에서 피해자의 Azure SQL Server에 connect할 수 있습니다. [MS docs explains this](https://learn.microsoft.com/en-us/azure/azure-sql/database/network-access-controls-overview?view=azuresql#allow-azure-services) -**인증 방법:** +**Authentication Methods:** -- Microsoft **Entra 전용** 인증: 서비스에 접근할 Entra 주체를 지정해야 합니다. -- **SQL 및 Microsoft Entra** 인증 모두: 사용자 이름과 비밀번호를 사용하는 전통적인 SQL 인증과 Microsoft Entra가 함께 사용됩니다. -- **SQL 전용** 인증: 데이터베이스 사용자만을 통해 접근을 허용합니다. +- Microsoft **Entra-only** authentication: 서비스에 access할 Entra principals를 지정해야 합니다. +- **Both SQL and Microsoft Entra** authentication: Microsoft Entra와 함께 전통적인 username과 password 기반 SQL authentication을 사용합니다. +- **Only SQL** authentication: database users를 통한 access만 허용합니다. -SQL 인증이 허용되는 경우 관리 사용자(사용자 이름 + 비밀번호)를 지정해야 하며, Entra ID 인증이 선택된 경우 최소한 하나의 관리 접근 권한이 있는 주체를 지정해야 합니다. +SQL auth가 허용되면 admin user(username + password)를 지정해야 하고, Entra ID auth가 선택되면 admin access를 가진 principal을 최소 하나 이상 지정해야 한다는 점에 유의하세요. -**암호화:** +**Encryption:** -- "투명 데이터 암호화"라고 하며, 데이터베이스, 백업 및 로그를 정지 상태에서 암호화합니다. -- 항상 기본적으로 Azure 관리 키가 사용되지만, 고객 관리 암호화 키(CMEK)도 사용할 수 있습니다. -**관리형 ID:** +- “Transparent data encryption”이라고 하며, databases, backups, logs를 at rest 상태에서 암호화합니다. +- 항상 그렇듯, 기본적으로 Azure managed key가 사용되지만 customer managed encryption key (CMEK)도 사용할 수 있습니다. +**Managed Identities:** -- 시스템 및 사용자 관리 MIs를 할당할 수 있습니다. -- 암호화 키에 접근하는 데 사용됩니다(사용되는 경우 CMEK) 및 데이터베이스의 다른 서비스에 접근하는 데 사용됩니다. -- 데이터베이스에서 접근할 수 있는 Azure 서비스의 몇 가지 예는 [이 문서 페이지](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql)를 확인하세요. -- 여러 UMI가 할당된 경우 사용할 기본 UMI를 지정할 수 있습니다. -- 크로스 테넌트 접근을 위한 연합 클라이언트 ID를 구성할 수 있습니다. +- system 및 user managed MIs를 할당할 수 있습니다. +- encryption key(CMEK가 사용되는 경우)와 databases에서 다른 services에 access하는 데 사용됩니다. +- database에서 접근할 수 있는 Azure services 예시는 [this page of the docs](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql)에서 확인할 수 있습니다. +- 둘 이상의 UMI가 할당된 경우, 사용할 default one을 지정할 수 있습니다. +- cross-tenant access를 위해 federated client identity를 설정할 수 있습니다. -SQL 데이터베이스에서 blob 저장소 내부의 정보에 접근하기 위한 몇 가지 명령: +SQL database에서 blob storage 내부의 정보를 access하는 몇 가지 commands: ```sql -- Create a credential for the managed identity CREATE DATABASE SCOPED CREDENTIAL [ManagedIdentityCredential] @@ -69,59 +71,60 @@ GO ``` **Microsoft Defender:** -- 데이터베이스의 잠재적 취약점을 완화하고 비정상적인 활동을 감지하는 데 유용합니다. -- Defender에 대해서는 별도의 수업에서 다룰 것입니다(여러 다른 Azure 서비스에서 활성화할 수 있습니다). +- 잠재적인 database 취약점을 완화하고, 비정상적인 활동을 탐지하는 데 유용함 +- Defender는 별도 레슨에서 다룰 예정임(다른 여러 Azure 서비스에서도 활성화할 수 있음) -**백업:** -- 백업 빈도는 보존 정책에서 관리됩니다. +**Backups:** +- Backup 빈도는 retention policies에서 관리됨. -**삭제된 데이터베이스:** -- 기존 백업에서 삭제된 DB를 복원할 수 있습니다. +**Deleted databases:** +- 기존 backups에서 삭제된 DB를 복원할 수 있음. ## Azure SQL Database -**Azure SQL Database**는 **완전 관리형 데이터베이스 플랫폼 서비스(PaaS)**로, 확장 가능하고 안전한 관계형 데이터베이스 솔루션을 제공합니다. 최신 SQL Server 기술을 기반으로 하며 인프라 관리의 필요성을 없애, 클라우드 기반 애플리케이션에 인기 있는 선택입니다. +**Azure SQL Database**는 확장 가능하고 안전한 relational database 솔루션을 제공하는 **fully managed database platform as a service (PaaS)**이다. 최신 SQL Server 기술을 기반으로 구축되어 infrastructure management가 필요 없으므로, cloud-based 애플리케이션에 널리 사용된다. -SQL 데이터베이스를 생성하려면 호스팅될 SQL 서버를 지정해야 합니다. +SQL database를 생성하려면, 호스팅될 SQL server를 지정해야 한다. -### SQL 데이터베이스 보안 기능 +### SQL Database Security Features -- **항상 최신 상태**: 최신 안정 버전의 SQL Server에서 실행되며 새로운 기능과 패치를 자동으로 받습니다. -- **상속된 SQL Server 보안 기능:** -- 인증(SQl 및/또는 Entra ID) -- 할당된 관리 ID -- 네트워크 제한 -- 암호화 -- 백업 +- **Always Up-to-Date**: 최신 안정 버전의 SQL Server에서 실행되며 새로운 기능과 패치를 자동으로 받음. +- **Inherited SQL Server security features:** +- Authentication (SQL and/or Entra ID) +- Assigned Managed Identities +- Network restrictions +- Encryption +- Backups - … -- **데이터 중복성:** 옵션은 로컬, 존, 지리적 또는 지리적-존 중복입니다. -- **원장:** 데이터의 무결성을 암호학적으로 검증하여 변조가 감지되도록 합니다. 재무, 의료 및 민감한 데이터를 관리하는 모든 조직에 유용합니다. +- **Data redundancy:** 로컬, zone, Geo 또는 Geo-Zone redundant 옵션이 있음. +- **Ledger:** 데이터의 무결성을 암호학적으로 검증하여 변조가 탐지되도록 보장함. 금융, 의료 및 민감한 데이터를 관리하는 모든 조직에 유용함. -SQL 데이터베이스는 **탄력적 풀**의 일부가 될 수 있습니다. 탄력적 풀은 여러 데이터베이스를 관리하기 위한 비용 효율적인 솔루션으로, 구성 가능한 컴퓨팅(eDTUs) 및 저장소 리소스를 공유하며, 가격은 데이터베이스 수가 아닌 할당된 리소스에 따라 결정됩니다. -#### Azure SQL 열 수준 보안(마스킹) 및 행 수준 보안 +SQL database는 **elastic Pool**의 일부가 될 수 있다. Elastic pools는 구성 가능한 compute (eDTUs)와 storage 리소스를 여러 database가 공유하도록 하여 여러 database를 관리하는 데 비용 효율적인 솔루션이며, 가격은 database 수가 아니라 할당된 리소스에만 기반한다. -**Azure SQL의 동적** 데이터 마스킹은 **민감한 정보를 보호하기 위해** 무단 사용자로부터 숨기는 기능입니다. 실제 데이터를 변경하는 대신, 표시된 데이터를 동적으로 마스킹하여 신용 카드 번호와 같은 민감한 세부 정보가 가려지도록 합니다. +#### Azure SQL Column Level Security (Masking) & Row Level Security -**동적 데이터 마스킹**은 마스킹되지 않은 사용자(이 사용자들은 지정되어야 함)와 관리자를 제외한 모든 사용자에게 영향을 미칩니다. 동적 데이터 마스킹에서 면제되는 SQL 사용자를 지정하는 구성 옵션이 있으며, **관리자는 항상 제외됩니다**. +**Azure SQL's dynamic** data masking은 **민감한 정보를 숨겨 비인가 사용자로부터 보호**하는 기능이다. 실제 데이터를 변경하는 대신, 표시되는 데이터를 동적으로 마스킹하여 credit card 번호와 같은 민감한 정보가 가려지도록 한다. -**Azure SQL 행 수준 보안(RLS)**은 **사용자가 볼 수 있거나 수정할 수 있는 행을 제어하는 기능**으로, 각 사용자가 자신과 관련된 데이터만 볼 수 있도록 보장합니다. 필터 또는 차단 술어로 보안 정책을 생성함으로써 조직은 데이터베이스 수준에서 세밀한 접근 제어를 시행할 수 있습니다. +**Dynamic Data Masking**은 unmasked된 사용자(이 사용자들은 지정되어야 함)와 administrators를 제외한 모든 사용자에게 적용된다. 동적 data masking에서 제외되는 SQL 사용자를 지정하는 구성 옵션이 있으며, **administrators는 항상 제외**된다. -### Azure SQL 관리형 인스턴스 +**Azure SQL Row Level Security (RLS)**는 사용자가 **어떤 rows를 볼 수 있거나 수정할 수 있는지 제어**하는 기능으로, 각 사용자가 자신과 관련된 data만 보도록 보장한다. filter 또는 block predicates로 security policies를 생성함으로써 조직은 database 수준에서 세밀한 접근 제어를 적용할 수 있다. -**Azure SQL 관리형 인스턴스**는 대규모 전체 SQL Server 인스턴스 범위 배포를 위한 것입니다. 최신 SQL Server 온프레미스(Enterprise Edition) 데이터베이스 엔진과 거의 100% 호환성을 제공하며, 일반적인 보안 문제를 해결하는 네이티브 가상 네트워크(VNet) 구현과 온프레미스 SQL Server 고객에게 유리한 비즈니스 모델을 제공합니다. +### Azure SQL Managed Instance -### Azure SQL 가상 머신 +**Azure SQL Managed Instances**는 더 큰 규모의, 전체 SQL Server instance 범위 배포를 위한 것이다. 최신 SQL Server on-premises (Enterprise Edition) Database Engine과 거의 100% 호환되며, 네이티브 virtual network (VNet) 구현을 제공해 일반적인 security concerns를 해결하고, on-premises SQL Server 고객에게 유리한 business model을 제공한다. -**Azure SQL 가상 머신**은 **운영 체제**와 SQL Server 인스턴스를 제어할 수 있게 해주며, SQL 서버를 실행하는 VM 서비스에서 VM이 생성됩니다. +### Azure SQL Virtual Machines -SQL 가상 머신이 생성될 때 SQL 서버를 호스팅할 VM의 **모든 설정을 선택할 수 있습니다**(VM 수업에서 보여준 대로). -- 이는 VM이 일부 VNet에 접근하고, **관리 ID가 연결**될 수 있으며, 파일 공유가 마운트될 수 있음을 의미합니다… SQL에서 VM으로의 **피벗이 매우 흥미로워집니다**. -- 또한, SQL이 특정 키 볼트에 접근할 수 있도록 **앱 ID 및 비밀을 구성**할 수 있으며, 이 키 볼트는 민감한 정보를 포함할 수 있습니다. +**Azure SQL Virtual Machines**는 **operating system**과 SQL Server instance를 제어할 수 있게 해준다. VM service에서 SQL server를 실행하는 VM이 생성되기 때문이다. -**자동 SQL 업데이트**, **자동 백업**, **Entra ID 인증** 및 다른 SQL 서비스의 대부분 기능과 같은 것들을 구성할 수도 있습니다. +SQL Virtual Machine이 생성되면, SQL server를 호스팅할 VM의 **모든 settings를 선택**할 수 있다( VM 레슨에 표시된 것처럼). +- 이는 VM이 일부 VNet(s)에 접근하게 되고, **Managed Identities attached**될 수 있으며, file shares가 마운트될 수도 있음을 의미한다… 따라서 **SQL에서 VM으로의 pivoting**이 매우 흥미롭다. +- 또한 app id와 secret을 설정하여 **SQL이 특정 key vault에 접근하도록 허용**할 수 있으며, 여기에 민감한 info가 들어 있을 수 있다. -## 열거 +**automatic SQL updates**, **automatic backups**, **Entra ID authentication** 및 다른 SQL 서비스들의 대부분 기능도 구성할 수 있다. + +## Enumeration {{#tabs}} {{#tab name="az cli"}} @@ -258,7 +261,7 @@ Get-AzSqlVM {{#endtab}} {{#endtabs}} -추가로 데이터베이스 내에서 Dynamic Data Masking 및 Row Level 정책을 열거하고 싶다면, 다음과 같이 쿼리할 수 있습니다: +또한 데이터베이스 내에서 Dynamic Data Masking과 Row Level policies를 열거하고 싶다면, 다음을 쿼리할 수 있습니다: ```sql --Enumerates the masked columns SELECT @@ -283,9 +286,9 @@ JOIN sys.security_predicates AS sp2 ON sp.object_id = sp2.object_id; ``` -### Connect and run SQL queries +### SQL 쿼리 연결 및 실행 -You could find a connection string (containing credentials) from example [enumerating an Az WebApp](az-app-services.md): +example [enumerating an Az WebApp](az-app-services.md)에서 연결 문자열(자격 증명 포함)을 찾을 수 있습니다: ```bash function invoke-sql{ param($query) @@ -304,7 +307,7 @@ $Connection.Close() invoke-sql 'Select Distinct TABLE_NAME From information_schema.TABLES;' ``` -데이터베이스에 접근하기 위해 sqlcmd를 사용할 수도 있습니다. 서버가 공용 연결을 허용하는지 아는 것이 중요합니다 `az sql server show --name --resource-group ` 그리고 방화벽 규칙이 우리의 IP 접근을 허용하는지도 확인해야 합니다: +또한 sqlcmd를 사용해 데이터베이스에 접근할 수 있습니다. 서버가 public connections를 허용하는지 `az sql server show --name --resource-group `로 확인하는 것이 중요하며, firewall rule이 우리의 IP를 접근하도록 허용하는지도 확인해야 합니다: ```bash sqlcmd -S .database.windows.net -U -P -d ```