연습 - 데이터베이스에 액세스할 수 있는 사용자 제어

완료됨

네트워크를 통해 데이터베이스에 연결할 수 있어도 실제로 데이터 자체에 액세스할 수 있는 것은 아닙니다. 다층적인 접근 방식을 따라 데이터에 액세스해야 하는 사용자만 실제로 액세스할 수 있도록 해야 합니다. 이 액세스에는 인증 및 권한 부여가 사용됩니다.

인증

인증은 ID를 확인하는 프로세스입니다. 이 ID는 사용자, 시스템에서 실행하는 서비스 또는 시스템 자체(예: 가상 머신)일 수 있습니다. 인증 프로세스를 통해 사용자 또는 시스템의 신원을 확인합니다. SQL Database는 다음과 같은 두 가지 인증 유형을 지원합니다. SQL 인증Microsoft Entra 인증.

SQL 인증

SQL 인증 방법은 사용자 이름과 암호를 사용합니다. 사용자 계정은 주 데이터베이스에서 만들 수 있으며 서버의 모든 데이터베이스에 대한 권한을 사용자 계정에 부여할 수 있습니다. 또한 포함된 사용자라고 하는 데이터베이스 자체에서 사용자를 만들고 해당 데이터베이스에 대한 액세스 권한만 부여할 수 있습니다. 데이터베이스의 논리 서버를 만들 때 사용자 이름 및 암호를 사용하여 서버 관리자 로그인을 지정했습니다. 이러한 자격 증명을 사용하면 해당 서버의 모든 데이터베이스에 데이터베이스 소유자 또는 dbo로 인증할 수 있습니다.

Microsoft Entra 인증

이 인증 방법은 Microsoft Entra ID에서 관리하는 ID를 사용하며 관리 및 통합 도메인에서 지원됩니다. 가능하면 Microsoft Entra 인증(통합 보안)을 사용합니다. Microsoft Entra 인증을 사용하면 데이터베이스 사용자의 ID와 기타 Microsoft 서비스를 하나의 중앙 위치에서 관리할 수 있습니다. 중앙 ID 관리는 데이터베이스 사용자 관리를 위한 단일 위치를 제공하며 권한 관리를 간소화합니다. Microsoft Entra 인증을 사용하려면 Microsoft Entra 사용자 및 그룹을 관리할 수 있는 Microsoft Entra 관리자라는 다른 서버 관리자를 만들어야 합니다. 이 관리자는 일반 서버 관리자가 할 수 있는 모든 작업을 수행할 수도 있습니다.

권한 부여

권한 부여는 Azure SQL Data Database 내에서 ID가 수행할 수 있는 작업을 의미합니다. 이 권한 부여는 사용자 계정 및 데이터베이스 역할 멤버 자격에 직접 부여된 사용 권한에 의해 제어됩니다. 데이터베이스 역할은 관리를 용이하게 하기 위해 사용 권한을 함께 그룹화하는 데 사용됩니다. 역할에 있는 사용 권한을 부여하려면 역할에 사용자를 추가합니다. 이러한 사용 권한에는 데이터베이스에 로그인 하는 기능, 테이블을 읽는 기능, 데이터베이스에서 열을 추가 및 제거하는 기능이 포함됩니다. 사용자에게 필요한 최소한의 권한을 부여하는 것이 가장 좋습니다. SQL 사용자와 Microsoft Entra 사용자 모두에게 권한을 부여하는 프로세스는 동일합니다.

이 예에서는 연결하는 서버 관리자 계정이 데이터베이스 내에서 작업을 수행할 권한이 있는 db_owner 역할의 구성원입니다.

실제 인증 및 권한 부여

애플리케이션이 인증을 위해 전용 계정을 사용하는 것이 가장 좋습니다. 이렇게 하면 애플리케이션에 부여되는 사용 권한을 제한하여 애플리케이션 코드가 SQL 삽입 공격에 취약한 경우 악의적인 활동의 위험을 줄일 수 있습니다. 포함된 데이터베이스 사용자를 만들어 앱이 데이터베이스에 직접 인증할 수 있도록 하는 것이 좋습니다. 자세한 내용은 포함된 데이터베이스 사용자 - 데이터베이스를 이식 가능하게 만들기를 참조하세요.

Microsoft Entra 인증을 사용하여 데이터베이스 사용자의 ID를 중앙에서 관리하고 SQL Server 인증 대신 사용할 수 있습니다.

사용자를 설정하고 데이터베이스에 대한 액세스 권한을 부여하는 방법을 살펴보세요. 이 경우에는 사용자에 SQL 인증을 사용하며, Microsoft Entra 인증을 사용하는 경우 프로세스는 기본적으로 동일합니다.

