Linux의 SQL Server 보안 기능 연습

적용 대상:SQL Server on Linux

SQL Server를 처음 사용하는 Linux 사용자인 경우 다음 작업에서 몇 가지 보안 작업을 안내합니다. 이 작업들은 리눅스에만 국한되거나 특화된 것은 아니지만, 더 조사해야 할 영역에 대한 감을 줍니다. 각 예시는 해당 분야에 대한 심층 문서로 연결됩니다.

이 문서의 코드 샘플은 AdventureWorks2025 또는 AdventureWorksDW2025 샘플 데이터베이스를 사용합니다. 이 데이터베이스는 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있습니다.

로그인 및 데이터베이스 사용자 만들기

데이터베이스에 문장을 입력 masterCREATE LOGIN 하여 다른 사람에게 SQL Server 접근 권한을 부여하세요. 다음은 그 예입니다.

CREATE LOGIN Larry
    WITH PASSWORD = '<password>';

Caution

암호는 SQL Server 기본 암호 정책을 따라야 합니다. 기본적으로 암호는 8자 이상이어야 하며 대문자, 소문자, 0~9까지의 숫자 및 기호 네 가지 집합 중 세 집합의 문자를 포함해야 합니다. 암호는 최대 128자까지 가능합니다. 되도록 길고 복잡한 암호를 사용합니다.

로그인은 SQL Server에 연결하고 master 데이터베이스에 대한 액세스 권한(제한된 권한 포함)을 가질 수 있습니다. 사용자 데이터베이스에 연결하려면 데이터베이스 사용자라고도 하는 데이터베이스 수준의 해당 ID가 로그인에 필요합니다. 사용자는 각 데이터베이스별로 특화되어 있으므로, 각 데이터베이스에서 별도로 생성해야 접근 권한을 부여할 수 있습니다.

다음 예시는 데이터베이스로 AdventureWorks2025 전환한 후, 이 CREATE USER 문장을 사용하여 로그인 Larry이름의 로그인 에 매핑되는 사용자 이름을 Larry 생성합니다. 로그인과 사용자는 서로 연결되어 있지만(서로 매핑되어 있지만), 서로 다른 객체입니다. 로그인은 서버 수준 보안 주체입니다. 사용자는 데이터베이스 수준의 보안 주체입니다.

USE AdventureWorks2025;
GO

CREATE USER Larry;
GO
  • SQL Server 관리자 계정은 모든 데이터베이스에 연결할 수 있으며 모든 데이터베이스에서 추가 로그인과 사용자를 만들 수 있습니다.
  • 데이터베이스를 만들면 당신이 데이터베이스 소유자가 되어 그 데이터베이스에 연결할 수 있습니다. 데이터베이스 소유자는 더 많은 사용자를 만들 수 있습니다.

나중에 다른 로그인에 ALTER ANY LOGIN 권한을 부여하여 추가 로그인을 만들 권한을 부여할 수 있습니다. 데이터베이스 내에서 다른 사용자에게 ALTER ANY USER 권한을 부여하여 추가 사용자를 만들 권한을 부여할 수 있습니다. 다음은 그 예입니다.

GRANT ALTER ANY LOGIN TO Larry;
GO

USE AdventureWorks2025;
GO

GRANT ALTER ANY USER TO Jerry;
GO

이제 그 로그인 Larry 자가 더 많은 로그인을 생성할 수 있고, 사용자가 Jerry 더 많은 사용자를 생성할 수 있습니다.

최소 권한으로 액세스 권한 부여

관리자와 데이터베이스 소유자는 보통 사용자 데이터베이스에 가장 먼저 연결하는 사용자입니다. 이 계정들은 데이터베이스에 대한 모든 권한을 가지고 있습니다. 권한이 적은 작업에는 이 계정을 사용하지 마세요.

처음 시작할 때는 내장된 고정 데이터베이스 역할로 일반적인 권한 카테고리를 지정할 수 있습니다. 예를 들어, db_datareader 고정 데이터베이스 역할은 데이터베이스 내 모든 테이블을 읽을 수는 있지만 변경할 수는 없습니다. 문장으로 고정된 데이터베이스 역할에 멤버십을 부여합니다.ALTER ROLE 다음 예시는 사용자를 Jerrydb_datareader 고정된 데이터베이스 역할에 추가합니다.

USE AdventureWorks2025;
GO

ALTER ROLE db_datareader ADD MEMBER Jerry;

고정 데이터베이스 역할 목록은 데이터베이스 수준 역할을 참조 하세요.

나중에 데이터에 더 정밀하게 접근할 수 있도록 설정할 준비가 되면(강력히 추천합니다), 문장으로 CREATE ROLE 사용자 정의 데이터베이스 역할을 직접 만들어보세요. 그런 다음 사용자 지정 역할에 특정 세분화된 권한을 할당합니다.

