Kubernetes'e turvaabitus: autentimine, autoriseerimine, audit

Kubernetes'e turvaabitus: autentimine, autoriseerimine, audit

Iga sĂŒsteemi kasutamisel kerkib varem vĂ”i hiljem esile turvakĂŒsimus: autentimise tagamise, Ă”iguste jagamise, auditi ja teiste ĂŒlesannete kindlustamine. Kubernetes'ele on juba loodud palju lahendusi, mis vĂ”imaldavad saavutada vastavust standarditele isegi vĂ€ga nĂ”udlikes keskkondades
 See materjal on pĂŒhendatud Kubernetes'i sisseehitatud mehhanismide raamides rakendatud turvaelementide pĂ”hialustele. EelkĂ”ige on see kasulik neile, kes alustavad Kubernetes'ega tutvumist, — kui lĂ€htepunkt turvakĂŒsimuste uurimiseks.

Autentimine

Kubernetes'is on kaks kasutajatĂŒĂŒpi:

  • Teenusekontod — kontod, mida haldab Kubernetes API;
  • Kasutajad — „tavalised“ kasutajad, mida haldavad vĂ€listest, sĂ”ltumatutest teenustest.

Peamine erinevus nende tĂŒĂŒpide vahel on see, et Teenusekontode jaoks on Kubernetes API-s erilised objektid (need kannavad samuti nime — Teenusekontod), mis on seotud nimedega ja autoriseerimisandmete kogumiga, mis on salvestatud klastri Secrets tĂŒĂŒpi objektides. Sellised kasutajad (Teenusekontod) on peamiselt mĂ”eldud Ă”iguste haldamiseks Kubernetes API juurdepÀÀsuks Kubernetes klastri protsesside jaoks.

Tavalised kasutajad ei oma kirjeid Kubernetes API-s: nende haldamine peab toimuma vÀlistes mehhanismides. Need on mÔeldud inimestele vÔi protsessidele, kes elavad vÀljaspool klastrit.

Iga API-pĂ€ring on seotud kas teenusekonto (Service Account) vĂ”i kasutajaga, vĂ”i seda peetakse anonĂŒĂŒmseks.

Kasutaja autentimisandmed sisaldavad:

  • Kasutajanimi — kasutajanimi (sensitiivne suurte tĂ€htede suhtes!);
  • UID — masinloetav kasutaja identifitseerimisrida, mis on "jĂ€rjekindlam ja ainulaadsem kui kasutajanimi";
  • Groups — kasutaja kuuluvate rĂŒhmade loetelu;
  • Extra — lisavĂ€ljad, mida vĂ”ib kasutada autoriseerimismehhanism.

Kubernetes toetab suurt hulka autentimismehhanisme: X509 sertifikaadid, Bearer-tokenid, autentimisproxi, HTTP Basic Auth. Neid mehhanisme kasutades saab rakendada mitmeid autoriseerimisskeeme: alates staatilisest paroolifailist kuni OpenID OAuth2-ni.

Lisaks on lubatud samaaegne mitme autoriseerimisskeemi kasutamine. Vaikimisi kasutatakse klastris:

  • teenusekonto tokenid — teenusekontode jaoks;
  • X509 — kasutajate jaoks.

KĂŒsimus ServiceAccountide haldamise kohta jÀÀb selle artikli raamest vĂ€lja, kuid soovitan selle teema pĂ”hjalikumaks tutvumiseks alustada ametlikest dokumentatsioonilehtedest. Meie vaatame lĂ€hemalt X509 sertifikaatide tööd.

Kasutaja sertifikaadid (X.509)

