中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

園嶺網(wǎng)站建設(shè)附近有沒有學(xué)電腦培訓(xùn)的

園嶺網(wǎng)站建設(shè),附近有沒有學(xué)電腦培訓(xùn)的,婚戀網(wǎng)站要錢嗎,discuz自適應(yīng)模板寫在前面 因?yàn)閰⒓涌荚?amp;#xff0c;會(huì)陸續(xù)分享一些 OpenShift 的筆記博文內(nèi)容為 openshift 用戶認(rèn)證和權(quán)限管理以及 scc 管理相關(guān)筆記學(xué)習(xí)環(huán)境為 openshift v3 的版本,有些舊這里如果專門學(xué)習(xí) openshift ,建議學(xué)習(xí) v4 版本理解不足小伙伴幫忙指正 對(duì)每個(gè)…

寫在前面


  • 因?yàn)閰⒓涌荚?#xff0c;會(huì)陸續(xù)分享一些 OpenShift 的筆記
  • 博文內(nèi)容為 openshift 用戶認(rèn)證和權(quán)限管理以及 scc 管理相關(guān)筆記
  • 學(xué)習(xí)環(huán)境為 openshift v3 的版本,有些舊
  • 這里如果專門學(xué)習(xí) openshift ,建議學(xué)習(xí) v4 版本
  • 理解不足小伙伴幫忙指正

對(duì)每個(gè)人而言,真正的職責(zé)只有一個(gè):找到自我。然后在心中堅(jiān)守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是對(duì)大眾理想的懦弱回歸,是隨波逐流,是對(duì)內(nèi)心的恐懼 ——赫爾曼·黑塞《德米安》


用戶認(rèn)證

OpenShift 中有用戶和權(quán)限的概念 。 用戶需要通過登錄賬號(hào)及密碼登錄 OpenShift 才能訪問相應(yīng)的資源以及執(zhí)行相關(guān)的操作 。 通過用戶提供的登錄信息確認(rèn)用戶身份的過程即認(rèn)證的過程。

認(rèn)證配置

認(rèn)證相關(guān)的配置可以通過下面的文件方式

[root@master master]# cat /etc/origin/master/master-config.yaml | grep -A 25 oauthConfig
oauthConfig:assetPublicURL: https://master.lab.example.com/console/grantConfig:method: autoidentityProviders:- challenge: truelogin: truemappingMethod: claimname: htpasswd_authprovider:apiVersion: v1file: /etc/origin/master/htpasswdkind: HTPasswdPasswordIdentityProvidermasterCA: ca-bundle.crtmasterPublicURL: https://master.lab.example.commasterURL: https://master.lab.example.comsessionConfig:sessionMaxAgeSeconds: 3600sessionName: ssnsessionSecretsFile: /etc/origin/master/session-secrets.yamltokenConfig:accessTokenMaxAgeSeconds: 86400authorizeTokenMaxAgeSeconds: 500
pauseControllers: false
policyConfig:bootstrapPolicyFile: /etc/origin/master/policy.json
[root@master master]#

通過上面的配置文件,可以看到當(dāng)前使用的認(rèn)證方式為 HTPasswdPasswordIdentityProvider,使用 HTPasswd 身份驗(yàn)證插件來實(shí)現(xiàn)基于密碼的認(rèn)證。

當(dāng)前版本為 openshift 3.9 的版本,有些老舊,可以通 api 資源對(duì)象的方式來創(chuàng)建

創(chuàng)建一個(gè)包含 HTPasswd 文件的 Secret 對(duì)象,然后創(chuàng)建一個(gè)包含 HTPasswd 配置的 ConfigMap 對(duì)象。最后,我們將 HTPasswd 身份驗(yàn)證提供者添加到 OAuth 對(duì)象中,以便用戶可以使用用戶名和密碼進(jìn)行身份驗(yàn)證。類似下面這樣

以下是一個(gè)使用 HTPasswd 身份驗(yàn)證插件的示例:

apiVersion: v1
kind: Secret
metadata:name: htpasswd-secret
data:htpasswd: <base64-encoded-htpasswd-file>
type: Opaque---apiVersion: v1
kind: ConfigMap
metadata:name: htpasswd-configmap
data:htpasswd: |kind: HTPasswdPasswordIdentityProviderfile: /etc/openshift/htpasswd
type: Opaque---apiVersion: v1
kind: OAuth
metadata:name: oauth
spec:identityProviders:- name: htpasswdmappingMethod: claimtype: HTPasswdhtpasswd:fileData:name: htpasswd-secretidentityProviderConfig:name: htpasswd-configmap

我們使用 HTPasswd 身份驗(yàn)證插件來實(shí)現(xiàn)基于密碼的認(rèn)證。我們首先創(chuàng)建一個(gè)包含 HTPasswd 文件的 Secret 對(duì)象,然后創(chuàng)建一個(gè)包含 HTPasswd 配置的 ConfigMap 對(duì)象。最后,我們將 HTPasswd 身份驗(yàn)證提供者添加到 OAuth 對(duì)象中,以便用戶可以使用用戶名和密碼進(jìn)行身份驗(yàn)證。

了解過 k8s 的小伙伴,會(huì)發(fā)現(xiàn),k8s 中并沒有 OAuth 這個(gè)資源對(duì)象,也沒有 identityProviders相關(guān)的,這是 OKD 所特有的,在OpenShift中,身份提供者(IDP,identityProviders)是一個(gè)組件,用于驗(yàn)證用戶并向 OpenShift 集群提供身份信息。OpenShift支持各種IDP,包括Htpasswd、LDAP和Keystone。

比如上面的配置,如果您想使用Htpasswd作為您的IDP,您可以按照以下步驟操作:

  1. 使用用戶名和密碼創(chuàng)建Htpasswd文件。您可以使用htpasswd命令行工具來創(chuàng)建和管理此文件。

  2. 在OpenShift中創(chuàng)建包含Htpasswd文件的secret。您可以使用以下命令創(chuàng)建secret:

   oc create secret generic htpass-secret --from-file=htpasswd=path/to/htpasswd

此命令創(chuàng)建名為htpass-secret的secret,并將htpasswd文件設(shè)置為secret中htpasswd鍵的值。

  1. 創(chuàng)建引用Htpasswd secret的OAuth自定義資源。這也就是我們?cè)谧钌厦娴目吹降哪莻€(gè)。

認(rèn)證方式

上面為基于密碼的認(rèn)證,常見的 Openshift 的認(rèn)證方式有以下幾種:

  1. 基于密碼的認(rèn)證:用戶使用用戶名和密碼進(jìn)行身份驗(yàn)證。
  2. 基于令牌的認(rèn)證:用戶使用令牌進(jìn)行身份驗(yàn)證。令牌可以是 OAuth 令牌、API 密鑰或其他類型的令牌。
  3. 基于證書的認(rèn)證:用戶使用證書進(jìn)行身份驗(yàn)證。證書可以是客戶端證書或服務(wù)端證書。

在 Openshift 中,可以使用不同的身份驗(yàn)證插件來實(shí)現(xiàn)這些認(rèn)證方式。例如,可以使用 HTPasswd 身份驗(yàn)證插件來實(shí)現(xiàn)基于密碼的認(rèn)證,使用 OAuth 身份驗(yàn)證插件來實(shí)現(xiàn)基于令牌的認(rèn)證,使用 x509 身份驗(yàn)證插件來實(shí)現(xiàn)基于證書的認(rèn)證(管理員即使用的這一種)。

在 Openshift 中,還可以使用 LDAP、Kerberos、GitHub 等外部身份驗(yàn)證提供者來實(shí)現(xiàn)身份驗(yàn)證。這些提供者可以與身份驗(yàn)證插件結(jié)合使用,以實(shí)現(xiàn)不同的身份驗(yàn)證方式。

OpenShift 通過 OAuth 進(jìn)行用戶的認(rèn)證。 OAuth 是一個(gè)開源的認(rèn)證和授權(quán)的框架。 在 OpenShift 的 Master 節(jié)點(diǎn)上運(yùn)行著一個(gè)內(nèi)置的 OAuth 服務(wù)對(duì)用戶的請(qǐng)求進(jìn)行認(rèn)證檢查。一旦 OAuth 服務(wù)器通過登錄信息確認(rèn)了用戶的身份, OAuth 服務(wù)器就返回用戶的訪問 token (令牌) 。 通過這個(gè) token 用戶可以在有效的時(shí)間內(nèi)對(duì)系統(tǒng)進(jìn)行訪問

admin 是集群默認(rèn)的管理員。前面提到過,該用戶是一個(gè)特殊的用戶,它不能通過用戶名密碼登錄,只提供基于證書的認(rèn)證,之所以的master 節(jié)點(diǎn) 上執(zhí)行 oc、kubectl 命令,是因?yàn)樵谀J(rèn)目錄下存在 集群的 kubeconfig 文件

[root@master master]# oc whoami
system:admin
[root@master master]# oc whoami -t
error: no token is currently in use for this session
[root@master master]#

所以它沒有 token 的認(rèn)證方式,直接通過 kubeconfig 文件的方式進(jìn)行認(rèn)證

[root@master master]# cat /root/.kube/config
apiVersion: v1
clusters:
- cluster:certificate.....

用戶與組管理

用戶類型

OKD 中存在以下幾種用戶類型:

  • Regular users:普通用戶。
  • System users:OKD 平臺(tái)自動(dòng)創(chuàng)建,用于 API 安全訪問。系統(tǒng)用戶包括集群管理員(具有所有訪問權(quán)限),routers 和 registries 使用的用戶,系統(tǒng)匿名用戶(用于非授權(quán)的請(qǐng)求)。 示例:system:admin system:openshift-registry system:node:node1.example.com
[root@master student]# oc get user
NAME        UID                                    FULL NAME   IDENTITIES
admin       3300d7da-da70-11ed-a5c3-52540000fa0a               htpasswd_auth:admin
liruilong   b0cb659b-da74-11ed-a5c3-52540000fa0a               htpasswd_auth:liruilong
  • Service accounts:與項(xiàng)目關(guān)聯(lián)的特殊系統(tǒng)用戶,有些是隨項(xiàng)目創(chuàng)建時(shí)自勱創(chuàng)建。 項(xiàng)目管理員可以根據(jù)需要?jiǎng)?chuàng)建服務(wù)賬戶,用于管理項(xiàng)目資源。 換句話講,給集群中的pod 訪問容器的權(quán)限。每個(gè)項(xiàng)目會(huì)創(chuàng)建一個(gè)默認(rèn)的 sa 賬戶。
[root@master student]# oc get sa
NAME       SECRETS   AGE
builder    2         19h
default    3         19h
deployer   2         19h
registry   3         19h
router     2         19h
[root@master student]#

在 OKD 中,每個(gè)項(xiàng)目都需要 sa 賬戶執(zhí)行 build、deployment 和創(chuàng)建其他 pod, master-config.yml 參數(shù) managedNames 定義了每個(gè)項(xiàng)目默認(rèn) sa 賬戶。

[root@master student]# cat /etc/origin/master/master-config.yaml |  grep  -A 10 serviceAccountConfig
serviceAccountConfig:limitSecretReferences: falsemanagedNames:- default- builder- deployermasterCA: ca-bundle.crtprivateKeyFile: serviceaccounts.private.keypublicKeyFiles:- serviceaccounts.public.key
servingInfo:
[root@master student]#
  • builder: 構(gòu)建pod需要每個(gè)項(xiàng)目中的構(gòu)建器服務(wù)賬戶,并賦予其 system:image-builder 角色,允許使用內(nèi)部容器注冊(cè)將鏡像推送到項(xiàng)目中的任何 image Stream。
  • deployer: 每個(gè)項(xiàng)目中的部署者服務(wù)Account是部署pods所必需的,并在系統(tǒng)中提供system:deployer角色,該角色允許查看和修改項(xiàng)目中的復(fù)制控制器和pod
  • default: 默認(rèn)服務(wù)賬戶由所有其他pod使用,除非它們指定了不同的服務(wù)帳戶

用戶創(chuàng)建

在 OKD 中,可以通過面板界面的方式創(chuàng)建用戶

在這里插入圖片描述

也可以通過命令行的方式來創(chuàng)建

這里我們看一個(gè) Demo,對(duì)于 HTPasswdIdentityProvider 模塊,使用 htpasswd 命令創(chuàng)建。 htpasswd 是一個(gè)阿帕奇開源的一個(gè)創(chuàng)建帳密的小工具h(yuǎn)ttp-tools的命令,使用時(shí)需要指定創(chuàng)建的密碼文件的位置

這里的密碼文件位置通過,配置的 認(rèn)證模塊來獲取

通過 api 資源文件獲取

data:htpasswd: |kind: HTPasswdPasswordIdentityProviderfile: /etc/openshift/htpasswd

