練習 - 控制能存取您資料庫的人員

已完成

雖然您或許能夠透過網路連線到資料庫,但那並不代表您實際上可以獲得對資料本身的存取權。 按照分層方式,您希望確保只有需要存取資料的使用者才能真正存取。 這類存取就是驗證和授權派上用場的地方。

驗證

驗證是確認身分識別的流程。 此身分識別可能是使用者、在系統上執行的服務,或是系統本身,例如虛擬機器。 透過驗證流程,您可以確保個人或系統是其所宣稱的身分。 SQL Database 支援兩種驗證類型:SQL 驗證Microsoft Entra 驗證

SQL 驗證

SQL 驗證方法會使用使用者名稱和密碼。 使用者帳戶可以在主資料庫中建立,並可獲授與伺服器上所有資料庫中的權限。 您也可以在資料庫本身建立使用者 (稱為自主使用者),並只授與他們該資料庫的存取權。 當您為資料庫建立邏輯伺服器時,採取使用者名稱和密碼指定了「伺服器管理員」登入。 使用這些認證,您就能以資料庫擁有者 (或 dbo) 的身分,向該伺服器上的任何資料庫進行驗證。

Microsoft Entra 驗證

此驗證方法使用由 Microsoft Entra ID 管理的身分識別,而且受控網域和整合式網域都支援此驗證。 盡可能使用 Microsoft Entra 驗證 (整合式安全性)。 您可以使用 Microsoft Entra 驗證,在單一位置集中管理資料庫使用者和其他 Microsoft 服務的身分識別。 中央識別碼管理提供單一位置以管理資料庫使用者並簡化權限管理。 如果您想要使用 Microsoft Entra 驗證,就必須建立另一個名為「Microsoft Entra 管理員」的伺服器管理員,才能管理 Microsoft Entra 使用者和群組。 此管理員也可以執行一般伺服器管理員可執行的所有作業。

授權

授權是指身分識別可在 Azure SQL Database 內執行的動作。 此授權會由直接授與該使用者帳戶和/或資料庫角色成員資格的權限來控制。 資料庫角色可用來將權限群組在一起,以簡化系統管理。 將使用者新增至角色,以授與角色擁有的權限。 這些權限可以包含登入資料庫的能力、讀取資料表的能力,以及從資料庫新增或移除資料行的能力。 最好的作法是,您應該授與使用者所需的最低權限。 向 SQL 和 Microsoft Entra 使用者授與授權的流程都一樣。

在這裡的範例中,您連線的伺服器管理帳戶是 db_owner 角色的成員,其有權在資料庫中執行任何動作。

驗證和授權的實際操作

作為最佳做法,您的應用程式應該使用專用帳戶來驗證。 這樣一來,萬一應用程式的程式碼很容易受到 SQL 插入式攻擊,您就可以限制授與應用程式的權限,並降低惡意活動的風險。 建議您建立自主資料庫使用者,讓您的應用程式能夠直接向資料庫進行驗證。 如需詳細資訊,請參閱 自主的資料庫使用者 - 使資料庫可攜

使用 Microsoft Entra 驗證集中管理資料庫使用者的身分識別,並作為 SQL Server 的替代驗證。

請看看如何設定使用者,並授與他們存取資料庫的權限。 在此案例中,您將針對使用者使用 SQL 驗證,但此流程和您使用 Microsoft Entra 驗證的情況基本上是一樣。

建立資料庫使用者

建立可用來授與存取權的新使用者。

  1. 在 Cloud Shell 中,於 appServer VM 上,以 ADMINUSER 的身分再次連線到您的資料庫。

    sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
    
  2. 執行下列命令以建立新使用者。 這個使用者是「自主使用者」,只允許存取 marketplace 資料庫。 您可以視需要隨意調整密碼,但請務必將密碼記下來,因為您將在以後的步驟中用到。

    CREATE USER ApplicationUser WITH PASSWORD = 'YourStrongPassword1';
    GO
    

使用這些認證,使用者將能向資料庫進行驗證,但他們並未獲授權來存取任何資料。 為此使用者授與存取權。

為使用者授與權限

將使用者設為 db_datareaderdb_datawriter 角色的成員,分別為其授與讀取和寫入資料庫的存取權。 您還想防止此使用者存取含有地址的資料表。

  1. 在仍連線到 appServer 上的 sqlcmd 時,執行下列 T-SQL,為您建立的使用者授與 db_datareaderdb_datawriter 角色。

    ALTER ROLE db_datareader ADD MEMBER ApplicationUser;
    ALTER ROLE db_datawriter ADD MEMBER ApplicationUser;
    GO
    
  2. 您可以進一步縮小存取權的範圍。 您可以使用 DENY 運算子來拒絕使用者對資料庫中其他元素的存取。 執行下列 T-SQL,以拒絕使用者 ApplicationUserSalesLT.Address 資料表選取資料的能力。

    DENY SELECT ON SalesLT.Address TO ApplicationUser;
    GO
    

現在,請以該使用者的身分登入,並查看此設定的實際運作方式。

  1. 在仍處於 T-SQL 提示字元中的情況下,輸入 exit 以結束您的工作階段。

  2. 現在,請以您所建立的使用者身分,重新登入資料庫。

    sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U 'ApplicationUser' -P '[password]' -N -l 30
    
  3. 執行下列查詢。 此查詢會從該使用者有權存取的資料表中提取資料。

    SELECT FirstName, LastName, EmailAddress, Phone FROM SalesLT.Customer;
    GO
    

    您應該會取回一份客戶清單。

    FirstName      LastName       EmailAddress                    Phone
    -------------- -------------- ------------------------------- ------------
    Orlando        Gee            orlando0@adventure-works.com    245-555-0173
    Keith          Harris         keith0@adventure-works.com      170-555-0127
    Donna          Carreras       donna0@adventure-works.com      279-555-0130
    Janet          Gates          janet1@adventure-works.com      710-555-0173
    ...
    
  4. 請看看當您嘗試查詢自己無權存取的資料表時,會發生什麼事。

    SELECT * FROM SalesLT.Address;
    GO
    

    您應該會收到一則訊息,表示您沒有此資料表的存取權。

    Msg 229, Level 14, State 5, Server server-22942, Line 1
    The SELECT permission was denied on the object 'Address', database 'marketplace', schema 'SalesLT'.
    

如您所見,就算您已獲授與對某個資料庫的讀取/寫入權限,您仍然可以透過明確拒絕對資料表的存取,進一步保護對資料的存取。 如果您有多位共用類似存取權的使用者,您可以建立具有適當權限的自訂角色並簡化管理。

務必妥善地保護您的資料庫,並且只在必要時授與存取權。 Azure SQL Database 所提供的內建功能,可讓您完全控制驗證及授權身分識別以存取您資料庫中資料的能力。