Klassikaline viis sertifikaatidega töötamiseks hÔlmab:

  • vĂ”tme genereerimist:
    mkdir -p ~/mynewuser/.certs/
    openssl genrsa -out ~/.certs/mynewuser.key 2048
  • sertifikaadi pĂ€ringu genereerimist:
    openssl req -new -key ~/.certs/mynewuser.key -out ~/.certs/mynewuser.csr -subj "/CN=mynewuser/O=company"
  • sertifikaadi pĂ€ringu töötlemist Kubernetes klastri CA vĂ”tmete abil, kasutaja sertifikaadi saamist (sertifikaadi saamiseks tuleb kasutada kontot, millel on juurdepÀÀs klastri sertifitseerimiskeskuse vĂ”tmele, mis vaikimisi asub /etc/kubernetes/pki/ca.key):
    openssl x509 -req -in ~/.certs/mynewuser.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out ~/.certs/mynewuser.crt -days 500
  • konfiguratsioonifaili loomist:
    • klastri kirjeldus (mĂ€rkige CA sertifikaadi aadress ja asukoht antud klastrite installatsioonis):
      kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --server=https://192.168.100.200:6443
    • vĂ”i — kuidas eisoovitatav valik — juuresertifikaati ei ole vaja nĂ€idata (sel juhul ei kontrolli kubectl klastrite api-serveri Ă”igust):
      kubectl config set-cluster kubernetes --insecure-skip-tls-verify=true --server=https://192.168.100.200:6443
    • kasutaja lisamine konfiguratsioonifaili:
      kubectl config set-credentials mynewuser --client-certificate=.certs/mynewuser.crt --client-key=.certs/mynewuser.key
    • konteksti lisamine:
      kubectl config set-context mynewuser-context --cluster=kubernetes --namespace=target-namespace --user=mynewuser
    • vaikimisi konteksti mÀÀramine:
      kubectl config use-context mynewuser-context

PĂ€rast ĂŒlalkirjeldatud toimingute tegemist, failis .kube/config loodakse konfiguraator jĂ€rgmises vormis:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: /etc/kubernetes/pki/ca.crt
    server: https://192.168.100.200:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    namespace: target-namespace
    user: mynewuser
  name: mynewuser-context
current-context: mynewuser-context
kind: Config
preferences: {}
users:
- name: mynewuser
  user:
    client-certificate: /home/mynewuser/.certs/mynewuser.crt
    client-key: /home/mynewuser/.certs/mynewuser.key

Konfiguraatori edasiviimise lihtsustamiseks kontode ja serverite vahel on kasulik redigeerida jÀrgmiste vÔtmete vÀÀrtusi:

  • certificate-authority
  • client-certificate
  • client-key

Selleks vÔib mÀÀratletud failid kodeerida base64 abil ja lisada need konfiguratsiooni, lisades vÔtme nimedele sufiksi -data, st saades certificate-authority-data jne.

Sertifikaadid kubeadm-iga

Koos vĂ€ljaandega Kubernetes 1.15 sertifikaatidega töötamine on muutunud oluliselt lihtsamaks, tĂ€nu selle toe alfa-versioonile utiliidis kubeadm. NĂ€iteks, siin on, kuidas nĂŒĂŒd vĂ”ib vĂ€lja nĂ€ha kasutaja vĂ”tmete konfigureerimisfaili genereerimine:

kubeadm alpha kubeconfig user --client-name=mynewuser --apiserver-advertise-address 192.168.100.200

NB: NÔutav reklaamimisadress saab vaadata api-serveri konfigureerimisfailist, mis asub vaikimisi aadressil /etc/kubernetes/manifests/kube-apiserver.yaml.

Tulemuseks olev konfiguraatsioon kuvatakse stdout-is. See tuleb salvestada ~/.kube/config kasutaja kontole vÔi faili, mille kohta on mÀÀratud keskkonnamuutuja KUBECONFIG.

SĂŒgavamale kaevuma

Neile, kes soovivad pÔhjalikumalt uurida kÀsitletud teemasid:

Autoriseerimine

Vaikimisi volitatud konto ei oma Ôigusi klastris tegutsemiseks. Kubernetes'is on volituste andmiseks rakendatud autoriseerimise mehanismi.

Kuni versioonini 1.6 kasutati Kubernetes'is autoriseerimistĂŒĂŒp, mida nimetatakse ABAC (atribuutide pĂ”hine juurdepÀÀsu kontroll). Lisainfot leiate ametlikus dokumentatsioonis. Praegu peetakse seda lĂ€henemist vananenuks (legacy), kuid saate seda siiski kasutada koos teiste autoriseerimisliikidega.