예를 들어, 다음 문장들은 ' 라는 데이터베이스 Sales역할을 생성하여 그룹이 Sales 테이블에서 Orders 행을 읽고, 업데이트하며, 삭제할 수 있는 권한을 부여한 후 사용자를 Jerry 역할에 Sales 추가할 수 있게 합니다.

CREATE ROLE Sales;

GRANT SELECT ON OBJECT::Orders TO Sales;
GRANT UPDATE ON OBJECT::Orders TO Sales;
GRANT DELETE ON OBJECT::Orders TO Sales;

ALTER ROLE Sales ADD MEMBER Jerry;

권한 시스템에 대한 자세한 내용은 데이터베이스 엔진 권한 시작하기를 참조하세요.

행 수준 보안 구성

행 수준 보안은 쿼리를 실행하는 사용자를 기반으로 데이터베이스 내 행에 대한 접근을 제한할 수 있게 해줍니다. 이 기능은 고객이 자신의 데이터에만 접근할 수 있도록 하거나, 직원들이 부서의 데이터만 접근할 수 있도록 하는 상황에서 유용합니다.

다음 단계에서는 테이블에 Sales.SalesOrderHeader 대해 서로 다른 행 수준의 접근 권한을 가진 두 사용자를 설정하는 과정을 안내합니다.

행 수준 보안을 테스트하기 위해 두 개의 사용자 계정을 생성하세요:

USE AdventureWorks2025;
GO

CREATE USER Manager WITHOUT LOGIN;
CREATE USER SalesPerson280 WITHOUT LOGIN;

두 사용자에게 Sales.SalesOrderHeader 테이블에 대한 읽기 권한을 부여합니다.

GRANT SELECT ON Sales.SalesOrderHeader TO Manager;
GRANT SELECT ON Sales.SalesOrderHeader TO SalesPerson280;

새 스키마와 인라인 테이블 반환값 함수를 만듭니다. 이 함수는 열의 SalesPersonID 행이 로그인 ID SalesPerson 와 일치하거나, 쿼리를 실행하는 사용자가 해당 Manager 사용자일 때 반환 1 됩니다.

CREATE SCHEMA Security;
GO

CREATE FUNCTION Security.fn_securitypredicate
(@SalesPersonID INT)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
    SELECT 1 AS fn_securitypredicate_result
    WHERE ('SalesPerson' + CAST (@SalesPersonId AS VARCHAR (16)) = USER_NAME())
          OR (USER_NAME() = 'Manager')

테이블에서 필터 및 차단 조건자로 이 함수를 추가하는 보안 정책을 만듭니다.

CREATE SECURITY POLICY SalesFilter
    ADD FILTER PREDICATE Security.fn_securitypredicate(SalesPersonID) ON Sales.SalesOrderHeader,
    ADD BLOCK PREDICATE Security.fn_securitypredicate(SalesPersonID) ON Sales.SalesOrderHeader
    WITH (STATE = ON);

각 사용자마다 다음 문장을 실행해 테이블을 SalesOrderHeader 쿼리하세요. SalesPerson280은(는) 자체 판매에서 95개 행만 표시되고 Manager은(는) 테이블의 모든 행을 볼 수 있는지 확인합니다.

EXECUTE AS USER = 'SalesPerson280';

SELECT *
FROM Sales.SalesOrderHeader;

REVERT;

EXECUTE AS USER = 'Manager';

SELECT *
FROM Sales.SalesOrderHeader;

REVERT;

보안 정책을 변경해 비활성화하세요. 이제 두 사용자가 모두 모든 행에 액세스할 수 있습니다.

ALTER SECURITY POLICY SalesFilter
    WITH (STATE = OFF);

동적 데이터 마스킹 사용

동적 데이터 마스킹을 사용하면 특정 열을 완전히 또는 부분적으로 마스킹 하여 애플리케이션 사용자에게 중요한 데이터의 노출을 제한할 수 있습니다.

ALTER TABLE 문을 사용하여 EmailAddress 테이블의 Person.EmailAddress 열에 마스킹 함수를 추가합니다.

USE AdventureWorks2025;
GO

ALTER TABLE Person.EmailAddress
    ALTER COLUMN EmailAddress
        ADD MASKED WITH (FUNCTION = 'email()');

테이블에 권한이 있는 SELECT 새 사용자를 TestUser 생성한 후, 마스크 데이터를 보기 위한 TestUser 쿼리를 실행하세요:

CREATE USER TestUser WITHOUT LOGIN;

GRANT SELECT
    ON Person.EmailAddress TO TestUser;

EXECUTE AS USER = 'TestUser';

SELECT EmailAddressID,
       EmailAddress
FROM Person.EmailAddress;

REVERT;

