<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # F.33\. sepgsql `sepgsql`是一個可加載的模塊,支持基于標簽的強制訪問控制(MAC), 以SELinux安全策略為基礎。 | **Warning** | |:--- | | 當前的實現有很大的局限性,并不為所有的動作都執行強制訪問控制。 參閱[Section F.33.7](#calibre_link-2185)。 | ## F.33.1\. 概述 這個模塊與SELinux結合,提供一個PostgreSQL 正常提供的安全檢查的附加層。從SELinux來看,這個模塊允許 PostgreSQL起到用戶空間對象管理者的作用。 DML查詢發起的每個表和函數訪問都將針對系統安全策略做檢查。 這個檢查是PostgreSQL執行的通常的SQL權限檢查之外的東西。 SELinux訪問控制決策利用安全標簽, 以字符串表示,如`system_u:object_r:sepgsql_table_t:s0`。 每個訪問控制決策包含兩個標簽:嘗試執行動作的主題的標簽, 和要被執行操作的對象的標簽。因為這些標簽可以用于任意類型的對象, 所以存儲在數據庫中的對象的訪問控制決策會(用這個模塊是這樣的) 和任意其他類型的對象(比如,文件)一樣使用通用標準。 這個設計是為了允許集中的安全策略保護信息資產獨立于這些資產的存儲細節。 [SECURITY LABEL](#calibre_link-759)語句允許分配安全標簽給數據庫對象。 ## F.33.2\. 安裝 `sepgsql`只能用于Linux 2.6.28 或更高的啟用SELinux的系統。 在其他的平臺上不能使用。也需要libselinux 2.1.10 或更高版本和selinux-policy 3.9.13或更高版本 (盡管一些分支可以移植需要的規則到老的政策版本)。 `sestatus`命令允許檢查SELinux的狀態。 一個典型的顯示是: ``` $ sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targeted ``` 如果禁用了SELinux或者沒有安裝SELinux, 那么必須在安裝這個模塊之前先配置該產品。 要建立這個模塊,在你的PostgreSQL `configure`命令中包含選項 `--with-selinux`。確保在建立時已經安裝了 `libselinux-devel` RPM。 要使用這個模塊,必須在`postgresql.conf`的 [shared_preload_libraries](#calibre_link-576)參數中包含了`sepgsql`。 如果以任何其他方式加載,該模塊將不會正確的運行。一旦加載了該模塊, 你應該在每個數據庫中執行`sepgsql.sql`。 這將安裝安全標簽管理需要的函數,并且分配最初的安全標簽。 這里是一個示例,顯示如何用`sepgsql`函數和安裝的安全標簽初始化新的數據庫集群。 為你的安裝適當的調整顯示的路徑: ``` $ export PGDATA=/path/to/data/directory $ initdb $ vi $PGDATA/postgresql.conf change #shared_preload_libraries = '' # (change requires restart) to shared_preload_libraries = 'sepgsql' # (change requires restart) $ for DBNAME in template0 template1 postgres; do postgres --single -F -c exit_on_error=true $DBNAME \ </usr/local/pgsql/share/contrib/sepgsql.sql >/dev/null done ``` 請注意,你可能會看到一些或者所有下列的通知,取決于你的 libselinux和selinux-policy版本: ``` /etc/selinux/targeted/contexts/sepgsql_contexts: line 33 has invalid object type db_blobs /etc/selinux/targeted/contexts/sepgsql_contexts: line 36 has invalid object type db_language /etc/selinux/targeted/contexts/sepgsql_contexts: line 37 has invalid object type db_language /etc/selinux/targeted/contexts/sepgsql_contexts: line 38 has invalid object type db_language /etc/selinux/targeted/contexts/sepgsql_contexts: line 39 has invalid object type db_language /etc/selinux/targeted/contexts/sepgsql_contexts: line 40 has invalid object type db_language ``` 這些信息是無害的,應該忽略。 如果安裝進程沒有錯誤的完成了,那么你現在可以正常的啟動服務器。 ## F.33.3\. 回歸測試 由于SELinux的性質,為`sepgsql` 運行回歸測試需要幾個額外的配置步驟,其中一些必須作為root用戶完成。 回歸測試不通過一個普通的`make check`或`make installcheck` 命令來運行;你必須設置配置,然后手動的調用測試腳本。 測試必須在配置的PostgreSQL構造樹的`contrib/sepgsql`目錄中運行。 盡管他們需要一個構造樹,但是測試的目的是針對一個已經安裝的服務器執行的, 這點他們可以與`make installcheck`作比較。 第一步,根據[Section F.33.2](#calibre_link-2186)中的指示, 在一個運行的數據庫中設置`sepgsql`。 請注意,當前的操作系統用戶必須能夠作為超級用戶不需要密碼認證的連接到數據庫。 第二步,為回歸測試建立和安裝策略包。`sepgsql-regtest`策略是一個特定用途的策略包, 提供了一組在回歸測試期間被允許的規則。應該從策略源文件`sepgsql-regtest.te` 中建立,使用`make`和SELinux提供的Makefile來實現。 你需要在你的系統上定位適當的Makefile;下面顯示的路徑只是一個示例。 一旦建立,使用`semodule`命令安裝這個策略包, 它加載提供的策略包到內核中。如果策略包正確的安裝了, 那么`semodule` -l應該會將 `sepgsql-regtest`作為一個可用的策略包列出: ``` $ cd .../contrib/sepgsql $ make -f /usr/share/selinux/devel/Makefile $ sudo semodule -u sepgsql-regtest.pp $ sudo semodule -l | grep sepgsql sepgsql-regtest 1.07 ``` 第三步,打開`sepgsql_regression_test_mode`。 出于安全考慮,`sepgsql-regtest`中的規則缺省是不啟用的; `sepgsql_regression_test_mode`參數啟用需要發出回歸測試的規則。 可以使用`setsebool`命令打開: ``` $ sudo setsebool sepgsql_regression_test_mode on $ getsebool sepgsql_regression_test_mode sepgsql_regression_test_mode --> on ``` 第四步,驗證你的shell是在`unconfined_t`域中運行: ``` $ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 ``` 如果需要,請參閱[Section F.33.8](#calibre_link-2187)獲取調整你的工作域的詳細信息。 最后,運行回歸測試腳本: ``` $ ./test_sepgsql ``` 這個腳本將嘗試驗證你已經正確的做了所有的配置步驟, 然后它將為`sepgsql`模塊運行歸回測試。 完成測試之后,建議你禁用`sepgsql_regression_test_mode`參數: ``` $ sudo setsebool sepgsql_regression_test_mode off ``` 你可能想要徹底刪除`sepgsql-regtest`策略: ``` $ sudo semodule -r sepgsql-regtest ``` ## F.33.4\. GUC 參數 `sepgsql.permissive` (`boolean`) 這個參數使得`sepgsql`能夠在許可的模式運行,無視系統的設置。 缺省為off。這個參數只能在`postgresql.conf` 文件中或者在服務器的命令行設置。 當這個參數為on時,`sepgsql`函數在許可模式, 即使SELinux通常運行在強制模式。這個參數對于測試目的尤其有用。 `sepgsql.debug_audit` (`boolean`) 這個參數啟用審計信息的打印,無視系統策略設置。缺省是off, 意味著信息將根據系統設置來打印。 SELinux的安全策略也有規則控制是否記錄特殊的訪問。 缺省的,只記錄違規的訪問。 這個參數強制打開所有可能的記錄,無視系統的策略。 ## F.33.5\. 特性 ### F.33.5.1\. 控制對象類 SELinux的安全模型描述了所有的訪問控制規則, 作為主題的實體(通常,數據庫的一個客戶端)和對象的實體(比如一個數據庫對象) 的關系,每一個都由安全標簽來鑒別。如果嘗試訪問一個沒有標簽的對象, 那么該對象被當做是分配了`unlabeled_t`標簽。 目前,`sepgsql`允許分配安全標簽給模式、表、字段、序列、 視圖和函數。當正在使用`sepgsql`時, 自動分配安全標簽給在創建時支持的數據庫對象。這個標簽被稱為缺省的安全標簽, 并且是根據系統的安全策略決定的,數據庫會拿這個系統的安全策略輸入來當作創建人的標簽, 該標簽分配給新對象的父對象,并且可以選擇以構造對象名來命名。 一個新的數據庫對象基本上繼承父對象的安全標簽,除了安全策略有特殊的類型轉換規則時, 會應用一個不同的標簽。對于模式來說,父對象是當前數據庫;對于表、序列、視圖和函數, 是包含的模式;對于字段,是包含的表。 ### F.33.5.2\. DML 權限 對于表,`db_table:select`、`db_table:insert`、 `db_table:update`或`db_table:delete`,根據語句的類型, 為所有引用的目標表做檢查;另外,`db_table:select` 也為所有在`WHERE`或`RETURNING`子句中的包含字段引用的表做檢查, `UPDATE`的數據源也是如此,等等。 也將為每個引用的字段檢查字段級別的權限。`db_column:select` 不只是檢查被`SELECT`讀取的字段,也檢查在其他DML語句中引用的字段; `db_column:update`或`db_column:insert` 也將檢查被`UPDATE`或`INSERT`修改的字段。 例如,考慮: ``` UPDATE t1 SET x = 2, y = md5sum(y) WHERE z = 100; ``` 這里,`db_column:update`將為`t1.x`做檢查, 因為它被更新了,`db_column:{select update}` 將為`t1.y`做檢查,因為它被更新和引用了, `db_column:select`將為`t1.z`做檢查, 因為它被引用了。`db_table:{select update}` 也將在表級別做檢查。 對于序列,當我們使用`SELECT`引用一個序列對象時,對 `db_sequence:get_value`做檢查;不過,請注意, 我們當前不檢查執行對應的函數的權限,如`lastval()`。 對于視圖,將檢查`db_view:expand`, 然后任何其他需要的權限都將分別在從視圖擴展的對象上做檢查。 對于函數,當用戶嘗試將函數作為查詢的一部分執行,或使用快速路徑調用時, 會對`db_procedure:{execute}`做檢查。如果這個函數是一個受信任的程序, 那么也會檢查`db_procedure:{entrypoint}`的權限, 看看它是否可以作為受信任的程序的入口點來執行。 為了訪問任意模式對象,在包含的模式上需要`db_schema:search`權限。 當不帶有模式限定的引用一個對象時,這個模式的權限沒有出現將不會被搜索 (就好像用戶在這個模式上沒有`USAGE`權限)。 如果給出了明確的模式限定,如果用戶在命名的模式上沒有必需的權限, 那么將會出現一個錯誤。 客戶端必須被允許訪問所有引用的表和字段,即使它們起源于隨后擴張的視圖, 所以我們應用一致的訪問控制規則,獨立于引用表內容的方式。 缺省的數據庫權限系統允許數據庫超級用戶使用DML命令修改系統目錄, 引用和修改toast表。當啟用`sepgsql`時,禁止這些操作。 ### F.33.5.3\. DDL 權限 SELinux為每個對象類型定義了幾個控制一般操作的權限;比如創建、 修改、刪除和重新貼安全標簽。另外,幾個對象類型有特殊的權限控制它們的典型操作; 如在一個特別的模式中添加或刪除名字入口。 創建一個新的數據庫對象需要`create`權限。SELinux 將根據客戶端的安全標簽授予或拒絕這個權限,并且為新的對象擬建安全標簽。 在某些情況下,需要額外的權限: * [CREATE DATABASE](#calibre_link-111)還需要源或模板數據庫的`getattr`權限。 * 創建一個模式對象還需要在父模式上有`add_name`權限。 * 創建一個表還需要有權限創建每個單獨的表字段,就好像每個表字段是一個獨立的頂級對象。 * 創建一個標記為`LEAKPROOF`的函數還需要`install`權限。 (當為一個現有的函數設置`LEAKPROOF`時,也需要檢查這個權限。) 當執行`DROP`命令時,將在要被刪除的對象上檢查`drop`。 也要檢查通過`CASCADE`直接刪除的對象的權限。 包含在特定模式(表、視圖、序列和程序)中對象的刪除還需要在該模式上的`remove_name`。 當執行`ALTER`命令時,將為每個對象類型的被修改的對象檢查`setattr`, 除了附屬的對象,如表的索引或觸發器,這里的權限是在父對象上檢查的。 在某些情況下,需要額外的權限: * 移動一個對象到新的模式還需要在舊的模式上有`remove_name`權限, 和在新的模式上有`add_name`權限。 * 在一個函數上設置`LEAKPROOF`屬性需要`install`權限。 * 在一個對象上使用[SECURITY LABEL](#calibre_link-759)還需要在與老的安全標簽結合的對象上有 `relabelfrom`權限,和在與新的安全標簽結合的對象上有`relabelto`權限。 (在安裝了多個標簽提供者和用戶嘗試設置一個安全標簽,但不被SELinux 管理的情況下,只應該檢查`setattr`。這是由于實現的限制,目前沒有做到的。) ### F.33.5.4\. 受信任的程序 受信任的程序類似于安全定義函數或setuid命令。SELinux 提供一個特性,允許受信任的代碼使用一個不同于客戶端的安全標簽運行, 通常是為了提供到敏感數據的高度控制的訪問(例如,可能會忽略行, 或者存儲值的精度可能會減少)。一個函數是否作為受信任的程序動作, 是由它的安全標簽和操作系統安全策略控制的。例如: ``` postgres=# CREATE TABLE customer ( cid int primary key, cname text, credit text ); CREATE TABLE postgres=# SECURITY LABEL ON COLUMN customer.credit IS 'system_u:object_r:sepgsql_secret_table_t:s0'; SECURITY LABEL postgres=# CREATE FUNCTION show_credit(int) RETURNS text AS 'SELECT regexp_replace(credit, ''-[0-9]+$'', ''-xxxx'', ''g'') FROM customer WHERE cid = $1' LANGUAGE sql; CREATE FUNCTION postgres=# SECURITY LABEL ON FUNCTION show_credit(int) IS 'system_u:object_r:sepgsql_trusted_proc_exec_t:s0'; SECURITY LABEL ``` 以上的操作應該由管理員用戶執行。 ``` postgres=# SELECT * FROM customer; ERROR: SELinux: security policy violation postgres=# SELECT cid, cname, show_credit(cid) FROM customer; cid | cname | show_credit -----+--------+--------------------- 1 | taro | 1111-2222-3333-xxxx 2 | hanako | 5555-6666-7777-xxxx (2 rows) ``` 在這種情況下,普通用戶不能直接引用`customer.credit`, 但是一個受信任的程序`show_credit`允許他帶有一些數字標記的打印客戶的信用卡號碼。 ### F.33.5.5\. 動態域轉換 使用SELinux的動態域轉換特性來轉換客戶端程序、客戶端域的安全標簽到一個新的內容是可能的, 如果安全策略允許這么做。客戶端域需要`setcurrent`權限, 還有從老的都新的域的`dyntransition`權限。 動態域轉換應該仔細考慮,因為他們允許用戶轉換他們的標簽, 并且因此他們在選項上的權限不受系統的授權(在受信任的程序的情況下)。 因此,`dyntransition`權限只在用于轉換一個域到更小的權限集合時認為是安全的。 例如: ``` regression=# select sepgsql_getcon(); sepgsql_getcon ------------------------------------------------------- unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 (1 row) regression=# SELECT sepgsql_setcon('unconfined_u:unconfined_r:unconfined_t:s0-s0:c1.c4'); sepgsql_setcon ---------------- t (1 row) regression=# SELECT sepgsql_setcon('unconfined_u:unconfined_r:unconfined_t:s0-s0:c1.c1023'); ERROR: SELinux: security policy violation ``` 在上面的例子中,允許我們從較大的MCS范圍`c1.c1023` 轉換到較小的范圍`c1.c4`,但是反過來轉換就被拒絕了。 動態域轉換和受信任的程序的組合使得一個有趣的用例滿足連接池軟件的典型的生命周期過程。 盡管你的連接池軟件不能運行大多數的SQL命令,但是你可以允許它使用`sepgsql_setcon()` 函數從一個受信任的程序里面切換客戶端的安全標簽;可能需要一些證書批準切換客戶端標簽的請求。 之后,這個會話將會擁有目標用戶的權限,而不是連接池的權限。該連接池可以稍后使用帶有 `NULL`參數的`sepgsql_setcon()`函數恢復安全標簽的改變, 再次從受信任的程序里面用適當的權限檢查調用。 這里的要點是只有那個受信任的程序實際上擁有改變有效的安全標簽的權限,并且給出適當的證書。 當然,對于安全的操作,證書的存儲(表、過程定義或其他東西)必須防止越權訪問。 ### F.33.5.6\. 其他 我們拒絕[LOAD](#calibre_link-739)命令包括一切, 因為加載的任何模塊都能很容易的繞開安全策略實施。 ## F.33.6\. Sepgsql 函數 [Table F-27](#calibre_link-2188)顯示了可用的函數。 **Table F-27\. Sepgsql 函數** | `sepgsql_getcon() returns text` | 返回客戶端的域,客戶端當前的安全標簽。 | | `sepgsql_setcon(text) returns bool` | 如果安全策略允許,則切換當前會話的客戶端的域到一個新的域。 也接受`NULL`輸入作為轉換到客戶端原來的域的一個請求。 | | `sepgsql_mcstrans_in(text) returns text` | 如果mcstrans進程正在運行,則轉化給出的限定MLS/MCS范圍為行格式。 | | `sepgsql_mcstrans_out(text) returns text` | 如果mcstrans進程正在運行,則轉化給出的行MCS/MCS范圍為限定的格式。 | | `sepgsql_restorecon(text) returns bool` | 為當前數據庫中所有的對象設置初始的安全標簽。參數可以是NULL, 或特定文件的名字用于系統默認的選擇。 | ## F.33.7\. 限制 數據定義語言 (DDL) 權限 由于實現的限制,一些DDL操作不檢查權限。 數據控制語言 (DCL) 權限 由于實現的限制,DCL操作不檢查權限。 行級別的訪問控制 PostgreSQL不支持行級別的訪問;因此`sepgsql`也不支持。 隱藏通道 `sepgsql`沒有試圖隱藏某一對象的存在,即使不允許用戶訪問它。 例如,我們可以推斷一個不可見對象的存在,根據主鍵沖突、外鍵沖突等, 雖然我們不能獲得該對象的內容。最高機密表的存在不能被隱藏;我們只希望能隱藏它的內容。 ## F.33.8\. 外部資源 [SE-PostgreSQL 介紹](http://wiki.postgresql.org/wiki/SEPostgreSQL) 這個wiki頁提供了一個簡要概述、安全設計、構造、管理和即將到來的特性。 [Fedora SELinux 用戶指南](http://docs.fedoraproject.org/selinux-user-guide/) 這個文檔提供了在你的系統上管理SELinux的廣泛的知識。 它主要集中于Fedora,但是不局限于Fedora。 [Fedora SELinux FAQ](http://docs.fedoraproject.org/selinux-faq) 這個文檔回答了關于SELinux的常見問題。 它主要集中于Fedora,但是不局限于Fedora。 ## F.33.9\. 作者 KaiGai Kohei `&lt;[kaigai@ak.jp.nec.com](mailto:kaigai@ak.jp.nec.com)&gt;`
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看