Praegune (ja paindlikum) meetod juurdepÀÀsuÔiguste jagamiseks klastris on nimetatud RBAC (RollipÔhine juurdepÀÀsu kontroll). See kuulutati stabiilseks alates versioonist Kubernetes 1.8. RBAC rakendab Ôiguste mudelit, kus keelatud on kÔik, mis ei ole selgelt lubatud.
RBAC-i aktiveerimisekstuleb kĂ€ivitada Kubernetes api-server koos parameetriga --authorization-mode=RBAC. Parameetrid mÀÀratakse api-serveri konfigureerimise manifestis, mis asub vaikimisi teel /etc/kubernetes/manifests/kube-apiserver.yaml, jaoks command. Siiski on RBAC vaikimisi juba sisse lĂŒlitatud, seega tĂ”enĂ€oliselt pole pĂ”hjust muretseda: saate seda kontrollida vÀÀrtuse kaudu authorization-mode (eelnevalt mainitud kube-apiserver.yaml). Muide, selle vÀÀrtuste seas vĂ”ivad esineda ka teisi autoriseerimisliike (node, webhook, always allow), kuid nende arutamine jÀÀb materiaali raames vĂ€lja.

Muide, oleme juba avaldanud artiklile ĂŒsna pĂ”hjaliku ĂŒlevaate RBAC-iga töötamise pĂ”himĂ”tetest ja eripĂ€radest, seega piirdun siin pĂ”hitĂ”dede ja nĂ€idete lĂŒhikese loeteluga.

