詳解linux運(yùn)維工程師高級(jí)篇(大數(shù)據(jù)安全方向)
在鶴峰等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需求定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷,外貿(mào)網(wǎng)站制作,鶴峰網(wǎng)站建設(shè)費(fèi)用合理。hadoop安全目錄:
kerberos(已發(fā)布)
elasticsearch(已發(fā)布)https://blog.51cto.com/chenhao6/2113873
knox
oozie
ranger
apache sentry
簡(jiǎn)介:
從運(yùn)維青銅到運(yùn)維白銀再到運(yùn)維黃金,這里就要牽扯到方向問(wèn)題也就是裝備,根據(jù)自己的愛(ài)好,每個(gè)人都應(yīng)該選擇一個(gè)適合自己和喜歡自己的一個(gè)職業(yè)技術(shù)方向,如:大數(shù)據(jù)安全,開發(fā)運(yùn)維,云計(jì)算運(yùn)維等等。而掌握的越多前言技術(shù)也就是更多的裝備,才能更好的在it行業(yè)混下去,畢竟it技術(shù)更新太快,初級(jí)篇和中級(jí)篇前面已介紹。
初級(jí)篇:詳解Linux運(yùn)維工程師入門必備技能(青銅)
中級(jí)篇:詳解Linux運(yùn)維工程師打怪升級(jí)篇(白銀)
現(xiàn)在給大家介紹大數(shù)據(jù)安全的正式面目:
1.大數(shù)據(jù)基本組件
2. Hadoop安全背景
? 共享集群
? 按照業(yè)務(wù)或應(yīng)用的規(guī)則劃分資源隊(duì)列,并分配給
特定用戶
? HDFS上存放各種數(shù)據(jù),包括公共的、機(jī)密的
? 安全認(rèn)證:確保某個(gè)用戶是自己聲稱的那個(gè)用戶
? 安全授權(quán):確保某個(gè)用戶只能做他允許的那些操作
3. 設(shè)備說(shuō)明
服務(wù) | IP | 主機(jī)名 | 系統(tǒng) |
Ambari Kerberos | 192.168.2.140 | hdp140 | CentOS 7.3 |
namenode | 192.168.2.141 | hdp141 | CentOS 7.3 |
datanode | 192.168.2.142 | hdp142 | CentOS 7.3 |
datanode | 192.168.2.143 | hdp143 | CentOS 7.3 |
4. kerberos基本概念:
? Principal(安全個(gè)體):被認(rèn)證的個(gè)體,有一個(gè)名字和口令
? KDC(key distribution center ) : 是一個(gè)網(wǎng)絡(luò)服務(wù),提供ticket 和臨時(shí)會(huì)話密鑰
? Ticket:一個(gè)票據(jù),客戶用它來(lái)向服務(wù)器證明自己的身份,包括客戶標(biāo)識(shí)、會(huì)話密鑰、時(shí)間戳。
? AS (Authentication Server): 認(rèn)證服務(wù)器
? TGS(Ticket Granting Server): 許可證服務(wù)器
? TGT:Ticket-granting Ticket
5. kerberos認(rèn)證過(guò)程:
6. 集群?jiǎn)⒂肒erberos認(rèn)證
裝KDC Server
1. 安裝一個(gè)新的KDC Server(任意一個(gè)集群主機(jī),這里hdp141為例)
# yum install krb5-server krb5-libs krb5-workstation
2. 打開KDC Server的配置文件
# vi /etc/krb5.conf
修改文件中的[realms]部分,將為屬性kdc和admin_server設(shè)置的默認(rèn)值“kerberos.example.com”替換成實(shí)際KDC server的主機(jī)名。在下面的例子中,“kerberos.example.com”被替換成了 “my.kdc.server”。
[realms] EXAMPLE.COM = { kdc = my.kdc.server admin_server = my.kdc.server }
3. (可選)自定義realms配置(EXAMPLE.COM修改為CESHI.COM,下面例子都為CESHI.COM)
# vi /etc/krb5.conf [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = CESHI.COM dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true [realms] CESHI.COM = { kdc = hdp141 admin_server = hdp141 } [domain_realm] .vrv.com = CESHI.COM vrv.com = CESHI.COM # vi /var/kerberos/krb5kdc/kdc.conf [kdcdefaults] kdc_ports = 88 kdc_tcp_ports = 88 [realms] CESHI.COM = { #master_key_type = aes256-cts acl_file = /var/kerberos/krb5kdc/kadm5.acl dict_file = /usr/share/dict/words admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal }
4.創(chuàng)建Kerberos數(shù)據(jù)庫(kù)
創(chuàng)建過(guò)程中需要輸入master key。
# kdb5_util create -s Loading random data Initializing database '/var/kerberos/krb5kdc/principal' for realm 'CESHI.COM', master key name 'K/M@CESHI.COM' You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: ceshi123456. Re-enter KDC database master key to verify: ceshi123456.
5.啟動(dòng)KDC
# service krb5kdc start # chkconfig krb5kdc on # service kadmin start # chkconfig kadmin on
6.創(chuàng)建kerberos Admin
通過(guò)創(chuàng)建一個(gè)admin principal創(chuàng)建KDC admin,需要輸入principal的密碼。
# kadmin.local -q "addprinc admin/admin" Authenticating as principal root/admin@CESHI.COM.COM with password. WARNING: no policy specified for admin/admin@CESHI.COM.COM; defaulting to no policy Enter password for principal "admin/admin@CESHI.COM.COM": ceshi123456. Re-enter password for principal "admin/admin@CESHI.COM.COM": ceshi123456. Principal "admin/admin@CESHI.COM" created. "admin/admin@CESHI.COM":ceshi123456.
打開KDC ACL文件,確認(rèn)admin principal在KDC ACL中擁有權(quán)限,若沒(méi)有對(duì)應(yīng)的域則需要添加。
# vi /var/kerberos/krb5kdc/kadm5.acl */admin@VRV.COM *
如果修改了文件kadm5.acl,那么你就必須重啟kadmin進(jìn)程
# service kadmin restart
7.啟用Kerberos保護(hù)
安裝JCE
必須用官網(wǎng)下載的JCE覆蓋本地已有的JCE,否則將缺少供Kerberos使用的加密方式
在Ambari server所在的主機(jī)和集群中的所有主機(jī)上,根據(jù)使用的JDK版本選擇合適的JCE策略文件。
? Oracle JDK 1.7:
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-
download-432124.html
? Oracle JDK 1.8:
http://www.oracle.com/technetwork/java/javase/downloads/jce8-
download-2133166.html
在Ambari Server所在主機(jī)和集群中的所有主機(jī)上,添加unlimited security policy JCE jars
到目錄$AMBARI_SERVER_JAVA_HOME/jre/lib/security/下。
注意:在所有的主機(jī)上,JCE相關(guān)的包都必須解壓到配置文件/etc/ambari-server/conf/ambari.properties中屬性java.home所指定的JDK目錄下
# JAVA_HOME=/usr/java/default # unzip -o -j -q UnlimitedJCEPolicyJDK8.zip -d $JAVA_HOME/jre/lib/security/
重啟Ambari Server(ambari server服務(wù)器hdp140)
# service ambari-server restart
8.運(yùn)行Kerberos保護(hù)向?qū)?/p>
1. 確認(rèn)KDC已經(jīng)安全和正確配置,并且已經(jīng)在集群的所有主機(jī)上配置好JCE。
2. 登錄Ambari Web,打開管理員 > Kerberos
3.點(diǎn)擊啟用Kerberos,啟用安裝向?qū)?,選擇條件檢查
4.提供關(guān)于KDC和管理員賬號(hào)的信息
KDC相關(guān)信息請(qǐng)參考配置文件/etc/krb5.conf
5.ambari會(huì)在集群的主機(jī)上安裝Kerberos客戶端,然后通過(guò)測(cè)試是否能創(chuàng)建principal,生成keytab和分配Keytab來(lái)測(cè)試是否能連接KDC。
自定義Hadoop使用的Kerberos identities
6.確認(rèn)你的配置。你可以通過(guò)頁(yè)面下載自動(dòng)創(chuàng)建的包含principals和Keytabs的CSV文件。
7.停止服務(wù)
8.啟用kerberos
Keytabs保存在主機(jī)的/etc/security/keytabs目錄下。
9.啟動(dòng)和測(cè)試服務(wù)
啟動(dòng)和測(cè)試服務(wù)成功后點(diǎn)擊完成以結(jié)束Kerberos的啟用。
10.查看已啟用的Kerberos配置
到這里kerberos安裝完成。
高級(jí)選項(xiàng):
為Ambari Server設(shè)置Kerberos(可選項(xiàng))
1. 使用kadmin在你的KDC所在的主機(jī)(hdp141)為Ambari Server創(chuàng)建一個(gè)principal。(ambari-server為自定義名)
# kadmin.local -q "addprinc -randkey ambari-server@CESHI.COM
2. 為此principal生成一個(gè)Keytab
# kadmin.local -q "xst -k ambari.server.keytab ambari-server@CESHI.COM"
3. 將單前目錄生成的Keytab拷貝到Ambari Server所在的集群。確定該文件有合適的權(quán)限,能夠被啟動(dòng)Ambari Server守護(hù)進(jìn)程所訪問(wèn)。
# scp ambari.server.keytab hdp140:/etc/security/keytabs/ # ll /etc/security/keytabs/ambari.server.keytab -r--r----- 1 root root 530 Dec 18 20:06 /etc/security/keytabs/ambari.server.keytab
4. 停止ambari server
# ambari-server stop
5. 運(yùn)行setup-security命令,設(shè)置JAAS。標(biāo)紅部分為需要設(shè)置部分。
A. 選擇3,Setup Ambari kerberos JAAS configuration
B. 輸入第一步為Ambari Server設(shè)置的principal名
C. 輸入Ambari principal的Keytab所在路徑
# ambari-server setup-security Using python /usr/bin/python2 Security setup options... =========================================================================== Choose one of the following options: [1] Enable HTTPS for Ambari server. [2] Encrypt passwords stored in ambari.properties file. [3] Setup Ambari kerberos JAAS configuration. [4] Setup truststore. [5] Import certificate to truststore. =========================================================================== Enter choice, (1-5): 3 Setting up Ambari kerberos JAAS configuration to access secured Hadoop daemons... Enter ambari server's kerberos principal name (ambari@VRV.COM): ambari-server@VRV.COM Enter keytab path for ambari server's kerberos principal: /etc/security/keytabs/ambari.server.keytab Ambari Server 'setup-security' completed successfully. 重啟Ambari Server # ambari-server restart
開始實(shí)測(cè):
1.新建測(cè)試用戶
普通用戶需要安裝ranger(后面介紹)管理權(quán)限。
列出所有用戶
# kadmin.local #在kdc服務(wù)器上執(zhí)行 kadmin.local: listprincs #//列出所有用戶 ambari-server@CESHI.COM ................. nn/hdp140@CESHI.COM zookeeper/hdp142@CESHI.COM zookeeper/hdp143@CESHI.COM
創(chuàng)建測(cè)試用戶
kadmin.local: addprinc test Enter password for principal "test@CESHI.COM": ceshi123456. Re-enter password for principal "test@CESHI.COM": ceshi123456. Principal "test@CESHI.COM" created.
登錄驗(yàn)證
# kinit test #登陸
ceshi123456.
退出登陸狀態(tài)
注銷:kdestroy
集群登錄與授權(quán)(hdfs用戶)
未使用kerberos用戶認(rèn)證前執(zhí)行
# hadoop dfs -ls /
使用kerberos用戶認(rèn)證
# kinit test #登陸 Password for test@CESHI.com #ceshi123456. # hadoop dfs -ls /
此時(shí)test用戶默認(rèn)有查看權(quán)限,無(wú)目錄授權(quán)
換到hdfs用戶下,初始化hdfs
查看hdfs的Kerberos用戶名
# klist -k /etc/security/keytabs/hdfs.headless.keytab Keytab name: FILE:hdfs.headless.keytab KVNO Principal ---- -------------------------------------------------------------------------- 1 hdfs-test@CESHI.COM 1 hdfs-test@CESHI.COM 1 hdfs-test@CESHI.COM 1 hdfs-test@CESHI.COM 1 hdfs-test@CESHI.COM 初始化認(rèn)證hdfs用戶 # kinit -k hdfs-test@CESHI.COM -t /etc/security/keytabs/hdfs.headless.keytab 創(chuàng)建目錄:hadoop fs -mkdir /test 查看目錄屬性:
改變目錄屬性:hadoop fs -chown test:hdfs /test
使用test用戶登錄
修改密碼和重新生成
#修改密碼命令cpw test(KDC server上執(zhí)行) # kadmin.local Authenticating as principal test/admin@CESHI.COM with password. kadmin.local: cpw test Enter password for principal "test1@CESHI.COM": ceshi123 Re-enter password for principal "test1@CESHI.COM": ceshi123 change_password: Principal does not exist while changing password for "test@CESHI.COM". kadmin.local: exit
生成新的多用戶使用keytab文件
創(chuàng)建keytab文件(生成到當(dāng)前文件夾下)
案例:將hive和hdfs的keytab集成到同一個(gè)keytab文件中
1. 查看所有princs
# kadmin.local Kadmin.local: listprincs hbase/hdp143@CESHI.COM" hdfs-vrvtest@CESHI.COM" hive/hdp140@CESHI.COM"
2. 添加hdfs的princs的keytab到hdfs-hive.keytab
# kadmin.local Kadmin.local: xst -norandkey -k hdfs-hive.keytab hdfs-vrvtest@CESHI.COM
3. 添加hive的princs的keytab到hdfs-hive.keytab
# kadmin.local Kadmin.local: xst -norandkey -k hdfs-hive.keytab hive/hdp140@CESHI.COM
查看生成的hdfs-hive.keytab
使用生成的Keytab文件登錄
# kinit -k -t hdfs-hive.keytab hive/hdp140@CESHI.COM
修改租期
1.修改全局租期
# vi /etc/krb5.conf [libdefaults] default_realm = CESHI.COM dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h #ticket 租期時(shí)間 renew_lifetime = 7d #重新申請(qǐng)時(shí)間 frwardable = true
#重新啟動(dòng)
# service krb5kdc restart # service kadmin restart
2.手動(dòng)修改用戶租期時(shí)間
#查看租期時(shí)間 可在kadmin命令行下用getprinc命令查看默認(rèn)的大時(shí)長(zhǎng),否則時(shí)長(zhǎng)被限制在24小時(shí),并且無(wú)法renew) # kadmin.local kadmin.local:getprinc hive/hdp141 Principal: hive/hdp141@CESHI Expiration date: [never] Last password change: Mon Dec 18 05:56:57 EST 2017 Password expiration date: [none] Maximum ticket life: 1 day 00:00:00 #租期時(shí)間 Maximum renewable life: 0 days 00:00:00 #重新續(xù)租時(shí)間 Last modified: Mon Dec 18 05:56:57 EST 2017 (admin/admin@VRV.COM) Last successful authentication: [never] Last failed authentication: [never] Failed password attempts: 0 Number of keys: 8 Key: vno 1, aes256-cts-hmac-sha1-96 Key: vno 1, aes128-cts-hmac-sha1-96 Key: vno 1, des3-cbc-sha1 Key: vno 1, arcfour-hmac Key: vno 1, camellia256-cts-cmac Key: vno 1, camellia128-cts-cmac Key: vno 1, des-hmac-sha1 Key: vno 1, des-cbc-md5 #更改租期時(shí)間命令(用戶使用真實(shí)用戶替換) modprinc -maxrenewlife 300days 用戶 modprinc -maxlife 300days 用戶
#應(yīng)用例子
modprinc -maxrenewlife 300days hive/hdp141@CESHI.com
modprinc -maxlife 300days hive/hdp141@CESHI.COM
退出后,重新啟動(dòng)
# service krb5kdc restart # service kadmin restart
3.使用spark任務(wù)測(cè)試kerberos下的作業(yè)提交
1.指定spark用戶和密碼
# cd /etc/security/keytabs [root@hdp140 keytabs]# ll -r--r----- 1 root root 353 Oct 30 23:54 ambari.server.keytab -r--r----- 1 hbase hadoop 313 Oct 30 23:54 hbase.headless.keytab -r-------- 1 hbase hadoop 313 Oct 30 23:54 hbase.service.keytab -r-------- 1 hdfs hadoop 308 Oct 30 23:54 hdfs.headless.keytab -r--r----- 1 hive hadoop 308 Oct 30 23:54 hive.service.keytab -r-------- 1 hdfs hadoop 298 Oct 30 23:54 nn.service.keytab -r--r----- 1 ambari-qa hadoop 333 Oct 30 23:54 smokeuser.headless.keytab -r-------- 1 spark hadoop 313 Oct 30 23:54 spark.headless.keytab -r--r----- 1 root hadoop 308 Oct 30 23:54 spnego.service.keytab
# klist -k spark.headless.keytab Keytab name: FILE:spark.headless.keytab KVNO Principal ---- -------------------------------------------------------------------------- 1 spark-test@CESHI.COM 1 spark-test@CESHI.COM 1 spark-test@CESHI.COM 1 spark-test@CESHI.COM 1 spark-test@CESHI.COM # kinit -k spark-vrvtest@VRV.COM -t spark.headless.keytab #指定spark用戶 [root@hdp140 keytabs]# klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: spark-vrvtest@VRV.COM Valid starting Expires Service principal 10/31/2017 01:08:56 11/01/2017 01:08:56 krbtgt/VRV.COM@VRV.COM
上傳spark文件到opt
# hdfs dfs -mkdir -p /tmp/sparkwordcount/ # hdfs dfs -mkdir -p /tmp/sparkwordcount/input # hdfs dfs -put /opt/sparkwordcountinput.txt /tmp/sparkwordcount/input # hdfs dfs -put /opt/spark_word_count.jar /tmp/sparkwordcount/
#spark測(cè)試文件
sparkwordcountinput.txt spark_word_count.jar
spark命令提交任務(wù)
# spark-submit \ --class com.vrv.bigdata.ml.DataExtract2 \ --master yarn \ --deploy-mode cluster \ --principal spark-test@CESHI.COM \ --keytab /etc/security/keytabs/spark.headless.keytab \ hdfs://hdp140:8020/tmp/sparkwordcount/spark_word_count.jar \ hdfs://hdp140:8020/tmp/sparkwordcount/input \ hdfs://hdp140:8020/tmp/sparkwordcount/output/spark_work_count 17/10/31 01:15:28 INFO Client: client token: Token { kind: YARN_CLIENT_TOKEN, service: } diagnostics: N/A ApplicationMaster host: 192.168.2.143 ApplicationMaster RPC port: 0 queue: default start time: 1509383715631 final status: SUCCEEDED tracking URL: http://hdp141:8088/proxy/application_1509379053332_0014/ user: spark 17/10/31 01:15:28 INFO ShutdownHookManager: Shutdown hook called 17/10/31 01:15:28 INFO ShutdownHookManager: Deleting directory /tmp/spark-40e868df-ca58-4389-b20c-03d2717516cc
疑難問(wèn)題1:
Received Exception while testing connectivity to the KDC: Algorithm AES256 not enabled **** Host: hdp261:88 (TCP) java.lang.IllegalArgumentException: Algorithm AES256 not enabled at sun.security.krb5.EncryptionKey.<init>(EncryptionKey.java:286) at javax.security.auth.kerberos.KeyImpl.<init>(KeyImpl.java
解決:
1. 在Ambari server所在的主機(jī)和集群中的所有主機(jī)上,根據(jù)使用的JDK版本選擇合適的JCE策略文件。 ? Oracle JDK 1.7: http://www.oracle.com/technetwork/java/javase/downloads/jce-7- download-432124.html ? Oracle JDK 1.8: http://www.oracle.com/technetwork/java/javase/downloads/jce8- download-2133166.html
疑難問(wèn)題2:
org.apache.hadoop.security.authentication.client.AuthenticationException: GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
解決:
# kinit guest Password for guest@CESHI.COM: ceshi123456. # klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: guest@CESHI.COM Valid starting Expires Service principal 11/28/2017 18:30:48 11/29/2017 18:30:48 krbtgt/CESHI.COM@CESHI.COM 11/28/2017 18:31:09 11/29/2017 18:30:48 HTTP/hdp140@ 11/28/2017 18:31:09 11/29/2017 18:30:48 HTTP/hdp140@CESHI.COM
參考:
http://blog.csdn.net/wulantian/article/details/42418231
http://book.51cto.com/art/200907/140533.htm
實(shí)戰(zhàn)到此結(jié)束。后續(xù)再更新elasticsearcn安全實(shí)戰(zhàn)。
總結(jié):
1. Hadoop集群節(jié)點(diǎn)數(shù)多,配置和維護(hù)一個(gè)使用kerberos系統(tǒng)高性能,穩(wěn)定的hadoop集群難度非常高。
2. Hadoop中的hdfs是一個(gè)文件系統(tǒng),用戶的認(rèn)證和授權(quán)比較復(fù)雜,難度不低于linux系統(tǒng)的用戶和組管理。
加上kerberos后,用戶和用戶組的管理更加復(fù)雜,通常一個(gè)合適的用戶不能訪問(wèn)hdfs上的文件。
3. Hadoop加上kerberos后,通常原來(lái)的用戶和文件,可能都失效導(dǎo)致數(shù)據(jù)流失。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享文章:詳解Linux運(yùn)維工程師高級(jí)篇(大數(shù)據(jù)安全方向)-創(chuàng)新互聯(lián)
標(biāo)題來(lái)源:http://jinyejixie.com/article4/dhopie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、網(wǎng)站導(dǎo)航、網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站排名、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容