포함된 데이터베이스의 보안 모범 사례Security Best Practices with Contained Databases

이 항목은 다음에 적용됩니다.예SQL Server(2012부터 시작)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2012)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

포함된 데이터베이스에는 SQL Server 데이터베이스 엔진SQL Server Database Engine 관리자가 이해하고 완화해야 하는 고유한 위협 요소가 있습니다.Contained databases have some unique threats that should be understood and mitigated by SQL Server 데이터베이스 엔진SQL Server Database Engine administrators. 대부분의 위협 요소는 수준에서 데이터베이스 수준으로 인증 경계를 이동하는 USER WITH PASSWORD 데이터베이스 엔진Database Engine 인증 프로세스와 관련되어 있습니다.Most of the threats are related to the USER WITH PASSWORD authentication process, which moves the authentication boundary from the 데이터베이스 엔진Database Engine level to the database level.

db_ownerdb_securityadmin 고정 데이터베이스 역할의 멤버와 같이 ALTER ANY USER 사용 권한이 있는 포함된 데이터베이스의 사용자는 지식이나 사용 권한 또는 SQL ServerSQL Server 관리자가 없어도 데이터베이스에 대한 액세스 권한을 부여할 수 있습니다.Users in a contained database that have the ALTER ANY USER permission, such as members of the db_owner and db_securityadmin fixed database roles, can grant access to the database without the knowledge or permission or the SQL ServerSQL Server administrator. 사용자에게 포함된 데이터베이스에 대한 액세스 권한을 부여하면 전체 SQL ServerSQL Server 인스턴스에 대한 잠재적인 공격 노출 영역이 늘어납니다.Granting users access to a contained database increases the potential attack surface area against the whole SQL ServerSQL Server instance. 관리자는 이러한 액세스 제어 위임을 인지하고 포함된 데이터베이스의 사용자에게 ALTER ANY USER 사용 권한을 부여할 때는 신중을 기해야 합니다.Administrators should understand this delegation of access control, and be very careful about granting users in the contained database the ALTER ANY USER permission. 모든 데이터베이스 소유자는 ALTER ANY USER 사용 권한을 가지고 있습니다.All database owners have the ALTER ANY USER permission. SQL ServerSQL Server 관리자는 포함된 데이터베이스 사용자를 정기적으로 감사해야 합니다. administrators should periodically audit the users in a contained database.

게스트 계정을 사용하여 다른 데이터베이스 액세스Accessing Other Databases Using the guest Account

데이터베이스 소유자 및 ALTER ANY USER 사용 권한이 있는 데이터베이스 사용자는 포함된 데이터베이스 사용자를 만들 수 있습니다.Database owners and database users with the ALTER ANY USER permission can create contained database users. SQL ServerSQL Server인스턴스의 포함된 데이터베이스에 연결한 후 포함된 데이터베이스 사용자는 데이터베이스 엔진Database Engineguest 계정을 사용하도록 설정한 의 다른 데이터베이스에 액세스할 수 있습니다.After connecting to a contained database on an instance of SQL ServerSQL Server, a contained database user can access other databases on the 데이터베이스 엔진Database Engine, if the other databases have enabled the guest account.

다른 데이터베이스에 복제 사용자 만들기Creating a Duplicate User in Another Database

일부 응용 프로그램에서는 사용자에게 여러 데이터베이스에 대한 액세스 권한이 필요할 수 있습니다.Some applications might require that a user to have access to more than one database. 각 데이터베이스에 동일한 포함된 데이터베이스 사용자를 만들면 됩니다.This can be done by creating identical contained database users in each database. 암호를 사용하는 두 번째 사용자를 만들 때 SID 옵션을 사용합니다.Use the SID option when creating the second user with password. 다음 예에서는 두 개의 데이터베이스에 두 명의 동일한 사용자를 만듭니다.The following example creates two identical users in two databases.

USE DB1;  
GO  
CREATE USER Carlo WITH PASSWORD = '<strong password>';   
-- Return the SID of the user  
SELECT SID FROM sys.database_principals WHERE name = 'Carlo';  

-- Change to the second database  
USE DB2;  
GO  
CREATE USER Carlo WITH PASSWORD = '<same password>', SID = <SID from DB1>;  
GO  

데이터베이스 간 쿼리를 실행하려면 호출하는 데이터베이스에 TRUSTWORTHY 옵션을 설정해야 합니다.To execute a cross-database query, you must set the TRUSTWORTHY option on the calling database. 예를 들어 위에 정의된 사용자(Carlo)가 DB1에 있는 경우 SELECT * FROM db2.dbo.Table1; 을 실행하려면 데이터베이스 DB1에 TRUSTWORTHY 옵션을 설정해야 합니다.For example if the user (Carlo) defined above is in DB1, to execute SELECT * FROM db2.dbo.Table1; then the TRUSTWORTHY setting must be on for database DB1. 다음 코드를 실행하여 TRUSTWORTHY 옵션을 설정합니다.Execute the following code to set the TRUSTWORTHY setting on.

ALTER DATABASE DB1 SET TRUSTWORTHY ON;  

