SQL Server Security Best Practices
SQL Server Security Best Practices
Best Practices
Table of contents
Introduction 4
Limit the Permissions of Service Accounts According to the Principle of Least Privilege 6
About Netwrix 23
Introduction
While SQL Server is designed to be a secure database platform, following best practices for configuring, managing,
and monitoring your SQL Server environment can significantly reduce your risk of costly breaches, downtime, and
violations of data protection and privacy regulations such as GDPR, HIPAA, PCI DSS, and SOX.
To help, this article details the critical SQL Server security best practices to implement. You’ll learn about implementing
robust access controls, regularly patching and updating software, conducting security assessments, and more.
▪ SQL injection attacks occur when malicious SQL code is injected into the input fields or parameters of a SQL
query. This can enable attackers to execute commands or to steal sensitive data, modify database records or
gain access to the underlying system.
▪ Unauthorized access refers to exploiting weak authentication mechanisms or misconfigured access controls
to gain entry into SQL Server instances or databases. Attackers may attempt to brute-force passwords, exploit
default credentials or bypass access controls to gain elevated privileges or access sensitive data.
▪ Data leakage occurs when sensitive or confidential information is improperly exposed from SQL Server
databases. This can happen due to misconfigured permissions, insecure data storage practices or inadequate
encryption of sensitive data.
▪ Denial of service (DoS) attacks target SQL Server instances or databases with the intent of disrupting service
availability or causing system downtime. Attackers may flood SQL Server with excessive requests, execute
resource-intensive queries or exploit vulnerabilities to exhaust system resources and disrupt normal
operations.
▪ Database exploitation involves the exploitation of vulnerabilities in SQL Server or the underlying operating
system to gain unauthorized access to or control over the database server. Attackers may exploit unpatched
vulnerabilities, insecure configurations or weak encryption mechanisms to compromise the integrity or
availability of SQL Server databases.
▪ Privilege escalation occurs when attackers exploit vulnerabilities or misconfigurations to elevate their privileges
in order to gain access to sensitive data or administrative functions on the database server.
▪ Insufficient auditing and logging practices may hinder detecting and responding to security incidents in SQL
Server environments. Inadequate logging of security events, weak audit policies or lack of monitoring may
prevent timely detection of unauthorized access, data breaches or suspicious activities.
▪ Social engineering attacks target SQL Server administrators, developers or users through manipulation or
deception to expose sensitive information or grant unauthorized access. Attackers may use phishing emails,
pretexting or impersonation techniques to trick individuals into revealing credentials, executing malicious
code or disclosing confidential information.
▪ Database Engine Services — This is the core component of SQL Server responsible for storing, processing
and securing data.
▪ SQL Server management tools — Include SQL Server Management Studio (SSMS) or Azure Data Studio for
managing and administering the SQL Server instance.
▪ Integration services — If your applications require ETL (extract, transform, load) functionality, select
Integration Services to enable SSIS package execution.
▪ Full-text and semantic extractions for search — Enable this feature if your applications require full-text
search capabilities.
▪ Analysis services — Choose this option if you need multidimensional or tabular data analysis services.
Best practices include assigning each service a separate account. That way, even if the account for one service is
compromised or damaged, other services will still operate normally.
Here are the types of accounts you can use for SQL Server services:
▪ Active Directory (AD) managed service account (MSA) — This is the best option for two reasons. First,
managed service accounts cannot be used to log on to a server, so they are more secure than domain user
accounts. Second, you do not need to manually manage password resets for service accounts, which reduces
the risk of account compromise.
▪ Domain user account — This is the most common type of account used to run services. This account type is
entirely secure in a domain environment because it doesn’t have administrator privileges.
▪ Local user account — This is a good choice for non-domain environments.
▪ Local system account — These accounts are highly privileged, so you should avoid using them to run services.
▪ Network service account — This type of account has fewer privileges than a system account. Still, it enables
a service to access network resources, so you should avoid using it whenever possible.
▪ Virtual service account — A virtual service account is similar to an AD managed service account, but it is
a type of local account that you can use to manage services without a domain. NT Service\MSSQLSERVER is
an example of a virtual account that gets created when you install SQL Server and is assigned to the service.
These accounts have minimal privileges by default and are more secure than domain user accounts.
▪ Limit network access to SQL Server by configuring firewalls to allow connections only from trusted IP
addresses or subnets. Use network segmentation to isolate SQL Server from other systems and services
to reduces the attack surface. Disable unnecessary network protocols and services on SQL Server, such as
Named Pipes and TCP/IP.
▪ Change the default port used by SQL Server (1433 for default instances, 1434 for SQL Server Browser) to a
non-standard port to make it harder for attackers to discover and target SQL Server instances.
▪ Use IPsec (Internet Protocol Security) to secure network communication between SQL Server instances and client
applications. IPsec provides authentication and encryption at the IP packet level, enhancing network security.
▪ Use Windows Firewall or a third-party firewall to control inbound and outbound traffic to SQL Server.
Configure firewall rules to allow only necessary traffic to SQL Server ports.
▪ Implement an intrusion detection and prevention system (IDPS) to monitor network traffic and alert
administrators about suspicious activity.
Configure SSL to Encrypt SQL Data
in Transit
Configuring SSL/TLS to encrypt SQL data in transit helps protect sensitive information from unauthorized access
during communication between client applications and the SQL Server instance. You should obtain a server
authentication certificate from a trusted Certificate Authority (CA) or create a self-signed certificate. The certificate
should include the fully qualified domain name (FQDN) of the SQL Server computer as the Common Name (CN)
or as a Subject Alternative Name (SAN).
Test SSL/TLS encryption by connecting to the SQL Server instance from a client application using SQL Server
Management Studio (SSMS) or another database client.
When running a default instance of SQL Server, you should turn off the SQL Server Browser service or configure
another port for it to use to communicate. Then restart the SQL Server instance service, test application and client
connectivity to the SQL Server, and update your firewall rules to allow direct access to the SQL Server.
Configure SSL to Encrypt SQL Data
in Transit
Server roles provide an easy way to delegate administrative privileges, but you must assign these roles carefully.
Always follow the principle of least privilege when assigning roles to users. For example, if a user needs only to be
able to shut down the server and end processes, they should be assigned the server admin and process admin
roles; assigning them the sysadmin role would violate the principle of least privilege. There are several types of
roles to understand:
▪ Fixed server roles are predefined server-level roles with a specific set of permissions. They provide
administrative access to various server-level operations. Examples of fixed server roles include:
– sysadmin — Members of this role have full administrative privileges on the SQL Server instance.
– server admin — Members can configure server-wide settings.
– security admin — Members can manage Microsoft SQL server security settings and permissions.
– setup admin — Members can manage linked servers and server configuration settings.
– process admin — Members can manage SQL Server processes.
– bulk admin — Members can perform bulk insert operations.
▪ Fixed database roles are predefined roles within each database with specific permissions. They control
access to database-level operations. Examples of fixed database roles include:
– db_owner — Members of this role have complete control over the database, including the ability to modify
the schema, execute DDL statements and manage users.
– db_datareader — Members can read all data in the database.
– db_datawriter — Members can add, modify and delete data in the database.
– db_ddladmin — Members can execute DDL statements in the database.
– db_securityadmin — Members can manage security permissions in the database.
▪ User-defined roles are created by administrators or database owners to meet specific application or business
requirements. These roles can have custom sets of permissions tailored to the needs of the application or users.
Understand SQL Server Effective
Permissions
Create containers (such as groups or roles) and assign them permissions to access resources. Then, make accounts
of members of those groups of roles.
Following this best practice will be easier to understand the effective permissions for each account. Moreover, simply
by putting a user in the right groups or roles, you can easily assign the correct permissions to new hires, accurately
modify permissions as a user’s role changes and remove a user’s permissions when they leave the organization.
When multiple permissions are granted to a user through different roles or groups, SQL Server follows a hierarchy
to determine the effective permissions. Generally, the most permissive permission prevails, but if any permissions
are explicitly denied, that overrides any grants.
▪ Server-level permissions — Server-level permissions control actions that can be performed at the server
level, such as creating databases, altering server configuration settings and shutting down the server.
▪ Database-level permissions — Database-level permissions control actions that can be performed within a
specific database, such as querying tables, updating data and executing stored procedures.
▪ Object-level permissions — Object-level permissions control access to individual database objects, such as
tables, views, stored procedures and functions. You can grant permissions such as SELECT, INSERT, UPDATE,
DELETE, EXECUTE and CONTROL at the object level.
▪ Hotfixes, also known Quick Fix Engineering (QFE), are released to solve problems ASAP. Due to the tight time
constraints, hotfixes receive limited testing, so they should be applied only to systems known to have the
specific issues they address.
▪ Cumulative updates (CUs) are periodic releases of hotfixes with thorough testing.
▪ Service packs (SPs) are collections of patches and fixes that have been adequately tested and can easily be
installed as a single package.
The simplest way to keep SQL Server up to date is to enable automatic updates from Microsoft. Organizations
with a solid change process should apply updates only after performing their own testing.
▪ Windows Authentication is recommended in environments where SQL Server and client applications are
in a Windows domain. Users connect to the SQL Server using their Windows credentials and the SQL Server
validates their identity. This provides a more secure and centralized authentication mechanism.
▪ SQL authentication or mixed mode authentication requires users to provide an SQL server login ID and
password when connecting to the SQL server. User credentials are stored in SQL Server’s security system
rather than managed by Windows; this provides flexibility for environments where Windows authentication is
not feasible. If you use this authentication mode to connect to SQL Server, do not use the sa account since it
is the first account attackers will try to compromise in a brute-force attack.
▪ Microsoft Entra authentication (introduced in SQL Server 2022) allows users to connect to SQL Server
using their Entra ID identities. It provides centralized identity management and integrates with Azure AD’s
security features, such as conditional access and multifactor authentication. It requires the SQL Server to
be configured for Azure AD authentication and for users to be synchronized with Azure AD. Microsoft Entra
authentication supports Azure SQL database, Azure SQL managed instance, SQL Server on Windows Azure
VMs, Azure Synapse Analytics and SQL Server.
▪ MUST_CHANGE — SQL Server will prompt users to change their password the next time they log on. Use this
option whenever you create a new user. You can also use it to force a user to reset their password.
▪ CHECK_POLICY —The Windows password policies of the computer on which the SQL Server is running will be
enforced for the user. Always enable this setting.
▪ CHECK_EXPIRATION — The user will be required to reset their password regularly. Always enable this setting.
Differential backups are much faster and occupy less disk space than full backups, so they are especially useful
for large databases. However, full backups should still be taken periodically. For small databases, the best practice
is to use full backups every time.
You can also take file and filegroup backups, which back up only specific files or filegroups. This strategy can
reduce backup time and speed recovery of a single file or filegroup. However, be aware that managing filegroup
backups can be complex.
▪ SQL Server Management Studio (SSMS) — Utilize SSMS tools to monitor processes, resource usage and
system performance. In particular, SSMS Activity Monitor provides real-time insights into CPU usage, memory
consumption, disk I/O and active sessions.
▪ Dynamic management views (DMVs) — Use DMVs to identify long-running queries, blocking processes,
memory pressure and other performance bottlenecks. Common DMVs include:
– sys.dm_exec_requests
– sys.dm_exec_sessions
– sys.dm_exec_connections
– sys.dm_os_wait_stats
▪ SQL Server Profiler — Use SQL Server Profiler to capture and analyze SQL Server events, including queries,
stored procedure executions, errors and security-related events. Customize trace templates to capture
specific events or filter out unnecessary information. Analyze captured traces to identify performance issues,
diagnose errors and optimize queries.
▪ Extended Events — Use Extended Events for lightweight and customizable event monitoring. Create custom
event sessions to capture specific events, performance metrics and diagnostic information. Compared to SQL
Server Profiler, Extended Events offer lower overhead and more event filtering and analysis flexibility.
▪ Performance Monitor (PerfMon) — Use PerfMon to monitor SQL Server performance metrics such as CPU
usage, memory utilization, disk I/O and network activity. Create data collector sets to collect performance
counters over time and analyze performance trends. Monitor key performance indicators (KPIs) to identify
performance issues and resource bottlenecks proactively.
▪ Third-party monitoring tools — Consider using third-party monitoring tools specifically designed for SQL
Server monitoring and management. These tools offer comprehensive monitoring capabilities, customizable
dashboards, alerting mechanisms and performance analysis features.
In addition, configure alerts and notifications to proactively notify administrators about critical events, performance
issues and system failures. You can use SQL Server Agent alerts, Database Mail or external monitoring systems to
send alerts via email, SMS or other communication channels.
The following strategies can help mitigate the risk of these issues:
▪ Minimize transaction duration by breaking down long-running transactions into smaller units to reduce the
likelihood of deadlocks.
▪ Use proper indexing and query optimization. These options can significantly reduce contention and
improve concurrency by minimizing the time and resources required for query execution. Analyze query
execution plans, identify performance bottlenecks, and optimize queries and indexes accordingly.
▪ Identify and monitor blocking chains using DMVs like sys.dm_exec_requests and sys.dm_tran_locks, and
optimize queries and indexes to minimize the duration and scope of locks.
▪ Using locking hints (e.g., ROWLOCK, READPAST) to control locking behavior.
▪ Implement row versioning techniques such as snapshot isolation or Read Committed Snapshot Isolation (RCSI).
▪ Choose the appropriate isolation level ((e.g., READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ,
SERIALIZABLE) based on the application requirements and sensitivity to concurrency issues.
▪ Use optimistic concurrency control mechanisms, such as row versioning, optimistic locking and timestamp-
based concurrency, to reduce contention and improve scalability.
▪ Design applications with concurrency in mind, considering factors such as transaction boundaries, data
access patterns and error handling.
To identify and troubleshoot concurrency issues, monitor SQL Server performance metrics like locks, blocking and
deadlock events using tools like SQL Server Profiler, Extended Events and performance monitoring dashboards.
Implement anomaly detection rules to identify deviations from the baselines. This can include simple threshold-
based alerts or more advanced statistical methods for anomaly detection. Then investigate the root causes of the
deviations, which can include attacks, resource contention and application issues.
Audit Access Attempts and Changes
to Access Permissions
Enable login auditing in SQL Server and monitor the SQL Server error logs for information about failed and
successful login attempts, as well as changes and deletions of database objects containing restricted data.
In addition, track changes to SQL Server configurations and permissions so you can spot and remediate unwanted
changes before you suffer significant damage. This tracking can be done using SQL traces or third-party software
like Netwrix Auditor for SQL Server.
For more granular information, use SQL Server Audit to capture database level events such as data access, schema
changes and object modifications.
▪ Use parameterized queries — Instead of dynamically constructing SQL queries by concatenating user
input, use parameterized queries or prepared statements provided by your programming language or ORM
framework. Parameterized queries separate SQL code from user input, preventing attackers from injecting
malicious SQL code.
▪ Require input validation — Validate and sanitize all user-supplied input before using it in SQL queries. Reject input
that contains unexpected characters or patterns, such as SQL keywords, special characters or escape sequences.
Use whitelisting rather than blacklisting to validate input, as it’s more robust against evasion techniques.
▪ Parameterize APIs — If you are using APIs to interact with the database, ensure that API parameters
are adequately validated and parameterized to prevent SQL injection attacks. Apply input validation and
parameterization techniques at the API and database levels.
▪ Use stored procedures — Utilize stored procedures to encapsulate database operations. This helps prevent
SQL injection by ensuring user input is treated as data, not executable SQL code.
▪ Escape special characters — If parameterized queries or prepared statements are not feasible, ensure that
special characters in user input are correctly escaped before being included in SQL queries. Use database-
specific escape functions or libraries to handle special characters safely.
▪ Conduct security testing — Conduct regular security assessments, including code reviews, vulnerability scans
and penetration testing, to identify potential injection points and validate input sanitization mechanisms.
▪ Use well-established cryptographic algorithms and protocols that have undergone rigorous analysis and
scrutiny and come from reputable sources such as NIST or IETF. Avoid custom cryptographic implementations.
▪ Protect cryptographic keys from unauthorized access or disclosure. Use hardware security modules (HSMs)
or trusted execution environments (TEEs) to generate, store and use cryptographic keys securely. Regularly
rotate encryption keys and revoke compromised keys to mitigate the impact of key leakage.
▪ Use a defense-in-depth approach that combines cryptographic protections with other security measures
such as access controls, network segmentation and intrusion detection systems.
▪ Use secure memory allocation and deallocation techniques to prevent memory-related side-channel
attacks such as memory scraping or timing attacks. Avoid storing sensitive data in memory for longer than
necessary and securely wipe memory buffers afterward.
▪ Mitigate the risk of timing side-channel attacks. Implement constant-time algorithms and data structures.
Avoid branching or conditional statements that can leak information through timing discrepancies. Use
performance counters or timing-resistant functions to ensure consistent execution time regardless of input
or conditions.
▪ Implement secure error-handling mechanisms to avoid leaking sensitive information through error
messages or exception handling. Use generic error messages that do not reveal details about the internal
state or operation of the system.
You can use several encryption features in SQL Server to protect your data:
▪ Transparent data encryption (TDE) — TDE encrypts database files on disk, so it requires minimal changes to
applications and queries. However, it does not protect data in memory or during transmission.
▪ SQL column-level protection — The Always Encrypted option allows you to encrypt individual columns
containing sensitive data, such as credit card details or Social Security numbers, while still allowing the
database users to perform operations on the data. The data is encrypted in client applications before being
sent to SQL Server and decrypted in the application after retrieval from SQL Server, ensuring the data remains
encrypted both at rest and in transit.
▪ SQL row-level protection — Row-level security (RLS) enables you to define security policies that specify which
rows users can access based on user attributes, session context or other criteria, allowing fine-grained control
over row-level access. You can also create indexes on a subset of rows in a table that meet specified filter
criteria. SQL table views can also implement row level security by limiting the rows returned to users based on
their permissions. Triggers can enforce row-level security by intercepting data modification operations (e.g.,
INSERT, UPDATE, DELETE) and applying custom security logic.
The following are some common data masking techniques in SQL Server:
▪ Dynamic data masking (DDM) masks sensitive data in real time based on user permissions without modifying
the underlying data.
▪ Static data masking permanently obfuscates sensitive data in non-production environments while preserving
data relationships and characteristics. Static data masking can be applied to entire databases, specific tables
or individual columns.
▪ Hashing involves transforming sensitive data into irreversible hashed values using cryptographic hash
functions such as SHA-256 or MD5. Hashing masks sensitive data by converting it into a fixed-length string
that cannot be reversed to obtain the original value. While hashing helps protect passwords and other one-
way encrypted data, it is unsuitable for preserving data usability in all scenarios.
▪ Subsetting involves extracting a subset of data from a production database for non-production environments.
During data extraction, you can use subsetting techniques to mask sensitive data by excluding or obfuscating
specific rows or columns.
▪ Tokenization replaces sensitive data with randomly generated tokens or placeholders while storing the
original data in a secure vault. Tokenization allows you to preserve data relationships and usability while
masking sensitive information. Tokenization is commonly used in payment processing and other applications
where data security in SQL and compliance are critical.
▪ Format-preserving encryption encrypts sensitive data while preserving its original format, such as
maintaining the same data type, length and structure. FPE ensures that the masked data remains compatible
with existing applications and databases without requiring extensive modifications. FPE techniques can
encrypt credit card numbers, Social Security numbers and other structured data elements.
▪ Assessment and Planning Toolkit (MAP) is a free tool that helps organizations assess their SQL Server
environment’s readiness for migration, identify security vulnerabilities and generate reports with actionable
recommendations. The assessment reports cover SQL Server versions, security configurations and compliance
with best practices.
▪ Secure Score for SQL Server is a feature of Microsoft Defender for SQL Server (formerly SQL Advanced Threat
Protection). It analyzes SQL Server configurations, security settings and user permissions to identify potential
security risks and provides actionable recommendations for improving security posture.
▪ SQL Server Vulnerability Assessment (SSVA) is a feature of SQL Server Management Studio (SSMS) that helps
identify security vulnerabilities in SQL Server databases. It performs automated checks against a predefined
set of security best practices and recommendations, and provides detailed findings and remediation steps.
▪ DbDefence for SQL Server helps organizations assess and improve SQL database security by encrypting data
at rest, controlling access to sensitive data, and auditing user activity.
▪ Idera SQL Compliance Manager monitors Microsoft SQL security, activity analyzes security events and
generates reports to help organizations ensure compliance with regulatory requirements such as GDPR,
HIPAA, and PCI DSS.
▪ Imperva SecureSphere Database Assessment scans SQL Server databases for vulnerabilities, misconfigurations,
and access control issues. It provides actionable recommendations for improving security and compliance with
industry standards and regulations.
▪ Nessus is a widely used vulnerability assessment tool that scans security SQL Server instances for known
vulnerabilities, misconfigurations, and other security weaknesses and provides detailed remediation
recommendations.
▪ Netwrix Auditor for SQL Server provides actionable intelligence about your Microsoft SQL Server, including
who has access to what, who’s logging in and what critical changes are being made.
Strengthen database security
with Netwrix Auditor for SQL
Server
Proactively investigate and remediate unwanted or malicious
actions before they affect your business.
Quickly sort through the SQL Server audit trail and fine-tune
your search criteria until you find the information you need.
Next Steps
Netwrix products — Check out the full portfolio of Netwrix products: netwrix.com/products