W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
sepgsql
是一個(gè)基于SELinux安全策略的 支持基于標(biāo)簽的強(qiáng)制訪問控制(MAC)模塊。
當(dāng)前的實(shí)現(xiàn)具有明顯的限制,并且不支持對(duì)所有動(dòng)作的強(qiáng)制訪問控制。詳見 第 F.35.7 節(jié)。
這個(gè)模塊和SELinux集成在一起在 PostgreSQL提供的安全檢查之上提供了一個(gè) 額外的安全檢查層。從SELinux的角度來看,這個(gè)模塊允許 PostgreSQL作為一個(gè)用戶空間對(duì)象管理器。 對(duì)每一次由 DML 查詢發(fā)起的表或者函數(shù)訪問將根據(jù)系統(tǒng)安全策略進(jìn)行檢查。這種 檢查是在PostgreSQL執(zhí)行的常規(guī) SQL 權(quán)限 檢查之外進(jìn)行的。
SELinux訪問控制決定是通過使用安全標(biāo)簽 來做出的,安全標(biāo)簽使用system_u:object_r:sepgsql_table_t:s0
這樣的字符串表示。每個(gè)訪問控制決定涉及兩個(gè)標(biāo)簽:嘗試執(zhí)行該動(dòng)作的主體的 標(biāo)簽以及要在其上執(zhí)行該動(dòng)作的客體的標(biāo)簽。由于這些標(biāo)簽可以被應(yīng)用于任何種 類的對(duì)象,對(duì)于存儲(chǔ)在數(shù)據(jù)庫(kù)中的對(duì)象的(用這個(gè)模塊做出的)訪問控制決定服 從于用于任意其他類型對(duì)象(例如文件)的同一種一般準(zhǔn)則。這種設(shè)計(jì)是為了允
許一種中央安全策略來保護(hù)信息資產(chǎn),而不依賴于這些資產(chǎn)是如何存儲(chǔ)的。
SECURITY LABEL語句允許為一個(gè)數(shù)據(jù)庫(kù)對(duì)象分配安全標(biāo)簽。
sepgsql
只能在啟用了 SELinux的 Linux 2.6.28 或者更高版本上使用。在任何 其他平臺(tái)上都無法使用這個(gè)模塊。你將還需要 libselinux 2.1.10 或者更高版本以及 selinux-policy 3.9.13
或者更高版本(盡管某些發(fā)行中可能 把必要的規(guī)則逆向移植到較老的策略版本中)。
你可以使用sestatus
命令檢查 SELinux的狀態(tài)。一種典型的顯示是:
$ sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
如果沒有安裝或者啟用SELinux,你就必須在安裝這個(gè)模塊 之前先安裝或者啟用它。
要編譯這個(gè)模塊,應(yīng)該在你的 PostgreSQL configure
命令中包括 選項(xiàng)--with-selinux
。還要確定編譯時(shí)安裝了 libselinux-devel
RPM 包。
要使用這個(gè)模塊,你必須在postgresql.conf
文件中的 shared_preload_libraries參數(shù)里包括 sepgsql
。如果以其他任何方式載入該模塊,它將無法正確地工作。 一旦該模塊被載入,你應(yīng)該在每一個(gè)數(shù)據(jù)庫(kù)中執(zhí)行
sepgsql.sql
。這將會(huì)安裝安全標(biāo)簽管理所需的函數(shù) 并且分配初始的安全標(biāo)簽。
這里有一個(gè)展示如何用sepgsql
函數(shù)和安全標(biāo)簽初始化一個(gè)新 數(shù)據(jù)庫(kù)集簇的例子(根據(jù)你的安裝調(diào)整其中的路徑):
$ 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
請(qǐng)注意,如果你具有特定版本的libselinux和 selinux-policy,你可能會(huì)看到下列提示中的一些或者全部:
/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
這些消息是無害的并且應(yīng)該被忽略。
如果該安裝過程完成時(shí)沒有出現(xiàn)錯(cuò)誤,就可以正常啟動(dòng)服務(wù)器了。
由于SELinux的本質(zhì),為sepgsql
運(yùn)行回歸測(cè)試要求一些額外的配置步驟,某些步驟還需要由 root 來完成。該回歸測(cè)試 無法通過普通的make check
或者make installcheck
命令運(yùn)行, 你必須建立配置并且接著手工調(diào)用測(cè)試腳本。這些測(cè)試必須在一個(gè)已配置
PostgreSQL 編譯樹的contrib/sepgsql
目錄中運(yùn)行。盡管它們要求一個(gè)編譯樹,但是 這些測(cè)試被設(shè)計(jì)成在一個(gè)已安裝服務(wù)器上執(zhí)行,也就是說它們可以比得上 make installcheck
(而不是make check
)。
首先,根據(jù)本文中第 F.35.2 節(jié)中的指導(dǎo)在一個(gè)工作數(shù)據(jù)庫(kù)中設(shè)置 sepgsql
。注意當(dāng)前操作系統(tǒng)用戶必須能夠不使用口令認(rèn)證作 為超級(jí)用戶連接到該數(shù)據(jù)庫(kù)。
第二,為該回歸測(cè)試編譯和安裝策略包。sepgsql-regtest
策略是一個(gè) 特殊的策略包,它提供一組在回歸測(cè)試淺見要被允許的規(guī)則。它應(yīng)該從策略源文件 sepgsql-regtest.te
編譯,這需要通過使用 make
和一個(gè) SELinux 提供的 Makefile 完成。你將需要 在你自己的系統(tǒng)上找到合適的 Makefile,下面展示的路徑只是一個(gè)例子。(這個(gè)
Makefile 通常 由 selinux-policy-devel
或 selinux-policy
RPM 提供。)一旦編譯好, 使用semodule
命令安裝這個(gè)策略包,它會(huì)把所提供的策略包載入到 內(nèi)核中。如果該包被正確地安裝,
應(yīng)該把
semodule
-lsepgsql-regtest
列成一個(gè)可用的策略包:
$ 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
中的規(guī)則默認(rèn)沒有被啟用。 the sepgsql_regression_test_mode
參數(shù)會(huì)啟用啟動(dòng)該回歸 測(cè)試所需的規(guī)則。它可以使用setsebool
命令來啟用:
$ sudo setsebool sepgsql_regression_test_mode on $ getsebool sepgsql_regression_test_mode sepgsql_regression_test_mode --> on
第四,驗(yàn)證你的 shell 在unconfined_t
域中操作:
$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
如果有必要,可以參考本文中第 F.35.8 節(jié)來調(diào)整你的工作域。
最后,運(yùn)行該回歸測(cè)試腳本:
$ ./test_sepgsql
這個(gè)腳本將嘗試驗(yàn)證你已經(jīng)正確地完成了所有的配置步驟,接下來它將運(yùn)行 sepgsql
模塊的回歸測(cè)試。
完成測(cè)試后,推薦你禁用 sepgsql_regression_test_mode
參數(shù):
$ sudo setsebool sepgsql_regression_test_mode off
你可能想要完全移除sepgsql-regtest
策略:
$ sudo semodule -r sepgsql-regtest
sepgsql.permissive
(boolean
)
不管系統(tǒng)設(shè)置如何,這個(gè)參數(shù)讓sepgsql
在自由模式中運(yùn)行。 默認(rèn)值為關(guān)閉。這個(gè)參數(shù)只能在postgresql.conf
文件中或者 服務(wù)器命令行上被設(shè)置。
當(dāng)這個(gè)參數(shù)為打開時(shí),sepgsql
在自由模式中運(yùn)行,即便 SELinux 運(yùn)行在強(qiáng)制模式中也是如此。這個(gè)參數(shù)主要用于測(cè)試目的。
sepgsql.debug_audit
(boolean
)
不管系統(tǒng)策略設(shè)置如何,這個(gè)參數(shù)啟用打印審計(jì)消息。默認(rèn)值為關(guān)閉,表示將 根據(jù)系統(tǒng)設(shè)置打印消息。
SELinux的安全性策略也具有控制是否記錄特定訪問的 規(guī)則。默認(rèn)情況下,違法訪問將會(huì)被記錄,但是被允許的訪問則不會(huì)被記錄。
這個(gè)參數(shù)強(qiáng)制打開所有可能的記錄而不管該系統(tǒng)策略。
SELinux的安全模型把所有訪問控制規(guī)則描述為一個(gè) 主體(典型的是一個(gè)數(shù)據(jù)庫(kù)客戶端)和一個(gè)客體(例如一個(gè)數(shù)據(jù)庫(kù)對(duì)象)之 間的關(guān)系, 每一個(gè)這樣的關(guān)系被一個(gè)安全標(biāo)簽標(biāo)識(shí)。如果嘗試訪問一個(gè)未加 標(biāo)簽的客體,會(huì)認(rèn)為該客體被分配了標(biāo)簽unlabeled_t
。
當(dāng)前,sepgsql
允許把安全標(biāo)簽分配給模式、表、列、 序列、視圖和函數(shù)。在使用sepgsql
時(shí),安全標(biāo)簽會(huì) 在所支持的數(shù)據(jù)庫(kù)對(duì)象創(chuàng)建時(shí)自動(dòng)分配給它們。這種標(biāo)簽被稱為默認(rèn)安全標(biāo)簽 并且根據(jù)系統(tǒng)安全性策略決定,默認(rèn)安全標(biāo)簽被用來輸入創(chuàng)建者標(biāo)簽、分配給 新對(duì)象父對(duì)象的標(biāo)簽以及所構(gòu)造對(duì)象的可選名稱。
一個(gè)新數(shù)據(jù)庫(kù)對(duì)象基本上會(huì)繼承父對(duì)象的安全標(biāo)簽,不過當(dāng)安全策略具有特殊的 類型轉(zhuǎn)換規(guī)則時(shí),將會(huì)應(yīng)用一個(gè)不同的標(biāo)簽。對(duì)于模式,其父對(duì)象是當(dāng)前數(shù)據(jù)庫(kù)。 對(duì)于表、序列、視圖和函數(shù),父對(duì)象是包含它的模式。對(duì)于列,其父對(duì)象是包含 它的表。
對(duì)于表,根據(jù)語句的種類會(huì)對(duì)所有被引用的目標(biāo)表檢查 db_table:select
、db_table:insert
、 db_table:update
或者db_table:delete
。此外,對(duì)于 所有其列被WHERE
或
RETURNING
子句引用、作為 UPDATE
的數(shù)據(jù)源(以及其他情況)的表, 都要檢查db_table:select
。
對(duì)每一個(gè)被引用的列也將檢查列級(jí)權(quán)限。不僅在使用SELECT
讀取列 時(shí)會(huì)檢查db_column:select
,在其他 DML 語句中引用列時(shí)也要檢查。 對(duì)于被UPDATE
或者INSERT
修改的列也將檢查 db_column:update
或者
db_column:insert
。
例如,考慮:
UPDATE t1 SET x = 2, y = func1(y) WHERE z = 100;
這里,將對(duì)t1.x
檢查db_column:update
,因?yàn)樗?被更新。對(duì)t1.y
將檢查db_column:{select update}
, 因?yàn)樗缺桓乱脖灰?。并且?huì)對(duì)t1.z
檢查 db_column:select
,因?yàn)樗槐桓?。還將在表層面上檢查
db_table:{select update}
。
對(duì)于序列,當(dāng)我們使用SELECT
引用一個(gè)序列對(duì)象時(shí)會(huì)檢查 db_sequence:get_value
。不過,我們當(dāng)前不會(huì)檢查執(zhí)行相應(yīng) 函數(shù)(例如lastval()
)的權(quán)限。
對(duì)于視圖,將檢查db_view:expand
,然后對(duì)從視圖展開來的任何 對(duì)象都會(huì)分別檢查所需的權(quán)限。
對(duì)于函數(shù),當(dāng)用戶嘗試在一個(gè)查詢中或者使用快路徑調(diào)用執(zhí)行一個(gè)函數(shù)時(shí)會(huì)檢查 db_procedure:{execute}
。如果該函數(shù)是一個(gè)可信過程,也會(huì)檢查 db_procedure:{entrypoint}
權(quán)限來看看它能否作為一個(gè)可信程序 的入口點(diǎn)來執(zhí)行。
為了訪問任何模式對(duì)象,在其所在的模式上需要db_schema:search
權(quán)限。當(dāng)不用模式限定引用一個(gè)對(duì)象時(shí),其上沒有該權(quán)限的模式不會(huì)被搜索(就好 像該用戶在該模式上沒有USAGE
特權(quán))。如果出現(xiàn)一個(gè)顯式的模式 限定,當(dāng)該用戶在提及的模式上沒有要求的權(quán)限時(shí)將會(huì)發(fā)生一個(gè)錯(cuò)誤。
客戶端必須被允許訪問所有引用到的表和列,即便它們是由視圖擴(kuò)展得來的。這樣 我們可以應(yīng)用一致的訪問控制規(guī)則而不管表內(nèi)容被引用的方式。
默認(rèn)的數(shù)據(jù)庫(kù)特權(quán)系統(tǒng)允許數(shù)據(jù)庫(kù)超級(jí)用戶使用 DML 命令修改系統(tǒng)目錄并且引用 或者修改 TOAST 表。當(dāng)sepgsql
被啟用時(shí),這些操作會(huì)被禁止。
SELinux為每一種對(duì)象類型定義了數(shù)個(gè)權(quán)限來控制 常用操作,例如創(chuàng)建、修改、刪除以及重新標(biāo)記安全標(biāo)簽。此外,數(shù)種 對(duì)象類型具有特殊的權(quán)限來控制它們的特性化操作,例如在一個(gè)特定模式 中增加或者刪除名字項(xiàng)。
創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)對(duì)象要求create
權(quán)限。 SELinux將基于客戶端的安全標(biāo)簽來授予或者否決 這個(gè)權(quán)限并且為新對(duì)象提出安全標(biāo)簽。在某些情況下,還需要額外的特權(quán):
CREATE DATABASE額外要求源數(shù)據(jù)庫(kù)或者模板數(shù) 據(jù)庫(kù)的getattr
權(quán)限。
創(chuàng)建一個(gè)模式對(duì)象額外地要求父模式上的add_name
權(quán)限。
創(chuàng)建一個(gè)表額外要求創(chuàng)建單個(gè)表列的權(quán)限,就好像每一個(gè)表列都是一個(gè) 單獨(dú)的頂層對(duì)象。
創(chuàng)建一個(gè)被標(biāo)記為LEAKPROOF
的函數(shù)額外要求 install
權(quán)限(當(dāng)為一個(gè)現(xiàn)有函數(shù)設(shè)置 LEAKPROOF
時(shí)也要檢查這個(gè)權(quán)限)。
當(dāng)執(zhí)行DROP
命令時(shí),在要移除的對(duì)象上會(huì)檢查drop
。 對(duì)于通過CASCADE
間接被刪除的對(duì)象也會(huì)檢查權(quán)限。刪除包含在 一個(gè)特定模式內(nèi)的對(duì)象(表、視圖、序列以及過程)額外地要求該模式上的 remove_name
。
在執(zhí)行ALTER
命令時(shí),會(huì)在被修改的對(duì)象上為每一種對(duì)象類型檢查 setattr
。附屬對(duì)象(例如一個(gè)表的索引或者觸發(fā)器)除外, 這種 情況下權(quán)限是在父對(duì)象上檢查的。在某些情況下,還需要額外的權(quán)限:
將一個(gè)對(duì)象移動(dòng)到一個(gè)新的模式要求舊模式上的remove_name
權(quán)限以及新模式上的add_name
權(quán)限。
設(shè)置一個(gè)函數(shù)上的LEAKPROOF
屬性要求install
權(quán)限。
在一個(gè)對(duì)象上使用SECURITY LABEL會(huì)額外對(duì)該對(duì)象要求 relabelfrom
權(quán)限連同它的舊安全標(biāo)簽以及relabelto
權(quán)限連同它的新安全標(biāo)簽(在安裝了多個(gè)標(biāo)簽提供者并且用戶嘗試設(shè)置一個(gè)不由
SELinux管理的安全標(biāo)簽的情況中,這里只應(yīng)該檢查 setattr
。當(dāng)前由于實(shí)現(xiàn)限制沒有這樣做。)。
可信過程類似于 SECURITY DEFINER 函數(shù)或者 setuid 命令。 SELinux提供了一個(gè)特性來允許可信代碼使用一個(gè)不同 于客戶端的安全標(biāo)簽運(yùn)行,通常這是為了提供對(duì)敏感數(shù)據(jù)的高度控制的訪問( 例如行可能會(huì)被忽略或者存儲(chǔ)值的精度可能會(huì)被降低)。一個(gè)函數(shù)是否可以 作為可信過程受到其安全標(biāo)簽和操作系統(tǒng)安全性策略的控制。例如:
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
上述的操作應(yīng)該由一個(gè)管理員用戶執(zhí)行。
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)
在這種情況下,一個(gè)常規(guī)用戶無法直接引用customer.credit
, 但是一個(gè)可信過程show_credit
允許用戶在打印客戶的信用卡號(hào)時(shí) 把一些數(shù)字掩蓋掉。
如果安全性策略允許,可以使用 SELinux 的動(dòng)態(tài)域轉(zhuǎn)換特性來切換客戶端 進(jìn)程(客戶端域)的安全性標(biāo)簽到一個(gè)新的上下文。該客戶端域需要 setcurrent
權(quán)限還有從舊的域到新的域的 dyntransition
權(quán)限。
動(dòng)態(tài)域轉(zhuǎn)換需要被仔細(xì)考慮,因?yàn)樵谟脩艨磥恚鼈冊(cè)试S用戶切換其標(biāo)簽, 并且因而切換特權(quán),而不是(像可信過程的情況那樣)受系統(tǒng)的強(qiáng)制性管理。 因此,只有當(dāng)被用來切換到一個(gè)比原來的域具有更少特權(quán)的域時(shí), dyntransition
才被認(rèn)為是安全的。例如:
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
在上面的這個(gè)例子中,我們被允許從較大范圍的c1.c1023
切換到 較小范圍的c1.c4
,但卻禁止切換回去。
動(dòng)態(tài)域轉(zhuǎn)換和可信過程的組合開啟了一種有趣的使用案例,它適合典型的 連接池軟件的處理生命周期。即便你的連接池軟件不被允許運(yùn)行大部分的 SQL 命令,你可以從一個(gè)可信過程中使用 sepgsql_setcon()
函數(shù)允許它切換該客戶端的安全標(biāo)簽, 這個(gè)過程應(yīng)該采用一些證據(jù)來授權(quán)該請(qǐng)求切換該客戶端標(biāo)簽。之后,這個(gè) 會(huì)話將會(huì)具有目標(biāo)用戶而不是連接池的特權(quán)。該連接池之后可以用 NULL
參數(shù)再次調(diào)用
sepgsql_setcon()
逆轉(zhuǎn)這次安全標(biāo)簽改變,當(dāng)然再次的調(diào)用也要在一個(gè)可信過程中配合適當(dāng) 的權(quán)限檢查進(jìn)行。這里的要點(diǎn)是只有可信過程實(shí)際具有權(quán)限來更改有效的安全 標(biāo)簽,并且只有在得到適當(dāng)?shù)淖C據(jù)后才這樣做。當(dāng)然,對(duì)于安全操作,必須 保護(hù)證據(jù)存儲(chǔ)(表、過程定義或者其他什么)不會(huì)受到未經(jīng)授權(quán)的訪問。
我們?nèi)婢芙^LOAD命令,因?yàn)槿魏文K的裝載都 可能很輕易地繞過安全策略的強(qiáng)制保護(hù)。
表 F.29展示了可用的函數(shù)。
表 F.29. Sepgsql 函數(shù)
函數(shù) 簡(jiǎn)述 |
---|
返回客戶端域,即客戶端的當(dāng)前安全標(biāo)簽。 |
如果安全策略允許,則將當(dāng)前會(huì)話的客戶端域切換到新域。它還接受 |
如果 mcstrans 守護(hù)進(jìn)程正在運(yùn)行,則將給定的限定 MLS/MCS 范圍轉(zhuǎn)換為原始格式。 |
如果 mcstrans 守護(hù)程序正在運(yùn)行,則將給定的原始 MLS/MCS 范圍轉(zhuǎn)換為限定格式。 |
為當(dāng)前數(shù)據(jù)庫(kù)中的所有對(duì)象設(shè)置初始安全標(biāo)簽。參數(shù)可以是 |
收到實(shí)現(xiàn)的限制,一些 DDL 操作無法檢查權(quán)限。
由于實(shí)現(xiàn)限制,DCL 操作不檢查權(quán)限。
PostgreSQL支持行級(jí)訪問,但是 sepgsql
不支持行級(jí)訪問。
sepgsql
不會(huì)嘗試隱藏一個(gè)特定對(duì)象的存在,即便是 用戶不被允許引用該對(duì)象。例如,即便我們無法得到一個(gè)不可見對(duì)象 的內(nèi)容,我們也可以通過主鍵沖突、外鍵違背等等結(jié)果來推知該對(duì)象 的存在。一個(gè)絕密表的存在無法被隱藏,我們只希望能夠隱藏其內(nèi)容。
這個(gè) wiki 頁面提供了一個(gè)簡(jiǎn)單的綜述、安全性設(shè)計(jì)、架構(gòu)、 管理和即將到來的特性。
這個(gè)文檔提供了廣泛的知識(shí)來管理系統(tǒng)上的 SELinux。它主要關(guān)注 Red Hat 操作系統(tǒng),但是并不僅限于此。
這個(gè)文檔回答了很多SELinux 的常見問題。它主要關(guān)注 Fedora,但是并不僅限于此。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: