適用於:Linux 上的 SQL Server
如果您是剛開始使用 SQL Server 的 Linux 使用者,下列工作將逐步解說其中一些安全性工作。 這些任務並非 Linux 獨有或專屬,但能讓你了解需要進一步調查的領域。 每個範例都連結到該領域的詳細文件。
本文中的程式代碼範例會使用 AdventureWorks2025 或 AdventureWorksDW2025 範例資料庫,您可以從 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
如需詳細資訊,請參閱 備份加密。