Kubernetes'i RBAC kaudu juurdepÀÀsu haldamiseks kasutatakse jÀrgmisi API-entiteete:

  • Roll ja ClusterRole — rollid, mis kirjeldavad ligipÀÀsuĂ”igusi:
  • Roll kĂŒtus kirjeldada Ă”igusi nimetatud nimekirjas;
  • ClusterRole — klastris, sealhulgas klastrispetsiifiliste objektide, nagu sĂ”lmede, non-resources URL-ide (st Kubernetes'e ressurssidega mitte seotud — nĂ€iteks, /version, /logs, /api*);
  • Rolli seondus ja ClusterRoleBinding — teenib seondumiseks Roll ja ClusterRole kasutajale, kasutajagrupile vĂ”i ServiceAccount'ile.

Rolli ja Rolli seondus entiteedid on piiratud nimeserveri ulatuses, st nad peavad olema ĂŒhe nimeserveri piires. Siiski vĂ”ib Rolli seondus viidata ClusterRole'ile, mis vĂ”imaldab luua rikka loomuliku loa komplekti ja hallata juurdepÀÀsu nende abil.

Rollid kirjeldavad Ôigusi reeglite komplektide abil, mis sisaldavad:

  • API-grupid — vt. ametlikku dokumentatsiooni apiGroups ja vĂ€ljund kubectl api-resources;
  • ressursid (resources: pod, namespace, deployment jne);
  • tegusĂ”nad (verbs: set, update jne).
  • ressursi nimed (resourceNames) — olukordades, kus tuleb anda juurdepÀÀs kindlale ressursile, mitte kĂ”igile selle tĂŒĂŒbi ressurssidele.

Kubernetes'i autoriseerimise ĂŒksikasjalikum analĂŒĂŒs on saadaval lehekĂŒljelt ametlikus dokumentatsioonis. Selle asemel (ja tĂ€ienduseks sellele) toon nĂ€ited, mis illustreerivad selle toimimist.

RBAC-i nÀidisobjektid

Lihtne Roll, mis vÔimaldab tuua vÀlja podide nimekirja ja staatuse ning neid jÀlgida sihtnimekirjas siht-nimekiri:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: siht-nimekiri
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

NÀide ClusterRole, mis vÔimaldab tuua vÀlja podide nimekirja ja staatuse ning neid jÀlgida kogu klastris:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # sektsiooni "namespace" ei ole, kuna ClusterRole katab kogu klastri
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

NĂ€ide Rolli seondus, mis annab kasutajale minuunewuser «lugeda» pod’e sihtnimekirjas minu-nimekiri:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: siht-nimekiri
subjects:
- kind: User
  name: minuuser # kasutajanimi on tundlik suur- ja vÀikeharfide suhtes!
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role # siin peab olema “Role” vĂ”i “ClusterRole”
  name: pod-reader # Role'i nimi, mis asub samas nimekirjas
                   # vÔi ClusterRole'i nimi, mille kasutamist
                   # soovime kasutajale lubada
  apiGroup: rbac.authorization.k8s.io

SĂŒndmuste audit

Kubernetes'i arhitektuuri vÔib joonistada jÀrgmiselt:

Kubernetes'e turvaabitus: autentimine, autoriseerimine, audit

Kubernetes'i peamine komponent, mis vastutab pĂ€ringute töötlemise eest, on api-server. KĂ”ik klastriga seotud toimingud kĂ€ivad selle kaudu. Nendest sisemistest mehhanismidest saab rohkem lugeda artiklist „Mis juhtub Kuberneteses, kui kĂ€ivitada kubectl run?».

SĂŒsteemi auditeerimine on huvitav funktsioon Kuberneteses, mis on vaikimisi vĂ€lja lĂŒlitatud. See vĂ”imaldab logida kĂ”iki pöördumisi Kubernetes API-le. Nagu lihtne arvata, tehakse kĂ”ik klastrit puudutavad toimingud just selle API kaudu. Selle vĂ”imaluste kohta saab head kirjeldust leida (nagu ikka) ametlikus dokumentatsioonis K8s. JĂ€rgnevalt pĂŒĂŒan teemat lihtsamalt selgitada.

Nii et, auditimise lubamiseks, peame api-serverile konteinerisse edastama kolm kohustuslikku parameetrit, millest allpool rohkem juttu:

  • --audit-policy-file=/etc/kubernetes/policies/audit-policy.yaml
  • --audit-log-path=/var/log/kube-audit/audit.log
  • --audit-log-format=json

Lisaks nendele kolmele vajalikele parameetrile on veel palju muid seadeid auditeerimise kohta: logide pööramine kuni webhookide kirjeldusteni. NÀide logide pööramise parameetritest:

  • --audit-log-maxbackup=10
  • --audit-log-maxsize=100
  • --audit-log-maxage=7

Kuid jÀÀme nendele pikemalt peatuma — kĂ”ik detailid leiate kube-apiserveri dokumentatsioonist.

Nagu juba mainitud, seadistatakse kÔik parameetrid api-serveri konfiguratsioonimanifestis (vaikimisi /etc/kubernetes/manifests/kube-apiserver.yaml), sektsioonis command. Naaseme kolme kohustusliku parameetri juurde ja vaatame need lÀbi:

  1. audit-policy-file — tee YAML-failini, mis kirjeldab auditi poliitikat (policy). Me pöördume selle sisu poole hiljem, aga mĂ€rkida tuleb, et fail peab olema api-serveri protsessile loetav. SeetĂ”ttu tuleb see konteinerisse montaaĆŸida, mille jaoks saate lisada jĂ€rgmise koodi vastavatesse konfigureerimise sektsioonidesse:
      volumeMounts:
        - mountPath: /etc/kubernetes/policies
          name: policies
          readOnly: true
      volumes:
      - hostPath:
          path: /etc/kubernetes/policies
          type: DirectoryOrCreate
        name: policies
  2. audit-log-path — tee logifailini. Tee peab olema samuti api-serveri protsessile loetav, seega kirjeldame selle montaaĆŸi samamoodi:
      volumeMounts:
        - mountPath: /var/log/kube-audit
          name: logs
          readOnly: false
      volumes:
      - hostPath:
          path: /var/log/kube-audit
          type: DirectoryOrCreate
        name: logs
  3. audit-log-format — auditi logi formaat. Vaikimisi on see json, aga saadaval on ka vananenud tekstivormaat (legacy).

Auditi poliitika

NĂŒĂŒd rÀÀkides mainitud logipoliitikast. Esimene mĂ”isted audit policy — see on level, logimise tase. Need vĂ”ivad olla jĂ€rgmised:

  • Puudub — ei logi;
  • Metadata — logige pĂ€ringute metaandmed: kasutaja, pĂ€ringu aeg, sihtressurss (pod, namespace jne), tegevuse tĂŒĂŒp (verb) jne;
  • Request — logige metaandmed ja pĂ€ringu body;
  • RequestResponse — logige metaandmed, pĂ€ringu body ja vastuse body.

Viimane kaks taset (Request ja RequestResponse) ei logi pÀringuid, mis ei suunatud ressurssidele (nn non-resources urls).

Samuti lÀbivad kÔik pÀringud mitmeid etappe:

  • RequestReceived — etapp, kui pĂ€ring on töödeldud ja pole veel edastatud jĂ€rgnevatele töötlejatele;
  • ResponseStarted — vastuse pealkirjad on saadetud, kuid enne vastuse body edastamist. See genereeritakse pikaajaliste pĂ€ringute jaoks (nĂ€iteks, watch);
  • ResponseComplete — vastuse body on saadetud, rohkem teavet ei saadeta;
  • Panic — sĂŒndmused genereeritakse, kui avastatakse ebanormaalne olukord.

MÔnede etapide vahelejÀtmiseks saab kasutada omitStages.

Poliitika failis saame kirjeldada mitmeid sektsioone erinevate logimise tasemetega. Rakendatakse esimest sobivat reeglit, mis leiti poliitika kirjeldusest.

Kubelet jĂ€lgib api-serveri konfiguratsioonifesti muudatusi ja, kui selliseid avastatakse, taaskĂ€ivitab api-serveri konteineri. Kuid on ĂŒks oluline detail: muudatusi policy failis ei vĂ”eta arvesse.PĂ€rast muudatuste tegemist policy failis tuleb api-server manuaalselt taaskĂ€ivitada. Kuna api-server töötab kui staatiline pod,, kĂ€sk kubectl delete ei too kaasa tema taaskĂ€ivitamist. Manuaalselt tuleb teha docker stop kube-masteritel, kus audiitpoliitikat on muudetud:

docker stop $(docker ps | grep k8s_kube-apiserver | awk '{print $1}')

Auditimise lubamisel on oluline meeles pidada, et kube-apiserverile tÔuseb koormus.Eriti suureneb mÀlu tarbimine pÀringute konteksti salvestamiseks. Logimise algus toimub alles pÀrast vastusepealkirja saatmist. Samuti sÔltub koormus audiitpoliitika konfiguratsioonist.

Poliitika nÀidised

AnalĂŒĂŒsime policy failide struktuuri nĂ€idete varal.

Siin on lihtne fail policy, et logida kÔike tasemel Metadata:

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata

Policy failis saab mÀÀrata kasutajate (Kasutajad ja Teenusekontod) ja kasutajagruppide loendi. NĂ€iteks, nii ignoreerime sĂŒsteemikasutajaid, kuid logime kĂ”ik muu tasemel Request:

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
  - level: None
    userGroups:
      - "system:serviceaccounts"
      - "system:nodes"
    users:
      - "system:anonymous"
      - "system:apiserver"
      - "system:kube-controller-manager"
      - "system:kube-scheduler"
  - level: Request

Samuti on vÔimalik kirjeldada sihtkohti:

  • nimetused (namespaces);
  • tegusĂ”nad (verbs: get, update, kustuta ja muud);
  • ressursid (resources, nimelt: pod, configmaps jne.) ning ressursside rĂŒhmad (apiGroups).

Palun pöörake tÀhelepanu! Ressursse ja ressursigruppide (API grupid, st apiGroups) versioone, mis on klastris installitud, saab saada jÀrgmiste kÀskude abil:

kubectl api-resources
kubectl api-versions

JĂ€rgmine audit policy on toodud parimate praktikate demonstreerimiseks Alibaba Cloud'i dokumentatsioonis:

apiVersion: audit.k8s.io/v1beta1
kind: Policy
# Ära logi RequestReceived etappi
omitStages:
  - "RequestReceived"
rules:
  # Ära logi sĂŒndmusi, mis peetakse vĂ€henenud tĂ€htsusega ja mitteohtlikeks:
  - level: None
    users: ["system:kube-proxy"]
    verbs: ["watch"]
    resources:
      - group: "" # see on api grupp tĂŒhja nimega, mis kuulub
                  # Kubernetes'i pĂ”hivahendite alla, mida nimetatakse “core”
        resources: ["endpoints", "services"]
  - level: None
    users: ["system:unsecured"]
    namespaces: ["kube-system"]
    verbs: ["get"]
    resources:
      - group: "" # core
        resources: ["configmaps"]
  - level: None
    users: ["kubelet"]
    verbs: ["get"]
    resources:
      - group: "" # core
        resources: ["nodes"]
  - level: None
    userGroups: ["system:nodes"]
    verbs: ["get"]
    resources:
      - group: "" # core
        resources: ["nodes"]
  - level: None
    users:
      - system:kube-controller-manager
      - system:kube-scheduler
      - system:serviceaccount:kube-system:endpoint-controller
    verbs: ["get", "update"]
    namespaces: ["kube-system"]
    resources:
      - group: "" # core
        resources: ["endpoints"]
  - level: None
    users: ["system:apiserver"]
    verbs: ["get"]
    resources:
      - group: "" # core
        resources: ["namespaces"]
  # Ära logi lugemisĂ”igusega URL-e:
  - level: None
    nonResourceURLs:
      - /healthz*
      - /version
      - /swagger*
  # Ära logi sĂŒndmusi, mis kuuluvad “sĂŒndmuste” ressursi tĂŒĂŒbi alla:
  - level: None
    resources:
      - group: "" # core
        resources: ["events"]
  # Secret-i, ConfigMap-i ja TokenReview'i ressursid vÔivad sisaldada salajasi andmeid,
  # seega logime vaid seotud pÀringute metainformatsiooni
  - level: Metadata
    resources:
      - group: "" # core
        resources: ["secrets", "configmaps"]
      - group: authentication.k8s.io
        resources: ["tokenreviews"]
  # Get-, list- ja watch-toimingud vÔivad olla ressursiintensiivsed; ei logi neid
  - level: Request
    verbs: ["get", "list", "watch"]
    resources:
      - group: "" # core
      - group: "admissionregistration.k8s.io"
      - group: "apps"
      - group: "authentication.k8s.io"
      - group: "authorization.k8s.io"
      - group: "autoscaling"
      - group: "batch"
      - group: "certificates.k8s.io"
      - group: "extensions"
      - group: "networking.k8s.io"
      - group: "policy"
      - group: "rbac.authorization.k8s.io"
      - group: "settings.k8s.io"
      - group: "storage.k8s.io"
  # Vaikimisi logimise tase standardsete API ressursside jaoks
  - level: RequestResponse
    resources:
      - group: "" # core
      - group: "admissionregistration.k8s.io"
      - group: "apps"
      - group: "authentication.k8s.io"
      - group: "authorization.k8s.io"
      - group: "autoscaling"
      - group: "batch"
      - group: "certificates.k8s.io"
      - group: "extensions"
      - group: "networking.k8s.io"
      - group: "policy"
      - group: "rbac.authorization.k8s.io"
      - group: "settings.k8s.io"
      - group: "storage.k8s.io"
  # Vaikimisi logimise tase kÔigi teiste pÀringute jaoks
  - level: Metadata

Teine hea nÀide auditipoliitikast on profiil, mida kasutatakse GCE-s.

AuditisĂŒndmustele reageerimiseks on vĂ”imalik kirjeldada webhook'i. Seda kĂŒsimust kĂ€sitletakse ametlikus dokumentatsioonis, jĂ€tn Ă€ra selle artikli raamidest.

KokkuvÔte

Artiklis antakse ĂŒlevaade Kubernetes'e klastrite pĂ”hiturvamehhanismidest, mis vĂ”imaldavad luua isikupĂ€rastatud kasutajakontosid, jagada nende Ă”igusi ja registreerida nende tegevusi. Loodan, et see on kasulik neile, kes on sarnaste kĂŒsimustega kokku puutunud teoorias vĂ”i juba praktikas. Samuti soovitan tutvuda muude turvateemadega seotud materjalide loetelu, mis on toodud "P.S.", — vĂ”ib-olla leiate nende hulgast vajalikke ĂŒksikasju teie jaoks olulistes kĂŒsimustes.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster