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

適用於:Linux 上的 SQL Server

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

本文中的程式碼範例使用 AdventureWorks2025 或 AdventureWorksDW2025 範例資料庫,您可以從 Azure Data SQL 範例存放庫 GitHub 存放庫下載這些資料庫。

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

透過在資料庫建立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 欄中的某一列符合 SalesPerson 登入的 ID,或執行查詢的使用者是 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()');

建立新使用者 TestUser,並在該資料表上授與 SELECT 權限,然後以 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。

以下範例說明了使用伺服器上安裝的憑證AdventureWorks2025來加密與解密MyServerCert資料庫。

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

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