로그인을 복제하는 사용자 만들기Creating a User that Duplicates a Login

암호를 사용하며 SQL ServerSQL Server 로그인과 같은 이름의 포함된 데이터베이스 사용자를 만들고 SQL ServerSQL Server 로그인에서 연결 시 초기 카탈로그로 포함된 데이터베이스를 지정하면 SQL ServerSQL Server 로그인에서 연결할 수 없습니다.If a contained database user with password is created, using the same name as a SQL ServerSQL Server login, and if the SQL ServerSQL Server login connects specifying the contained database as the initial catalog, then the SQL ServerSQL Server login will be unable to connect. 이 연결은 SQL ServerSQL Server 로그인을 기반으로 하는 사용자가 아니라 포함된 데이터베이스의 암호가 있는 포함된 데이터베이스 사용자로 평가됩니다.The connection will be evaluated as the contained database user with password principal on the contained database instead of as a user based on the SQL ServerSQL Server login. 따라서 SQL ServerSQL Server 로그인에 대해 의도적으로 또는 의도치 않게 서비스가 거부될 수 있습니다.This could cause an intentional or accidental denial of service for the SQL ServerSQL Server login.

  • 최선의 방법은 sysadmin 고정 서버 역할의 멤버가 항상 초기 카탈로그 옵션을 사용하지 않고 연결하는 것입니다.As a best practice, members of the sysadmin fixed server role should consider always connecting without using the initial catalog option. 이렇게 하면 로그인이 master 데이터베이스에 연결되므로 데이터베이스 소유자가 로그인 시도를 잘못 사용할 수 없게 됩니다.This connects the login to the master database and avoids any attempts by a database owner to misuse the login attempt. 그런 다음 관리자는 USE<database> 문을 사용하여 포함된 데이터베이스로 변경할 수 있습니다.Then the administrator can change to the contained database by using the USE<database> statement. 로그인의 기본 데이터베이스를 포함된 데이터베이스로 설정할 수도 있습니다. 이렇게 하면 master로의 로그인이 완료된 다음 포함된 데이터베이스로 이 로그인이 전송됩니다.You can also set the default database of the login to the contained database, which completes the login to master, and then transfers the login to the contained database.

  • 최선의 방법은 SQL ServerSQL Server 로그인과 이름이 같은, 암호가 있는 포함된 데이터베이스 사용자를 만들지 않는 것입니다.As a best practice, do not create contained database users with passwords who have the same name as SQL ServerSQL Server logins.

  • 중복 로그인이 있으면 초기 카탈로그를 지정하지 않고 master 데이터베이스에 연결한 다음 USE 명령을 실행하여 포함된 데이터베이스로 변경합니다.If the duplicate login exists, connect to the master database without specifying an initial catalog, and then execute the USE command to change to the contained database.

  • 포함된 데이터베이스가 있는 경우 포함되지 않은 데이터베이스의 사용자는 초기 카탈로그를 사용하지 않거나 포함되지 않은 데이터베이스 이름을 초기 카탈로그로 지정하여 데이터베이스 엔진Database Engine 에 연결해야 합니다.When contained databases are present, users of databases that are not contained databases should connect to the 데이터베이스 엔진Database Engine without using an initial catalog or by specifying the database name of a non-contained database as the initial catalog. 이렇게 하면 데이터베이스 엔진Database Engine 관리자의 직접 제어를 적게 받는 포함된 데이터베이스에 연결하지 않게 됩니다.This avoids connecting to the contained database which is under less direct control by the 데이터베이스 엔진Database Engine administrators.

데이터베이스의 포함 상태를 변경하여 액세스를 늘림Increasing Access by Changing the Containment Status of a Database

dbcreator 고정 서버 역할의 멤버와 같이 ALTER ANY DATABASE 권한이 있는 로그인 및 db_owner 고정 데이터베이스 역할의 멤버와 같이 CONTROL DATABASE 권한이 있는 포함되지 않은 데이터베이스 사용자는 데이터베이스의 포함 설정을 변경할 수 있습니다.Logins that have the ALTER ANY DATABASE permission, such as members of the dbcreator fixed server role, and users in a non-contained database that have the CONTROL DATABASE permission, such as members of the db_owner fixed database role, can change the containment setting of a database. 데이터베이스의 포함 설정이 NONE 에서 PARTIAL 또는 FULL로 변경된 경우 암호가 있는 포함된 데이터베이스 사용자를 만들면 사용자 액세스 권한을 부여할 수 있습니다.If the containment setting of a database is changed from NONE to either PARTIAL or FULL, then user access can be granted by creating contained database users with passwords. 이 경우 SQL ServerSQL Server 관리자의 인지 또는 동의 없이 액세스 권한을 제공할 수 있습니다.This could provide access without the knowledge or consent of the SQL ServerSQL Server administrators. 데이터베이스가 포함되지 않도록 하려면 데이터베이스 엔진Database Engine포함된 데이터베이스 인증 옵션을 0으로 설정합니다.To prevent any databases from being contained, set the 데이터베이스 엔진Database Enginecontained database authentication option to 0. 선택된 포함된 데이터베이스에서 암호가 있는 포함된 데이터베이스 사용자가 연결하지 못하게 하려면 로그인 트리거를 사용하여 암호가 있는 포함된 데이터베이스 사용자의 로그인 시도를 취소합니다.To prevent connections by contained database users with passwords on selected contained databases, use login triggers to cancel login attempts by contained database users with passwords.

