SQL Server 보안 모범 사례
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance
이 문서에서는 SQL Server 보안을 설정하는 데 도움이 되는 모범 사례 및 지침에 대한 정보를 제공합니다. SQL Server 보안 기능에 대한 포괄적인 검토는 SQL Serve 보안 설정을 참조하세요.
특정 제품 보안 모범 사례는 Azure SQL Database 및 SQL Managed Instance 및 Azure VM의 SQL Server를 참조하세요.
개요
계층화된 보안 방법론은 다양한 보안 범위를 대상으로 하는 여러 보안 기능을 사용하여 심층 방어 솔루션을 제공합니다. SQL Server 2016에서 도입되어 후속 릴리스에서 개선된 보안 기능은 보안 위협에 대응하고 보안이 뛰어난 데이터베이스 애플리케이션을 제공하는 데 도움이 됩니다.
Azure는 가상 머신에서 실행되는 SQL Server로 호환되는 솔루션을 제작할 수 있도록 하는 몇 가지 산업 규정 및 표준을 준수합니다. Azure 규정 준수에 대한 자세한 내용은 Azure 보안 센터를 참조하세요.
열 수준 보호
조직에서는 고객, 직원, 영업 비밀, 제품 데이터, 의료, 재무 및 기타 중요한 데이터가 SQL Server 데이터베이스에 저장되기 때문에 열 수준에서 데이터를 보호해야 하는 경우가 많습니다. 중요한 열에는 종종 신분증/사회보장번호, 휴대폰 번호, 이름, 가족 이름, 금융 계좌 식별 정보 및 기타 개인 데이터로 간주될 수 있는 데이터가 포함됩니다.
이 섹션에 언급된 방법 및 기능은 애플리케이션 코드를 광범위하게 변경할 필요 없이 최소한의 오버헤드로 열 수준에서 보호 수준을 향상합니다.
Always Encrypted를 사용하여 미사용 데이터 및 전송 중 데이터를 암호화합니다. 암호화된 데이터는 애플리케이션 클라이언트 수준에서 클라이언트 라이브러리에 의해서만 암호가 해독됩니다. 가능한 경우 결정적 암호화보다 임의 암호화를 사용합니다. Always Encrypted(보안 enclave 포함)는 임의 암호화 시나리오에서 BETWEEN, IN, LIKE, DISTINCT, Joins 등과 같은 비교 연산의 성능을 향상시킬 수 있습니다.
Always Encrypted를 사용할 수 없는 경우 DDM(동적 데이터 마스킹)을 사용하여 열 수준에서 데이터를 난독 처리합니다. DDM(동적 데이터 마스킹)은 Always Encrypted와 호환되지 않습니다. 가능하면 동적 데이터 마스킹보다 Always Encrypted를 사용합니다.
열 수준에서 테이블, 뷰 또는 테이블 반환 함수에 권한을 부여할 수도 있습니다. 오직 열에 있는 SELECT
, REFERENCES
및 UPDATE
에 사용 권한을 부여할 수 있단 점을 고려하세요.
테이블 수준 DENY
(은)는 열 수준의 GRANT
보다 우선하지 않습니다.
행 수준 보호
RLS(행 수준 보안)를 사용하면 데이터베이스 테이블의 행에 대한 액세스를 제어하기 위해 사용자 실행 컨텍스트를 활용할 수 있습니다. RLS는 사용자가 관련된 레코드만 볼 수 있도록 합니다. 그러면 애플리케이션을 크게 변경하지 않고도 애플리케이션의 '레코드 수준' 보안이 유지됩니다.
비즈니스 논리는 RLS 기능을 켜고 끄는 보안 정책으로 제어되는 테이블 반환 함수 내에 캡슐화됩니다. 또한 보안 정책은 RLS가 적용되는 테이블에 바인딩된 FILTER
및 BLOCK
조건자를 제어합니다. RLS(행 수준 보안)를 사용하여 호출하는 사용자에게 반환되는 레코드를 제한합니다. 애플리케이션 사용자가 동일한 SQL Server 사용자 계정을 공유하는 중간 계층 애플리케이션을 통해 데이터베이스에 연결하는 사용자에게 SESSION_CONTEXT(T-SQL)를 사용합니다. 성능 및 관리 효율성을 최적화하려면 행 수준 보안 모범 사례를 따르세요.
팁
RLS(행 수준 보안)를 Always Encrypted 또는 DDM(동적 데이터 마스킹)과 함께 사용하여 조직의 보안 태세를 극대화합니다.
파일 암호화
TDE(투명한 데이터 암호화)는 데이터베이스 파일에 미사용 암호화를 제공하여 파일 수준에서 데이터를 보호합니다. TDE(투명한 데이터 암호화)를 사용하면 데이터베이스 파일의 암호를 해독하는 적절한 인증서 없이는 데이터베이스 파일, 백업 파일 및 tempdb
파일을 연결하고 읽을 수 없습니다. TDE(투명한 데이터 암호화)를 사용하지 않으면 공격자가 물리적 미디어(드라이브 또는 백업 테이프)에서 데이터베이스를 복원 또는 연결하여 내용을 읽을 수 있습니다. TDE(투명한 데이터 암호화)는 SQL Server의 다른 모든 보안 기능과 함께 사용할 수 있습니다. TDE(투명한 데이터 암호화)는 데이터 및 로그 파일에 대한 실시간 I/O 암호화 및 암호 해독을 제공합니다. TDE 암호화는 사용자 데이터베이스에 저장된 DEK(데이터베이스 암호화 키)를 사용합니다. 데이터베이스 암호화 키는 데이터베이스의 master
데이터베이스 마스터 키로 보호되는 인증서를 사용하여 보호할 수도 있습니다.
TDE를 사용하여 미사용 데이터, 백업 및 tempdb
를 보호합니다.
감사 및 보고
SQL Server를 감사하려면 서버 또는 데이터베이스 수준에서 감사 정책을 만듭니다. 서버 정책은 서버에 있는 모든 기존 데이터베이스 및 새로 만든 데이터베이스에 적용됩니다. 간단히 설명하면 서버 수준 감사를 사용하도록 설정하고 데이터베이스 수준 감사가 모든 데이터베이스의 서버 수준 속성을 상속하도록 허용합니다.
보안 조치가 적용된 중요한 데이터가 있는 테이블 및 열을 감사합니다. 테이블 또는 열이 보안 기능으로 보호해야 할 만큼 중요한 경우 감사해야 할 만큼 중요한 것으로 간주해야 합니다. 중요한 정보가 포함되어 있지만 애플리케이션 또는 아키텍처 제한으로 인해 원하는 보안 조치를 적용할 수 없는 테이블을 감사하고 정기적으로 검토하는 것이 특히 중요합니다.
ID 및 인증
SQL Server는 Windows 인증 모드와 'SQL Server 및 Windows 인증 모드’(혼합 모드)의 두 가지 인증 모드를 지원합니다.
로그인은 데이터베이스 사용자와 분리됩니다. 먼저 별도의 작업으로 로그인 또는 Windows 그룹을 데이터베이스 사용자 또는 역할에 매핑합니다. 그런 다음 사용자, 서버 역할 및/또는 데이터베이스 역할에 데이터베이스 개체에 액세스할 수 있는 권한을 부여합니다.
SQL Server에서는 세 가지 유형의 로그인을 지원합니다.
- 로컬 Windows 사용자 계정 또는 Active Directory 도메인 계정 - SQL Server는 Windows를 사용하여 Windows 사용자 계정을 인증합니다.
- Windows 그룹 - Windows 그룹에 액세스 권한을 부여하면 해당 그룹의 멤버인 모든 Windows 사용자 로그인에 액세스 권한이 부여됩니다. 그룹에서 사용자를 제거하면 사용자에게서 해당 그룹에서 나온 권한이 제거됩니다. 그룹 멤버 자격은 기본 전략입니다.
- SQL Server 로그인 - SQL Server는 사용자 이름 및 암호 해시를
master
데이터베이스에 저장합니다. - 포함된 데이터베이스 사용자는 데이터베이스 수준에서 SQL Server 연결을 인증합니다. 포함된 데이터베이스는 다른 데이터베이스 및 해당 데이터베이스를 호스팅하는 SQL Server(및
master
데이터베이스) 인스턴스에서 격리된 데이터베이스입니다. SQL Server는 Windows 및 SQL Server 인증에 포함된 데이터베이스 사용자를 지원합니다.
다음 권장 사항 및 모범 사례는 ID와 인증 방법을 보호하는 데 도움이 됩니다.
최소 권한 역할 기반 보안 전략을 사용하여 보안 관리를 개선합니다.
- Active Directory 사용자를 AD 그룹에 배치하는 것이 표준이며, AD 그룹은 SQL Server 역할에 있어야 하고, SQL Server 역할에는 애플리케이션에 필요한 최소 권한이 부여되어야 합니다.
Azure에서 RBAC(역할 기반 액세스) 컨트롤을 사용하여 최소 권한 보안을 사용합니다.
가능하면 SQL Server 인증보다는 Active Directory를 선택하고, 특히 애플리케이션 또는 데이터베이스 수준에서 보안을 저장하는 대신 Active Directory를 선택합니다.
- 사용자가 퇴사하는 경우 계정을 비활성화하기 쉽습니다.
- 또한 사용자가 역할을 변경하거나 조직을 떠날 때 그룹에서 사용자를 손쉽게 제거할 수 있습니다. 그룹 보안은 모범 사례로 간주됩니다.
RDP를 사용하여 컴퓨터에 로그인하는 계정을 포함하여 컴퓨터 수준 액세스 권한이 있는 계정에 다단계 인증을 사용합니다. 이는 자격 증명 도난 또는 누출을 방지하는 데 도움이 됩니다. 단일 단계 암호 기반 인증은 자격 증명이 손상되거나 실수로 제공될 위험이 있는 약한 형태의 인증이기 때문입니다.
쉽게 추측할 수 없고 다른 계정 또는 용도에 사용되지 않는 강력하고 복잡한 암호가 필요합니다. 정기적으로 암호를 업데이트하고 Active Directory 정책을 적용합니다.
gMSA(그룹 관리 서비스 계정)는 자동 암호 관리, 간소화된 SPN(서비스 사용자 이름) 관리 및 다른 관리자에게 관리 위임을 제공합니다.
- gMSA에서는 관리자가 암호를 관리하는 대신 Windows 운영 체제가 해당 계정의 암호를 관리합니다.
- gMSA는 서비스를 다시 시작하지 않고 계정 암호를 자동으로 업데이트합니다.
- gMSA는 관리 표면 수준을 축소하고 직무 분리를 개선합니다.
DBA의 AD 계정에 부여된 권한을 최소화합니다. 가상 머신에 대한 액세스, 운영 체제에 로그인하는 능력, 오류 및 감사 로그를 수정하는 능력, 애플리케이션 및/또는 기능을 설치하는 능력을 제한하는 직무 분리를 고려합니다.
DBA 계정을 sysadmin 역할에서 제거하고 DBA 계정을 sysadmin 역할의 멤버로 만드는 대신 CONTROL SERVER를 부여하는 것이 좋습니다. 시스템 관리자 역할은
DENY
(을)를 준수하지 않지만 CONTROL SERVER는 준수합니다.
데이터 계보 및 데이터 무결성
시간 경과에 따른 데이터 변경의 기록 레코드를 유지하면 실수로 데이터가 변경되었을 때 문제를 해결하는 데 도움이 될 수 있습니다. 또한 애플리케이션 변경 감사에도 유용할 수 있으며, 악의적인 행위자가 권한 없이 데이터를 변경한 경우 데이터 요소를 복구할 수 있습니다.
- temporal 테이블을 사용하여 시간 경과에 따른 레코드 버전을 보존하고 레코드의 수명 동안 데이터를 확인하여 애플리케이션 데이터의 기록 보기를 제공합니다.
- Temporal 테이블을 사용하여 현재 테이블의 임의 시점 버전을 제공할 수 있습니다.
보안 평가 도구 및 평가
다음 구성 및 평가 도구는 노출 영역 보안을 처리하고, 데이터 보안 기회를 식별하고, 인스턴스 수준에서 SQL Server 환경의 보안에 대한 모범 사례 평가를 제공합니다.
- 노출 영역 구성 - 악의적인 사용자가 공격할 수 있는 기능 수를 최소화하기 위해 사용자 환경에 필요한 기능만 사용하도록 설정해야 합니다.
- SQL Server에 대한 취약성 평가(SSMS) - SQL 취약성 평가는 SSMS v17.4 이상에서 잠재적인 데이터베이스 취약성을 검색, 추적 및 수정하는 데 도움이 되는 도구입니다. 취약성 평가는 데이터베이스 보안을 개선하기 위한 유용한 도구이며 데이터베이스 수준에서 데이터베이스별로 실행됩니다.
- SQL 데이터 검색 및 분류(SSMS) - DBA는 서버 및 데이터베이스를 관리하고 데이터베이스에 포함된 데이터의 민감도를 인식하지 않는 것이 일반적입니다. 데이터 검색 및 분류는 데이터를 검색, 분류, 레이블 지정 및 민감도 수준을 보고하는 기능을 추가합니다. 데이터 검색 및 분류는 SSMS 17.5부터 지원됩니다.
일반적인 SQL 위협
SQL Server를 위험하게 만드는 몇 가지 일반적인 위협이 무엇인지 파악하는 데 도움이 됩니다.
- SQL 삽입 - SQL 삽입은 실행을 위해 SQL Server의 인스턴스로 전달되는 문자열에 악성 코드를 삽입하는 공격 유형입니다.
- 삽입 프로세스는 텍스트 문자열을 종료하고 새 명령을 덧붙이는 방법으로 수행됩니다. 삽입된 명령에는 실행 전에 덧붙여진 추가 문자열이 있을 수 있으므로 공격자는 주입된 문자열을 주석 표시인
--
로 종료합니다. - SQL Server가 수신된 구문상 유효한 쿼리를 실행합니다.
- 삽입 프로세스는 텍스트 문자열을 종료하고 새 명령을 덧붙이는 방법으로 수행됩니다. 삽입된 명령에는 실행 전에 덧붙여진 추가 문자열이 있을 수 있으므로 공격자는 주입된 문자열을 주석 표시인
- 사이드 채널 공격, 맬웨어 및 기타 위협에 유의하세요.
SQL 삽입 위험
SQL 삽입의 위험을 최소화하려면 다음 항목을 고려하세요.
- SQL 문을 생성하는 모든 SQL 프로세스에서 삽입 취약성을 검토합니다.
- 매개 변수가 있는 방식으로 SQL 문을 동적으로 생성합니다.
- 개발자 및 보안 관리자는
EXECUTE
,EXEC
, 또는sp_executesql
을 호출하는 모든 코드를 검토해야 합니다. - 다음 입력 문자를 허용하지 않아야 합니다.
;
: 쿼리 구분 기호'
: 문자 데이터 문자열 구분 기호--
: 한 줄 주석 구분 기호./* ... */
: 주석 구분 기호.xp_
: 카탈로그 확장 저장 프로시저, 예:xp_cmdshell
.- SQL Server 환경에서는
xp_cmdshell
(을)를 사용하지 않는 것이 좋습니다.xp_cmdshell
(이)가 발생하는 위험이 있으니 SQLCLR을 대신 사용하거나 다른 대안을 찾으세요.
- SQL Server 환경에서는
- 항상 사용자 입력의 유효성을 검사하고 오류 출력을 스크럽하여 공격자에게 누출 및 노출되지 않도록 합니다.
사이드 채널 위험
사이드 채널 공격의 위험을 최소화하려면 다음을 고려하세요.
- 최신 애플리케이션 및 운영 체제 패치가 적용되었는지 확인합니다.
- 하이브리드 워크로드의 경우 모든 온-프레미스 하드웨어에 최신 펌웨어 패치가 적용되었는지 확인합니다.
- Azure에서는 매우 중요한 애플리케이션 및 워크로드의 경우 격리된 가상 머신, 전용 호스트를 사용하거나 3세대 AMD EPYC 프로세서를 사용하는 가상 머신, DC 시리즈 같은 기밀 컴퓨팅 가상 머신을 사용하여 사이드 채널 공격에 대한 보호를 추가할 수 있습니다.
인프라 위협
다음과 같은 일반적인 인프라 위협을 고려합니다.
- 무차별 암호 대입 공격(brute force attack) - 공격자는 올바른 암호를 찾을 때까지 여러 계정에서 여러 암호로 인증을 시도합니다.
- 암호 해독/암호 스프레이 - 공격자는 모든 알려진 사용자 계정에 대해 정교하게 만든 하나의 암호를 시도합니다(많은 계정에 하나의 암호). 초기 암호 스프레이가 실패하면 다른 정교하게 만든 암호를 활용하여 다시 시도하며 일반적으로 탐지를 회피하기 위해 시도 사이에 일정 시간을 대기합니다.
- 랜섬웨어 공격은 맬웨어를 사용하여 데이터 및 파일을 암호화하고 중요한 콘텐츠에 대한 액세스를 차단하는 표적 공격 유형입니다. 그런 다음 공격자는 암호 해독 키를 제공하는 대가로 주로 암호 화폐 형태의 금전을 희생자로부터 갈취하려고 합니다. 대부분의 랜섬웨어 감염은 랜섬웨어를 설치하려는 첨부 파일이 있는 전자 메일 메시지 또는 웹 브라우저 및 기타 소프트웨어의 취약성을 사용하여 랜섬웨어를 설치하려는 악용 키트를 호스트하는 웹 사이트로 시작합니다.
암호 위험
공격자가 계정 이름 또는 암호를 쉽게 추측할 수 없도록 하려면 다음 단계를 통해 암호가 검색될 위험을 줄일 수 있습니다.
- 로컬 관리자 계정의 이름을 Administrator가 아닌 다른 이름으로 만듭니다.
- 모든 계정에 복잡하고 강력한 암호를 사용합니다. 강력한 암호를 만드는 방법에 대한 자세한 내용은 강력한 암호 만들기 문서를 참조하세요.
- 기본적으로 Azure는 SQL Server 가상 머신을 설치하는 동안 Windows 인증을 선택합니다. 따라서 SA 로그인이 사용하지 않도록 설정되고 설치 프로그램에서 암호를 할당합니다. SA 로그인을 사용하거나 사용하도록 설정하지 않는 것이 좋습니다. SQL 로그인이 있어야 하는 경우 다음 전략 중 하나를 사용합니다.
sysadmin 멤버 자격이 있는 고유한 이름을 가진 SQL 계정을 만듭니다. 포털에서 프로비전하는 동안 SQL 인증을 사용하도록 설정하여 이렇게 할 수 있습니다.
팁
프로비전하는 동안 SQL 인증을 사용하도록 설정하지 않으면 인증 모드를 수동으로 SQL Server 및 Windows 인증 모드로 변경해야 합니다. 자세한 내용은 서버 인증 모드 변경을 참조하세요.
SA 로그인을 사용해야 하는 경우 프로비전한 후 로그인을 사용하도록 설정하고 새로운 강력한 암호를 할당합니다.
랜섬웨어 위험
랜섬웨어 위험을 최소화하려면 다음을 고려하세요.
- 랜섬웨어를 방어하는 최선의 전략은 RDP 및 SSH 취약성에 특히 주의를 기울이는 것입니다. 또한 다음 권장 사항을 살펴 보세요.
- 방화벽을 사용하고 포트를 잠급니다.
- 최신 운영 체제 및 애플리케이션 보안 업데이트가 적용되었는지 확인합니다.
- gMSA(그룹 관리 서비스 계정)를 사용합니다.
- 가상 머신에 대한 액세스를 제한합니다.
- JIT(Just-In-Time) 액세스 및 Azure Bastion을 요구합니다.
- 로컬 컴퓨터에 sysinternals 및 SSMS를 포함한 도구를 설치하지 않도록 하여 노출 영역 보안을 개선합니다.
- 필요하지 않은 Windows 기능, 역할 및 서비스를 설치 또는 사용하도록 설정하지 않습니다.
- 또한 데이터베이스 복사본을 삭제할 수 없도록 공통 관리자 계정에서 별도로 보호되는 정기 전체 백업이 예약되어 있어야 합니다.