通過靜態(tài)配置文件獲取

    provider:apiVersion: v1file: /etc/origin/master/htpasswdkind: HTPasswdPasswordIdentityProvider

非交互式創(chuàng)建

[root@master master]# htpasswd -b  /etc/origin/master/htpasswd  liruilong redhat
Adding password for user liruilong
[root@master master]# cat /etc/origin/master/htpasswd
admin:$apr1$4ZbKL26l$3eKL/6AQM8O94lRwTAu611
developer:$apr1$4ZbKL26l$3eKL/6AQM8O94lRwTAu611
liruilong:$apr1$TEsPZeVC$mTKI3oehZBZrZUU74UhLn1

交互式創(chuàng)建

[root@master master]# htpasswd   /etc/origin/master/htpasswd  liruilong
New password:
Re-type new password:
Updating password for user liruilong
[root@master master]# cat /etc/origin/master/htpasswd
admin:$apr1$4ZbKL26l$3eKL/6AQM8O94lRwTAu611
developer:$apr1$4ZbKL26l$3eKL/6AQM8O94lRwTAu611
liruilong:$apr1$RhuXyaXn$xMo1M9CBBA2IftxBdtyHr1
[root@master master]#

也可以通過配置文件的方式來創(chuàng)建用戶

SA 服務(wù)賬號(hào)創(chuàng)建

sa 創(chuàng)建之后會(huì)生成一個(gè)默認(rèn)的 token ,某些面板工具可以通過 token 來實(shí)現(xiàn)認(rèn)證登錄。但是需要對(duì) sa 做授權(quán)

[root@master student]# oc create sa liruilong
serviceaccount "liruilong" created
[root@master student]# oc get sa liruilong
NAME        SECRETS   AGE
liruilong   2         9s

查看 sa 的詳細(xì)信息

[root@master student]# oc describe sa liruilong
Name:                liruilong
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  liruilong-dockercfg-2bpbm
Mountable secrets:   liruilong-token-rl57kliruilong-dockercfg-2bpbm
Tokens:              liruilong-token-j5v87liruilong-token-rl57k
Events:              <none>
[root@master student]# oc get secret liruilong-token-rl57k
NAME                    TYPE                                  DATA      AGE
liruilong-token-rl57k   kubernetes.io/service-account-token   4         59s
[root@master student]#

用戶登錄

交互式登錄

[root@master master]# oc login -u liruilong
Authentication required for https://master.lab.example.com:443 (openshift)
Username: liruilong
Password:
Login successful.You don't have any projects. You can try to create a new project, by runningoc new-project <projectname>[root@master master]#

非交互式登錄

[root@master master]# oc login -u liruilong -p redhat https://master.lab.example.com:443
Login successful.You don't have any projects. You can try to create a new project, by runningoc new-project <projectname>[root@master master]#

登錄管理賬號(hào)查看用戶信息

[root@master student]# oc login -u  admin
Authentication required for https://master.lab.example.com:443 (openshift)
Username: admin
Password:
[root@master student]# oc login -u  admin -p redhat
Login successful.You have access to the following projects and can switch between them with 'oc project <projectname>':* defaultkube-publickube-service-catalogkube-systemloggingmanagement-infraopenshiftopenshift-ansible-service-brokeropenshift-infraopenshift-nodeopenshift-template-service-brokeropenshift-web-consoleUsing project "default".

查看當(dāng)前登錄用戶

[root@master student]# oc whoami
admin
[root@master student]# oc log
login   logout  logs
[root@master student]# oc log
login   logout  logs
[root@master student]# oc logout
Logged "admin" out on "https://master.lab.example.com:443"
[root@master student]# oc login -u liruilong -p redhat https://master.lab.example.com:443
Login successful.You don't have any projects. You can try to create a new project, by runningoc new-project <projectname>[root@master student]# oc whoami
liruilong
[root@master student]#

查看當(dāng)前登錄用戶的 tocke

[root@master student]# oc whoami -t
iTYaOvc7DZVBW-vmn_6m71-TrGPiltJ210OkfjMEEi4
[root@master student]#

查看用戶列表

查看用戶列表

[root@master student]#  oc get user
NAME        UID                                    FULL NAME   IDENTITIES
admin       3300d7da-da70-11ed-a5c3-52540000fa0a               htpasswd_auth:admin
liruilong   b0cb659b-da74-11ed-a5c3-52540000fa0a               htpasswd_auth:liruilong

OpenShift 用戶信息來源于后端的省份提供者(Indentity Provider)。 假設(shè)用戶為 OpenShift 配置了某個(gè) Indentity Provider,當(dāng)用戶第一次登錄時(shí), OpenShift 往會(huì)為這個(gè)用戶創(chuàng)建一個(gè) user 對(duì)象及一個(gè) identity 對(duì)象。這個(gè) identity 對(duì)象記錄了用戶來源于哪一個(gè)后端的 Indentity Provider,以及相關(guān)的用戶信息 。

通過下面的例子可以看到當(dāng)前系統(tǒng)中的用戶,其來源 Provider 為 htpasswd auth 。

查看 identity 列表

[root@master student]# oc get identity
NAME                      IDP NAME        IDP USER NAME   USER NAME   USER UID
htpasswd_auth:admin       htpasswd_auth   admin           admin       3300d7da-da70-11ed-a5c3-52540000fa0a
htpasswd_auth:liruilong   htpasswd_auth   liruilong       liruilong   b0cb659b-da74-11ed-a5c3-52540000fa0a
[root@master student]#

刪除用戶

刪除 OKD 平臺(tái)中 user

[root@master    ~]#oc    delete    user    liruilong   

刪除 liruilong 用戶對(duì)應(yīng)的 identity。

oc delete identity liruilong

刪除 identity provider 中用戶。

[root@master    ~]#    htpasswd    -D    /etc/origin/openshift-passwd    liruilong 

如果未刪除 identity provider 中用戶,此時(shí)還可以使用該用戶登錄到 ocp 平臺(tái)。

如果為新創(chuàng)建的一個(gè)用戶,不添加項(xiàng)目,那么這個(gè)用戶沒有任何權(quán)限,需要通過下面的方式添加用戶權(quán)限。

  1. 將用戶添加到項(xiàng)目中:oc adm policy add-role-to-user <role> <username> -n <project>
  2. 從項(xiàng)目中刪除用戶:oc adm policy remove-role-from-user <role> <username> -n <project>
  3. 刪除用戶:oc adm policy remove-role-from-user <role> <username> -n <project>

請(qǐng)注意,命令 1 和 2 中的 是您要分配給用戶的角色,例如 admin 或 view。

組管理

組 (group)的信息的來源有兩個(gè),一是后端的 Indentity Provider ,二是通過用戶在 Open Shift 中定義 。 通過 oadm groups 命令,可以在 OpenShift 中對(duì)組及組的成員進(jìn)行管理。

添加組

[root@master student]# oc adm groups new devops
NAME      USERS
devops

在組中添加用戶

[root@master student]# oc adm groups add-users devops liruilong
group "devops" added: "liruilong"

查看組

[root@master student]# kubectl  get group
NAME      USERS
devops    liruilong
[root@master student]# oc get group
NAME      USERS
devops    liruilong
[root@master student]#

刪除組

[root@master student]# oc adm policy remove-group devops
Groups [devops] were not bound to roles in project default.
[root@master student]# kubectl  get  groups
NAME      USERS
devops
[root@master student]# oc get group
NAME      USERS
devops
[root@master student]# kubectl  delete group devops
group "devops" deleted
[root@master student]# oc get group
No resources found.
[root@master student]#

權(quán)限管理

OKD 的權(quán)限處理方式有很多中,這里和 K8s 不同的是多了 Policy ,K8s 印象中沒有這一層關(guān)系, 同樣使用 RBAC 的權(quán)限管理方式進(jìn)行管理,不同的是弱化了綁定關(guān)系對(duì)象,進(jìn)行了封裝。

  • role:Role (角色)是一組權(quán)限的集
  • rule:通過過權(quán)限 Rule,系統(tǒng)或用戶可以定義什么樣的角色可以對(duì)什么資源執(zhí)行什么動(dòng)作
  • policy: 若干個(gè) Role 組成一個(gè) 策略policy ,策略分為 集群級(jí)別 Clusterpolicy和命名空間Policy 級(jí)別.
  • Role Binding: 角色綁定關(guān)系,定義了角色于具體的用戶以及組的關(guān)聯(lián)關(guān)系,
  • Policy Binding: 若干 Role Binding組成的集合將構(gòu)成一個(gè) Policy Binding (策略綁定關(guān)系)。該對(duì)象類型同樣分為集群與項(xiàng)目?jī)蓚€(gè)級(jí)別 。

關(guān)于 RBAC 以及對(duì)應(yīng)的資源對(duì)象,這個(gè)不多做說明,簡(jiǎn)單來看一下當(dāng)前 集群內(nèi)置的一些角色

權(quán)限對(duì)象關(guān)系Demo

在這里插入圖片描述

角色管理

k8s 中的 集群相關(guān)的資源有兩個(gè) roleclusterrole,OKD 中,也是一樣的,角色一般用于處理命令空間,也就是okd 中的項(xiàng)目的資源,而 集群角色用于整個(gè)集群的角色控制。集群級(jí)別的 Clusterrole 和項(xiàng)目級(jí)別的 Role 。

查看當(dāng)前集群的角色和集群角色

[root@master student]# oc get clusterrole | head -n 5
NAME
admin
asb-access
asb-auth
basic-user
[root@master student]# oc get role
No resources found.
[root@master student]#

給用戶和組添加角色

給用戶或組添加角色和集群角色,這里在命令使用上和 k8s 有些出入,應(yīng)為 OKD 多個(gè)一層 policy ,默認(rèn)情況下,需要指定策略,即 policy

為當(dāng)前策略添加角色規(guī)則,看一下有什么命令

[root@master student]# oc adm policy add-cluster-role-to-
add-cluster-role-to-group  add-cluster-role-to-user

通過下面的命令看到,可以把角色和集群角色添加到用戶和組上面,給 liruilong 用戶添加一個(gè) admin

[root@master student]# oc adm policy add-cluster-role-to-user admin liruilong
cluster role "admin" added: "liruilong"
[root@master student]# oc adm policy add-
add-cluster-role-to-group  add-cluster-role-to-user   add-role-to-group          add-role-to-user           add-scc-to-group           add-scc-to-user

devops 組添加一個(gè) admin 的集群角色

[root@master student]# oc adm policy add-cluster-role-to-group admin devops
cluster role "admin" added: "devops"
[root@master student]#

綁定關(guān)系管理

用戶和角色的綁定關(guān)系查看

[root@master student]# oc get clusterrolebinding  admin
NAME      ROLE      USERS     GROUPS    SERVICE ACCOUNTS                               SUBJECTS
admin     /admin                        openshift-infra/template-instance-controller
[root@master student]#
admin-2                                                               /admin                                                                 liruilong
admin-3                                                               /admin                                                                                                  devops

查看哪個(gè) user 和 group 可以執(zhí)行特定 rule

[root@master student]# oc    adm    policy    who-can    delete    user
Namespace: default
Verb:      delete
Resource:  users.user.openshift.ioUsers:  adminsystem:adminsystem:serviceaccount:kube-system:clusterrole-aggregation-controllersystem:serviceaccount:kube-system:generic-garbage-collectorsystem:serviceaccount:kube-system:namespace-controllerGroups: system:cluster-adminssystem:masters[root@master student]# oc    adm    policy    who-can    delete  pod
Namespace: default
Verb:      delete
Resource:  podsUsers:  adminliruilongsystem:adminsystem:kube-schedulersystem:serviceaccount:kube-service-catalog:defaultsystem:serviceaccount:kube-system:clusterrole-aggregation-controllersystem:serviceaccount:kube-system:cronjob-controllersystem:serviceaccount:kube-system:daemon-set-controllersystem:serviceaccount:kube-system:generic-garbage-collectorsystem:serviceaccount:kube-system:job-controllersystem:serviceaccount:kube-system:namespace-controllersystem:serviceaccount:kube-system:node-controllersystem:serviceaccount:kube-system:persistent-volume-bindersystem:serviceaccount:kube-system:pod-garbage-collectorsystem:serviceaccount:kube-system:replicaset-controllersystem:serviceaccount:kube-system:replication-controllersystem:serviceaccount:kube-system:statefulset-controllersystem:serviceaccount:openshift-ansible-service-broker:asbsystem:serviceaccount:openshift-infra:build-controllersystem:serviceaccount:openshift-infra:deployer-controllersystem:serviceaccount:openshift-infra:pv-recycler-controllersystem:serviceaccount:openshift-infra:template-instance-controllerGroups: devopssystem:cluster-adminssystem:masters[root@master student]#