포함된 데이터베이스 연결Attaching a Contained Database

포함된 데이터베이스를 연결함으로써 관리자는 원치 않는 사용자에게 데이터베이스 엔진Database Engine인스턴스에 대한 액세스 권한을 주게 될 수 있습니다.By attaching a contained database, an administrator could give unwanted users access to the instance of the 데이터베이스 엔진Database Engine. 이러한 위험을 우려하는 관리자는 RESTRICTED_USER 모드에서 데이터베이스를 온라인으로 만들 수 있습니다. 이렇게 하면 암호가 있는 포함된 데이터베이스 사용자에 대한 인증을 막을 수 있습니다.An administrator concerned about this risk can bring the database online in RESTRICTED_USER mode, which prevents authentication for contained database users with passwords. 로그인을 통해 승인된 보안 주체만 데이터베이스 엔진Database Engine에 액세스할 수 있습니다.Only principals authorized through logins will be able to access the 데이터베이스 엔진Database Engine.

사용자는 사용자를 만드는 시점에 유효한 암호 요구 사항을 사용하여 만들어지며 데이터베이스를 연결하는 시점에서 암호가 다시 확인되지는 않습니다.Users are created using the password requirements in effect at the time that they are created and passwords are not rechecked when a database is attached. 약한 암호를 허용하는 포함된 데이터베이스를 더 강력한 암호 정책을 사용하는 시스템에 연결함으로써 관리자는 연결하는 데이터베이스 엔진Database Engine에서 현재 암호 정책을 충족하지 않는 암호를 허용할 수 있습니다.By attaching a contained database which allowed weak passwords to a system with a stricter password policy, an administrator could permit passwords that do not meet the current password policy on the attaching 데이터베이스 엔진Database Engine. 관리자는 연결된 데이터베이스에 대해 모든 암호를 다시 설정하도록 요구함으로써 약한 암호가 유지되지 않게 할 수 있습니다.Administrators can avoid retaining the weak passwords by requiring that all passwords be reset for the attached database.

암호 정책Password Policies

데이터베이스의 암호는 강한 암호가 되도록 요구할 수는 있지만 견고한 암호 정책으로 보호할 수는 없습니다.Passwords in a database can be required to be strong passwords, but cannot be protected by robust password policies. Windows에서 사용할 수 있는 가장 광범위한 암호 정책을 이용할 수 있도록 가능한 한 Windows 인증을 사용하십시오.Use Windows Authentication whenever possible to take advantage of the more extensive password policies available from Windows.

Kerberos 인증Kerberos Authentication

암호가 있는 포함된 데이터베이스 사용자는 Kerberos 인증을 사용할 수 없습니다.Contained database users with passwords cannot use Kerberos Authentication. Kerberos와 같은 Windows 기능을 이용할 수 있도록 가능하면 Windows 인증을 사용하십시오.When possible, use Windows Authentication to take advantage of Windows features such as Kerberos.

오프라인 사전 공격Offline Dictionary Attack

포함된 데이터베이스 사용자에 대한 암호 해시는 포함된 데이터베이스에 저장됩니다.The password hashes for contained database users with passwords are stored in the contained database. 데이터베이스 파일에 대한 액세스 권한이 있는 사용자는 누구나 감사되지 않는 시스템에서 암호가 있는 포함된 데이터베이스 사용자에 대해 사전 공격을 수행할 수 있습니다.Anyone with access to the database files could perform a dictionary attack against the contained database users with passwords on an unaudited system. 이러한 위협을 완화하려면 데이터베이스 파일에 대한 액세스를 제한하거나 Windows 인증을 통해서만 포함된 데이터베이스에 연결할 수 있도록 하십시오.To mitigate this threat, restrict access to the database files, or only permit connections to contained databases by using Windows Authentication.

포함된 데이터베이스 이스케이프Escaping a Contained Database

데이터베이스가 부분적으로 포함되어 있는 경우 SQL ServerSQL Server 관리자는 포함된 데이터베이스의 사용자 및 모듈의 기능을 정기적으로 감사해야 합니다.If a database is partially contained, SQL ServerSQL Server administrators should periodically audit the capabilities of the users and modules in contained databases.

AUTO_CLOSE를 통한 서비스 거부Denial of Service Through AUTO_CLOSE

포함된 데이터베이스가 자동으로 닫히도록 구성하지 마십시오.Do not configure contained databases to auto close. 데이터베이스가 닫히면 사용자를 인증하기 위해 데이터베이스를 여는 데 추가 리소스가 소비되며 서비스 거부 공격이 발생할 수 있습니다.If closed, opening the database to authenticate a user consumes additional resources and could contribute to a denial of service attack.

참고 항목See Also

포함된 데이터베이스 Contained Databases
부분적으로 포함된 데이터베이스로 마이그레이션 Migrate to a Partially Contained Database