GitHub OAuth ಮತ್ತು Dex ಬಳಸಿಕೊಂಡು Kubernetes ನಲ್ಲಿ ಪ್ರಮಾಣೀಕರಿಸಿ

Dex, dex-k8s-authenticator ಮತ್ತು GitHub ಅನ್ನು ಬಳಸಿಕೊಂಡು ಕುಬರ್ನೆಟ್ಸ್ ಕ್ಲಸ್ಟರ್‌ಗೆ ಪ್ರವೇಶವನ್ನು ರಚಿಸಲು ನಾನು ನಿಮ್ಮ ಗಮನಕ್ಕೆ ಟ್ಯುಟೋರಿಯಲ್ ಅನ್ನು ಪ್ರಸ್ತುತಪಡಿಸುತ್ತೇನೆ.

GitHub OAuth ಮತ್ತು Dex ಬಳಸಿಕೊಂಡು Kubernetes ನಲ್ಲಿ ಪ್ರಮಾಣೀಕರಿಸಿ
ರಷ್ಯನ್ ಭಾಷೆಯ ಕುಬರ್ನೆಟ್ಸ್ ಚಾಟ್‌ನಿಂದ ಸ್ಥಳೀಯ ಮೆಮೆ ಟೆಲಿಗ್ರಾಂ

ಪರಿಚಯ

ಅಭಿವೃದ್ಧಿ ಮತ್ತು QA ತಂಡಕ್ಕೆ ಕ್ರಿಯಾತ್ಮಕ ಪರಿಸರವನ್ನು ರಚಿಸಲು ನಾವು ಕುಬರ್ನೆಟ್ಸ್ ಅನ್ನು ಬಳಸುತ್ತೇವೆ. ಆದ್ದರಿಂದ ನಾವು ಅವರಿಗೆ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್ ಮತ್ತು kubectl ಎರಡಕ್ಕೂ ಕ್ಲಸ್ಟರ್‌ಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡಲು ಬಯಸುತ್ತೇವೆ. OpenShift ಗಿಂತ ಭಿನ್ನವಾಗಿ, ವೆನಿಲ್ಲಾ ಕುಬರ್ನೆಟ್ಸ್ ಸ್ಥಳೀಯ ದೃಢೀಕರಣವನ್ನು ಹೊಂದಿಲ್ಲ, ಆದ್ದರಿಂದ ನಾವು ಇದಕ್ಕಾಗಿ ಮೂರನೇ ವ್ಯಕ್ತಿಯ ಸಾಧನಗಳನ್ನು ಬಳಸುತ್ತೇವೆ.

ಈ ಸಂರಚನೆಯಲ್ಲಿ ನಾವು ಬಳಸುತ್ತೇವೆ:

  • dex-k8s-ದೃಢೀಕರಣಕಾರ  - kubectl ಸಂರಚನೆಯನ್ನು ಉತ್ಪಾದಿಸಲು ವೆಬ್ ಅಪ್ಲಿಕೇಶನ್
  • ಡೆಕ್ಸ್ - OpenID ಸಂಪರ್ಕ ಪೂರೈಕೆದಾರ
  • GitHub - ನಾವು ನಮ್ಮ ಕಂಪನಿಯಲ್ಲಿ GitHub ಅನ್ನು ಬಳಸುವುದರಿಂದ

ನಾವು Google OIDC ಅನ್ನು ಬಳಸಲು ಪ್ರಯತ್ನಿಸಿದ್ದೇವೆ, ಆದರೆ ದುರದೃಷ್ಟವಶಾತ್ ನಾವು ವಿಫಲವಾಗಿದೆ ಅವುಗಳನ್ನು ಗುಂಪುಗಳೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸಲು, ಆದ್ದರಿಂದ GitHub ನೊಂದಿಗೆ ಏಕೀಕರಣವು ನಮಗೆ ಸಾಕಷ್ಟು ಸೂಕ್ತವಾಗಿದೆ. ಗುಂಪು ಮ್ಯಾಪಿಂಗ್ ಇಲ್ಲದೆ, ಗುಂಪುಗಳ ಆಧಾರದ ಮೇಲೆ RBAC ನೀತಿಗಳನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.