마스킹 함수가 첫 번째 레코드의 전자 메일 주소를 다음과 같이 변경하는지 확인합니다.

EmailAddressID 이메일 주소
1 ken0@adventure-works.com

EmailAddressID 이메일 주소
1 kXXX@XXXX.com

투명한 데이터 암호화 사용

공격자는 하드 드라이브에서 데이터베이스 파일을 훔칠 수 있습니다. 공격자가 시스템에 권한을 부여받거나, 직원이 파일을 가져가거나, 파일이 저장된 컴퓨터를 누군가 훔치는 경우 발생할 수 있습니다.

TDE(투명한 데이터 암호화)는 하드 드라이브에 저장되어 있는 데이터 파일을 암호화합니다. SQL Server 데이터베이스 엔진의 데이터베이스에는 master 암호화 키가 포함되어 있어 데이터베이스 엔진이 데이터를 조작할 수 있습니다. 키에 액세스하지 않고는 데이터베이스 파일을 읽을 수 없습니다. 고위급 관리자는 키를 관리, 백업, 재생성할 수 있어, 선택된 사람만 데이터베이스를 이동할 수 있습니다. TDE를 활성화하면 SQL Server도 자동으로 데이터베이스를 tempdb 암호화합니다.

데이터베이스 엔진이 데이터를 읽을 수 있기 때문에, TDE는 관리자 계정으로 직접 메모리를 읽거나 SQL Server에 접근할 수 있는 컴퓨터 관리자의 무단 접근을 막지 못합니다.

TDE 구성하기

  • 마스터 키 만들기
  • 마스터 키로 보호되는 인증서 만들기 또는 획득
  • 데이터베이스 암호화 키를 만들고 인증서로 보호하세요
  • 암호화를 사용하도록 데이터베이스 설정

TDE를 구성하려면 CONTROL 데이터베이스에 대한 master 권한과 사용자 데이터베이스에 대한 CONTROL 권한이 필요합니다. 일반적으로 관리자가 TDE를 구성합니다.

다음 예시는 서버에 설치된 인증서 MyServerCert 를 사용하여 데이터베이스를 AdventureWorks2025 암호화하고 복호화하는 과정을 보여줍니다.

USE master;
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
GO

CREATE CERTIFICATE MyServerCert
    WITH SUBJECT = 'My Database Encryption Key Certificate';
GO

USE AdventureWorks2025;
GO

CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256
    ENCRYPTION BY SERVER CERTIFICATE MyServerCert;
GO

ALTER DATABASE AdventureWorks2025
    SET ENCRYPTION ON;

TDE를 제거하려면 다음 명령을 실행합니다.

ALTER DATABASE AdventureWorks2025
    SET ENCRYPTION OFF;

SQL Server는 백그라운드 스레드에서 암호화 및 복호화 작업을 일정화합니다. 이 작업들의 상태를 이 문서의 후반부에 나오는 목록에서 카탈로그 뷰와 동적 관리 뷰로 확인할 수 있습니다.

Warning

데이터베이스 암호화 키는 TDE가 활성화된 데이터베이스의 백업 파일도 암호화합니다. 따라서 이러한 백업 파일을 복원하려면 데이터베이스 암호화 키를 보호하는 인증서를 사용할 수 있어야 합니다. 데이터베이스 백업 외에도 데이터 손실을 방지하기 위해 서버 인증서도 백업해야 합니다. 인증서가 더 이상 제공되지 않으면 데이터 손실이 발생합니다. 자세한 내용은 SQL Server Certificates and Asymmetric Keys을 참조하세요.

TDE에 대한 자세한 내용은 TDE(투명한 데이터 암호화)를 참조하세요.

백업 암호화 구성

SQL Server는 백업을 생성하는 동안 데이터를 암호화할 수 있습니다. 암호화 알고리즘 및 암호기(인증서 또는 비대칭 키)를 지정하여 백업을 생성할 때 암호화된 백업 파일을 만들 수 있습니다.

Warning

항상 인증서나 비대칭 키를 백업하고, 가능하면 암호화된 백업 파일과는 다른 위치로 백업하세요. 인증서 또는 비대칭 키가 없으면 백업을 복원할 수 없으므로 백업 파일을 사용할 수 없게 됩니다.

다음 예제에서는 인증서를 만든 후 인증서로 보호되는 백업을 만듭니다.

USE master;
GO

CREATE CERTIFICATE BackupEncryptCert
    WITH SUBJECT = 'Database backups';
GO

BACKUP DATABASE [AdventureWorks2025]
TO DISK = N'/var/opt/mssql/backups/AdventureWorks2025.bak'
WITH COMPRESSION,
    ENCRYPTION (ALGORITHM = AES_256, SERVER CERTIFICATE = BackupEncryptCert),
    STATS = 10;
GO

자세한 내용은 Backup 암호화를 참조 하세요.