Konsep

Edit This Page

Sertifikat

Saat menggunakan autentikasi sertifikat klien, kamu dapat membuat sertifikat secara manual melalui easyrsa, openssl atau cfssl.

easyrsa

easyrsa dapat digunakan untuk menghasilkan sertifikat klaster kamu secara manual.

  1. Unduh, buka paket, dan inisialisasi versi tambal easyrsa3.

    curl -LO https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz
    tar xzf easy-rsa.tar.gz
    cd easy-rsa-master/easyrsa3
    ./easyrsa init-pki
    
  2. Hasilkan CA. (--batch untuk atur mode otomatis. --req-cn untuk menggunakan default CN.)

    ./easyrsa --batch "--req-cn=${MASTER_IP}@`date +%s`" build-ca nopass
    
  3. Hasilkan sertifikat dan kunci server. Argumen --subject-alt-name digunakan untuk mengatur alamat IP dan nama DNS yang dapat diakses oleh server API. MASTER_CLUSTER_IP biasanya merupakan IP pertama dari CIDR service cluster yang diset dengan argumen--service-cluster-ip-range untuk server API dan komponen manajer pengontrol. Argumen --days digunakan untuk mengatur jumlah hari masa berlaku sertifikat. Sampel di bawah ini juga mengasumsikan bahwa kamu menggunakan cluster.local sebagai nama domain DNS default.

    ./easyrsa --subject-alt-name="IP:${MASTER_IP},"\
    "IP:${MASTER_CLUSTER_IP},"\
    "DNS:kubernetes,"\
    "DNS:kubernetes.default,"\
    "DNS:kubernetes.default.svc,"\
    "DNS:kubernetes.default.svc.cluster,"\
    "DNS:kubernetes.default.svc.cluster.local" \
    --days=10000 \
    build-server-full server nopass
    
  4. Salin pki/ca.crt, pki/issued/server.crt, dan pki/private/server.key ke direktori kamu.

  5. Isi dan tambahkan parameter berikut ke dalam parameter mulai server API:

    --client-ca-file=/yourdirectory/ca.crt
    --tls-cert-file=/yourdirectory/server.crt
    --tls-private-key-file=/yourdirectory/server.key
    

openssl

openssl secara manual dapat menghasilkan sertifikat untuk klaster kamu.

  1. Hasilkan ca.key dengan 2048bit:

    openssl genrsa -out ca.key 2048
    
  2. Hasilkan ca.crt berdasarkan ca.key (gunakan -days untuk mengatur waktu efektif sertifikat):

    openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt
    
  3. Hasilkan server.key dengan 2048bit:

    openssl genrsa -out server.key 2048
    
  4. Buat file konfigurasi untuk menghasilkan Certificate Signing Request (CSR). Pastikan untuk mengganti nilai yang ditandai dengan kurung sudut (mis. <MASTER_IP>) dengan nilai sebenarnya sebelum menyimpan ke file (mis. csr.conf). Perhatikan bahwa nilai MASTER_CLUSTER_IP adalah layanan IP klaster untuk server API seperti yang dijelaskan dalam subbagian sebelumnya. Sampel di bawah ini juga mengasumsikan bahwa kamu menggunakan cluster.local sebagai nama domain DNS default.

    [ req ]
    default_bits = 2048
    prompt = no
    default_md = sha256
    req_extensions = req_ext
    distinguished_name = dn
    
    [ dn ]
    C = <country>
    ST = <state>
    L = <city>
    O = <organization>
    OU = <organization unit>
    CN = <MASTER_IP>
    
    [ req_ext ]
    subjectAltName = @alt_names
    
    [ alt_names ]
    DNS.1 = kubernetes
    DNS.2 = kubernetes.default
    DNS.3 = kubernetes.default.svc
    DNS.4 = kubernetes.default.svc.cluster
    DNS.5 = kubernetes.default.svc.cluster.local
    IP.1 = <MASTER_IP>
    IP.2 = <MASTER_CLUSTER_IP>
    
    [ v3_ext ]
    authorityKeyIdentifier=keyid,issuer:always
    basicConstraints=CA:FALSE
    keyUsage=keyEncipherment,dataEncipherment
    extendedKeyUsage=serverAuth,clientAuth
    subjectAltName=@alt_names
    
  5. Hasilkan permintaan penandatanganan sertifikat berdasarkan file konfigurasi:

    openssl req -new -key server.key -out server.csr -config csr.conf
    
  6. Hasilkan sertifikat server menggunakan ca.key, ca.crt dan server.csr:

    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
    -CAcreateserial -out server.crt -days 10000 \
    -extensions v3_ext -extfile csr.conf
    
  7. Lihat sertifikat:

    openssl x509  -noout -text -in ./server.crt
    