用戶默認(rèn)權(quán)限管理

用戶首次登錄獲取什么權(quán)限?默認(rèn)分配什么組和角色?每個(gè)項(xiàng)目綁定的角色和 用戶?整個(gè)集群綁定的角色和用戶?

默認(rèn)情況下,系統(tǒng)會(huì)為用戶授予這些默認(rèn)組

  • 系統(tǒng):已認(rèn)證(system:authenticated):這被分配給API可認(rèn)證的所有用戶。非system:anonymous (用戶) 的所有人都在這個(gè)組中
  • 系統(tǒng):已認(rèn)證:授權(quán)(system:authenticated:oauth):這將分配給使用嵌入式 oauth 服務(wù)器領(lǐng)發(fā)的 oauth 令牌進(jìn)行標(biāo)識(shí)的所有用戶。這不適用于服務(wù)帳戶(它們使用服務(wù)帳戶令牌) 或證書用戶
  • 系統(tǒng):未經(jīng)身份驗(yàn)證(system:unauthenticated):這將分配給尚未提交憑據(jù)的用戶。無效憑據(jù)被拒絕,并顯示401錯(cuò)誤,因此這是針對(duì)根本沒有嘗試進(jìn)行身份驗(yàn)證的用戶.

所以正常的,如果登錄成功那么系統(tǒng)會(huì)默認(rèn)賦予 authenticated、authenticated:oauth 這兩個(gè)組的權(quán)限

管理員是無法手勱改變這些組成員,想改變這些組中成員權(quán)限,可以通過更改組的角色實(shí)現(xiàn)。 system:authenticatedsytem:authenticated:oauth 組具有的默認(rèn)角色

[root@master student]# oc    get    clusterrolebinding    |grep    -e    system:authenticated    -e    USER
NAME                                                                  ROLE                                                                   USERS                            GROUPS                                         SERVICE ACCOUNTS                                                                   SUBJECTS
basic-users                                                           /basic-user                                                                                             system:authenticated
cluster-status-binding                                                /cluster-status                                                                                         system:authenticated, system:unauthenticated
self-access-reviewers                                                 /self-access-reviewer                                                                                   system:authenticated, system:unauthenticated
self-provisioners                                                     /self-provisioner                                                                                       system:authenticated:oauth
servicecatalog-serviceclass-viewer-binding                            /servicecatalog-serviceclass-viewer                                                                     system:authenticated
system:basic-user                                                     /system:basic-user                                                                                      system:authenticated, system:unauthenticated
system:build-strategy-docker-binding                                  /system:build-strategy-docker                                                                           system:authenticated
system:build-strategy-jenkinspipeline-binding                         /system:build-strategy-jenkinspipeline                                                                  system:authenticated
system:build-strategy-source-binding                                  /system:build-strategy-source                                                                           system:authenticated
system:discovery                                                      /system:discovery                                                                                       system:authenticated, system:unauthenticated
system:discovery-binding                                              /system:discovery                                                                                       system:authenticated, system:unauthenticated
system:oauth-token-deleters                                           /system:oauth-token-deleter                                                                             system:authenticated, system:unauthenticated
system:scope-impersonation                                            /system:scope-impersonation                                                                             system:authenticated, system:unauthenticated
system:webhooks                                                       /system:webhook                                                                                         system:authenticated, system:unauthenticated

修改用戶默認(rèn)權(quán)限

假設(shè)現(xiàn)在我們有這樣一個(gè)問題,我們不希望默認(rèn)的登錄用戶有 可以創(chuàng)建命名空間的權(quán)限, 即項(xiàng)目的權(quán)限,那么我們可以把對(duì)應(yīng)的綁定關(guān)系刪除。

可以看到創(chuàng)建項(xiàng)目的權(quán)限目前在 self-provisioner 這個(gè)角色

[root@master student]# oc describe clusterrole self-provisioner --all-namespaces
Name:           self-provisioner
Created:        24 hours ago
Labels:         <none>
Annotations:    authorization.openshift.io/system-only=trueopenshift.io/description=A user that can request projects.openshift.io/reconcile-protect=false
Verbs           Non-Resource URLs       Resource Names  API Groups              Resources
[create]        []                      []              [ project.openshift.io] [projectrequests]
[root@master student]#

即將已授權(quán) self-provisioner 集群角色和用戶組(system:authenticated:oauth)的綁定關(guān)系取消。

直接通過 kubectl 命令刪除綁定關(guān)系

[root@master student]# kubectl  delete  clusterrolebinding self-provisioners
clusterrolebinding "self-provisioners" deleted
[root@master student]# htpasswd -b /etc/origin/master/htpasswd  demo redhat
Adding password for user demo
[root@master student]# oc login  -u demo -p redhat
Login successful.You don't have any projects. Contact your system administrator to request a project.
[root@master student]#

當(dāng)然也可以使用 OKD 的方式 ,移除策略中對(duì)應(yīng)的綁定關(guān)系規(guī)則,下面我們通過這種方式來添加了對(duì)應(yīng)的綁定關(guān)系,可以看到登錄的時(shí)候擁有了創(chuàng)建項(xiàng)目的權(quán)限

[root@master student]# oc adm policy  add-cluster-role-to-group self-provisioner system:authenticated:oauth
cluster role "self-provisioner" added: "system:authenticated:oauth"
[root@master student]# oc    get    clusterrolebinding    |grep    -e    system:authenticated    -e    USER | grep provisioner
self-provisioner-0                                                    /self-provisioner                                                                                       system:authenticated:oauth[root@master student]# oc logout
Logged "admin" out on "https://master.lab.example.com:443"
[root@master student]# oc login  -u demo -p redhat
Login successful.You don't have any projects. You can try to create a new project, by runningoc new-project <projectname>[root@master student]#

安全上下文(SCC)管理

Kubernetes 中的容器安全有三個(gè)主要的組件:Pod Security Policies (PSP),Pod Security Admission (PSA) 和 Security Context (SC)。 K8s 中 PSP 在1.25 的版本中被測(cè)底廢除,只能使用 PSA 。

OpenShift 中的容器安全組件是 Security Context Constraints (SCC)。

上面這四個(gè)組件的作用是確保容器在 Kubernetes 或 OpenShift 集群中運(yùn)行時(shí)的安全性。它們的相同點(diǎn)和不同點(diǎn)如下:

