mORMot 1.18 第19章 安全性
第19章 安全性
在企業資料庫設計中,安全性是必不可少的。mORMot已為此做好準備。
19.1 HTTP/HTTPS
您可以在四個受支援的模式中的任何一箇中進行選擇,它們可以組合使用。
Pascal類 | 描述 |
---|---|
TSQLRestServerAuthenticationDefault | mORMot安全認證,作為一種專有的雙重挑戰和SHA-256雜湊 |
TSQLRestServerAuthenticationSSPI | Windows認證,透過已登入的使用者進行 |
TSQLRestServerAuthenticationNone | 僅基於使用者名稱的簡單認證(較弱) |
TSQLRestServerAuthenticationHttpBasic | HTTP基本認證 警告:密碼未加密 |
預設是TSQLRestServerAuthenticationDefault和TSQLRestServerAuthenticationSPPI的組合。這些指定了用於mORMot客戶端的內部專有安全性,以及SPPI,即Windows HTTP認證,該認證可與Windows客戶端的已登入使用者ID自動配合工作。
在使用者修改模型建立並新增TSQLAuthUser和TSQLAuthGroup這兩個類之前,使用者ID和密碼不會被強制執行。
檢視我們之前專案中的csclass.pas,我們的函式更改為:
function CreateSampleModel: TSQLModel;
begin
// 安全性 - 新增安全類 *Auth*
result := TSQLModel.Create([TSQLAuthUser, TSQLAuthGroup, TSQLSampleRecord]);
end;
然後在客戶端的啟動過程中新增以下行:
procedure Start;
var
Server: AnsiString;
userid: RawUTF8;
password: RawUTF8;
begin
if ParamCount = 0 then
Server := 'localhost'
else
Server := AnsiString(Paramstr(1));
Model := CreateSampleModel;
DB := TSQLHttpClient.Create(Server, '8080', Model);
userid := 'joe';
password := 'synopse';
if not DB.SetUser(userid, password) then
raise Exception.CreateFmt('%s: 伺服器拒絕了 "%s" 的憑據', [Server, userid]);
end;
重新編譯客戶端和伺服器以滿足新模型的要求。然後在一個視窗中執行伺服器。
當您執行客戶端時,會顯示localhost: 伺服器拒絕了“joe”的憑據,並且程式會停止。
嘗試將userid更改為具有相同密碼“synopse”的“User”,然後重新編譯客戶端。現在您不會收到錯誤,但讀取和寫入會失敗。身份驗證已成功,但授權阻止了您檢視資料。
最後,在不更改密碼的情況下將userid更改為“Admin”。重新編譯後,程式將完美執行。我們透過了身份驗證,並獲得了完成工作的授權。
DB.CreateMissingTables這一行自動新增了預設的使用者ID:
管理員、主管、使用者和訪客,密碼都是“synopse”。
請務必在任何資料庫上更改這些預設密碼,或刪除這些使用者ID。
mORMot 文件中有關於使用者ID和密碼的最新詳細資訊,但在我寫這篇文章的時候,SQLAuthUser 記錄的 JSON 格式如下:
[{
"AuthUser": [{
"RowID": 1,
"LogonName": "Admin",
"DisplayName": "Admin",
"PasswordHashHexa": "67aeea294e1cb515236fd7829c55ec820ef888e8e221814d24d83b3dc4d825dd",
"GroupRights": 1,
"Data": null
},
{
"RowID": 2,
"LogonName": "Supervisor",
"DisplayName": "Supervisor",
"PasswordHashHexa": "67aeea294e1cb515236fd7829c55ec820ef888e8e221814d24d83b3dc4d825dd",
"GroupRights": 2,
"Data": null
},
{
"RowID": 3,
"LogonName": "User",
"DisplayName": "User",
"PasswordHashHexa": "67aeea294e1cb515236fd7829c55ec820ef888e8e221814d24d83b3dc4d825dd",
"GroupRights": 3,
"Data": null
}
]
},
{
"AuthGroup": [{
"RowID": 1,
"Ident": "Admin",
"SessionTimeout": 10,
"AccessRights": "11,1-256,0,1-256,0,1-256,0,1-256,0"
},
{
"RowID": 2,
"Ident": "Supervisor",
"SessionTimeout": 60,
"AccessRights": "10,1-256,0,3-256,0,3-256,0,3-256,0"
},
{
"RowID": 3,
"Ident": "User",
"SessionTimeout": 60,
"AccessRights": "10,3-256,0,3-256,0,3-256,0,3-256,0"
},
{
"RowID": 4,
"Ident": "Guest",
"SessionTimeout": 60,
"AccessRights": "0,3-256,0,0,0,0"
}
]
}
]
許可權是應用於使用者組的。您可以建立任何您想要的組,但預設組如下所示。
組 | 提交SQL | 查詢SQL | 認證讀 | 認證寫 | 表讀 | 表寫 | 服務 |
---|---|---|---|---|---|---|---|
Admin | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
Supervisor | 是 | 否 | 是 | 否 | 是 | 是 | 是 |
User | 否 | 否 | 否 | 否 | 是 | 是 | 是 |
Guest | 否 | 否 | 否 | 否 | 是 | 否 | 否 |
這個表格概述了不同使用者組所享有的許可權。例如,“Admin”組擁有所有許可權,包括提交SQL查詢、查詢SQL、認證讀寫、表讀寫以及服務訪問。相比之下,“Guest”組的許可權則非常有限,只能讀取表資料,無法進行其他操作。
在實際應用中,您可以根據實際需求建立和調整使用者組及其許可權,以滿足不同使用者或使用者群體的訪問需求。這有助於確保資料的安全性和完整性,同時提供靈活性和可管理性。
19.2 資料庫加密
mORMot 支援透明的資料庫加密,以保護您的資料免受未經授權的訪問。您可以透過設定 TSQLModel
的 EncryptionKey
屬性來啟用加密。此金鑰用於在資料寫入磁碟之前對其進行加密,並在讀取時對其進行解密。
Model := TSQLModel.Create([...]); // 建立模型
Model.EncryptionKey := 'MySecretEncryptionKey'; // 設定加密金鑰
警告: 請確保牢記加密金鑰,因為如果丟失,將無法恢復加密的資料。
19.3 訪問控制和許可權
mORMot 提供了一個靈活的許可權系統,允許您控制哪些使用者可以訪問資料庫的哪些部分。這透過 TSQLAuthUser
和 TSQLAuthGroup
類實現,它們允許您定義使用者和組,並分配相應的許可權。
例如,您可以為使用者分配不同的角色,如“管理員”、“編輯者”或“檢視者”,併為每個角色設定不同的許可權級別。
19.4 日誌和審計
為了增強安全性,mORMot 還支援詳細的日誌記錄,以便您可以跟蹤誰何時訪問了哪些資料。這對於審計和合規性檢查特別有用。
您可以透過配置 TSQLRestServer
的日誌設定來啟用日誌記錄,並選擇要記錄的資訊級別。
19.5 備份和恢復
定期備份您的資料庫是保護資料免受丟失或損壞的重要步驟。mORMot 提供了用於備份和恢復資料庫的功能。
您可以使用 TSQLRestClient
或 TSQLRestServer
的方法來備份資料庫到檔案,並在需要時從該檔案恢復。
19.6 網路安全性
當透過網路與資料庫通訊時,確保通訊的安全性至關重要。mORMot 支援透過 HTTPS 進行安全通訊,您可以使用 SSL/TLS 證書來加密客戶端和伺服器之間的資料傳輸。
為了設定 HTTPS,您需要在伺服器上配置 SSL/TLS 證書,並確保客戶端配置為信任該證書。
小結
mORMot 提供了一個全面的安全性框架,涵蓋了身份驗證、授權、加密、日誌記錄、備份恢復和網路安全性等多個方面。當設計和實現企業資料庫解決方案時,請務必考慮並應用這些安全措施來保護您的資料和系統免受潛在威脅。