SQL Azure 的安全性與登入管理
SQL Azure 安全性模型

 SQL Azure 對於單一個使用者帳戶來說,其實就等同於一台 SQL Server 機器,管理人員或開發人員只要使用註冊 SQL Azure 時所得到的帳戶連線即可,當使用者在 SQL Azure 上登記建立 SQL Azure Server 時,SQL Azure 會建立一個 master 資料庫,並派給一個帳戶,這個帳戶稱為伺服器級主帳戶(Server-level principal),它其實就是平常 SQL Server 所使用的 sa 帳戶,具有最高等級的權限,在剛開始使用時只有它可以存取到 master 資料庫。

 在 master 資料庫中,存有完整的 SQL Azure Server 設定,必要的系統預存程序以及動態管理檢視表(Dynamic Management Views, DMV)等等。

SQL Azure Server 
圖:SQL Azure Server 的 master 資料庫可使用的檢視表

 在 SQL Azure 上要管理使用者的存取權限,多半都和 SQL Server 本機上管理差不多,只有下列幾點不同:

  • SQL Azure Server 上的安全群組(Security Role)只有 loginmanager 以及 dbmanager,分別屬於管理登入帳戶以及資料庫。
  • 所有針對帳戶的管理以及資料庫的建立,都必須要在 master 資料庫上執行才會有效,因此這也表示登入帳戶必須要能夠連到 master 資料庫。

下表為在 SQL Server 上管理以及在 SQL Azure Server 上管理的差異。

差異點 SQL Server SQL Azure Server
在何處管理伺服器安全性 在 SSMS 物件瀏覽器的安全性資料夾。 在 master 資料庫。
用以建立登入帳戶的
伺服器級安全性群組
securityadmin loginmanager
管理登入用的指令 CREATE LOGIN
ALTER LOGIN
DROP LOGIN
CREATE LOGIN
ALTER LOGIN
DROP LOGIN
(部份參數受到限制,同時只能在 master 資料庫上執行)
檢視登入帳戶 sys.sql_logins sys.sql_logins
(只能在 master 資料庫上執行)
用以建立資料庫用的
伺服器級安全性群組
dbcreator dbmanager
建立資料庫用的指令 CREATE DATABASE CREATE DATABASE
(部份參數受到限制,同時只能在 master 資料庫上執行)
刪除資料庫用的指令 DROP DATABASE DROP DATABASE
(若使用者擁有 dbmanager的權限,就算資料庫不是由該使用者建立,仍能刪除)
檢視資料庫清單 sys.databases (檢視表) sys.databases (只能在maste 資料庫上執行)
建立與管理 SQL Azure Server 的登入帳戶

 若想要管理 SQL Azure Server 的登入帳戶,則必須要先使用 sqlcmd.exe 或是 SSMS 連線到 SQL Azure Server 的 master 資料庫,若不知道要如何連接到 SQL Azure,請參考『SQL Azure:資料庫的雲端世代』一文。

NOTE
在 SQL Azure Server 中,USE 指令無法使用,這代表不可以直接用 USE master 來切換到 master 資料庫,只能夠重新建立連到 master 資料庫的連線才行。

連線成功後,可以使用 SELECT * FROM sys.sql_logins 來查詢目前登記的 SQL 登入帳戶,在一開始時,只有一個伺服器級主帳戶。

SQL Azure Server 

接著,可以利用下列指令建立一個新使用者:

[SQL]
  CREATE LOGIN [login_name] WITH PASSWORD = '[password for this login]'

例如:

[SQL]
  CREATE LOGIN test_login WITH PASSWORD = 'frejwj@fe0i0jksd'

然後使用 SELECT * FROM sys.sql_logins 去查詢,就可以看到新的帳戶了。

SQL Azure Server 