相同點(diǎn):

  • 都是用于保證容器安全的組件。
  • 都可以用于限制容器的權(quán)限和訪問控制。
  • 都可以用于限制容器的資源使用。

不同點(diǎn):

  • PSP 是一種集群級(jí)別的安全策略,可以限制 Pod 的安全上下文和訪問控制。而 PSA 是一種動(dòng)態(tài)的安全策略,可以在 Pod 創(chuàng)建時(shí)對(duì)其進(jìn)行檢查和限制。而 SCC 是 OpenShift 中的一種安全策略,可以限制容器的權(quán)限和訪問控制。
  • PSP 和 PSA 都可以限制容器的權(quán)限和訪問控制,但 PSP 更加靈活,可以根據(jù) Pod 的標(biāo)簽和命名空間來進(jìn)行限制。而 PSA 只能根據(jù) Pod 的規(guī)范來進(jìn)行限制。而 SCC 可以根據(jù)用戶、命名空間和標(biāo)簽來進(jìn)行限制。
  • Security Context 是一種在容器級(jí)別上設(shè)置的安全策略,可以限制容器的權(quán)限和訪問控制。與 PSP、PSA 和 SCC 不同的是,Security Context 是在容器級(jí)別上設(shè)置的,而 PSP、PSA 和 SCC 是在 Pod 或集群級(jí)別上設(shè)置的。

回到 SSC,安全上下文( Security Context Constraint, SCC)要管控的是具體容器可以或不可以執(zhí)行哪些操作或調(diào)用 。 SCC 是 OpenShift 規(guī)范用戶運(yùn)行容器行為的一個(gè)有效途徑,比如相同的鏡像,可能在 docker 中可以運(yùn)行,在openshift 中不能運(yùn)行。

換句話講,通過 SCC 來限定 Pod 對(duì)宿主節(jié)點(diǎn)的資源訪問,雖然通過 Linux 命名空間有對(duì)應(yīng)的資源限制。

利用 SCC ,管理員能對(duì)Pod做如下的一些約束:

  • 運(yùn)行特權(quán)容器 (privileged container)
  • 為容器增加能力 (capahiliticg)
  • 用主機(jī)上的目錄作為卷
  • 容器的 SELinux 下文
  • 用戶 TD
  • 主機(jī)命名空間和網(wǎng)絡(luò)
  • 為Pod 的卷分配 FSGroup
  • 配置允許的補(bǔ)充組
  • 要求使用只讀文件系統(tǒng)
  • 控制允許使用的卷類型
  • 控制允許使用的安全計(jì)算模式配置文件(seccop prorile)

默認(rèn)情況下,任何容器的執(zhí)行都只授予 restricted(受限制) 的 SCC,這個(gè) SCC 是最嚴(yán)格的,適用于以 root 權(quán)限運(yùn)行的 pod。它限制了 pod 對(duì)主機(jī)文件系統(tǒng)和網(wǎng)絡(luò)的訪問。

查看當(dāng)前命名空間下的所以的 SSC ,OpenShift 有七個(gè) SCC