ಆದ್ದರಿಂದ, ನಮ್ಮ ಕುಬರ್ನೆಟ್ಸ್ ದೃಢೀಕರಣ ಪ್ರಕ್ರಿಯೆಯು ದೃಶ್ಯ ಪ್ರಾತಿನಿಧ್ಯದಲ್ಲಿ ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ:

GitHub OAuth ಮತ್ತು Dex ಬಳಸಿಕೊಂಡು Kubernetes ನಲ್ಲಿ ಪ್ರಮಾಣೀಕರಿಸಿ
ದೃಢೀಕರಣ ಪ್ರಕ್ರಿಯೆ

ಸ್ವಲ್ಪ ಹೆಚ್ಚು ವಿವರ ಮತ್ತು ಪಾಯಿಂಟ್ ಮೂಲಕ ಪಾಯಿಂಟ್:

  1. ಬಳಕೆದಾರರು dex-k8s-authenticator ಗೆ ಲಾಗ್ ಮಾಡುತ್ತಾರೆ (login.k8s.example.com)
  2. dex-k8s-authticator ವಿನಂತಿಯನ್ನು Dex ಗೆ ರವಾನಿಸುತ್ತದೆ (dex.k8s.example.com)
  3. ಡೆಕ್ಸ್ ಗಿಟ್‌ಹಬ್ ಲಾಗಿನ್ ಪುಟಕ್ಕೆ ಮರುನಿರ್ದೇಶಿಸುತ್ತದೆ
  4. GitHub ಅಗತ್ಯ ದೃಢೀಕರಣ ಮಾಹಿತಿಯನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ ಮತ್ತು ಅದನ್ನು Dex ಗೆ ಹಿಂತಿರುಗಿಸುತ್ತದೆ
  5. Dex ಸ್ವೀಕರಿಸಿದ ಮಾಹಿತಿಯನ್ನು dex-k8s-authenticator ಗೆ ರವಾನಿಸುತ್ತದೆ
  6. ಬಳಕೆದಾರರು GitHub ನಿಂದ OIDC ಟೋಕನ್ ಅನ್ನು ಸ್ವೀಕರಿಸುತ್ತಾರೆ
  7. dex-k8s-authenticator kubeconfig ಗೆ ಟೋಕನ್ ಅನ್ನು ಸೇರಿಸುತ್ತದೆ
  8. kubectl ಟೋಕನ್ ಅನ್ನು KubeAPIServer ಗೆ ರವಾನಿಸುತ್ತದೆ
  9. ಪಾಸ್ ಮಾಡಿದ ಟೋಕನ್ ಆಧಾರದ ಮೇಲೆ KubeAPIServer kubectl ಗೆ ಪ್ರವೇಶಗಳನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ
  10. ಬಳಕೆದಾರರು kubectl ನಿಂದ ಪ್ರವೇಶವನ್ನು ಪಡೆಯುತ್ತಾರೆ

ಪೂರ್ವಸಿದ್ಧತಾ ಕ್ರಮಗಳು

ಸಹಜವಾಗಿ, ನಾವು ಈಗಾಗಲೇ ಕುಬರ್ನೆಟ್ಸ್ ಕ್ಲಸ್ಟರ್ ಅನ್ನು ಸ್ಥಾಪಿಸಿದ್ದೇವೆ (k8s.example.com), ಮತ್ತು ಪೂರ್ವ-ಸ್ಥಾಪಿತವಾದ HELM ನೊಂದಿಗೆ ಬರುತ್ತದೆ. ನಾವು GitHub (super-org) ನಲ್ಲಿ ಸಂಸ್ಥೆಯನ್ನು ಸಹ ಹೊಂದಿದ್ದೇವೆ.
ನೀವು HELM ಹೊಂದಿಲ್ಲದಿದ್ದರೆ, ಅದನ್ನು ಸ್ಥಾಪಿಸಿ ತುಂಬಾ ಸರಳ.

