Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-sql.

This commit is contained in:
Translator
2026-07-13 14:07:13 +00:00
parent 2abefa2bda
commit 18cdb6b811
@@ -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를 획득했다면, 자신의 attackercontrolled 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 <server-name> --resource-group <resource-group>` 그리고 방화벽 규칙이 우리의 IP 접근 허용하는지도 확인해야 합니다:
또한 sqlcmd를 사용해 데이터베이스에 접근할 수 있습니다. 서버가 public connections를 허용하는지 `az sql server show --name <server-name> --resource-group <resource-group>`로 확인하는 것이 중요하며, firewall rule이 우리의 IP 접근하도록 허용하는지도 확인해야 합니다:
```bash
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
```