[root@master student]# oc get scc
NAME               PRIV      CAPS      SELINUX     RUNASUSER          FSGROUP     SUPGROUP    PRIORITY   READONLYROOTFS   VOLUMES
anyuid             false     []        MustRunAs   RunAsAny           RunAsAny    RunAsAny    10         false            [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
hostaccess         false     []        MustRunAs   MustRunAsRange     MustRunAs   RunAsAny    <none>     false            [configMap downwardAPI emptyDir hostPath persistentVolumeClaim projected secret]
hostmount-anyuid   false     []        MustRunAs   RunAsAny           RunAsAny    RunAsAny    <none>     false            [configMap downwardAPI emptyDir hostPath nfs persistentVolumeClaim projected secret]
hostnetwork        false     []        MustRunAs   MustRunAsRange     MustRunAs   MustRunAs   <none>     false            [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
nonroot            false     []        MustRunAs   MustRunAsNonRoot   RunAsAny    RunAsAny    <none>     false            [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
privileged         true      [*]       RunAsAny    RunAsAny           RunAsAny    RunAsAny    <none>     false            [*]
restricted         false     []        MustRunAs   MustRunAsRange     MustRunAs   RunAsAny    <none>     false            [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
[root@master student]#

對(duì)應(yīng) 的7中 SCC 限制說明:

  1. restricted:這個(gè) SCC 是最嚴(yán)格的,適用于以 root 權(quán)限運(yùn)行的 pod。它限制了 pod 對(duì)主機(jī)文件系統(tǒng)和網(wǎng)絡(luò)的訪問。
  2. privileged:這個(gè) SCC 允許 pod 以完整的 root 權(quán)限運(yùn)行,并訪問所有主機(jī)資源。它適用于需要訪問敏感主機(jī)資源的 pod。
  3. anyuid:這個(gè) SCC 允許 pod 以任何用戶 ID 和組 ID 運(yùn)行。它適用于需要訪問默認(rèn)用戶 ID 不可訪問的主機(jī)資源的 pod。
  4. hostaccess:這個(gè) SCC 允許 pod 掛載主機(jī)文件系統(tǒng)并訪問主機(jī)設(shè)備。它適用于需要訪問默認(rèn)用戶 ID 不可訪問的主機(jī)資源的 pod。
  5. hostmount-anyuid:這個(gè) SCC 允許 pod 掛載主機(jī)文件系統(tǒng)并以任何用戶 ID 和組 ID 運(yùn)行。它適用于需要訪問默認(rèn)用戶 ID 不可訪問的主機(jī)資源的 pod。
  6. nonroot:這個(gè) SCC 適用于不需要 root 權(quán)限的 pod。它限制了 pod 對(duì)主機(jī)文件系統(tǒng)和網(wǎng)絡(luò)的訪問。
  7. hostnetwork: 這個(gè) SCC 允許 pod 使用主機(jī)網(wǎng)絡(luò)命名空間。這意味著 pod 可以訪問主機(jī)上的網(wǎng)絡(luò)接口和端口,而不是被限制在容器網(wǎng)絡(luò)命名空間中。這個(gè) SCC 可能會(huì)增加 pod 對(duì)主機(jī)網(wǎng)絡(luò)的訪問權(quán)限,因此需要謹(jǐn)慎使用。

查看當(dāng)前 privileged SCC的詳細(xì)信息

[root@master student]# oc describe scc privileged
Name:                                           privileged
Priority:                                       <none>
Access:Users:                                        system:admin,system:serviceaccount:openshift-infra:build-controller,system:serviceaccount:management-infra:management-admin,system:serviceaccount:management-infra:inspector-adminGroups:                                       system:cluster-admins,system:nodes,system:masters
Settings:Allow Privileged:                             trueDefault Add Capabilities:                     <none>Required Drop Capabilities:                   <none>Allowed Capabilities:                         *Allowed Seccomp Profiles:                     *Allowed Volume Types:                         *Allowed Flexvolumes:                          <all>Allow Host Network:                           trueAllow Host Ports:                             trueAllow Host PID:                               trueAllow Host IPC:                               trueRead Only Root Filesystem:                    falseRun As User Strategy: RunAsAnyUID:                                        <none>UID Range Min:                              <none>UID Range Max:                              <none>SELinux Context Strategy: RunAsAnyUser:                                       <none>Role:                                       <none>Type:                                       <none>Level:                                      <none>FSGroup Strategy: RunAsAnyRanges:                                     <none>Supplemental Groups Strategy: RunAsAnyRanges:                                     <none>
[root@master student]#

詳情中的 Run As User Strategy: RunAsAny 表示可以使用容器中的任意用戶 ID 執(zhí)行,但運(yùn)行容器需要指定特定的 Service 用戶

查看系統(tǒng)默認(rèn)的restricted SCC 詳細(xì)信息

[root@master student]# oc describe scc  restricted
Name:                                           restricted
Priority:                                       <none>
Access:Users:                                        <none>Groups:                                       system:authenticated
Settings:Allow Privileged:                             falseDefault Add Capabilities:                     <none>Required Drop Capabilities:                   KILL,MKNOD,SETUID,SETGIDAllowed Capabilities:                         <none>Allowed Seccomp Profiles:                     <none>Allowed Volume Types:                         configMap,downwardAPI,emptyDir,persistentVolumeClaim,projected,secretAllowed Flexvolumes:                          <all>Allow Host Network:                           falseAllow Host Ports:                             falseAllow Host PID:                               falseAllow Host IPC:                               falseRead Only Root Filesystem:                    falseRun As User Strategy: MustRunAsRangeUID:                                        <none>UID Range Min:                              <none>UID Range Max:                              <none>SELinux Context Strategy: MustRunAsUser:                                       <none>Role:                                       <none>Type:                                       <none>Level:                                      <none>FSGroup Strategy: MustRunAsRanges:                                     <none>Supplemental Groups Strategy: RunAsAnyRanges:                                     <none>
[root@master student]#

Run As User Strategy: MustRunAsRange:則表示容器必須以指定的用戶 ID 運(yùn)行。具體來說,MustRunAsRange 策略要求容器的用戶 ID 必須在指定的范圍內(nèi)。這個(gè)范圍由 RunAsUser 和 RunAsGroup 字段指定。如果容器的用戶 ID 不在指定的范圍內(nèi),容器將無法啟動(dòng)。

pod 以哪個(gè)用戶身份執(zhí)行,如果沒有明確挃定,則由 pod 使用的 scc 確定。明確指定方法,下面為 K8s官網(wǎng)的一個(gè)Demo。

apiVersion: v1
kind: Pod
metadata:name: security-context-demo
spec:securityContext:runAsUser: 1000runAsGroup: 3000fsGroup: 2000volumes:- name: sec-ctx-volemptyDir: {}containers:- name: sec-ctx-demoimage: busybox:1.28command: [ "sh", "-c", "sleep 1h" ]volumeMounts:- name: sec-ctx-volmountPath: /data/demosecurityContext:allowPrivilegeEscalation: false

SCC 使用案例

如果你有一個(gè)需要特定 capability 能力的應(yīng)用,但是這個(gè) capability 不能通過系統(tǒng)默認(rèn)的 restricted SCC 授予,此時(shí)可以創(chuàng)建一個(gè)特殊的 service account,并將該賬戶加到 SCC 中。創(chuàng)建應(yīng)用使用此 sa 賬戶。

Openshift 中容器默認(rèn)是以隨機(jī)用戶執(zhí)行 command 的,如果該容器中 command 命令要求 root 用戶執(zhí)行,那么容器就無法創(chuàng)建

[root@master student]# oc new-app --name=nginx --docker-image=registry.lab.example.com/nginx
--> Found Docker image c825216 (4 years old) from registry.lab.example.com for "registry.lab.example.com/nginx"* An image stream will be created as "nginx:latest" that will track this image* This image will be deployed in deployment config "nginx"* Port 80/tcp will be load balanced by service "nginx"* Other containers can access this service through the hostname "nginx"* WARNING: Image "registry.lab.example.com/nginx" runs as the 'root' user which may not be permitted by your cluster administrator--> Creating resources ...imagestream "nginx" createddeploymentconfig "nginx" createdservice "nginx" created
--> SuccessApplication is not exposed. You can expose services to the outside world by executing one or more of the commands below:'oc expose svc/nginx'Run 'oc status' to view your app.
[root@master student]# oc expose svc/nginx
route "nginx" exposed
[root@master student]# kubectl  get route
NAME               HOST/PORT                                       PATH      SERVICES           PORT      TERMINATION   WILDCARD
docker-registry    docker-registry-default.apps.lab.example.com              docker-registry    <all>     passthrough   None
nginx              nginx-default.apps.lab.example.com                        nginx              80-tcp                  None
registry-console   registry-console-default.apps.lab.example.com             registry-console   <all>     passthrough   None
[root@master student]# kubectl  get pods
NAME                       READY     STATUS             RESTARTS   AGE
docker-registry-1-drmbk    1/1       Running            2          1d
nginx-1-deploy             1/1       Running            0          45s
nginx-1-h5zx8              0/1       CrashLoopBackOff   2          42s
registry-console-1-dg4h9   1/1       Running            2          1d
router-1-27wtd             1/1       Running            2          1d
router-1-lvmvk             1/1       Running            2          1d

可以看到 pod 一直創(chuàng)建失敗。

[root@master student]# kubectl  get pods  --selector=app=nginx
NAME            READY     STATUS             RESTARTS   AGE
nginx-1-h5zx8   0/1       CrashLoopBackOff   6          6m
[root@master student]#

在最前面的 Pod 創(chuàng)建的時(shí)候,我們看到一個(gè)告警,提示提示,以root 的方式運(yùn)行不被集群管理員所允許。所以 Pod 狀態(tài)一直是 CrashLoopBackOff.

* WARNING: Image "registry.lab.example.com/nginx" runs as the 'root' user which may not be permitted by your cluster administrator
[root@master student]# oc describe pods nginx-1-h5zx8 | grep -i -A 20 event
Events:Type     Reason                 Age                From                            Message----     ------                 ----               ----                            -------Normal   Scheduled              13m                default-scheduler               Successfully assigned nginx-1-h5zx8 to node2.lab.example.comNormal   SuccessfulMountVolume  13m                kubelet, node2.lab.example.com  MountVolume.SetUp succeeded for volume "default-token-bmctn"Normal   Pulled                 12m (x4 over 13m)  kubelet, node2.lab.example.com  Successfully pulled image "registry.lab.example.com/nginx@sha256:4ffd9758ea9ea360fd87d0cee7a2d1cf9dba630bb57ca36b3108dcd3708dc189"Normal   Created                12m (x4 over 13m)  kubelet, node2.lab.example.com  Created containerNormal   Started                12m (x4 over 13m)  kubelet, node2.lab.example.com  Started containerNormal   Pulling                11m (x5 over 13m)  kubelet, node2.lab.example.com  pulling image "registry.lab.example.com/nginx@sha256:4ffd9758ea9ea360fd87d0cee7a2d1cf9dba630bb57ca36b3108dcd3708dc189"Warning  BackOff                3m (x46 over 13m)  kubelet, node2.lab.example.com  Back-off restarting failed container
[root@master student]#

這個(gè)時(shí)候,我們可以修改默認(rèn)的 SCC 相關(guān)的權(quán)限,或者通過創(chuàng)建新的 SA 的方式,創(chuàng)建服務(wù)帳戶;將特定 SCC(如 anyuid)添加給用戶;修改 dc 使用創(chuàng)建的 sa 用戶身份運(yùn)行。

這里創(chuàng)建的 SA ,綁定到

oc    create    sa    useroot
oc    adm    policy    add-scc-to-user    anyuid    -z    useroot

修改應(yīng)用 dc,使用 sa-useroot 用戶運(yùn)行容器

oc    patch dc/nginx    --patch    '{"spec":{"template":{"spec":{"serviceAccountName":    " useroot"}}}}'

dc 會(huì)根據(jù) template 的定義創(chuàng)建 pod。

serviceAccountName: useroot 

也可以直接修改 默認(rèn) sa 的綁定的 SCC 。

oc adm policy add-scc-to-user anyuid -z default -n test2

關(guān)于 secret 這里簡(jiǎn)單介紹,Secret 對(duì)象類型提供了一種保存敏感信息的機(jī)制,例如密碼,OCP 客戶端配置文件,Docker 配置文件,私有 sorce registry 憑據(jù)。

博文部分內(nèi)容參考

? 文中涉及參考鏈接內(nèi)容版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)告知,這是一個(gè)開源項(xiàng)目,如果你認(rèn)可它,不要吝嗇星星哦 😃


《OKD 3.9 DO280 Red Hat OpenShift Administration I》

《開源容器云OpenShift:構(gòu)建基于Kubernetes的企業(yè)應(yīng)用云平臺(tái)》

https://docs.okd.io/latest/welcome/index.html


? 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

http://www.risenshineclean.com/news/50956.html

相關(guān)文章:

  • 做接口的網(wǎng)站廣告?zhèn)髅焦窘?jīng)營(yíng)范圍
  • java 網(wǎng)站開發(fā) 順序刷死粉網(wǎng)站推廣
  • 湛江企業(yè)網(wǎng)站建站模板靠譜的拉新平臺(tái)
  • 網(wǎng)站后臺(tái)更新怎么做可口可樂軟文范例
  • 山東疫情最新消息今天上海優(yōu)化網(wǎng)站seo公司
  • 鄭州百度網(wǎng)站優(yōu)化排名ios微信上的pdf亂碼
  • 網(wǎng)站建設(shè)解說詞百度手機(jī)助手下載2022官方正版
  • 酒店vi設(shè)計(jì)抖音seo培訓(xùn)
  • 網(wǎng)站怎么做微信支付寶電商網(wǎng)站開發(fā)平臺(tái)
  • 免費(fèi)網(wǎng)站開發(fā)公司百度競(jìng)價(jià)可以自學(xué)嗎
  • 如何注冊(cè)個(gè)人網(wǎng)站cnn頭條新聞
  • 自助建站平臺(tái)便宜營(yíng)銷型網(wǎng)站特點(diǎn)
  • 在線觀看視頻網(wǎng)站怎么做活動(dòng)推廣宣傳方案
  • 一般網(wǎng)站建設(shè)多少錢怎么才能讓百度收錄網(wǎng)站
  • 哪些網(wǎng)站可以做教師資格證題目seo網(wǎng)絡(luò)優(yōu)化軟件
  • 嘉興網(wǎng)站公司哪家好上海seo優(yōu)化培訓(xùn)機(jī)構(gòu)
  • 安裝wordpress 500 - 內(nèi)部服務(wù)器錯(cuò)誤.手機(jī)百度seo怎么優(yōu)化
  • 建設(shè)網(wǎng)站要在需求長(zhǎng)沙縣網(wǎng)絡(luò)營(yíng)銷咨詢
  • 前端特效網(wǎng)站cnzz統(tǒng)計(jì)
  • photoshop怎么做網(wǎng)站百度網(wǎng)站關(guān)鍵詞排名查詢
  • 龍海市城鄉(xiāng)規(guī)劃建設(shè)局網(wǎng)站優(yōu)化網(wǎng)站內(nèi)容
  • 嘉興制作網(wǎng)站企業(yè)西安seo外包優(yōu)化
  • 贛州做公司網(wǎng)站手機(jī)網(wǎng)站智能建站
  • 嘉興企業(yè)網(wǎng)站開發(fā)可以免費(fèi)發(fā)帖的網(wǎng)站
  • asp.net做的音樂網(wǎng)站杭州最專業(yè)的seo公司
  • 網(wǎng)站自助建設(shè)平臺(tái)有哪些廣州競(jìng)價(jià)托管公司
  • 做企業(yè)網(wǎng)站推廣多少錢百度官方網(wǎng)站登錄
  • 做曖曖視頻網(wǎng)站安全嗎百度營(yíng)銷官網(wǎng)
  • 網(wǎng)站建設(shè)好公司好營(yíng)銷網(wǎng)站做的好的公司
  • 做問卷哪個(gè)網(wǎng)站好愛站網(wǎng)關(guān)鍵詞密度