ಮೊದಲು ನಾವು GitHub ಅನ್ನು ಹೊಂದಿಸಬೇಕಾಗಿದೆ.

ಸಂಸ್ಥೆಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಪುಟಕ್ಕೆ ಹೋಗಿ, (https://github.com/organizations/super-org/settings/applications) ಮತ್ತು ಹೊಸ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ರಚಿಸಿ (ಅಧಿಕೃತ OAuth ಅಪ್ಲಿಕೇಶನ್):
GitHub OAuth ಮತ್ತು Dex ಬಳಸಿಕೊಂಡು Kubernetes ನಲ್ಲಿ ಪ್ರಮಾಣೀಕರಿಸಿ
GitHub ನಲ್ಲಿ ಹೊಸ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ

ಅಗತ್ಯವಿರುವ URL ಗಳೊಂದಿಗೆ ಕ್ಷೇತ್ರಗಳನ್ನು ಭರ್ತಿ ಮಾಡಿ, ಉದಾಹರಣೆಗೆ:

  • ಮುಖಪುಟ URL: https://dex.k8s.example.com
  • ಅಧಿಕೃತ ಕಾಲ್‌ಬ್ಯಾಕ್ URL: https://dex.k8s.example.com/callback

ಲಿಂಕ್ಗಳೊಂದಿಗೆ ಜಾಗರೂಕರಾಗಿರಿ, ಸ್ಲಾಶ್ಗಳನ್ನು ಕಳೆದುಕೊಳ್ಳದಿರುವುದು ಮುಖ್ಯವಾಗಿದೆ.

ಪೂರ್ಣಗೊಂಡ ಫಾರ್ಮ್‌ಗೆ ಪ್ರತಿಕ್ರಿಯೆಯಾಗಿ, GitHub ಉತ್ಪಾದಿಸುತ್ತದೆ Client ID и Client secret, ಅವುಗಳನ್ನು ಸುರಕ್ಷಿತ ಸ್ಥಳದಲ್ಲಿ ಇರಿಸಿ, ಅವು ನಮಗೆ ಉಪಯುಕ್ತವಾಗುತ್ತವೆ (ಉದಾಹರಣೆಗೆ, ನಾವು ಬಳಸುತ್ತೇವೆ ವಾಲ್ಟ್ ರಹಸ್ಯಗಳನ್ನು ಸಂಗ್ರಹಿಸಲು):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

ಉಪಡೊಮೇನ್‌ಗಳಿಗಾಗಿ DNS ದಾಖಲೆಗಳನ್ನು ತಯಾರಿಸಿ login.k8s.example.com и dex.k8s.example.com, ಹಾಗೆಯೇ ಪ್ರವೇಶಕ್ಕಾಗಿ SSL ಪ್ರಮಾಣಪತ್ರಗಳು.

SSL ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ರಚಿಸೋಣ:

cat <<EOF | kubectl create -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: cert-auth-dex
  namespace: kube-system
spec:
  secretName: cert-auth-dex
  dnsNames:
    - dex.k8s.example.com
  acme:
    config:
    - http01:
        ingressClass: nginx
      domains:
      - dex.k8s.example.com
  issuerRef:
    name: le-clusterissuer
    kind: ClusterIssuer
---
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: cert-auth-login
  namespace: kube-system
spec:
  secretName: cert-auth-login
  dnsNames:
    - login.k8s.example.com
  acme:
    config:
    - http01:
        ingressClass: nginx
      domains:
      - login.k8s.example.com
  issuerRef:
    name: le-clusterissuer
    kind: ClusterIssuer
EOF
kubectl describe certificates cert-auth-dex -n kube-system
kubectl describe certificates cert-auth-login -n kube-system

ಶೀರ್ಷಿಕೆಯೊಂದಿಗೆ ಕ್ಲಸ್ಟರ್ ವಿತರಕರು le-clusterissuer ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿರಬೇಕು, ಆದರೆ ಇಲ್ಲದಿದ್ದರೆ, ಅದನ್ನು ಹೆಲ್ಮ್ ಬಳಸಿ ರಚಿಸಿ:

helm install --namespace kube-system -n cert-manager stable/cert-manager
cat << EOF | kubectl create -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  name: le-clusterissuer
  namespace: kube-system
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: le-clusterissuer
    http01: {}
EOF

KubeAPISserver ಕಾನ್ಫಿಗರೇಶನ್

kubeAPISserver ಕೆಲಸ ಮಾಡಲು, ನೀವು OIDC ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ ಮತ್ತು ಕ್ಲಸ್ಟರ್ ಅನ್ನು ನವೀಕರಿಸಬೇಕು:

kops edit cluster
...
  kubeAPIServer:
    anonymousAuth: false
    authorizationMode: RBAC
    oidcClientID: dex-k8s-authenticator
    oidcGroupsClaim: groups
    oidcIssuerURL: https://dex.k8s.example.com/
    oidcUsernameClaim: email
kops update cluster --yes
kops rolling-update cluster --yes

ನಾವು ಬಳಸುತ್ತೇವೆ ಕಿಕ್ ಕ್ಲಸ್ಟರ್‌ಗಳನ್ನು ನಿಯೋಜಿಸಲು, ಆದರೆ ಇದು ಇದೇ ರೀತಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಇತರ ಕ್ಲಸ್ಟರ್ ವ್ಯವಸ್ಥಾಪಕರು.

Dex ಕಾನ್ಫಿಗರೇಶನ್ ಮತ್ತು dex-k8s-authenticator

ಡೆಕ್ಸ್ ಕೆಲಸ ಮಾಡಲು, ನೀವು ಕುಬರ್ನೆಟ್ಸ್ ಮಾಸ್ಟರ್‌ನಿಂದ ಪ್ರಮಾಣಪತ್ರ ಮತ್ತು ಕೀಲಿಯನ್ನು ಹೊಂದಿರಬೇಕು, ಅದನ್ನು ಅಲ್ಲಿಂದ ಪಡೆಯೋಣ:

sudo cat /srv/kubernetes/ca.{crt,key}
-----BEGIN CERTIFICATE-----
AAAAAAAAAAABBBBBBBBBBCCCCCC
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
DDDDDDDDDDDEEEEEEEEEEFFFFFF
-----END RSA PRIVATE KEY-----

dex-k8s-authenticator ರೆಪೊಸಿಟರಿಯನ್ನು ಕ್ಲೋನ್ ಮಾಡೋಣ:

git clone [email protected]:mintel/dex-k8s-authenticator.git
cd dex-k8s-authenticator/

ಮೌಲ್ಯಗಳ ಫೈಲ್‌ಗಳನ್ನು ಬಳಸಿ, ನಮಗಾಗಿ ನಾವು ವೇರಿಯೇಬಲ್‌ಗಳನ್ನು ಸುಲಭವಾಗಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದು HELM ಚಾರ್ಟ್‌ಗಳು.

Dex ಗಾಗಿ ಸಂರಚನೆಯನ್ನು ವಿವರಿಸೋಣ:

cat << EOF > values-dex.yml
global:
  deployEnv: prod
tls:
  certificate: |-
    -----BEGIN CERTIFICATE-----
    AAAAAAAAAAABBBBBBBBBBCCCCCC
    -----END CERTIFICATE-----
  key: |-
    -----BEGIN RSA PRIVATE KEY-----
    DDDDDDDDDDDEEEEEEEEEEFFFFFF
    -----END RSA PRIVATE KEY-----
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - dex.k8s.example.com
  tls:
    - secretName: cert-auth-dex
      hosts:
        - dex.k8s.example.com
serviceAccount:
  create: true
  name: dex-auth-sa
config: |
  issuer: https://dex.k8s.example.com/
  storage: # https://github.com/dexidp/dex/issues/798
    type: sqlite3
    config:
      file: /var/dex.db
  web:
    http: 0.0.0.0:5556
  frontend:
    theme: "coreos"
    issuer: "Example Co"
    issuerUrl: "https://example.com"
    logoUrl: https://example.com/images/logo-250x25.png
  expiry:
    signingKeys: "6h"
    idTokens: "24h"
  logger:
    level: debug
    format: json
  oauth2:
    responseTypes: ["code", "token", "id_token"]
    skipApprovalScreen: true
  connectors:
  - type: github
    id: github
    name: GitHub
    config:
      clientID: $GITHUB_CLIENT_ID
      clientSecret: $GITHUB_CLIENT_SECRET
      redirectURI: https://dex.k8s.example.com/callback
      orgs:
      - name: super-org
        teams:
        - team-red
  staticClients:
  - id: dex-k8s-authenticator
    name: dex-k8s-authenticator
    secret: generatedLongRandomPhrase
    redirectURIs:
      - https://login.k8s.example.com/callback/
envSecrets:
  GITHUB_CLIENT_ID: "1ab2c3d4e5f6g7h8"
  GITHUB_CLIENT_SECRET: "98z76y54x32w1"
EOF

ಮತ್ತು dex-k8s-authenticator ಗಾಗಿ:

cat << EOF > values-auth.yml
global:
  deployEnv: prod
dexK8sAuthenticator:
  clusters:
  - name: k8s.example.com
    short_description: "k8s cluster"
    description: "Kubernetes cluster"
    issuer: https://dex.k8s.example.com/
    k8s_master_uri: https://api.k8s.example.com
    client_id: dex-k8s-authenticator
    client_secret: generatedLongRandomPhrase
    redirect_uri: https://login.k8s.example.com/callback/
    k8s_ca_pem: |
      -----BEGIN CERTIFICATE-----
      AAAAAAAAAAABBBBBBBBBBCCCCCC
      -----END CERTIFICATE-----
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - login.k8s.example.com
  tls:
    - secretName: cert-auth-login
      hosts:
        - login.k8s.example.com
EOF

Dex ಮತ್ತು dex-k8s-authenticator ಅನ್ನು ಸ್ಥಾಪಿಸಿ:

helm install -n dex --namespace kube-system --values values-dex.yml charts/dex
helm install -n dex-auth --namespace kube-system --values values-auth.yml charts/dex-k8s-authenticator

ಸೇವೆಗಳ ಕಾರ್ಯವನ್ನು ಪರಿಶೀಲಿಸೋಣ (Dex ಕೋಡ್ 400 ಅನ್ನು ಹಿಂತಿರುಗಿಸಬೇಕು ಮತ್ತು dex-k8s-authenticator ಕೋಡ್ 200 ಅನ್ನು ಹಿಂತಿರುಗಿಸಬೇಕು):

curl -sI https://dex.k8s.example.com/callback | head -1
HTTP/2 400
curl -sI https://login.k8s.example.com/ | head -1
HTTP/2 200

RBAC ಕಾನ್ಫಿಗರೇಶನ್

ನಾವು ಗುಂಪಿಗಾಗಿ ಕ್ಲಸ್ಟರ್‌ರೋಲ್ ಅನ್ನು ರಚಿಸುತ್ತೇವೆ, ನಮ್ಮ ಸಂದರ್ಭದಲ್ಲಿ ಓದಲು-ಮಾತ್ರ ಪ್ರವೇಶದೊಂದಿಗೆ:

cat << EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-read-all
rules:
  -
    apiGroups:
      - ""
      - apps
      - autoscaling
      - batch
      - extensions
      - policy
      - rbac.authorization.k8s.io
      - storage.k8s.io
    resources:
      - componentstatuses
      - configmaps
      - cronjobs
      - daemonsets
      - deployments
      - events
      - endpoints
      - horizontalpodautoscalers
      - ingress
      - ingresses
      - jobs
      - limitranges
      - namespaces
      - nodes
      - pods
      - pods/log
      - pods/exec
      - persistentvolumes
      - persistentvolumeclaims
      - resourcequotas
      - replicasets
      - replicationcontrollers
      - serviceaccounts
      - services
      - statefulsets
      - storageclasses
      - clusterroles
      - roles
    verbs:
      - get
      - watch
      - list
  - nonResourceURLs: ["*"]
    verbs:
      - get
      - watch
      - list
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create"]
EOF

ClusterRoleBinding ಗಾಗಿ ಸಂರಚನೆಯನ್ನು ರಚಿಸೋಣ:

cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: dex-cluster-auth
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-read-all
subjects:
  kind: Group
  name: "super-org:team-red"
EOF

ಈಗ ನಾವು ಪರೀಕ್ಷೆಗೆ ಸಿದ್ಧರಿದ್ದೇವೆ.

ಪರೀಕ್ಷೆಗಳು

ಲಾಗಿನ್ ಪುಟಕ್ಕೆ ಹೋಗಿ (https://login.k8s.example.com) ಮತ್ತು ನಿಮ್ಮ GitHub ಖಾತೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಲಾಗ್ ಇನ್ ಮಾಡಿ:

GitHub OAuth ಮತ್ತು Dex ಬಳಸಿಕೊಂಡು Kubernetes ನಲ್ಲಿ ಪ್ರಮಾಣೀಕರಿಸಿ
ಲಾಗಿನ್ ಪುಟ

GitHub OAuth ಮತ್ತು Dex ಬಳಸಿಕೊಂಡು Kubernetes ನಲ್ಲಿ ಪ್ರಮಾಣೀಕರಿಸಿ
ಲಾಗಿನ್ ಪುಟವನ್ನು GitHub ಗೆ ಮರುನಿರ್ದೇಶಿಸಲಾಗಿದೆ

GitHub OAuth ಮತ್ತು Dex ಬಳಸಿಕೊಂಡು Kubernetes ನಲ್ಲಿ ಪ್ರಮಾಣೀಕರಿಸಿ
 ಪ್ರವೇಶವನ್ನು ಪಡೆಯಲು ರಚಿಸಿದ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ

ವೆಬ್ ಪುಟದಿಂದ ಕಾಪಿ-ಪೇಸ್ಟ್ ಮಾಡಿದ ನಂತರ, ನಮ್ಮ ಕ್ಲಸ್ಟರ್ ಸಂಪನ್ಮೂಲಗಳನ್ನು ನಿರ್ವಹಿಸಲು ನಾವು kubectl ಅನ್ನು ಬಳಸಬಹುದು:

kubectl get po
NAME                READY   STATUS    RESTARTS   AGE
mypod               1/1     Running   0          3d

kubectl delete po mypod
Error from server (Forbidden): pods "mypod" is forbidden: User "[email protected]" cannot delete pods in the namespace "default"

ಮತ್ತು ಇದು ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ, ನಮ್ಮ ಸಂಸ್ಥೆಯಲ್ಲಿರುವ ಎಲ್ಲಾ GitHub ಬಳಕೆದಾರರು ಸಂಪನ್ಮೂಲಗಳನ್ನು ನೋಡಬಹುದು ಮತ್ತು ಪಾಡ್‌ಗಳಿಗೆ ಲಾಗ್ ಇನ್ ಮಾಡಬಹುದು, ಆದರೆ ಅವುಗಳನ್ನು ಬದಲಾಯಿಸುವ ಹಕ್ಕುಗಳನ್ನು ಹೊಂದಿಲ್ಲ.

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