Linux 上的 SQL Server 安全性功能逐步解說

適用於:Linux 上的 SQL Server

如果您是剛開始使用 SQL Server 的 Linux 使用者,下列工作將逐步解說其中一些安全性工作。 這些任務並非 Linux 獨有或專屬,但能讓你了解需要進一步調查的領域。 每個範例都連結到該領域的詳細文件。

本文中的程式代碼範例會使用 AdventureWorks2025AdventureWorksDW2025 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案 首頁下載。

建立登入帳戶和資料庫使用者

透過在資料庫建立master登入帳號並使用該CREATE LOGIN語句,授權他人存取 SQL Server。 例如:

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

注意事項

您的密碼應遵循 SQL Server 預設 密碼原則。 根據預設,密碼長度必須至少為8個字元,且包含下列四個集合中的三個字元:大寫字母、小寫字母、基底10位數和符號。 密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。

登入可以連線到 SQL Server 且可以存取 (權限受限) master 資料庫。 若要連線到使用者資料庫,登入需要資料庫層級的對應識別,稱為資料庫使用者。 使用者是針對每個資料庫的,因此你必須在每個資料庫中分別建立使用者才能授權存取。

以下範例切換到 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 語句授予固定資料庫成員資格。 以下範例將使用者 Jerry 加入 db_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某列與登入IDSalesPerson相符,或執行查詢的使用者就是使用者時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) 會加密儲存在硬碟上的資料檔案。 master SQL Server Database Engine 的資料庫內有加密金鑰,因此 資料庫引擎 可以操作資料。 需要存取金鑰才可讀取資料庫檔案。 高階管理員可以管理、備份並重建金鑰,因此只有被選定的人能移動資料庫。 啟用 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

如需詳細資訊,請參閱 備份加密