Terakhir, tambahkan parameter yang sama ke dalam parameter mulai server API.

cfssl

cfssl adalah alat lain untuk pembuatan sertifikat.

  1. Unduh, buka paket dan siapkan command line tools seperti yang ditunjukkan di bawah ini. Perhatikan bahwa kamu mungkin perlu menyesuaikan contoh perintah berdasarkan arsitektur perangkat keras dan versi cfssl yang kamu gunakan.

    curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o cfssl
    chmod +x cfssl
    curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o cfssljson
    chmod +x cfssljson
    curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o cfssl-certinfo
    chmod +x cfssl-certinfo
    
  2. Buat direktori untuk menyimpan artifacts dan inisialisasi cfssl:

    mkdir cert
    cd cert
    ../cfssl print-defaults config > config.json
    ../cfssl print-defaults csr > csr.json
    
  3. Buat file konfigurasi JSON untuk menghasilkan file CA, misalnya, ca-config.json:

    {
      "signing": {
        "default": {
          "expiry": "8760h"
        },
        "profiles": {
          "kubernetes": {
            "usages": [
              "signing",
              "key encipherment",
              "server auth",
              "client auth"
            ],
            "expiry": "8760h"
          }
        }
      }
    }
    
  4. Buat file konfigurasi JSON untuk CA certificate signing request (CSR), misalnya, ca-csr.json. Pastikan untuk mengganti nilai yang ditandai dengan kurung sudut dengan nilai sebenarnya yang ingin kamu gunakan.

    {
      "CN": "kubernetes",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names":[{
        "C": "<country>",
        "ST": "<state>",
        "L": "<city>",
        "O": "<organization>",
        "OU": "<organization unit>"
      }]
    }
    
  5. Hasilkan kunci CA (ca-key.pem) dan sertifikat (ca.pem):

    ../cfssl gencert -initca ca-csr.json | ../cfssljson -bare ca
    
  6. Buat file konfigurasi JSON untuk menghasilkan kunci dan sertifikat untuk API server, misalnya, server-csr.json. Pastikan untuk mengganti nilai dalam kurung sudut dengan nilai sebenarnya yang ingin kamu gunakan. MASTER_CLUSTER_IP adalah layanan klaster IP untuk server API seperti yang dijelaskan dalam subbagian sebelumnya. Sampel di bawah ini juga mengasumsikan bahwa kamu menggunakan cluster.local sebagai nama domain DNS default.

    {
      "CN": "kubernetes",
      "hosts": [
        "127.0.0.1",
        "<MASTER_IP>",
        "<MASTER_CLUSTER_IP>",
        "kubernetes",
        "kubernetes.default",
        "kubernetes.default.svc",
        "kubernetes.default.svc.cluster",
        "kubernetes.default.svc.cluster.local"
      ],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [{
        "C": "<country>",
        "ST": "<state>",
        "L": "<city>",
        "O": "<organization>",
        "OU": "<organization unit>"
      }]
    }
    
  7. Buat kunci dan sertifikat untuk server API, yang mana awalnya di simpan masing-masing ke dalam file server-key.pem dan server.pem:

    ../cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \
    --config=ca-config.json -profile=kubernetes \
    server-csr.json | ../cfssljson -bare server
    

Distribusi Sertifikat Self-Signed CA

Node klien dapat menolak untuk mengakui sertifikat CA yang ditandatangani sendiri sebagai valid. Untuk deployment non-produksi, atau untuk deployment yang berjalan di belakang firewall perusahaan, kamu dapat mendistribusikan sertifikat CA yang ditandatangani sendiri untuk semua klien dan refresh daftar lokal untuk sertifikat yang valid.

Pada setiap klien, lakukan operasi berikut:

sudo cp ca.crt /usr/local/share/ca-certificates/kubernetes.crt
sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....
done.

Sertifikat API

Kamu dapat menggunakan API Certificate.k8s.io untuk menyediakan sertifikat x509 yang digunakan untuk autentikasi seperti yang didokumentasikan di sini.

Masukan