EEP2008安全管理機制詳解
前言
隨著科技的進步與Internet的普及,透過Internet就可以存取公司的資料與相關資源,對現代人而言是一則以喜,一則以憂,喜的是Internet帶來了方便與進步,憂的是Internet也讓企業的相關資源暴露在有心人士與駭客之中,因此,資訊系統的保密與安全,已經是必要而且是刻不容緩的事。資訊安全是一個很大的課題,從網路設備到通訊軟體,從作業系統到應用軟體,最後到資料庫,作者也非資安專家無法高談闊論,本文中我們就針對應用軟體的安全架構與資料庫權限控管機制來說明。
多種安全管理機制
早期我們在開發系統時,都是從最簡單的帳號密碼開始的,然後延伸到功能權限,最後是資料權限控管,我想大多的系統都是以此為核心,來達到安全管控的目的,同樣在EEP2008中,我們也是從這些基礎架構談起,說明如下:
1. 登入的機制:提供一個帳號與密碼的管理,並能與Microsoft的AD或LDAP結合。 2. SingleSignOn權限:在不通過EEP的登陸畫面登陸EEP系統情況下,系統將按照EEP登陸用戶的安全管理權限進行管控。 3. 功能表的權限:提供一個功能表系統,並能與用戶帳號及群組結合來定義權限。 4. Web Form權限:在Web系統中,直接使用URL連結網頁時,依然啟動EEP安全管控機制。 5. 操作功能的權限:提供一個Security保全元件來控制Button或資料新增/更改/刪除的權限。 6. 欄位的權限:可以使用SecColumn元件來控制欄位的顯示或編輯權限。 7. 資料的權限:可以使用InfoCommand元件來控制使用者的資料讀取權限。
以下,我們就針對此7種機制來詳細說明。
登入的機制
不管是Web或Windows,我們提供了一個Login機制,透過這個Login機制來管制此User是否可以登入並使用系統,因此任何EEP2008所開發出來的網頁或dll程式,都必須要Login成功才能使用該頁面。此機制中,我們使用了一個系統資料表Users,其重要的欄位說明如下: UserID,用來存放User帳號。 UserName,原來存放User名稱。 Pwd,該User的密碼,本欄位使用加密的方式,以防止密碼外洩。 MSAD,該帳號是否來自Active Directory的帳號,如果是,登入時必須向AD認證。
因此,在EEP2008的此Table資料,可以單獨使用,資料可以透過其他的帳號Table轉入,也可以指定來自那一個Domain的AD帳號轉入,並透過LDAP來向AD認證,增加其帳號的安全性。
SingleSignOn權限
這個功能只要是我們可通過Single SignOn中提供的方法,設定UserID及Password等訊息後,Single SignOn可以不透過Login畫面來登陸系統,但登陸的User依然可按照EEP的Login機制來管控系統。 在使用此功能情況下,若用戶登陸了非EEP的應用程式後,用戶將無需重新登陸EEP的Login畫面,即可開啟在EEP權限管控下的Form。無論Win還是Web同樣適用Single SignOn的功能。
功能表的權限
這個功能主要是要控制那些User或那些群組,可以使用那些功能,首先系統是透過 MenuTable這個資料表來完成功能表的定義,系統會在RunTime時以TreeView(樹狀結構)或Pulldonw Menu(下拉式功能表)來呈現,其重要的欄位說明如下: MenuID,功能表代號。 Caption,功能表項目的名稱。 Parent,上層功能表代號,如果沒有Parent代表是根目錄,用此來呈現多階架構。 Package,網頁的名稱或DLL程式名稱。
在此為了定義群組權限,因此就多出了Groups與UserGroups這兩個系統資料表,來定義那些群組(部門)有那些Users。在群組中一樣有一個MSAD欄位代表該群組是否來自Active Directory的群組帳號,Groups與UserGroups是一對多的關聯關係,而且一個User是允許定義在不同的群組上。 接著,透過上述的MenuTable功能清單,我們必須讓它與Users或Groups建立對應的關係,那些Users或那些Groups可以使用這些MenuTable,系統以GroupMenus(內有GroupID與MenuID)與UserMenus(內有UserID與MenuID)定義該User或Group與MenuTable的關係,來達到功能權限管制的目的。
Web Form權限
這個功能主要是用於控制當User透過在IE地址中輸入有效的URL地址後,系統依然能夠自動進入登陸畫面。這樣系統將會根據登入的機制進行安全管控,並透過MenuTable功能清單,來建立功能權限管制的目的。透過下圖可知,當以一個功能表單的地址轉入時,系統會自動顯示逾時提示,告知User需要重新登陸,當然你必須在EEP的Web表單上加入一行EEP特有的CheckMenuRights()來達到這個需求。
操作功能的權限
MenuTable的控制只是對主功能表的權限控管,這是不夠的,我們又必須在每個頁面(或視窗)上對每個功能按鈕做深入的控制,因此在頁面上我們要貼入一個Security元件,目的用來輸出下列幾種元件來輸出其控制權,並可以透過EEPManager來讓使用者自定這些權限,如下:
1. Button/ToolStripButton/ImageButton/LinkButton等,可以控制其元件可以顯示或執行(Enable/Disable) 2. BindingSource/WebDataSource可以用來連接頁面資料的元件,主要控制是否可以擁有新增/更改/刪除/印表/輸出等權限。 3. Panel/SplitterPanel等,可以用來控制是否可以顯示或操作(Enable/Disable) 4. SecColumns,針對資料的欄位做權限管制,說明於下一段文章中。
接著我們針對Security元件的屬性,說明如下:
MenuID:必須對應到MenuTable中的MenuID來連接此頁面與主功能表間的關係。 EEPAlias:因為Security會將上述元件項目輸出到一個MenuTableControls的系統表上,因此要指定一個EEPAlias的資料庫別名。該MenuTableControls只存放了MenuID與此頁面的ControlName(元件名稱)及Description(讓使用者看得懂的元件描述)。 Active:是否真正啟動安全管制功能,要設為True才能生效。 RelaxMode:如果有User的權限又有群組的權限,甚至此User隸屬多個群組,產生混淆時,設為True會讓系統進入寬鬆的模式中(有一個成立就成立),或是為False讓其嚴謹(都要成立才能成立)。
真正的權限設定,在EEP2008中有一個EEPManager.EXE來設定這些功能項中的頁面,一般會與Users或Groups搭配設定,如果是Users,則是設定在UserMenuControls中,代表該Users在該頁面擁有那些權限;如果是Groups,則會設定在GroupMenuControls中,代表該Groups在該頁面擁有那些權限;此兩個Table的欄位都是要給管理者設定後存檔所使用,並能在RunTime達到管制權限的目的,說明如下:
UserID/GroupID,如果是UserMenuControls則代表使用者代號,如果是GroupMenuControls則代表群組代號。 MenuID,功能表代號,此代表某一個頁面或視窗。 ControlName,該頁面中的功能項目(也是元件名稱),取自MenuTableControls。 Enabled,控制該元件為Enable或Disable。 Visible,控制該元件為Visible或Hide。 AllowAdd,控制該資料表可以允許新增,這些控制只針對資料表元件有效。 AllowDelete,控制該資料表可以允許刪除。 AllowUpdate,控制該資料表可以允許更改。 AllowPrint,控制該資料表可以允許印表。 AllowExport,控制該資料表可以允許輸出。
以上設定,只要在RunTime打開頁面或視窗,如果該Security為Active狀態下,就會依該Login的User或所屬群組,依上述的對照關係來自動反應各個元件其權限的情況。
欄位的權限
針對特殊的欄位,我們有一個特別的SecColumn元件來處理此權限的管制,也就是除了在該頁面上貼了Security元件外,還要特別針對要管制的欄位貼入此元件來搭配使用,此元件的重要屬性如下: DataSource:要管制欄位的資料表。 Columns:此DataSource中,可以設定多個欄位來管制其欄位的權限。 ReadOnly:控制所有Columns欄位皆為唯讀與否。 Visible:控制所有Columns欄位皆顯示與否。
控制此SecColumn中欄位權限,是透過Security輸出到MenuTableControls中,再由管理者自由以UserMenuControls或GroupMenuControls來個別定義是否可以顯示或編輯,不必透過程式控制的方式來進行。
資料的權限
最後就是資料的存取權限了,這也是所有權限管理中,最困難的部份,因為所有的RDBMS資料庫中,也沒有對ROW DATA有提供權限的管理,都是要開發者自行去規劃與設計,在EEP2008因為是N-Tier的架構,因此,我們可以輕易透過InfoCommand這個元件的功能來達到。
以下先說明InfoCommand的幾個資料權限控管的屬性:
SecurityStyle:用來控制資料保全的模式,目前可用的模式為: 1. ByNone不啟動,本InfoCommand不作任何資料保全控管。 2. ByUser,所有歸屬該User的資料都可以存取,啟動此命令時系統會自動為你加上where 欄位=UserID,因此,此功能必須在InfoCommand的Table中要有這個欄位來存放UserID。 3. ByGroup,所有歸屬該使用者相對的群組資料都可以存取,啟動此命令時系統會自動為你加上 where 欄位 IN (該User群組),此功能必須在InfoCommand的Table中要有這個欄位來存放GroupID。 4. ByRoles,用於WorkFlow的環境下,所有歸屬該使用者相對的角色資料都可以存取,啟動此命令時系統會自動為你加上 where 欄位 IN (該User角色),此功能必須在InfoCommand的Table中要有這個欄位來存放RoleID。 5. ByOrg,用於WorkFlow的環境下,所有歸屬該使用者相對的角色及其組織結構中下屬角色資料都可以存取,啟動此命令時系統會自動為你加上 where 欄位 IN (該User相對的角色及其組織結構中下屬角色),此功能必須在InfoCommand的Table中要有這個欄位來存放RoleID。 6. ByOrgShare,與ByOrg類似,將所有歸屬該使用者相對的角色及其組織結構中下屬角色資料都可以存取,唯一與ByOrg不同的是ByOrgShare多了同部門的成員角色(同僚),彼此可以相互看到資料,因此ByOrg是一個上下關係,上面主管可以看到下屬的資料,而ByOrgShare則除了上下關係,有多了水平關係,就是在最底層時可以透通同僚的資料。 SecFieldName:用來配合SecStyle所定義的欄位名稱,如果SecStyle=ByUser就是指建檔者userid的欄位名稱,如果SecStyle=ByGroup即指此資料的所屬部門(群組)的欄位名稱。 SecExcept:可以定義一個或多個例外的群組(UserGroup),該User如果隸屬這些群組時,SecStyle就會失效,如高級主管/財務部門/MIS部門等群組,都是可以不受資料安全機制所管控的。 SiteControl:用來自動分割多廠或分公司及事業體的資料控制,此要配合Client端的Login系統變數(存在CliUtils.fSideCode中),在每次啟動Infocommand時,就會自動加入Where SiteFieldName欄位=fSideCode,fSideCode是依每個Client來決定之,而欄位內容則記錄分公司或廠區的代號。此即可依Client的fSideCode自動過濾與分割資料。 SiteFieldName:當SiteControl=True時,則以此欄位名稱做為多公司多廠的欄位名稱。
由以上InfoCommand元件,就可以輕易來設定那些Table要有資料的存取權限管制,並依Login者的不同與所屬的部門不同,而顯示不同的資料,達到資料的保全目的。
結語
訊光歷經了十七個年頭與十代產品的洗禮,數千個客戶建議下,演變成今日的規格,雖說不上完美,但也是一個集體創作的美好產物,產物不貴在產品本身,而是貴在規格,因為那是經過了無數的批評與指教所辛苦耕耘來的,隨著科技的躍進,變的是作業系統與技術平台,甚至工具語言,不變的是商用軟體的需求與工具規格,透過這樣的演變與蛻變,希望能讓參與這個行業的同好,有更好更易學習的開發環境,及共同成長的空間,讓這個產業也能有蓬勃發展的一日,共同來期待那日的來臨。
|