NOTE
SQL Azure Server 登入的密碼,必須符合高強度密碼的規則,亦即密碼字元中必須符合下列規則:
1. 密碼不包含全部或部分的使用者帳戶名稱。帳戶名稱的一部分是定義為三個以上的連續英數字元,
    兩邊以空格 (例如空格鍵、Tab 鍵和 Return 鍵) 或下列任一字元分隔:逗號 (,)、句號 (.)、
    連字號 (-)、底線 (_) 或數字符號 (#) 分隔。
2. 密碼長度至少為八個字元。
3. 密碼包含下列四種字元的其中三種:
4. 拉丁文大寫字母 (A 到 Z)。
5. 拉丁文小寫字母 (a 到 z)。
6. 以 10 為基底的數字 (0 到 9)。
7. 非英數字元,例如:驚嘆號 (!)、錢幣符號 ($)、數字符號 (#) 或百分比符號 (%)。 若不符合規則,
    則 SQL Azure Server 會回傳這個訊息: Password validation failed. The password does not
    meet Windows policy requirements because it is too short.

NOTE
SQL Azure Server 的登入名稱最長為 117 個字元,因為在登入時必須要用 name@server 的方式,而 server 會佔去 10 個字元,因此登入名稱只能用 117 個字元。

若要修改登入帳戶的密碼,則請使用 ALTER LOGIN 指令。

[SQL]
  ALTER LOGIN [login_name] {ENABLE|DISABLE} {WITH PASSWORD = '[password for this login]'}

例如:

[SQL]
  --修改 test_login 的密碼:
      ALTER LOGIN test_login WITH PASSWORD = 'frejwj@jwtergv54gr'
      --關閉 test_login 帳戶:
      ALTER LOGIN test_login DISABLE
      --開啟 test_login 帳戶:
      ALTER LOGIN test_login ENABLE

若要刪除使用者帳戶,請使用 DROP LOGIN 指令:

[SQL]
  DROP LOGIN [login_name]

管理 SQL Azure Server 登入帳戶的安全性群組

 當帳戶建立完成後,只是一個普通的登入帳戶,若想要讓帳戶具有特別的功能(管理登入帳戶或建立資料庫)時,就必須將帳戶加到特定的安全性群組中。最常見的情況是 SQL Azure Server 的管理員將資料庫管理權限交給專案團隊或是開發人員,由他們來決定登入的帳戶以及資料庫的設置等等。

 若想要將帳戶加入安全性群組,則首先必須將它設為可存取 master 資料庫的使用者,亦即要先使用 CREATE USER 來加入登入帳戶。

[SQL]
  CREATE USER [user_name] FROM LOGIN [login_name]

例如:

[SQL]
  CREATE USER test_login FROM LOGIN test_login

加入帳戶至 master 資料庫後,即可使用系統預存程序 sp_addrolemember 將它加入安全性群組中。

[SQL]
  --將使用者加入 dbmanager 群組:EXEC sp_addrolemember 'dbmanager', '[db_user_name]'
      --將使用者加入 loginmanager 群組: EXEC sp_addrolemember 'loginmanager', '[db_user_name]'

若想要將登入自指定的安全性群組中移除時,可使用系統預存程序 sp_droprolemember 來處理。

[SQL]
  --將使用者自 dbmanager 群組移除: EXEC sp_droprolemember 'dbmanager', '[db_user_name]'
      --將使用者自  loginmanager 群組移除: EXEC sp_droprolemember 'loginmanager', '[db_user_name]'

管理資料庫安全性

 若要在 SQL Azure Server 中建立資料庫,則登入帳戶必須要先連到 master 資料庫,亦即要先使用 CREATE USER 將登入帳戶加到 master 資料庫中的使用者以及授予 dbmanager 安全性群組權限,才能夠建立資料庫。

 建立資料庫的指令為 CREATE DATABASE,這個指令必須要在 master上資料庫做,或者在 SQL Azure Server 的管理介面上也可以(請參考『SQL Azure:資料庫的雲端世代』一文)。

[SQL]
  CREATE DATABASE [database_name] [(MAXSIZE=[1|10] GB)]

 建立好資料庫後,請切換到該資料庫後,再使用 CREATE USER 來設定允許存取該資料庫的使用者(登入帳戶必須要先在 master 資料庫使用 CREATE LOGIN 建立好)即可。

NOTE
只要是針對資料庫或使用者的 CREATE / ALTER / DROP 指令,都必須是在該 SQL 批次中唯一的一條指令,不能使用複數的指令來做,因此像下列指令無法在 SQL Azure Server 中執行:

[SQL]
  IF EXISTS (SELECT [name]
                     FROM [sys].[databases]
                     WHERE [name] = N'database_name')
             DROP DATABASE [database_name];
       go

針對資料庫層次的安全性,像是 schema、permission 等等,都與獨立安裝的 SQL Server 功能相同,可參考 SQL Server 線上書籍或是坊間的 SQL Server 管理書籍來學習這部份的管理指令。

接下來...
下一期筆者會介紹與存取 SQL Azure Server 資料庫,以及移轉現有資料庫到 SQL Azure Server 的議題。

參考資料

 SQL Azure: Managing Databases and Logins
 SQL Azure: Guidelines and Limitations

本文摘錄自 Micorsoft MSDN Flash 2009年1月號

arrow
arrow
    全站熱搜

    Zabo 發表在 痞客邦 留言(1) 人氣()