데이터베이스 사용자 만들기

액세스 권한을 부여하는 데 사용할 수 있는 새 사용자를 만듭니다.

  1. Cloud Shell의 appServer VM에서 ADMINUSER로 데이터베이스에 다시 연결해 보세요.

    sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
    
  2. 다음 명령을 실행하여 새 사용자를 만듭니다. 이 사용자는 포함된 사용자이며 Marketplace 데이터베이스에만 액세스할 수 있습니다. 필요에 따라 암호를 자유롭게 조정하되, 다음 단계에서 필요하기 때문에 기록해 둡니다.

    CREATE USER ApplicationUser WITH PASSWORD = 'YourStrongPassword1';
    GO
    

이러한 자격 증명을 사용하면 사용자가 데이터베이스에 대해 인증할 수 있지만, 데이터에 액세스할 수 있는 권한은 없습니다. 이 사용자 액세스 권한을 부여하세요.

사용자에게 권한 부여

사용자를 db_datareaderdb_datawriter 역할의 구성원으로 만들어, 각각 데이터베이스에 대한 읽기 및 쓰기를 위한 액세스 권한을 부여합니다. 또한 이 사용자가 주소가 있는 테이블에는 액세스하지 못하도록 만들어야 합니다.

  1. appServersqlcmd에 계속 연결되어 있는 동안 다음 T-SQL을 실행하여 방금 만든 사용자에게 db_datareaderdb_datawriter 역할을 부여합니다.

    ALTER ROLE db_datareader ADD MEMBER ApplicationUser;
    ALTER ROLE db_datawriter ADD MEMBER ApplicationUser;
    GO
    
  2. 액세스 범위를 더 좁힐 수 있습니다. DENY 연산자를 사용하여 데이터베이스 내의 다른 요소에 대한 사용자 액세스를 거부할 수 있습니다. 다음 T-SQL을 실행하여 사용자 ApplicationUserSalesLT.Address 테이블에서 데이터를 선택하는 기능을 거부합니다.

    DENY SELECT ON SalesLT.Address TO ApplicationUser;
    GO
    

이제 해당 사용자로 로그인하여 이 구성의 동작을 살펴봅니다.

  1. T-SQL 프롬프트가 계속 표시되는 동안 exit를 입력하여 세션을 종료합니다.

  2. 이제 데이터베이스에 다시 로그인하되, 만든 사용자로 로그인합니다.

    sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U 'ApplicationUser' -P '[password]' -N -l 30
    
  3. 다음 쿼리를 실행합니다. 이 쿼리는 사용자가 액세스할 수 있는 권한이 있는 테이블에서 데이터를 끌어옵니다.

    SELECT FirstName, LastName, EmailAddress, Phone FROM SalesLT.Customer;
    GO
    

    고객 목록을 다시 가져와야 합니다.

    FirstName      LastName       EmailAddress                    Phone
    -------------- -------------- ------------------------------- ------------
    Orlando        Gee            orlando0@adventure-works.com    245-555-0173
    Keith          Harris         keith0@adventure-works.com      170-555-0127
    Donna          Carreras       donna0@adventure-works.com      279-555-0130
    Janet          Gates          janet1@adventure-works.com      710-555-0173
    ...
    
  4. 이제 액세스할 수 없는 테이블을 쿼리하려고 할 때 어떤 일이 발생하는지 살펴봅니다.

    SELECT * FROM SalesLT.Address;
    GO
    

    이 테이블에 액세스할 수 없다는 메시지가 표시됩니다.

    Msg 229, Level 14, State 5, Server server-22942, Line 1
    The SELECT permission was denied on the object 'Address', database 'marketplace', schema 'SalesLT'.
    

여기에서 알 수 있듯, 데이터베이스에 대한 읽기/쓰기 액세스 권한을 부여했지만, 테이블에 대한 액세스를 명시적으로 거부함으로써 데이터에 대한 액세스를 한층 더 안전하게 보호할 수 있습니다. 유사한 액세스 권한을 공유하는 여러 사용자가 있는 경우 적절한 권한이 있는 사용자 지정 역할을 만들고 관리를 간소화할 수 있습니다.

데이터베이스를 제대로 보호하고 필요한 경우에만 액세스 권한을 부여하는 것이 중요합니다. Azure SQL Database는 데이터베이스의 데이터에 액세스하는 ID를 인증하고 권한을 부여하는 기능을 완벽하게 제어하는 기본 기능을 제공합니다.